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},
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
86 uint32_t order
, type
, scope
;
88 uint8_t *comp_settings
;
89 int comp_settings_len
;
90 } mkv_content_encoding_t
;
92 typedef struct mkv_track
{
102 uint32_t v_width
, v_height
, v_dwidth
, v_dheight
;
105 uint32_t a_formattag
;
106 uint32_t a_channels
, a_bps
;
109 double default_duration
;
113 unsigned char *private_data
;
114 unsigned int private_size
;
116 /* stuff for realmedia */
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 */
135 double qt_last_a_pts
;
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
;
147 /* generic content encoding support */
148 mkv_content_encoding_t
*encodings
;
151 /* For VobSubs and SSA/ASS */
155 typedef struct mkv_index
{
157 uint64_t timecode
, filepos
;
160 typedef struct mkv_demuxer
{
163 double duration
, last_pts
;
164 uint64_t last_filepos
;
166 mkv_track_t
**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
;
183 bool parsed_chapters
;
184 bool parsed_attachments
;
189 } *cluster_positions
;
192 int64_t skip_to_timecode
;
193 int v_skip_to_keyframe
, a_skip_to_keyframe
;
196 int audio_tracks
[MAX_A_STREAMS
];
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
)
213 array
= realloc(array
, (nelem
+ 32) * elsize
);
217 static bool is_parsed_header(struct mkv_demuxer
*mkv_d
, off_t pos
)
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
)
228 if (mkv_d
->num_parsed_pos
&& mkv_d
->parsed_pos
[low
] == pos
)
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
;
240 static mkv_track_t
*demux_mkv_find_track_by_num(mkv_demuxer_t
*d
, int n
,
245 for (i
= 0, id
= 0; i
< d
->num_tracks
; i
++)
246 if (d
->tracks
[i
] != NULL
&& d
->tracks
[i
]->type
== type
)
253 static void add_cluster_position(mkv_demuxer_t
*mkv_d
, uint64_t filepos
,
259 int n
= mkv_d
->num_cluster_pos
;
260 if (n
> 0 && mkv_d
->cluster_positions
[n
-1].filepos
>= filepos
)
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
){
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
281 while (sample_rate
< srates
[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
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
;
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;
312 static int demux_mkv_decode(mkv_track_t
*track
, uint8_t *src
,
313 uint8_t **dest
, uint32_t *size
, uint32_t type
)
319 if (track
->num_encodings
<= 0)
322 for (i
= 0; i
< track
->num_encodings
; i
++) {
323 if (!(track
->encodings
[i
].scope
& type
))
327 if (track
->encodings
[i
].comp_algo
== 0) {
328 /* zlib encoded track */
331 zstream
.zalloc
= (alloc_func
) 0;
332 zstream
.zfree
= (free_func
) 0;
333 zstream
.opaque
= (voidpf
) 0;
334 if (inflateInit(&zstream
) != Z_OK
) {
335 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
336 "[mkv] zlib initialization failed.\n");
339 zstream
.next_in
= (Bytef
*) src
;
340 zstream
.avail_in
= *size
;
344 zstream
.avail_out
= *size
;
347 *dest
= realloc(*dest
, *size
);
348 zstream
.next_out
= (Bytef
*) (*dest
+ zstream
.total_out
);
349 result
= inflate(&zstream
, Z_NO_FLUSH
);
350 if (result
!= Z_OK
&& result
!= Z_STREAM_END
) {
351 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
352 "[mkv] zlib decompression failed.\n");
355 inflateEnd(&zstream
);
358 zstream
.avail_out
+= 4000;
359 } while (zstream
.avail_out
== 4000 && zstream
.avail_in
!= 0
360 && result
!= Z_STREAM_END
);
362 *size
= zstream
.total_out
;
363 inflateEnd(&zstream
);
366 if (track
->encodings
[i
].comp_algo
== 2) {
367 /* lzo encoded track */
368 int dstlen
= *size
* 3;
373 if (dstlen
> SIZE_MAX
- AV_LZO_OUTPUT_PADDING
)
375 *dest
= realloc(*dest
, dstlen
+ AV_LZO_OUTPUT_PADDING
);
376 result
= av_lzo1x_decode(*dest
, &dstlen
, src
, &srclen
);
379 if (!(result
& AV_LZO_OUTPUT_FULL
)) {
381 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
382 "[mkv] lzo decompression failed.\n");
387 mp_msg(MSGT_DEMUX
, MSGL_DBG2
,
388 "[mkv] lzo decompression buffer too small.\n");
399 static int demux_mkv_read_info(demuxer_t
*demuxer
)
401 mkv_demuxer_t
*mkv_d
= demuxer
->priv
;
402 stream_t
*s
= demuxer
->stream
;
405 uint64_t tc_scale
= 1000000;
406 long double duration
= 0.;
408 length
= ebml_read_length(s
, NULL
);
410 uint32_t id
= ebml_read_id(s
, &i
);
413 case MATROSKA_ID_TIMECODESCALE
:
414 tc_scale
= ebml_read_uint(s
, &l
);
416 if (tc_scale
== EBML_UINT_INVALID
)
418 mp_msg(MSGT_DEMUX
, MSGL_V
,
419 "[mkv] | + timecode scale: %" PRIu64
"\n", tc_scale
);
422 case MATROSKA_ID_DURATION
:
423 duration
= ebml_read_float(s
, &l
);
425 if (duration
== EBML_FLOAT_INVALID
)
429 case MATROSKA_ID_SEGMENTUID
:;
430 l
= ebml_read_length(s
, &i
);
432 if (l
!= sizeof(demuxer
->matroska_data
.segment_uid
)) {
433 mp_msg(MSGT_DEMUX
, MSGL_INFO
,
434 "[mkv] segment uid invalid length %" PRIu64
"\n", l
);
437 stream_read(s
, demuxer
->matroska_data
.segment_uid
, l
);
438 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + segment uid");
439 for (int i
= 0; i
< l
; i
++)
440 mp_msg(MSGT_DEMUX
, MSGL_V
, " %02x",
441 demuxer
->matroska_data
.segment_uid
[i
]);
442 mp_msg(MSGT_DEMUX
, MSGL_V
, "\n");
448 ebml_read_skip(s
, &l
);
453 mkv_d
->tc_scale
= tc_scale
;
454 mkv_d
->duration
= duration
* tc_scale
/ 1000000000.0;
456 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + duration: %.3fs\n",
463 * \brief free array of kv_content_encoding_t
464 * \param encodings pointer to array
465 * \param numencodings number of encodings in array
467 static void demux_mkv_free_encodings(mkv_content_encoding_t
*encodings
,
470 while (numencodings
-- > 0)
471 free(encodings
[numencodings
].comp_settings
);
475 static int demux_mkv_read_trackencodings(demuxer_t
*demuxer
,
478 stream_t
*s
= demuxer
->stream
;
479 mkv_content_encoding_t
*ce
, e
;
480 uint64_t len1
, len2
, length
, l
;
483 ce
= malloc(sizeof(*ce
));
486 len1
= length
= ebml_read_length(s
, &il
);
489 switch (ebml_read_id(s
, &il
)) {
490 case MATROSKA_ID_CONTENTENCODING
:
491 memset(&e
, 0, sizeof(e
));
494 len2
= ebml_read_length(s
, &i
);
501 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
:;
526 le
= ebml_read_length(s
, &i
);
533 switch (ebml_read_id(s
, &il
)) {
534 case MATROSKA_ID_CONTENTCOMPALGO
:
535 num
= ebml_read_uint(s
, &l
);
536 if (num
== EBML_UINT_INVALID
)
541 case MATROSKA_ID_CONTENTCOMPSETTINGS
:
542 l
= ebml_read_length(s
, &i
);
543 e
.comp_settings
= malloc(l
);
544 stream_read(s
, e
.comp_settings
, l
);
545 e
.comp_settings_len
= l
;
550 ebml_read_skip(s
, &l
);
557 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] Track "
558 "number %u has been encrypted and "
559 "decryption has not yet been\n"
560 "[mkv] implemented. Skipping track.\n",
562 } else if (e
.type
!= 0) {
563 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
564 "[mkv] Unknown content encoding type for "
565 "track %u. Skipping track.\n",
569 if (e
.comp_algo
!= 0 && e
.comp_algo
!= 2) {
570 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
571 "[mkv] Track %u has been compressed with "
572 "an unknown/unsupported compression\n"
573 "[mkv] algorithm (%u). Skipping track.\n",
574 track
->tnum
, e
.comp_algo
);
577 else if (e
.comp_algo
== 0) {
578 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
579 "[mkv] Track %u was compressed with zlib "
580 "but mplayer has not been compiled\n"
581 "[mkv] with support for zlib compression. "
590 ebml_read_skip(s
, &l
);
595 for (i
= 0; i
< n
; i
++)
596 if (e
.order
<= ce
[i
].order
)
598 ce
= realloc(ce
, (n
+ 1) * sizeof(*ce
));
599 memmove(ce
+ i
+ 1, ce
+ i
, (n
- i
) * sizeof(*ce
));
600 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
);
621 static int demux_mkv_read_trackaudio(demuxer_t
*demuxer
, mkv_track_t
*track
)
623 stream_t
*s
= demuxer
->stream
;
624 uint64_t len
, length
, l
;
629 track
->a_sfreq
= 8000.0;
630 track
->a_channels
= 1;
632 len
= length
= ebml_read_length(s
, &il
);
635 switch (ebml_read_id(s
, &il
)) {
636 case MATROSKA_ID_SAMPLINGFREQUENCY
:
637 fnum
= ebml_read_float(s
, &l
);
638 if (fnum
== EBML_FLOAT_INVALID
)
640 track
->a_sfreq
= fnum
;
641 mp_msg(MSGT_DEMUX
, MSGL_V
,
642 "[mkv] | + Sampling frequency: %f\n", track
->a_sfreq
);
645 case MATROSKA_ID_BITDEPTH
:
646 num
= ebml_read_uint(s
, &l
);
647 if (num
== EBML_UINT_INVALID
)
650 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Bit depth: %u\n",
654 case MATROSKA_ID_CHANNELS
:
655 num
= ebml_read_uint(s
, &l
);
656 if (num
== EBML_UINT_INVALID
)
658 track
->a_channels
= num
;
659 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Channels: %u\n",
664 ebml_read_skip(s
, &l
);
672 static int demux_mkv_read_trackvideo(demuxer_t
*demuxer
, mkv_track_t
*track
)
674 stream_t
*s
= demuxer
->stream
;
675 uint64_t len
, length
, l
;
680 len
= length
= ebml_read_length(s
, &il
);
683 switch (ebml_read_id(s
, &il
)) {
684 case MATROSKA_ID_FRAMERATE
:
685 fnum
= ebml_read_float(s
, &l
);
686 if (fnum
== EBML_FLOAT_INVALID
)
688 track
->v_frate
= fnum
;
689 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Frame rate: %f\n",
691 if (track
->v_frate
> 0)
692 track
->default_duration
= 1 / track
->v_frate
;
695 case MATROSKA_ID_DISPLAYWIDTH
:
696 num
= ebml_read_uint(s
, &l
);
697 if (num
== EBML_UINT_INVALID
)
699 track
->v_dwidth
= num
;
700 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display width: %u\n",
704 case MATROSKA_ID_DISPLAYHEIGHT
:
705 num
= ebml_read_uint(s
, &l
);
706 if (num
== EBML_UINT_INVALID
)
708 track
->v_dheight
= num
;
709 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display height: %u\n",
713 case MATROSKA_ID_PIXELWIDTH
:
714 num
= ebml_read_uint(s
, &l
);
715 if (num
== EBML_UINT_INVALID
)
717 track
->v_width
= num
;
718 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel width: %u\n",
722 case MATROSKA_ID_PIXELHEIGHT
:
723 num
= ebml_read_uint(s
, &l
);
724 if (num
== EBML_UINT_INVALID
)
726 track
->v_height
= num
;
727 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel height: %u\n",
732 ebml_read_skip(s
, &l
);
741 * \brief free any data associated with given track
742 * \param track track of which to free data
744 static void demux_mkv_free_trackentry(mkv_track_t
*track
)
747 free(track
->codec_id
);
748 free(track
->language
);
749 free(track
->private_data
);
750 free(track
->audio_buf
);
751 free(track
->audio_timestamp
);
752 demux_mkv_free_encodings(track
->encodings
, track
->num_encodings
);
756 static int demux_mkv_read_trackentry(demuxer_t
*demuxer
)
758 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
759 stream_t
*s
= demuxer
->stream
;
761 uint64_t len
, length
, l
;
765 track
= calloc(1, sizeof(*track
));
766 /* set default values */
767 track
->default_track
= 1;
769 track
->language
= strdup("eng");
771 len
= length
= ebml_read_length(s
, &il
);
774 switch (ebml_read_id(s
, &il
)) {
775 case MATROSKA_ID_TRACKNUMBER
:
776 num
= ebml_read_uint(s
, &l
);
777 if (num
== EBML_UINT_INVALID
)
780 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track number: %u\n",
784 case MATROSKA_ID_NAME
:
785 track
->name
= ebml_read_utf8(s
, &l
);
786 if (track
->name
== NULL
)
788 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Name: %s\n",
792 case MATROSKA_ID_TRACKTYPE
:
793 num
= ebml_read_uint(s
, &l
);
794 if (num
== EBML_UINT_INVALID
)
797 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track type: ");
798 switch (track
->type
) {
799 case MATROSKA_TRACK_AUDIO
:
800 mp_msg(MSGT_DEMUX
, MSGL_V
, "Audio\n");
802 case MATROSKA_TRACK_VIDEO
:
803 mp_msg(MSGT_DEMUX
, MSGL_V
, "Video\n");
805 case MATROSKA_TRACK_SUBTITLE
:
806 mp_msg(MSGT_DEMUX
, MSGL_V
, "Subtitle\n");
809 mp_msg(MSGT_DEMUX
, MSGL_V
, "unknown\n");
814 case MATROSKA_ID_AUDIO
:
815 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Audio track\n");
816 l
= demux_mkv_read_trackaudio(demuxer
, track
);
821 case MATROSKA_ID_VIDEO
:
822 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Video track\n");
823 l
= demux_mkv_read_trackvideo(demuxer
, track
);
828 case MATROSKA_ID_CODECID
:
829 track
->codec_id
= ebml_read_ascii(s
, &l
);
830 if (track
->codec_id
== NULL
)
832 if (!strcmp(track
->codec_id
, MKV_V_MSCOMP
)
833 || !strcmp(track
->codec_id
, MKV_A_ACM
))
834 track
->ms_compat
= 1;
835 else if (!strcmp(track
->codec_id
, MKV_S_VOBSUB
))
836 track
->subtitle_type
= MATROSKA_SUBTYPE_VOBSUB
;
837 else if (!strcmp(track
->codec_id
, MKV_S_TEXTSSA
)
838 || !strcmp(track
->codec_id
, MKV_S_TEXTASS
)
839 || !strcmp(track
->codec_id
, MKV_S_SSA
)
840 || !strcmp(track
->codec_id
, MKV_S_ASS
)) {
841 track
->subtitle_type
= MATROSKA_SUBTYPE_SSA
;
842 } else if (!strcmp(track
->codec_id
, MKV_S_TEXTASCII
))
843 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
844 if (!strcmp(track
->codec_id
, MKV_S_TEXTUTF8
)) {
845 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
847 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Codec ID: %s\n",
851 case MATROSKA_ID_CODECPRIVATE
:;
853 num
= ebml_read_length(s
, &x
);
854 // audit: cheap guard against overflows later..
855 if (num
> SIZE_MAX
- 1000)
858 track
->private_data
= malloc(num
+ AV_LZO_INPUT_PADDING
);
859 if (stream_read(s
, track
->private_data
, num
) != (int) num
)
861 track
->private_size
= num
;
862 mp_msg(MSGT_DEMUX
, MSGL_V
,
863 "[mkv] | + CodecPrivate, length " "%u\n",
864 track
->private_size
);
867 case MATROSKA_ID_LANGUAGE
:
868 free(track
->language
);
869 track
->language
= ebml_read_utf8(s
, &l
);
870 if (track
->language
== NULL
)
872 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Language: %s\n",
876 case MATROSKA_ID_FLAGDEFAULT
:
877 num
= ebml_read_uint(s
, &l
);
878 if (num
== EBML_UINT_INVALID
)
880 track
->default_track
= num
;
881 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default flag: %u\n",
882 track
->default_track
);
885 case MATROSKA_ID_DEFAULTDURATION
:
886 num
= ebml_read_uint(s
, &l
);
887 if (num
== EBML_UINT_INVALID
)
890 mp_msg(MSGT_DEMUX
, MSGL_V
,
891 "[mkv] | + Default duration: 0");
893 track
->v_frate
= 1000000000.0 / num
;
894 track
->default_duration
= num
/ 1000000000.0;
895 mp_msg(MSGT_DEMUX
, MSGL_V
,
896 "[mkv] | + Default duration: "
897 "%.3fms ( = %.3f fps)\n", num
/ 1000000.0,
902 case MATROSKA_ID_CONTENTENCODINGS
:
903 l
= demux_mkv_read_trackencodings(demuxer
, track
);
909 ebml_read_skip(s
, &l
);
915 mkv_d
->tracks
[mkv_d
->num_tracks
++] = track
;
919 demux_mkv_free_trackentry(track
);
923 static int demux_mkv_read_tracks(demuxer_t
*demuxer
)
925 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
926 stream_t
*s
= demuxer
->stream
;
930 mkv_d
->tracks
= malloc(sizeof(*mkv_d
->tracks
));
931 mkv_d
->num_tracks
= 0;
933 length
= ebml_read_length(s
, NULL
);
935 switch (ebml_read_id(s
, &il
)) {
936 case MATROSKA_ID_TRACKENTRY
:
937 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + a track...\n");
938 mkv_d
->tracks
= realloc(mkv_d
->tracks
, (mkv_d
->num_tracks
+ 1)
939 * sizeof(*mkv_d
->tracks
));
940 l
= demux_mkv_read_trackentry(demuxer
);
946 ebml_read_skip(s
, &l
);
954 static int demux_mkv_read_cues(demuxer_t
*demuxer
)
956 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
957 stream_t
*s
= demuxer
->stream
;
958 uint64_t length
, l
, time
, track
, pos
;
961 if (index_mode
== 0 || index_mode
== 2) {
962 ebml_read_skip(s
, NULL
);
966 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing cues ] -----------\n");
967 length
= ebml_read_length(s
, NULL
);
970 time
= track
= pos
= EBML_UINT_INVALID
;
972 switch (ebml_read_id(s
, &il
)) {
973 case MATROSKA_ID_CUEPOINT
:;
976 len
= ebml_read_length(s
, &i
);
983 switch (ebml_read_id(s
, &il
)) {
984 case MATROSKA_ID_CUETIME
:
985 time
= ebml_read_uint(s
, &l
);
988 case MATROSKA_ID_CUETRACKPOSITIONS
:;
989 uint64_t le
= ebml_read_length(s
, &i
);
996 switch (ebml_read_id(s
, &il
)) {
997 case MATROSKA_ID_CUETRACK
:
998 track
= ebml_read_uint(s
, &l
);
1001 case MATROSKA_ID_CUECLUSTERPOSITION
:
1002 pos
= ebml_read_uint(s
, &l
);
1006 ebml_read_skip(s
, &l
);
1014 ebml_read_skip(s
, &l
);
1022 ebml_read_skip(s
, &l
);
1028 if (time
!= EBML_UINT_INVALID
&& track
!= EBML_UINT_INVALID
1029 && pos
!= EBML_UINT_INVALID
) {
1031 grow_array(mkv_d
->indexes
, mkv_d
->num_indexes
,
1032 sizeof(mkv_index_t
));
1033 mkv_d
->indexes
[mkv_d
->num_indexes
].tnum
= track
;
1034 mkv_d
->indexes
[mkv_d
->num_indexes
].timecode
= time
;
1035 mkv_d
->indexes
[mkv_d
->num_indexes
].filepos
=
1036 mkv_d
->segment_start
+ pos
;
1037 mp_msg(MSGT_DEMUX
, MSGL_DBG2
,
1038 "[mkv] |+ found cue point " "for track %" PRIu64
1039 ": timecode %" PRIu64
", filepos: %" PRIu64
"\n", track
,
1040 time
, mkv_d
->segment_start
+ pos
);
1041 mkv_d
->num_indexes
++;
1045 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing cues ] -----------\n");
1049 static uint64_t read_one_chapter(struct demuxer
*demuxer
, stream_t
*s
,
1050 struct matroska_chapter
*chapters
,
1054 uint64_t start
= 0, end
= 0;
1055 struct matroska_chapter chapter
= { };
1059 bool badchapter
= false;
1061 len
= ebml_read_length(s
, &i
);
1062 uint64_t bytes_read
= len
+ i
;
1065 id
= ebml_read_id(s
, &i
);
1068 case MATROSKA_ID_CHAPTERTIMESTART
:
1069 start
= ebml_read_uint(s
, &l
) / 1000000;
1073 case MATROSKA_ID_CHAPTERTIMEEND
:
1074 end
= ebml_read_uint(s
, &l
) / 1000000;
1078 case MATROSKA_ID_CHAPTERDISPLAY
:;
1079 uint64_t displaylen
= ebml_read_length(s
, &i
);
1080 len
-= displaylen
+ i
;
1081 while (displaylen
> 0) {
1082 id
= ebml_read_id(s
, &i
);
1085 case MATROSKA_ID_CHAPSTRING
:
1086 name
= ebml_read_utf8(s
, &l
);
1089 ebml_read_skip(s
, &l
);
1096 case MATROSKA_ID_CHAPTERSEGMENTUID
:
1097 l
= ebml_read_length(s
, &i
);
1099 if (l
!= sizeof(chapter
.segment_uid
)) {
1100 mp_msg(MSGT_DEMUX
, MSGL_INFO
,
1101 "[mkv] chapter segment uid invalid length %" PRIu64
1105 stream_read(s
, chapter
.segment_uid
, l
);
1106 chapter
.has_segment_uid
= true;
1107 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] Chapter segment uid ");
1108 for (int i
= 0; i
< l
; i
++)
1109 mp_msg(MSGT_DEMUX
, MSGL_V
, "%02x ",
1110 chapter
.segment_uid
[i
]);
1111 mp_msg(MSGT_DEMUX
, MSGL_V
, "\n");
1115 case MATROSKA_ID_CHAPTERSEGMENTEDITIONUID
:
1116 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
1117 "[mkv] Warning: unsupported edition recursion in chapter; "
1118 "will skip on playback!\n");
1119 ebml_read_skip(s
, &l
);
1125 ebml_read_skip(s
, &l
);
1132 name
= strdup("(unnamed)");
1134 chapter
.start
= start
;
1136 chapter
.name
= talloc_strdup(chapters
, name
);
1137 chapters
[chapter_num
] = chapter
;
1140 memset(&chapter
.segment_uid
, 0, sizeof(chapter
.segment_uid
));
1144 mp_msg(MSGT_DEMUX
, MSGL_V
,
1145 "[mkv] Chapter %u from %02d:%02d:%02d."
1146 "%03d to %02d:%02d:%02d.%03d, %s\n", chapter_num
,
1147 (int) (start
/ 60 / 60 / 1000), (int) ((start
/ 60 / 1000) % 60),
1148 (int) ((start
/ 1000) % 60), (int) (start
% 1000),
1149 (int) (end
/ 60 / 60 / 1000), (int) ((end
/ 60 / 1000) % 60),
1150 (int) ((end
/ 1000) % 60), (int) (end
% 1000), name
);
1157 static int demux_mkv_read_chapters(struct demuxer
*demuxer
)
1159 struct MPOpts
*opts
= demuxer
->opts
;
1160 stream_t
*s
= demuxer
->stream
;
1165 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing chapters ] ---------\n");
1166 length
= ebml_read_length(s
, NULL
);
1168 struct matroska_chapter
*selected_chapters
= NULL
;
1169 int num_selected_chapters
= 0;
1170 bool have_default
= false;
1171 bool have_user_specified
= false;
1172 int selected_edition
= -1;
1173 bool se_is_ordered
= false;
1175 while (length
> 0) {
1176 id
= ebml_read_id(s
, &i
);
1179 case MATROSKA_ID_EDITIONENTRY
:
1181 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] New edition %d\n", cur_idx
);
1182 uint64_t editionlen
= ebml_read_length(s
, &i
);
1183 length
-= editionlen
+ i
;
1184 bool defaultflag
= false;
1185 bool ordered
= false;
1186 struct matroska_chapter
*chapters
= NULL
;
1187 int num_chapters
= 0;
1188 while (editionlen
> 0) {
1189 id
= ebml_read_id(s
, &i
);
1192 case MATROSKA_ID_CHAPTERATOM
:
1194 talloc_realloc(demuxer
, chapters
,
1195 struct matroska_chapter
,
1197 l
= read_one_chapter(demuxer
, s
, chapters
, num_chapters
++);
1199 case MATROSKA_ID_EDITIONFLAGDEFAULT
:
1200 defaultflag
= ebml_read_uint(s
, &l
);
1201 mp_msg(MSGT_DEMUX
, MSGL_V
,
1202 "[mkv] Default edition flag: %d\n", defaultflag
);
1204 case MATROSKA_ID_EDITIONFLAGORDERED
:
1205 ordered
= ebml_read_uint(s
, &l
);
1206 mp_msg(MSGT_DEMUX
, MSGL_V
,
1207 "[mkv] Ordered chapter flag: %d\n", ordered
);
1211 ebml_read_skip(s
, &l
);
1216 if (cur_idx
== opts
->edition_id
) {
1217 have_user_specified
= true;
1218 mp_msg(MSGT_DEMUX
, MSGL_V
,
1219 "[mkv] Found user-selected edition\n");
1220 } else if (!have_user_specified
&& !have_default
&& defaultflag
) {
1221 have_default
= true;
1222 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] Default edition: %d\n",
1224 } else if (selected_edition
< 0) {
1227 talloc_free(chapters
);
1230 selected_edition
= cur_idx
;
1231 talloc_free(selected_chapters
);
1232 selected_chapters
= chapters
;
1233 num_selected_chapters
= num_chapters
;
1234 se_is_ordered
= ordered
;
1238 ebml_read_skip(s
, &l
);
1244 mp_msg(MSGT_DEMUX
, MSGL_INFO
,
1245 "[mkv] Found %d editions, will play #%d (first is 0).\n",
1246 cur_idx
+ 1, selected_edition
);
1248 for (i
= 0; i
< num_selected_chapters
; i
++)
1249 demuxer_add_chapter(demuxer
, selected_chapters
[i
].name
,
1250 selected_chapters
[i
].start
,
1251 selected_chapters
[i
].end
);
1252 struct matroska_data
*m
= &demuxer
->matroska_data
;
1253 talloc_free(m
->ordered_chapters
);
1254 if (se_is_ordered
) {
1255 m
->ordered_chapters
= selected_chapters
;
1256 m
->num_ordered_chapters
= num_selected_chapters
;
1258 m
->ordered_chapters
= NULL
;
1259 m
->num_ordered_chapters
= 0;
1260 talloc_free(selected_chapters
);
1263 mp_msg(MSGT_DEMUX
, MSGL_V
,
1264 "[mkv] \\---- [ parsing chapters ] ---------\n");
1268 static int demux_mkv_read_tags(demuxer_t
*demuxer
)
1270 ebml_read_skip(demuxer
->stream
, NULL
);
1274 static int demux_mkv_read_attachments(demuxer_t
*demuxer
)
1276 stream_t
*s
= demuxer
->stream
;
1280 mp_msg(MSGT_DEMUX
, MSGL_V
,
1281 "[mkv] /---- [ parsing attachments ] ---------\n");
1282 length
= ebml_read_length(s
, NULL
);
1284 while (length
> 0) {
1285 switch (ebml_read_id(s
, &il
)) {
1286 case MATROSKA_ID_ATTACHEDFILE
:;
1294 len
= ebml_read_length(s
, &i
);
1297 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + an attachment...\n");
1303 switch (ebml_read_id(s
, &il
)) {
1304 case MATROSKA_ID_FILENAME
:
1306 name
= ebml_read_utf8(s
, &l
);
1309 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileName: %s\n",
1313 case MATROSKA_ID_FILEMIMETYPE
:
1315 mime
= ebml_read_ascii(s
, &l
);
1318 mp_msg(MSGT_DEMUX
, MSGL_V
,
1319 "[mkv] | + FileMimeType: %s\n", mime
);
1322 case MATROSKA_ID_FILEDATA
:;
1324 uint64_t num
= ebml_read_length(s
, &x
);
1328 if (stream_read(s
, data
, num
) != (int) num
) {
1336 mp_msg(MSGT_DEMUX
, MSGL_V
,
1337 "[mkv] | + FileData, length " "%u\n",
1342 ebml_read_skip(s
, &l
);
1348 demuxer_add_attachment(demuxer
, name
, mime
, data
, data_size
);
1352 mp_msg(MSGT_DEMUX
, MSGL_V
,
1353 "[mkv] Attachment: %s, %s, %u bytes\n", name
, mime
,
1358 ebml_read_skip(s
, &l
);
1364 mp_msg(MSGT_DEMUX
, MSGL_V
,
1365 "[mkv] \\---- [ parsing attachments ] ---------\n");
1369 static int read_header_element(struct demuxer
*demuxer
, uint32_t id
,
1372 static int demux_mkv_read_seekhead(demuxer_t
*demuxer
)
1374 struct mkv_demuxer
*mkv_d
= demuxer
->priv
;
1375 struct stream
*s
= demuxer
->stream
;
1377 struct ebml_seek_head seekhead
= {};
1378 struct ebml_parse_ctx parse_ctx
= {};
1380 mp_msg(MSGT_DEMUX
, MSGL_V
,
1381 "[mkv] /---- [ parsing seek head ] ---------\n");
1382 if (ebml_read_element(s
, &parse_ctx
, &seekhead
, &ebml_seek_head_desc
) < 0) {
1386 /* off now holds the position of the next element after the seek head. */
1387 off_t off
= stream_tell(s
);
1388 for (int i
= 0; i
< seekhead
.n_seek
; i
++) {
1389 struct ebml_seek
*seek
= &seekhead
.seek
[i
];
1390 if (seek
->n_seek_id
!= 1 || seek
->n_seek_position
!= 1) {
1391 mp_msg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] Invalid SeekHead entry\n");
1394 uint64_t pos
= seek
->seek_position
+ mkv_d
->segment_start
;
1395 if (pos
>= demuxer
->movi_end
) {
1396 mp_msg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] SeekHead position beyond "
1397 "end of file - incomplete file?\n");
1400 read_header_element(demuxer
, seek
->seek_id
, pos
);
1402 if (!stream_seek(s
, off
)) {
1403 mp_msg(MSGT_DEMUX
, MSGL_ERR
, "[mkv] Couldn't seek back after "
1408 mp_msg(MSGT_DEMUX
, MSGL_V
,
1409 "[mkv] \\---- [ parsing seek head ] ---------\n");
1410 talloc_free(parse_ctx
.talloc_ctx
);
1414 static bool seek_pos_id(struct stream
*s
, off_t pos
, uint32_t id
)
1416 if (!stream_seek(s
, pos
)) {
1417 mp_msg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] Failed to seek in file\n");
1420 if (ebml_read_id(s
, NULL
) != id
) {
1421 mp_msg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] Expected element not found\n");
1427 static int read_header_element(struct demuxer
*demuxer
, uint32_t id
,
1430 struct mkv_demuxer
*mkv_d
= demuxer
->priv
;
1431 stream_t
*s
= demuxer
->stream
;
1432 off_t pos
= stream_tell(s
) - 4;
1435 case MATROSKA_ID_INFO
:
1436 if (mkv_d
->parsed_info
)
1438 if (at_filepos
&& !seek_pos_id(s
, at_filepos
, id
))
1440 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment information...\n");
1441 mkv_d
->parsed_info
= true;
1442 return demux_mkv_read_info(demuxer
) ? -1 : 1;
1444 case MATROSKA_ID_TRACKS
:
1445 if (mkv_d
->parsed_tracks
)
1447 if (at_filepos
&& !seek_pos_id(s
, at_filepos
, id
))
1449 mkv_d
->parsed_tracks
= true;
1450 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment tracks...\n");
1451 return demux_mkv_read_tracks(demuxer
) ? -1 : 1;
1453 case MATROSKA_ID_CUES
:
1454 if (is_parsed_header(mkv_d
, pos
))
1456 if (at_filepos
&& !seek_pos_id(s
, at_filepos
, id
))
1458 return demux_mkv_read_cues(demuxer
) ? -1 : 1;
1460 case MATROSKA_ID_TAGS
:
1461 if (mkv_d
->parsed_tags
)
1463 if (at_filepos
&& !seek_pos_id(s
, at_filepos
, id
))
1465 mkv_d
->parsed_tags
= true;
1466 return demux_mkv_read_tags(demuxer
) ? -1 : 1;
1468 case MATROSKA_ID_SEEKHEAD
:
1469 if (is_parsed_header(mkv_d
, pos
))
1471 if (at_filepos
&& !seek_pos_id(s
, at_filepos
, id
))
1473 return demux_mkv_read_seekhead(demuxer
) ? -1 : 1;
1475 case MATROSKA_ID_CHAPTERS
:
1476 if (mkv_d
->parsed_chapters
)
1478 if (at_filepos
&& !seek_pos_id(s
, at_filepos
, id
))
1480 mkv_d
->parsed_chapters
= true;
1481 return demux_mkv_read_chapters(demuxer
) ? -1 : 1;
1483 case MATROSKA_ID_ATTACHMENTS
:
1484 if (mkv_d
->parsed_attachments
)
1486 if (at_filepos
&& !seek_pos_id(s
, at_filepos
, id
))
1488 mkv_d
->parsed_attachments
= true;
1489 return demux_mkv_read_attachments(demuxer
) ? -1 : 1;
1493 ebml_read_skip(s
, NULL
);
1497 ebml_read_skip(s
, NULL
);
1503 static int demux_mkv_open_video(demuxer_t
*demuxer
, mkv_track_t
*track
,
1505 static int demux_mkv_open_audio(demuxer_t
*demuxer
, mkv_track_t
*track
,
1507 static int demux_mkv_open_sub(demuxer_t
*demuxer
, mkv_track_t
*track
,
1510 static void display_create_tracks(demuxer_t
*demuxer
)
1512 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1513 int i
, vid
= 0, aid
= 0, sid
= 0;
1515 for (i
= 0; i
< mkv_d
->num_tracks
; i
++) {
1516 char *type
= "unknown", str
[32];
1518 switch (mkv_d
->tracks
[i
]->type
) {
1519 case MATROSKA_TRACK_VIDEO
:
1521 demux_mkv_open_video(demuxer
, mkv_d
->tracks
[i
], vid
);
1522 if (mkv_d
->tracks
[i
]->name
)
1523 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VID_%d_NAME=%s\n", vid
,
1524 mkv_d
->tracks
[i
]->name
);
1525 sprintf(str
, "-vid %u", vid
++);
1527 case MATROSKA_TRACK_AUDIO
:
1529 demux_mkv_open_audio(demuxer
, mkv_d
->tracks
[i
], aid
);
1530 if (mkv_d
->tracks
[i
]->name
)
1531 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_NAME=%s\n", aid
,
1532 mkv_d
->tracks
[i
]->name
);
1533 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_LANG=%s\n", aid
,
1534 mkv_d
->tracks
[i
]->language
);
1535 sprintf(str
, "-aid %u, -alang %.5s", aid
++,
1536 mkv_d
->tracks
[i
]->language
);
1538 case MATROSKA_TRACK_SUBTITLE
:
1540 demux_mkv_open_sub(demuxer
, mkv_d
->tracks
[i
], sid
);
1541 if (mkv_d
->tracks
[i
]->name
)
1542 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_NAME=%s\n", sid
,
1543 mkv_d
->tracks
[i
]->name
);
1544 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_LANG=%s\n", sid
,
1545 mkv_d
->tracks
[i
]->language
);
1546 sprintf(str
, "-sid %u, -slang %.5s", sid
++,
1547 mkv_d
->tracks
[i
]->language
);
1550 if (mkv_d
->tracks
[i
]->name
)
1551 mp_tmsg(MSGT_DEMUX
, MSGL_INFO
,
1552 "[mkv] Track ID %u: %s (%s) \"%s\", %s\n",
1553 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
,
1554 mkv_d
->tracks
[i
]->name
, str
);
1556 mp_tmsg(MSGT_DEMUX
, MSGL_INFO
, "[mkv] Track ID %u: %s (%s), %s\n",
1557 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
,
1566 } videocodec_info_t
;
1568 static const videocodec_info_t vinfo
[] = {
1569 {MKV_V_MPEG1
, mmioFOURCC('m', 'p', 'g', '1'), 0},
1570 {MKV_V_MPEG2
, mmioFOURCC('m', 'p', 'g', '2'), 0},
1571 {MKV_V_MPEG4_SP
, mmioFOURCC('m', 'p', '4', 'v'), 1},
1572 {MKV_V_MPEG4_ASP
, mmioFOURCC('m', 'p', '4', 'v'), 1},
1573 {MKV_V_MPEG4_AP
, mmioFOURCC('m', 'p', '4', 'v'), 1},
1574 {MKV_V_MPEG4_AVC
, mmioFOURCC('a', 'v', 'c', '1'), 1},
1575 {MKV_V_THEORA
, mmioFOURCC('t', 'h', 'e', 'o'), 1},
1579 static int demux_mkv_open_video(demuxer_t
*demuxer
, mkv_track_t
*track
,
1582 struct MPOpts
*opts
= demuxer
->opts
;
1583 BITMAPINFOHEADER
*bih
;
1584 void *ImageDesc
= NULL
;
1587 if (track
->ms_compat
) { /* MS compatibility mode */
1588 BITMAPINFOHEADER
*src
;
1590 if (track
->private_data
== NULL
1591 || track
->private_size
< sizeof(BITMAPINFOHEADER
))
1594 src
= (BITMAPINFOHEADER
*) track
->private_data
;
1595 bih
= calloc(1, track
->private_size
);
1596 bih
->biSize
= le2me_32(src
->biSize
);
1597 bih
->biWidth
= le2me_32(src
->biWidth
);
1598 bih
->biHeight
= le2me_32(src
->biHeight
);
1599 bih
->biPlanes
= le2me_16(src
->biPlanes
);
1600 bih
->biBitCount
= le2me_16(src
->biBitCount
);
1601 bih
->biCompression
= le2me_32(src
->biCompression
);
1602 bih
->biSizeImage
= le2me_32(src
->biSizeImage
);
1603 bih
->biXPelsPerMeter
= le2me_32(src
->biXPelsPerMeter
);
1604 bih
->biYPelsPerMeter
= le2me_32(src
->biYPelsPerMeter
);
1605 bih
->biClrUsed
= le2me_32(src
->biClrUsed
);
1606 bih
->biClrImportant
= le2me_32(src
->biClrImportant
);
1607 memcpy((char *) bih
+ sizeof(BITMAPINFOHEADER
),
1608 (char *) src
+ sizeof(BITMAPINFOHEADER
),
1609 track
->private_size
- sizeof(BITMAPINFOHEADER
));
1611 if (track
->v_width
== 0)
1612 track
->v_width
= bih
->biWidth
;
1613 if (track
->v_height
== 0)
1614 track
->v_height
= bih
->biHeight
;
1616 bih
= calloc(1, sizeof(BITMAPINFOHEADER
));
1617 bih
->biSize
= sizeof(BITMAPINFOHEADER
);
1618 bih
->biWidth
= track
->v_width
;
1619 bih
->biHeight
= track
->v_height
;
1620 bih
->biBitCount
= 24;
1621 bih
->biSizeImage
= bih
->biWidth
* bih
->biHeight
* bih
->biBitCount
/ 8;
1623 if (track
->private_size
>= RVPROPERTIES_SIZE
1624 && (!strcmp(track
->codec_id
, MKV_V_REALV10
)
1625 || !strcmp(track
->codec_id
, MKV_V_REALV20
)
1626 || !strcmp(track
->codec_id
, MKV_V_REALV30
)
1627 || !strcmp(track
->codec_id
, MKV_V_REALV40
))) {
1628 unsigned char *dst
, *src
;
1632 src
= (uint8_t *) 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
=
1643 mmioFOURCC('R', 'V', track
->codec_id
[9], '0');
1644 dst
= (unsigned char *) (bih
+ 1);
1645 // copy type1 and type2 info from rv properties
1646 memcpy(dst
, src
- 8, 8);
1647 stream_read(demuxer
->stream
, dst
+ 8, cnt
);
1648 track
->realmedia
= 1;
1650 #ifdef CONFIG_QTX_CODECS
1651 } else if (track
->private_size
>= sizeof(ImageDescription
)
1652 && !strcmp(track
->codec_id
, MKV_V_QUICKTIME
)) {
1653 ImageDescriptionPtr idesc
;
1655 idesc
= (ImageDescriptionPtr
) track
->private_data
;
1656 idesc
->idSize
= be2me_32(idesc
->idSize
);
1657 idesc
->cType
= be2me_32(idesc
->cType
);
1658 idesc
->version
= be2me_16(idesc
->version
);
1659 idesc
->revisionLevel
= be2me_16(idesc
->revisionLevel
);
1660 idesc
->vendor
= be2me_32(idesc
->vendor
);
1661 idesc
->temporalQuality
= be2me_32(idesc
->temporalQuality
);
1662 idesc
->spatialQuality
= be2me_32(idesc
->spatialQuality
);
1663 idesc
->width
= be2me_16(idesc
->width
);
1664 idesc
->height
= be2me_16(idesc
->height
);
1665 idesc
->hRes
= be2me_32(idesc
->hRes
);
1666 idesc
->vRes
= be2me_32(idesc
->vRes
);
1667 idesc
->dataSize
= be2me_32(idesc
->dataSize
);
1668 idesc
->frameCount
= be2me_16(idesc
->frameCount
);
1669 idesc
->depth
= be2me_16(idesc
->depth
);
1670 idesc
->clutID
= be2me_16(idesc
->clutID
);
1672 bih
->biCompression
= idesc
->cType
;
1674 #endif /* CONFIG_QTX_CODECS */
1677 const videocodec_info_t
*vi
= vinfo
;
1678 while (vi
->id
&& strcmp(vi
->id
, track
->codec_id
))
1680 bih
->biCompression
= vi
->fourcc
;
1681 if (vi
->extradata
&& track
->private_data
1682 && (track
->private_size
> 0)) {
1683 bih
->biSize
+= track
->private_size
;
1684 bih
= realloc(bih
, bih
->biSize
);
1685 memcpy(bih
+ 1, track
->private_data
, track
->private_size
);
1687 track
->reorder_timecodes
= opts
->user_correct_pts
== 0;
1689 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] Unknown/unsupported "
1690 "CodecID (%s) or missing/bad CodecPrivate\n"
1691 "[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
) {
1708 sh_v
->disp_w
= track
->v_width
;
1709 sh_v
->disp_h
= track
->v_height
;
1710 if (track
->v_dheight
)
1711 sh_v
->aspect
= (double) track
->v_dwidth
/ track
->v_dheight
;
1713 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1714 // disp_w and disp_h from the RealVideo stream contents returned
1715 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1716 // the Matroska file then it has already been set to PixelWidth/Height
1717 // by check_track_information.
1718 sh_v
->disp_w
= track
->v_dwidth
;
1719 sh_v
->disp_h
= track
->v_dheight
;
1721 sh_v
->ImageDesc
= ImageDesc
;
1722 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] Aspect: %f\n", sh_v
->aspect
);
1724 sh_v
->ds
= demuxer
->video
;
1728 static int demux_mkv_open_audio(demuxer_t
*demuxer
, mkv_track_t
*track
,
1731 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1732 sh_audio_t
*sh_a
= new_sh_audio_aid(demuxer
, track
->tnum
, aid
);
1735 mkv_d
->audio_tracks
[mkv_d
->last_aid
] = track
->tnum
;
1737 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
1738 sh_a
->lang
= strdup(track
->language
);
1739 sh_a
->default_track
= track
->default_track
;
1740 sh_a
->ds
= demuxer
->audio
;
1741 sh_a
->wf
= malloc(sizeof(WAVEFORMATEX
));
1742 if (track
->ms_compat
&& (track
->private_size
>= sizeof(WAVEFORMATEX
))) {
1743 WAVEFORMATEX
*wf
= (WAVEFORMATEX
*) track
->private_data
;
1744 sh_a
->wf
= realloc(sh_a
->wf
, track
->private_size
);
1745 sh_a
->wf
->wFormatTag
= le2me_16(wf
->wFormatTag
);
1746 sh_a
->wf
->nChannels
= le2me_16(wf
->nChannels
);
1747 sh_a
->wf
->nSamplesPerSec
= le2me_32(wf
->nSamplesPerSec
);
1748 sh_a
->wf
->nAvgBytesPerSec
= le2me_32(wf
->nAvgBytesPerSec
);
1749 sh_a
->wf
->nBlockAlign
= le2me_16(wf
->nBlockAlign
);
1750 sh_a
->wf
->wBitsPerSample
= le2me_16(wf
->wBitsPerSample
);
1751 sh_a
->wf
->cbSize
= track
->private_size
- sizeof(WAVEFORMATEX
);
1752 memcpy(sh_a
->wf
+ 1, wf
+ 1,
1753 track
->private_size
- sizeof(WAVEFORMATEX
));
1754 if (track
->a_sfreq
== 0.0)
1755 track
->a_sfreq
= sh_a
->wf
->nSamplesPerSec
;
1756 if (track
->a_channels
== 0)
1757 track
->a_channels
= sh_a
->wf
->nChannels
;
1758 if (track
->a_bps
== 0)
1759 track
->a_bps
= sh_a
->wf
->wBitsPerSample
;
1760 track
->a_formattag
= sh_a
->wf
->wFormatTag
;
1762 memset(sh_a
->wf
, 0, sizeof(WAVEFORMATEX
));
1763 if (!strcmp(track
->codec_id
, MKV_A_MP3
)
1764 || !strcmp(track
->codec_id
, MKV_A_MP2
))
1765 track
->a_formattag
= 0x0055;
1766 else if (!strncmp(track
->codec_id
, MKV_A_AC3
, strlen(MKV_A_AC3
)))
1767 track
->a_formattag
= 0x2000;
1768 else if (!strcmp(track
->codec_id
, MKV_A_DTS
))
1769 track
->a_formattag
= 0x2001;
1770 else if (!strcmp(track
->codec_id
, MKV_A_PCM
)
1771 || !strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1772 track
->a_formattag
= 0x0001;
1773 else if (!strcmp(track
->codec_id
, MKV_A_AAC_2MAIN
)
1774 || !strncmp(track
->codec_id
, MKV_A_AAC_2LC
,
1775 strlen(MKV_A_AAC_2LC
))
1776 || !strcmp(track
->codec_id
, MKV_A_AAC_2SSR
)
1777 || !strcmp(track
->codec_id
, MKV_A_AAC_4MAIN
)
1778 || !strncmp(track
->codec_id
, MKV_A_AAC_4LC
,
1779 strlen(MKV_A_AAC_4LC
))
1780 || !strcmp(track
->codec_id
, MKV_A_AAC_4SSR
)
1781 || !strcmp(track
->codec_id
, MKV_A_AAC_4LTP
)
1782 || !strcmp(track
->codec_id
, MKV_A_AAC
))
1783 track
->a_formattag
= mmioFOURCC('M', 'P', '4', 'A');
1784 else if (!strcmp(track
->codec_id
, MKV_A_VORBIS
)) {
1785 if (track
->private_data
== NULL
)
1787 track
->a_formattag
= mmioFOURCC('v', 'r', 'b', 's');
1788 } else if (!strcmp(track
->codec_id
, MKV_A_QDMC
))
1789 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', 'C');
1790 else if (!strcmp(track
->codec_id
, MKV_A_QDMC2
))
1791 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', '2');
1792 else if (!strcmp(track
->codec_id
, MKV_A_WAVPACK
))
1793 track
->a_formattag
= mmioFOURCC('W', 'V', 'P', 'K');
1794 else if (!strcmp(track
->codec_id
, MKV_A_TRUEHD
))
1795 track
->a_formattag
= mmioFOURCC('T', 'R', 'H', 'D');
1796 else if (!strcmp(track
->codec_id
, MKV_A_FLAC
)) {
1797 if (track
->private_data
== NULL
|| track
->private_size
== 0) {
1798 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
,
1799 "[mkv] FLAC track does not contain valid headers.\n");
1802 track
->a_formattag
= mmioFOURCC('f', 'L', 'a', 'C');
1803 } else if (track
->private_size
>= RAPROPERTIES4_SIZE
) {
1804 if (!strcmp(track
->codec_id
, MKV_A_REAL28
))
1805 track
->a_formattag
= mmioFOURCC('2', '8', '_', '8');
1806 else if (!strcmp(track
->codec_id
, MKV_A_REALATRC
))
1807 track
->a_formattag
= mmioFOURCC('a', 't', 'r', 'c');
1808 else if (!strcmp(track
->codec_id
, MKV_A_REALCOOK
))
1809 track
->a_formattag
= mmioFOURCC('c', 'o', 'o', 'k');
1810 else if (!strcmp(track
->codec_id
, MKV_A_REALDNET
))
1811 track
->a_formattag
= mmioFOURCC('d', 'n', 'e', 't');
1812 else if (!strcmp(track
->codec_id
, MKV_A_REALSIPR
))
1813 track
->a_formattag
= mmioFOURCC('s', 'i', 'p', 'r');
1815 mp_tmsg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] Unknown/unsupported audio "
1816 "codec ID '%s' for track %u or missing/faulty\n[mkv] "
1817 "private codec data.\n", track
->codec_id
, track
->tnum
);
1818 free_sh_audio(demuxer
, track
->tnum
);
1823 sh_a
->format
= track
->a_formattag
;
1824 sh_a
->wf
->wFormatTag
= track
->a_formattag
;
1825 sh_a
->channels
= track
->a_channels
;
1826 sh_a
->wf
->nChannels
= track
->a_channels
;
1827 sh_a
->samplerate
= (uint32_t) track
->a_sfreq
;
1828 sh_a
->wf
->nSamplesPerSec
= (uint32_t) track
->a_sfreq
;
1829 if (track
->a_bps
== 0) {
1830 sh_a
->samplesize
= 2;
1831 sh_a
->wf
->wBitsPerSample
= 16;
1833 sh_a
->samplesize
= track
->a_bps
/ 8;
1834 sh_a
->wf
->wBitsPerSample
= track
->a_bps
;
1836 if (track
->a_formattag
== 0x0055) { /* MP3 || MP2 */
1837 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1838 sh_a
->wf
->nBlockAlign
= 1152;
1839 } else if ((track
->a_formattag
== 0x2000) /* AC3 */
1840 || (track
->a_formattag
== 0x2001)) { /* DTS */
1843 } else if (track
->a_formattag
== 0x0001) { /* PCM || PCM_BE */
1844 sh_a
->wf
->nAvgBytesPerSec
= sh_a
->channels
* sh_a
->samplerate
* 2;
1845 sh_a
->wf
->nBlockAlign
= sh_a
->wf
->nAvgBytesPerSec
;
1846 if (!strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1847 sh_a
->format
= mmioFOURCC('t', 'w', 'o', 's');
1848 } else if (!strcmp(track
->codec_id
, MKV_A_QDMC
)
1849 || !strcmp(track
->codec_id
, MKV_A_QDMC2
)) {
1850 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1851 sh_a
->wf
->nBlockAlign
= 1486;
1852 track
->fix_i_bps
= 1;
1853 track
->qt_last_a_pts
= 0.0;
1854 if (track
->private_data
!= NULL
) {
1855 sh_a
->codecdata
= malloc(track
->private_size
);
1856 memcpy(sh_a
->codecdata
, track
->private_data
, track
->private_size
);
1857 sh_a
->codecdata_len
= track
->private_size
;
1859 } else if (track
->a_formattag
== mmioFOURCC('M', 'P', '4', 'A')) {
1860 int profile
, srate_idx
;
1862 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1863 sh_a
->wf
->nBlockAlign
= 1024;
1865 if (!strcmp(track
->codec_id
, MKV_A_AAC
)
1866 && (NULL
!= track
->private_data
)) {
1867 sh_a
->codecdata
= malloc(track
->private_size
);
1868 memcpy(sh_a
->codecdata
, track
->private_data
, track
->private_size
);
1869 sh_a
->codecdata_len
= track
->private_size
;
1873 /* Recreate the 'private data' */
1874 /* which faad2 uses in its initialization */
1875 srate_idx
= aac_get_sample_rate_index(sh_a
->samplerate
);
1876 if (!strncmp(&track
->codec_id
[12], "MAIN", 4))
1878 else if (!strncmp(&track
->codec_id
[12], "LC", 2))
1880 else if (!strncmp(&track
->codec_id
[12], "SSR", 3))
1884 sh_a
->codecdata
= malloc(5);
1885 sh_a
->codecdata
[0] = ((profile
+ 1) << 3) | ((srate_idx
& 0xE) >> 1);
1886 sh_a
->codecdata
[1] =
1887 ((srate_idx
& 0x1) << 7) | (track
->a_channels
<< 3);
1889 if (strstr(track
->codec_id
, "SBR") != NULL
) {
1890 /* HE-AAC (aka SBR AAC) */
1891 sh_a
->codecdata_len
= 5;
1893 sh_a
->samplerate
*= 2;
1894 sh_a
->wf
->nSamplesPerSec
*= 2;
1895 srate_idx
= aac_get_sample_rate_index(sh_a
->samplerate
);
1896 sh_a
->codecdata
[2] = AAC_SYNC_EXTENSION_TYPE
>> 3;
1897 sh_a
->codecdata
[3] = ((AAC_SYNC_EXTENSION_TYPE
& 0x07) << 5) | 5;
1898 sh_a
->codecdata
[4] = (1 << 7) | (srate_idx
<< 3);
1899 track
->default_duration
= 1024.0 / (sh_a
->samplerate
/ 2);
1901 sh_a
->codecdata_len
= 2;
1902 track
->default_duration
= 1024.0 / sh_a
->samplerate
;
1904 } else if (track
->a_formattag
== mmioFOURCC('v', 'r', 'b', 's')) { /* VORBIS */
1905 sh_a
->wf
->cbSize
= track
->private_size
;
1906 sh_a
->wf
= realloc(sh_a
->wf
, sizeof(WAVEFORMATEX
) + sh_a
->wf
->cbSize
);
1907 memcpy((unsigned char *) (sh_a
->wf
+ 1), track
->private_data
,
1909 } else if (track
->private_size
>= RAPROPERTIES4_SIZE
1910 && !strncmp(track
->codec_id
, MKV_A_REALATRC
, 7)) {
1911 /* Common initialization for all RealAudio codecs */
1912 unsigned char *src
= track
->private_data
;
1913 int codecdata_length
, version
;
1916 sh_a
->wf
->nAvgBytesPerSec
= 0; /* FIXME !? */
1918 version
= AV_RB16(src
+ 4);
1919 flavor
= AV_RB16(src
+ 22);
1920 track
->coded_framesize
= AV_RB32(src
+ 24);
1921 track
->sub_packet_h
= AV_RB16(src
+ 40);
1922 sh_a
->wf
->nBlockAlign
= track
->audiopk_size
= AV_RB16(src
+ 42);
1923 track
->sub_packet_size
= AV_RB16(src
+ 44);
1925 src
+= RAPROPERTIES4_SIZE
;
1929 src
+= RAPROPERTIES5_SIZE
;
1934 codecdata_length
= AV_RB32(src
);
1936 sh_a
->wf
->cbSize
= codecdata_length
;
1937 sh_a
->wf
= realloc(sh_a
->wf
, sizeof(WAVEFORMATEX
) + sh_a
->wf
->cbSize
);
1938 memcpy(((char *) (sh_a
->wf
+ 1)), src
, codecdata_length
);
1940 switch (track
->a_formattag
) {
1941 case mmioFOURCC('a', 't', 'r', 'c'):
1942 sh_a
->wf
->nAvgBytesPerSec
= atrc_fl2bps
[flavor
];
1943 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
1945 malloc(track
->sub_packet_h
* track
->audiopk_size
);
1946 track
->audio_timestamp
=
1947 malloc(track
->sub_packet_h
* sizeof(double));
1949 case mmioFOURCC('c', 'o', 'o', 'k'):
1950 sh_a
->wf
->nAvgBytesPerSec
= cook_fl2bps
[flavor
];
1951 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
1953 malloc(track
->sub_packet_h
* track
->audiopk_size
);
1954 track
->audio_timestamp
=
1955 malloc(track
->sub_packet_h
* sizeof(double));
1957 case mmioFOURCC('s', 'i', 'p', 'r'):
1958 sh_a
->wf
->nAvgBytesPerSec
= sipr_fl2bps
[flavor
];
1959 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
1961 malloc(track
->sub_packet_h
* track
->audiopk_size
);
1962 track
->audio_timestamp
=
1963 malloc(track
->sub_packet_h
* sizeof(double));
1965 case mmioFOURCC('2', '8', '_', '8'):
1966 sh_a
->wf
->nAvgBytesPerSec
= 3600;
1967 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
1969 malloc(track
->sub_packet_h
* track
->audiopk_size
);
1970 track
->audio_timestamp
=
1971 malloc(track
->sub_packet_h
* sizeof(double));
1975 track
->realmedia
= 1;
1976 } else if (!strcmp(track
->codec_id
, MKV_A_FLAC
)
1977 || (track
->a_formattag
== 0xf1ac)) {
1983 if (track
->a_formattag
== mmioFOURCC('f', 'L', 'a', 'C')) {
1984 ptr
= track
->private_data
;
1985 size
= track
->private_size
;
1987 sh_a
->format
= mmioFOURCC('f', 'L', 'a', 'C');
1988 ptr
= track
->private_data
+ sizeof(WAVEFORMATEX
);
1989 size
= track
->private_size
- sizeof(WAVEFORMATEX
);
1991 if (size
< 4 || ptr
[0] != 'f' || ptr
[1] != 'L' || ptr
[2] != 'a'
1993 sh_a
->codecdata
= malloc(4);
1994 sh_a
->codecdata_len
= 4;
1995 memcpy(sh_a
->codecdata
, "fLaC", 4);
1997 sh_a
->codecdata
= malloc(size
);
1998 sh_a
->codecdata_len
= size
;
1999 memcpy(sh_a
->codecdata
, ptr
, size
);
2001 } else if (track
->a_formattag
== mmioFOURCC('W', 'V', 'P', 'K') || track
->a_formattag
== mmioFOURCC('T', 'R', 'H', 'D')) { /* do nothing, still works */
2002 } else if (!track
->ms_compat
2003 || (track
->private_size
< sizeof(WAVEFORMATEX
))) {
2004 free_sh_audio(demuxer
, track
->tnum
);
2011 static int demux_mkv_open_sub(demuxer_t
*demuxer
, mkv_track_t
*track
,
2014 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_UNKNOWN
) {
2017 sh_sub_t
*sh
= new_sh_sub_sid(demuxer
, track
->tnum
, sid
);
2020 if (track
->subtitle_type
== MATROSKA_SUBTYPE_VOBSUB
)
2022 if (track
->subtitle_type
== MATROSKA_SUBTYPE_SSA
)
2024 size
= track
->private_size
;
2025 m
= demux_mkv_decode(track
, track
->private_data
, &buffer
, &size
, 2);
2027 free(track
->private_data
);
2028 track
->private_data
= buffer
;
2029 track
->private_size
= size
;
2031 sh
->extradata
= malloc(track
->private_size
);
2032 memcpy(sh
->extradata
, track
->private_data
, track
->private_size
);
2033 sh
->extradata_len
= track
->private_size
;
2034 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
2035 sh
->lang
= strdup(track
->language
);
2036 sh
->default_track
= track
->default_track
;
2038 mp_tmsg(MSGT_DEMUX
, MSGL_ERR
,
2039 "[mkv] Subtitle type '%s' is not supported.\n",
2047 static int demux_mkv_open(demuxer_t
*demuxer
)
2049 stream_t
*s
= demuxer
->stream
;
2050 mkv_demuxer_t
*mkv_d
;
2054 stream_seek(s
, s
->start_pos
);
2055 if (ebml_read_id(s
, NULL
) != EBML_ID_EBML
)
2057 struct ebml_ebml ebml_master
= {};
2058 struct ebml_parse_ctx parse_ctx
= { .no_error_messages
= true };
2059 if (ebml_read_element(s
, &parse_ctx
, &ebml_master
, &ebml_ebml_desc
) < 0)
2061 if (ebml_master
.doc_type
.len
!= 8 || strncmp(ebml_master
.doc_type
.start
,
2063 mp_msg(MSGT_DEMUX
, MSGL_DBG2
, "[mkv] no head found\n");
2064 talloc_free(parse_ctx
.talloc_ctx
);
2067 if (ebml_master
.doc_type_read_version
> 2) {
2068 mp_msg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] This looks like a Matroska file, "
2069 "but we don't support format version %"PRIu64
"\n",
2070 ebml_master
.doc_type_read_version
);
2071 talloc_free(parse_ctx
.talloc_ctx
);
2074 if ((ebml_master
.n_ebml_read_version
2075 && ebml_master
.ebml_read_version
!= EBML_VERSION
)
2076 || (ebml_master
.n_ebml_max_size_length
2077 && ebml_master
.ebml_max_size_length
> 8)
2078 || (ebml_master
.n_ebml_max_id_length
2079 && ebml_master
.ebml_max_id_length
!= 4)) {
2080 mp_msg(MSGT_DEMUX
, MSGL_WARN
, "[mkv] This looks like a Matroska file, "
2081 "but the header has bad parameters\n");
2082 talloc_free(parse_ctx
.talloc_ctx
);
2085 talloc_free(parse_ctx
.talloc_ctx
);
2087 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] Found the head...\n");
2089 if (ebml_read_id(s
, NULL
) != MATROSKA_ID_SEGMENT
) {
2090 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] but no segment :(\n");
2093 ebml_read_length(s
, NULL
); /* return bytes number until EOF */
2095 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] + a segment...\n");
2097 mkv_d
= talloc_zero(demuxer
, struct mkv_demuxer
);
2098 demuxer
->priv
= mkv_d
;
2099 mkv_d
->tc_scale
= 1000000;
2100 mkv_d
->segment_start
= stream_tell(s
);
2103 uint32_t id
= ebml_read_id(s
, NULL
);
2105 case MATROSKA_ID_CLUSTER
:
2106 mp_msg(MSGT_DEMUX
, MSGL_V
,
2107 "[mkv] |+ found cluster, headers are "
2108 "parsed completely :)\n");
2109 stream_seek(s
, stream_tell(s
) - 4);
2114 cont
= read_header_element(demuxer
, id
, 0) < 1;
2117 ebml_read_skip(s
, NULL
);
2122 display_create_tracks(demuxer
);
2124 /* select video track */
2126 if (demuxer
->video
->id
== -1) { /* automatically select a video track */
2127 /* search for a video track that has the 'default' flag set */
2128 for (i
= 0; i
< mkv_d
->num_tracks
; i
++)
2129 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
2130 && mkv_d
->tracks
[i
]->default_track
) {
2131 track
= mkv_d
->tracks
[i
];
2136 /* no track has the 'default' flag set */
2137 /* let's take the first video track */
2138 for (i
= 0; i
< mkv_d
->num_tracks
; i
++)
2139 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
) {
2140 track
= mkv_d
->tracks
[i
];
2143 } else if (demuxer
->video
->id
!= -2) /* -2 = no video at all */
2145 demux_mkv_find_track_by_num(mkv_d
, demuxer
->video
->id
,
2146 MATROSKA_TRACK_VIDEO
);
2148 if (track
&& demuxer
->v_streams
[track
->tnum
]) {
2149 mp_tmsg(MSGT_DEMUX
, MSGL_INFO
, "[mkv] Will play video track %u.\n",
2151 demuxer
->video
->id
= track
->tnum
;
2152 demuxer
->video
->sh
= demuxer
->v_streams
[track
->tnum
];
2154 mp_tmsg(MSGT_DEMUX
, MSGL_INFO
, "[mkv] No video track found/wanted.\n");
2155 demuxer
->video
->id
= -2;
2158 /* select audio track */
2161 /* search for an audio track that has the 'default' flag set */
2162 for (i
= 0; i
< mkv_d
->num_tracks
; i
++)
2163 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
2164 && mkv_d
->tracks
[i
]->default_track
) {
2165 track
= mkv_d
->tracks
[i
];
2170 /* no track has the 'default' flag set */
2171 /* let's take the first audio track */
2172 for (i
= 0; i
< mkv_d
->num_tracks
; i
++)
2173 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
) {
2174 track
= mkv_d
->tracks
[i
];
2178 if (track
&& demuxer
->a_streams
[track
->tnum
]) {
2179 demuxer
->audio
->id
= track
->tnum
;
2180 demuxer
->audio
->sh
= demuxer
->a_streams
[track
->tnum
];
2182 mp_tmsg(MSGT_DEMUX
, MSGL_INFO
, "[mkv] No audio track found/wanted.\n");
2183 demuxer
->audio
->id
= -2;
2187 if (demuxer
->audio
->id
!= -2)
2188 for (i
= 0; i
< mkv_d
->num_tracks
; i
++) {
2189 if (mkv_d
->tracks
[i
]->type
!= MATROSKA_TRACK_AUDIO
)
2191 if (demuxer
->a_streams
[track
->tnum
]) {
2193 if (mkv_d
->last_aid
== MAX_A_STREAMS
)
2198 if (s
->end_pos
== 0 || (mkv_d
->indexes
== NULL
&& index_mode
< 0))
2199 demuxer
->seekable
= 0;
2201 demuxer
->movi_start
= s
->start_pos
;
2202 demuxer
->movi_end
= s
->end_pos
;
2203 demuxer
->seekable
= 1;
2206 demuxer
->accurate_seek
= true;
2208 return DEMUXER_TYPE_MATROSKA
;
2211 static void demux_close_mkv(demuxer_t
*demuxer
)
2213 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2217 free_cached_dps(demuxer
);
2218 if (mkv_d
->tracks
) {
2219 for (i
= 0; i
< mkv_d
->num_tracks
; i
++)
2220 demux_mkv_free_trackentry(mkv_d
->tracks
[i
]);
2221 free(mkv_d
->tracks
);
2223 free(mkv_d
->indexes
);
2224 free(mkv_d
->cluster_positions
);
2228 static int demux_mkv_read_block_lacing(uint8_t *buffer
, uint64_t *size
,
2230 uint32_t **all_lace_sizes
)
2232 uint32_t total
= 0, *lace_size
;
2236 *all_lace_sizes
= NULL
;
2242 switch ((flags
& 0x06) >> 1) {
2243 case 0: /* no lacing */
2245 lace_size
= calloc(*laces
, sizeof(uint32_t));
2246 lace_size
[0] = *size
;
2249 case 1: /* xiph lacing */
2250 case 2: /* fixed-size lacing */
2251 case 3: /* EBML lacing */
2255 lace_size
= calloc(*laces
, sizeof(uint32_t));
2257 switch ((flags
& 0x06) >> 1) {
2258 case 1: /* xiph lacing */
2259 for (i
= 0; i
< *laces
- 1; i
++) {
2262 lace_size
[i
] += *buffer
;
2264 } while (*buffer
++ == 0xFF);
2265 total
+= lace_size
[i
];
2267 lace_size
[i
] = *size
- total
;
2270 case 2: /* fixed-size lacing */
2271 for (i
= 0; i
< *laces
; i
++)
2272 lace_size
[i
] = *size
/ *laces
;
2275 case 3:; /* EBML lacing */
2277 uint64_t num
= ebml_read_vlen_uint(buffer
, &l
);
2278 if (num
== EBML_UINT_INVALID
) {
2285 total
= lace_size
[0] = num
;
2286 for (i
= 1; i
< *laces
- 1; i
++) {
2288 snum
= ebml_read_vlen_int(buffer
, &l
);
2289 if (snum
== EBML_INT_INVALID
) {
2295 lace_size
[i
] = lace_size
[i
- 1] + snum
;
2296 total
+= lace_size
[i
];
2298 lace_size
[i
] = *size
- total
;
2303 *all_lace_sizes
= lace_size
;
2307 static void handle_subtitles(demuxer_t
*demuxer
, mkv_track_t
*track
,
2308 char *block
, int64_t size
,
2309 uint64_t block_duration
, uint64_t timecode
)
2313 if (block_duration
== 0) {
2314 mp_msg(MSGT_DEMUX
, MSGL_WARN
,
2315 "[mkv] Warning: No BlockDuration for subtitle track found.\n");
2320 dp
= new_demux_packet(size
);
2321 memcpy(dp
->buffer
, block
, size
);
2322 dp
->pts
= timecode
/ 1000.0;
2323 dp
->endpts
= (timecode
+ block_duration
) / 1000.0;
2324 ds_add_packet(demuxer
->sub
, dp
);
2327 double real_fix_timestamp(unsigned char *buf
, unsigned int timestamp
,
2328 unsigned int format
, int64_t *kf_base
, int *kf_pts
,
2331 static void handle_realvideo(demuxer_t
*demuxer
, mkv_track_t
*track
,
2332 uint8_t *buffer
, uint32_t size
, int block_bref
)
2334 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2336 uint32_t timestamp
= mkv_d
->last_pts
* 1000;
2338 dp
= new_demux_packet(size
);
2339 memcpy(dp
->buffer
, buffer
, size
);
2341 if (mkv_d
->v_skip_to_keyframe
) {
2342 dp
->pts
= mkv_d
->last_pts
;
2343 track
->rv_kf_base
= 0;
2344 track
->rv_kf_pts
= timestamp
;
2347 real_fix_timestamp(dp
->buffer
, timestamp
,
2348 ((sh_video_t
*) demuxer
->video
->sh
)->bih
->
2349 biCompression
, &track
->rv_kf_base
,
2350 &track
->rv_kf_pts
, NULL
);
2351 dp
->pos
= demuxer
->filepos
;
2352 dp
->flags
= block_bref
? 0 : 0x10;
2354 ds_add_packet(demuxer
->video
, dp
);
2357 static void handle_realaudio(demuxer_t
*demuxer
, mkv_track_t
*track
,
2358 uint8_t *buffer
, uint32_t size
, int block_bref
)
2360 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2361 int sps
= track
->sub_packet_size
;
2362 int sph
= track
->sub_packet_h
;
2363 int cfs
= track
->coded_framesize
;
2364 int w
= track
->audiopk_size
;
2365 int spc
= track
->sub_packet_cnt
;
2369 if ((track
->a_formattag
== mmioFOURCC('2', '8', '_', '8'))
2370 || (track
->a_formattag
== mmioFOURCC('c', 'o', 'o', 'k'))
2371 || (track
->a_formattag
== mmioFOURCC('a', 't', 'r', 'c'))
2372 || (track
->a_formattag
== mmioFOURCC('s', 'i', 'p', 'r'))) {
2374 // spc = track->sub_packet_cnt = 0;
2375 switch (track
->a_formattag
) {
2376 case mmioFOURCC('2', '8', '_', '8'):
2377 for (x
= 0; x
< sph
/ 2; x
++)
2378 memcpy(track
->audio_buf
+ x
* 2 * w
+ spc
* cfs
,
2379 buffer
+ cfs
* x
, cfs
);
2381 case mmioFOURCC('c', 'o', 'o', 'k'):
2382 case mmioFOURCC('a', 't', 'r', 'c'):
2383 for (x
= 0; x
< w
/ sps
; x
++)
2384 memcpy(track
->audio_buf
+
2385 sps
* (sph
* x
+ ((sph
+ 1) / 2) * (spc
& 1) +
2386 (spc
>> 1)), buffer
+ sps
* x
, sps
);
2388 case mmioFOURCC('s', 'i', 'p', 'r'):
2389 memcpy(track
->audio_buf
+ spc
* w
, buffer
, w
);
2390 if (spc
== sph
- 1) {
2392 int bs
= sph
* w
* 2 / 96; // nibbles per subpacket
2393 // Perform reordering
2394 for (n
= 0; n
< 38; n
++) {
2396 int i
= bs
* sipr_swaps
[n
][0];
2397 int o
= bs
* sipr_swaps
[n
][1];
2398 // swap nibbles of block 'i' with 'o' TODO: optimize
2399 for (j
= 0; j
< bs
; j
++) {
2401 (track
->audio_buf
[i
>> 1] >> 4) :
2402 (track
->audio_buf
[i
>> 1] & 0x0F);
2404 (track
->audio_buf
[o
>> 1] >> 4) :
2405 (track
->audio_buf
[o
>> 1] & 0x0F);
2407 track
->audio_buf
[o
>> 1] =
2408 (track
->audio_buf
[o
>> 1] & 0x0F) | (x
<< 4);
2410 track
->audio_buf
[o
>> 1] =
2411 (track
->audio_buf
[o
>> 1] & 0xF0) | x
;
2413 track
->audio_buf
[i
>> 1] =
2414 (track
->audio_buf
[i
>> 1] & 0x0F) | (y
<< 4);
2416 track
->audio_buf
[i
>> 1] =
2417 (track
->audio_buf
[i
>> 1] & 0xF0) | y
;
2425 track
->audio_timestamp
[track
->sub_packet_cnt
] =
2426 (track
->ra_pts
== mkv_d
->last_pts
) ? 0 : (mkv_d
->last_pts
);
2427 track
->ra_pts
= mkv_d
->last_pts
;
2428 if (track
->sub_packet_cnt
== 0)
2429 track
->audio_filepos
= demuxer
->filepos
;
2430 if (++(track
->sub_packet_cnt
) == sph
) {
2432 ((WAVEFORMATEX
*) ((sh_audio_t
*) demuxer
->audio
->sh
)->wf
)->
2434 track
->sub_packet_cnt
= 0;
2435 // Release all the audio packets
2436 for (x
= 0; x
< sph
* w
/ apk_usize
; x
++) {
2437 dp
= new_demux_packet(apk_usize
);
2438 memcpy(dp
->buffer
, track
->audio_buf
+ x
* apk_usize
,
2440 /* Put timestamp only on packets that correspond to original
2441 * audio packets in file */
2442 dp
->pts
= (x
* apk_usize
% w
) ? 0 :
2443 track
->audio_timestamp
[x
* apk_usize
/ w
];
2444 dp
->pos
= track
->audio_filepos
; // all equal
2445 dp
->flags
= x
? 0 : 0x10; // Mark first packet as keyframe
2446 ds_add_packet(demuxer
->audio
, dp
);
2449 } else { // Not a codec that require reordering
2450 dp
= new_demux_packet(size
);
2451 memcpy(dp
->buffer
, buffer
, size
);
2452 if (track
->ra_pts
== mkv_d
->last_pts
&& !mkv_d
->a_skip_to_keyframe
)
2455 dp
->pts
= mkv_d
->last_pts
;
2456 track
->ra_pts
= mkv_d
->last_pts
;
2458 dp
->pos
= demuxer
->filepos
;
2459 dp
->flags
= block_bref
? 0 : 0x10;
2460 ds_add_packet(demuxer
->audio
, dp
);
2464 /** Reorder timecodes and add cached demux packets to the queues.
2466 * Timecode reordering is needed if a video track contains B frames that
2467 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2468 * MPlayer doesn't like timestamps in display order. This function adjusts
2469 * the timestamp of cached frames (which are exactly one I/P frame followed
2470 * by one or more B frames) so that they are in coding order again.
2472 * Example: The track with 25 FPS contains four frames with the timecodes
2473 * I at 0ms, P at 120ms, B at 40ms and B at 80ms. As soon as the next I
2474 * or P frame arrives these timecodes can be changed to I at 0ms, P at 40ms,
2475 * B at 80ms and B at 120ms.
2477 * This works for simple H.264 B-frame pyramids, but not for arbitrary orders.
2479 * \param demuxer The Matroska demuxer struct for this instance.
2480 * \param track The track structure whose cache should be handled.
2482 static void flush_cached_dps(demuxer_t
*demuxer
, mkv_track_t
*track
)
2486 if (track
->num_cached_dps
== 0)
2491 for (i
= 1; i
< track
->num_cached_dps
; i
++)
2492 if (track
->cached_dps
[i
- 1]->pts
> track
->cached_dps
[i
]->pts
) {
2493 double tmp_pts
= track
->cached_dps
[i
- 1]->pts
;
2494 track
->cached_dps
[i
- 1]->pts
= track
->cached_dps
[i
]->pts
;
2495 track
->cached_dps
[i
]->pts
= tmp_pts
;
2500 for (i
= 0; i
< track
->num_cached_dps
; i
++)
2501 ds_add_packet(demuxer
->video
, track
->cached_dps
[i
]);
2502 track
->num_cached_dps
= 0;
2505 /** Cache video frames if timecodes have to be reordered.
2507 * Timecode reordering is needed if a video track contains B frames that
2508 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2509 * This function takes in a Matroska block read from the file, allocates a
2510 * demux packet for it, fills in its values, allocates space for storing
2511 * pointers to the cached demux packets and adds the packet to it. If
2512 * the packet contains an I or a P frame then ::flush_cached_dps is called
2513 * in order to send the old cached frames downstream.
2515 * \param demuxer The Matroska demuxer struct for this instance.
2516 * \param track The packet is meant for this track.
2517 * \param buffer The actual frame contents.
2518 * \param size The frame size in bytes.
2519 * \param block_bref A relative timecode (backward reference). If it is \c 0
2520 * then the frame is an I frame.
2521 * \param block_fref A relative timecode (forward reference). If it is \c 0
2522 * then the frame is either an I frame or a P frame depending on the value
2523 * of \a block_bref. Otherwise it's a B frame.
2525 static void handle_video_bframes(demuxer_t
*demuxer
, mkv_track_t
*track
,
2526 uint8_t *buffer
, uint32_t size
,
2527 int block_bref
, int block_fref
)
2529 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2532 dp
= new_demux_packet(size
);
2533 memcpy(dp
->buffer
, buffer
, size
);
2534 dp
->pos
= demuxer
->filepos
;
2535 dp
->pts
= mkv_d
->last_pts
;
2536 if ((track
->num_cached_dps
> 0) && (dp
->pts
< track
->max_pts
))
2538 if (block_fref
== 0) /* I or P frame */
2539 flush_cached_dps(demuxer
, track
);
2540 if (block_bref
!= 0) /* I frame, don't cache it */
2542 if ((track
->num_cached_dps
+ 1) > track
->num_allocated_dps
) {
2543 track
->cached_dps
= (demux_packet_t
**)
2544 realloc(track
->cached_dps
,
2545 (track
->num_cached_dps
+ 10) * sizeof(demux_packet_t
*));
2546 track
->num_allocated_dps
+= 10;
2548 track
->cached_dps
[track
->num_cached_dps
] = dp
;
2549 track
->num_cached_dps
++;
2550 if (dp
->pts
> track
->max_pts
)
2551 track
->max_pts
= dp
->pts
;
2554 static int handle_block(demuxer_t
*demuxer
, uint8_t *block
, uint64_t length
,
2555 uint64_t block_duration
, int64_t block_bref
,
2556 int64_t block_fref
, uint8_t simpleblock
)
2558 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2559 mkv_track_t
*track
= NULL
;
2560 demux_stream_t
*ds
= NULL
;
2561 uint64_t old_length
;
2563 uint32_t *lace_size
;
2564 uint8_t laces
, flags
;
2565 int i
, num
, tmp
, use_this_block
= 1;
2569 /* first byte(s): track num */
2570 num
= ebml_read_vlen_uint(block
, &tmp
);
2572 /* time (relative to cluster time) */
2573 time
= block
[0] << 8 | block
[1];
2576 old_length
= length
;
2578 if (demux_mkv_read_block_lacing(block
, &length
, &laces
, &lace_size
))
2580 block
+= old_length
- length
;
2582 tc
= (time
* mkv_d
->tc_scale
+ mkv_d
->cluster_tc
) / 1000000.0 + 0.5;
2585 current_pts
= tc
/ 1000.0;
2587 for (i
= 0; i
< mkv_d
->num_tracks
; i
++)
2588 if (mkv_d
->tracks
[i
]->tnum
== num
) {
2589 track
= mkv_d
->tracks
[i
];
2592 if (track
== NULL
) {
2596 if (num
== demuxer
->audio
->id
) {
2597 ds
= demuxer
->audio
;
2599 if (mkv_d
->a_skip_to_keyframe
) {
2601 if (!(flags
& 0x80)) /*current frame isn't a keyframe */
2603 } else if (block_bref
!= 0)
2605 } else if (mkv_d
->v_skip_to_keyframe
)
2608 if (track
->fix_i_bps
&& use_this_block
) {
2609 sh_audio_t
*sh
= (sh_audio_t
*) ds
->sh
;
2611 if (block_duration
!= 0) {
2612 sh
->i_bps
= length
* 1000 / block_duration
;
2613 track
->fix_i_bps
= 0;
2614 } else if (track
->qt_last_a_pts
== 0.0)
2615 track
->qt_last_a_pts
= current_pts
;
2616 else if (track
->qt_last_a_pts
!= current_pts
) {
2617 sh
->i_bps
= length
/ (current_pts
- track
->qt_last_a_pts
);
2618 track
->fix_i_bps
= 0;
2621 } else if (tc
< mkv_d
->skip_to_timecode
)
2623 else if (num
== demuxer
->video
->id
) {
2624 ds
= demuxer
->video
;
2625 if (mkv_d
->v_skip_to_keyframe
) {
2627 if (!(flags
& 0x80)) /*current frame isn't a keyframe */
2629 } else if (block_bref
!= 0 || block_fref
!= 0)
2632 } else if (num
== demuxer
->sub
->id
) {
2634 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_VOBSUB
) {
2635 if (!mkv_d
->v_skip_to_keyframe
)
2636 handle_subtitles(demuxer
, track
, block
, length
, block_duration
,
2643 if (use_this_block
) {
2644 mkv_d
->last_pts
= current_pts
;
2645 mkv_d
->last_filepos
= demuxer
->filepos
;
2647 for (i
= 0; i
< laces
; i
++) {
2648 if (ds
== demuxer
->video
&& track
->realmedia
)
2649 handle_realvideo(demuxer
, track
, block
, lace_size
[i
],
2651 else if (ds
== demuxer
->audio
&& track
->realmedia
)
2652 handle_realaudio(demuxer
, track
, block
, lace_size
[i
],
2654 else if (ds
== demuxer
->video
&& track
->reorder_timecodes
)
2655 handle_video_bframes(demuxer
, track
, block
, lace_size
[i
],
2656 block_bref
, block_fref
);
2658 int modified
, size
= lace_size
[i
];
2661 modified
= demux_mkv_decode(track
, block
, &buffer
, &size
, 1);
2663 dp
= new_demux_packet(size
);
2664 memcpy(dp
->buffer
, buffer
, size
);
2667 dp
->flags
= (block_bref
== 0
2668 && block_fref
== 0) ? 0x10 : 0;
2669 /* If default_duration is 0, assume no pts value is known
2670 * for packets after the first one (rather than all pts
2671 * values being the same) */
2672 if (i
== 0 || track
->default_duration
)
2674 mkv_d
->last_pts
+ i
* track
->default_duration
;
2675 ds_add_packet(ds
, dp
);
2678 block
+= lace_size
[i
];
2681 if (ds
== demuxer
->video
) {
2682 mkv_d
->v_skip_to_keyframe
= 0;
2683 mkv_d
->skip_to_timecode
= 0;
2684 } else if (ds
== demuxer
->audio
)
2685 mkv_d
->a_skip_to_keyframe
= 0;
2695 static int demux_mkv_fill_buffer(demuxer_t
*demuxer
, demux_stream_t
*ds
)
2697 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2698 stream_t
*s
= demuxer
->stream
;
2703 while (mkv_d
->cluster_size
> 0) {
2704 uint64_t block_duration
= 0, block_length
= 0;
2705 int64_t block_bref
= 0, block_fref
= 0;
2706 uint8_t *block
= NULL
;
2708 while (mkv_d
->blockgroup_size
> 0) {
2709 switch (ebml_read_id(s
, &il
)) {
2710 case MATROSKA_ID_BLOCKDURATION
:
2711 block_duration
= ebml_read_uint(s
, &l
);
2712 if (block_duration
== EBML_UINT_INVALID
) {
2717 block_duration
* mkv_d
->tc_scale
/ 1000000.0 + 0.5;
2720 case MATROSKA_ID_BLOCK
:
2721 block_length
= ebml_read_length(s
, &tmp
);
2723 if (block_length
> SIZE_MAX
- AV_LZO_INPUT_PADDING
)
2725 block
= malloc(block_length
+ AV_LZO_INPUT_PADDING
);
2726 demuxer
->filepos
= stream_tell(s
);
2727 if (stream_read(s
, block
, block_length
) !=
2728 (int) block_length
) {
2732 l
= tmp
+ block_length
;
2735 case MATROSKA_ID_REFERENCEBLOCK
:;
2736 int64_t num
= ebml_read_int(s
, &l
);
2737 if (num
== EBML_INT_INVALID
) {
2747 case EBML_ID_INVALID
:
2752 ebml_read_skip(s
, &l
);
2755 mkv_d
->blockgroup_size
-= l
+ il
;
2756 mkv_d
->cluster_size
-= l
+ il
;
2760 int res
= handle_block(demuxer
, block
, block_length
,
2761 block_duration
, block_bref
, block_fref
,
2770 if (mkv_d
->cluster_size
> 0) {
2771 switch (ebml_read_id(s
, &il
)) {
2772 case MATROSKA_ID_TIMECODE
:;
2773 uint64_t num
= ebml_read_uint(s
, &l
);
2774 if (num
== EBML_UINT_INVALID
)
2776 mkv_d
->cluster_tc
= num
* mkv_d
->tc_scale
;
2777 add_cluster_position(mkv_d
, mkv_d
->cluster_start
,
2781 case MATROSKA_ID_BLOCKGROUP
:
2782 mkv_d
->blockgroup_size
= ebml_read_length(s
, &tmp
);
2786 case MATROSKA_ID_SIMPLEBLOCK
:;
2788 block_length
= ebml_read_length(s
, &tmp
);
2789 block
= malloc(block_length
);
2790 demuxer
->filepos
= stream_tell(s
);
2791 if (stream_read(s
, block
, block_length
) !=
2792 (int) block_length
) {
2796 l
= tmp
+ block_length
;
2797 res
= handle_block(demuxer
, block
, block_length
,
2798 block_duration
, block_bref
,
2801 mkv_d
->cluster_size
-= l
+ il
;
2807 mkv_d
->cluster_size
+= l
+ il
;
2810 case EBML_ID_INVALID
:
2814 ebml_read_skip(s
, &l
);
2817 mkv_d
->cluster_size
-= l
+ il
;
2821 if (ebml_read_id(s
, &il
) != MATROSKA_ID_CLUSTER
)
2823 mkv_d
->cluster_start
= stream_tell(s
) - il
;
2824 mkv_d
->cluster_size
= ebml_read_length(s
, NULL
);
2830 static void demux_mkv_seek(demuxer_t
*demuxer
, float rel_seek_secs
,
2831 float audio_delay
, int flags
)
2833 if (!(flags
& (SEEK_BACKWARD
| SEEK_FORWARD
))) {
2834 if (flags
& SEEK_ABSOLUTE
|| rel_seek_secs
< 0)
2835 flags
|= SEEK_BACKWARD
;
2837 flags
|= SEEK_FORWARD
;
2839 // Adjust the target a little bit to catch cases where the target position
2840 // specifies a keyframe with high, but not perfect, precision.
2841 rel_seek_secs
+= flags
& SEEK_FORWARD
? -0.005 : 0.005;
2843 free_cached_dps(demuxer
);
2844 if (!(flags
& SEEK_FACTOR
)) { /* time in secs */
2845 mkv_index_t
*index
= NULL
;
2846 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2847 stream_t
*s
= demuxer
->stream
;
2848 int64_t target_timecode
= 0, diff
, min_diff
= 0xFFFFFFFFFFFFFFFLL
;
2851 if (!(flags
& SEEK_ABSOLUTE
)) /* relative seek */
2852 target_timecode
= (int64_t) (mkv_d
->last_pts
* 1000.0);
2853 target_timecode
+= (int64_t) (rel_seek_secs
* 1000.0);
2854 if (target_timecode
< 0)
2855 target_timecode
= 0;
2857 if (mkv_d
->indexes
== NULL
) { /* no index was found */
2858 int64_t target_tc_ns
= (int64_t) (rel_seek_secs
* 1e9
);
2859 if (target_tc_ns
< 0)
2861 uint64_t max_filepos
= 0;
2862 int64_t max_tc
= -1;
2863 int n
= mkv_d
->num_cluster_pos
;
2865 max_filepos
= mkv_d
->cluster_positions
[n
- 1].filepos
;
2866 max_tc
= mkv_d
->cluster_positions
[n
- 1].timecode
;
2869 if (target_tc_ns
> max_tc
) {
2870 if ((off_t
) max_filepos
> stream_tell(s
))
2871 stream_seek(s
, max_filepos
);
2873 stream_seek(s
, stream_tell(s
) + mkv_d
->cluster_size
);
2874 /* parse all the clusters upto target_filepos */
2876 uint64_t start
= stream_tell(s
);
2877 uint32_t type
= ebml_read_id(s
, NULL
);
2878 uint64_t len
= ebml_read_length(s
, NULL
);
2879 uint64_t end
= stream_tell(s
) + len
;
2880 if (type
== MATROSKA_ID_CLUSTER
) {
2881 while (!s
->eof
&& stream_tell(s
) < end
) {
2882 if (ebml_read_id(s
, NULL
)
2883 == MATROSKA_ID_TIMECODE
) {
2884 uint64_t tc
= ebml_read_uint(s
, NULL
);
2885 tc
*= mkv_d
->tc_scale
;
2886 add_cluster_position(mkv_d
, start
, tc
);
2887 if (tc
>= target_tc_ns
)
2893 stream_seek(s
, end
);
2899 if (!mkv_d
->num_cluster_pos
) {
2900 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] no target for seek found\n");
2903 uint64_t cluster_pos
= mkv_d
->cluster_positions
[0].filepos
;
2904 /* Let's find the nearest cluster */
2905 for (i
= 0; i
< mkv_d
->num_cluster_pos
; i
++) {
2906 diff
= mkv_d
->cluster_positions
[i
].timecode
- target_tc_ns
;
2907 if (flags
& SEEK_BACKWARD
&& diff
< 0 && -diff
< min_diff
) {
2908 cluster_pos
= mkv_d
->cluster_positions
[i
].filepos
;
2910 } else if (flags
& SEEK_FORWARD
2911 && (diff
< 0 ? -1 * diff
: diff
) < min_diff
) {
2912 cluster_pos
= mkv_d
->cluster_positions
[i
].filepos
;
2913 min_diff
= diff
< 0 ? -1 * diff
: diff
;
2916 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
2917 stream_seek(s
, cluster_pos
);
2919 int seek_id
= (demuxer
->video
->id
< 0) ?
2920 demuxer
->audio
->id
: demuxer
->video
->id
;
2922 /* let's find the entry in the indexes with the smallest */
2923 /* difference to the wanted timecode. */
2924 for (i
= 0; i
< mkv_d
->num_indexes
; i
++)
2925 if (mkv_d
->indexes
[i
].tnum
== seek_id
) {
2928 (int64_t) (mkv_d
->indexes
[i
].timecode
*
2929 mkv_d
->tc_scale
/ 1000000.0 + 0.5);
2931 if (flags
& SEEK_BACKWARD
) {
2932 // Seek backward: find the last index position
2933 // before target time
2934 if (diff
< 0 || diff
>= min_diff
)
2937 // Seek forward: find the first index position
2938 // after target time. If no such index exists, find last
2939 // position between current position and target time.
2941 if (min_diff
<= 0 && diff
<= min_diff
)
2944 FFMIN(target_timecode
- mkv_d
->last_pts
,
2949 index
= mkv_d
->indexes
+ i
;
2952 if (index
) { /* We've found an entry. */
2953 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
2954 stream_seek(s
, index
->filepos
);
2958 if (demuxer
->video
->id
>= 0)
2959 mkv_d
->v_skip_to_keyframe
= 1;
2960 if (flags
& SEEK_FORWARD
)
2961 mkv_d
->skip_to_timecode
= target_timecode
;
2963 mkv_d
->skip_to_timecode
= index
? index
->timecode
: 0;
2964 mkv_d
->a_skip_to_keyframe
= 1;
2966 demux_mkv_fill_buffer(demuxer
, NULL
);
2967 } else if ((demuxer
->movi_end
<= 0) || !(flags
& SEEK_ABSOLUTE
))
2968 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
2970 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2971 stream_t
*s
= demuxer
->stream
;
2972 uint64_t target_filepos
;
2973 mkv_index_t
*index
= NULL
;
2976 if (mkv_d
->indexes
== NULL
) { /* not implemented without index */
2977 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
2981 target_filepos
= (uint64_t) (demuxer
->movi_end
* rel_seek_secs
);
2982 for (i
= 0; i
< mkv_d
->num_indexes
; i
++)
2983 if (mkv_d
->indexes
[i
].tnum
== demuxer
->video
->id
)
2985 || ((mkv_d
->indexes
[i
].filepos
>= target_filepos
)
2986 && ((index
->filepos
< target_filepos
)
2987 || (mkv_d
->indexes
[i
].filepos
< index
->filepos
))))
2988 index
= &mkv_d
->indexes
[i
];
2993 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
2994 stream_seek(s
, index
->filepos
);
2996 if (demuxer
->video
->id
>= 0)
2997 mkv_d
->v_skip_to_keyframe
= 1;
2998 mkv_d
->skip_to_timecode
= index
->timecode
;
2999 mkv_d
->a_skip_to_keyframe
= 1;
3001 demux_mkv_fill_buffer(demuxer
, NULL
);
3005 static int demux_mkv_control(demuxer_t
*demuxer
, int cmd
, void *arg
)
3007 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3010 case DEMUXER_CTRL_CORRECT_PTS
:
3011 return DEMUXER_CTRL_OK
;
3012 case DEMUXER_CTRL_GET_TIME_LENGTH
:
3013 if (mkv_d
->duration
== 0)
3014 return DEMUXER_CTRL_DONTKNOW
;
3016 *((double *) arg
) = (double) mkv_d
->duration
;
3017 return DEMUXER_CTRL_OK
;
3019 case DEMUXER_CTRL_GET_PERCENT_POS
:
3020 if (mkv_d
->duration
== 0) {
3021 return DEMUXER_CTRL_DONTKNOW
;
3024 *((int *) arg
) = (int) (100 * mkv_d
->last_pts
/ mkv_d
->duration
);
3025 return DEMUXER_CTRL_OK
;
3027 case DEMUXER_CTRL_SWITCH_AUDIO
:
3028 if (demuxer
->audio
&& demuxer
->audio
->sh
) {
3029 sh_audio_t
*sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3030 int aid
= *(int *) arg
;
3032 aid
= (sh
->aid
+ 1) % mkv_d
->last_aid
;
3033 if (aid
!= sh
->aid
) {
3034 mkv_track_t
*track
=
3035 demux_mkv_find_track_by_num(mkv_d
, aid
,
3036 MATROSKA_TRACK_AUDIO
);
3038 demuxer
->audio
->id
= track
->tnum
;
3039 sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3040 ds_free_packs(demuxer
->audio
);
3043 *(int *) arg
= sh
->aid
;
3046 return DEMUXER_CTRL_OK
;
3049 return DEMUXER_CTRL_NOTIMPL
;
3053 const demuxer_desc_t demuxer_desc_matroska
= {
3059 DEMUXER_TYPE_MATROSKA
,
3060 1, // safe autodetect
3062 demux_mkv_fill_buffer
,