2 * native Matroska demuxer
3 * Written by 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.
17 #include "stream/stream.h"
27 #include "subreader.h"
28 #include "libvo/sub.h"
30 #include "libass/ass.h"
31 #include "libass/ass_mp.h"
33 #include "libavutil/common.h"
36 #include "loader/qtx/qtxsdk/components.h"
43 #include "libavutil/lzo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/avstring.h"
47 static const unsigned char sipr_swaps
[38][2]={
48 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
49 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
50 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
51 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
54 // Map flavour to bytes per second
55 #define SIPR_FLAVORS 4
56 #define ATRC_FLAVORS 8
57 #define COOK_FLAVORS 34
58 static const int sipr_fl2bps
[SIPR_FLAVORS
] = {813, 1062, 625, 2000};
59 static const int atrc_fl2bps
[ATRC_FLAVORS
] = {8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100};
60 static const int cook_fl2bps
[COOK_FLAVORS
] = {
61 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
62 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
63 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
64 12016, 16408, 22911, 33506};
68 uint32_t order
, type
, scope
;
70 uint8_t *comp_settings
;
71 int comp_settings_len
;
72 } mkv_content_encoding_t
;
74 typedef struct mkv_track
85 uint32_t v_width
, v_height
, v_dwidth
, v_dheight
;
89 uint32_t a_channels
, a_bps
;
92 float default_duration
;
96 unsigned char *private_data
;
97 unsigned int private_size
;
99 /* stuff for realmedia */
101 int rv_kf_base
, rv_kf_pts
;
102 float rv_pts
; /* previous video timestamp */
103 float ra_pts
; /* previous audio timestamp */
105 /** realaudio descrambling */
106 int sub_packet_size
; ///< sub packet size, per stream
107 int sub_packet_h
; ///< number of coded frames per block
108 int coded_framesize
; ///< coded frame size, per stream
109 int audiopk_size
; ///< audio packet size
110 unsigned char *audio_buf
; ///< place to store reordered audio data
111 float *audio_timestamp
; ///< timestamp for each audio packet
112 int sub_packet_cnt
; ///< number of subpacket already received
113 int audio_filepos
; ///< file position of first audio packet in block
115 /* stuff for quicktime */
121 /* The timecodes of video frames might have to be reordered if they're
122 in display order (the timecodes, not the frames themselves!). In this
123 case demux packets have to be cached with the help of these variables. */
124 int reorder_timecodes
;
125 demux_packet_t
**cached_dps
;
126 int num_cached_dps
, num_allocated_dps
;
129 /* generic content encoding support */
130 mkv_content_encoding_t
*encodings
;
133 /* For VobSubs and SSA/ASS */
137 typedef struct mkv_index
140 uint64_t timecode
, filepos
;
143 typedef struct mkv_demuxer
147 float duration
, last_pts
;
148 uint64_t last_filepos
;
150 mkv_track_t
**tracks
;
153 uint64_t tc_scale
, cluster_tc
, first_tc
;
156 uint64_t cluster_size
;
157 uint64_t blockgroup_size
;
159 mkv_index_t
*indexes
;
164 off_t
*parsed_seekhead
;
165 int parsed_seekhead_num
;
167 uint64_t *cluster_positions
;
170 int64_t skip_to_timecode
;
171 int v_skip_to_keyframe
, a_skip_to_keyframe
;
173 int64_t stop_timecode
;
176 int audio_tracks
[MAX_A_STREAMS
];
179 #define REALHEADER_SIZE 16
180 #define RVPROPERTIES_SIZE 34
181 #define RAPROPERTIES4_SIZE 56
182 #define RAPROPERTIES5_SIZE 70
185 * \brief ensures there is space for at least one additional element
186 * \param array array to grow
187 * \param nelem current number of elements in array
188 * \param elsize size of one array element
190 static void *grow_array(void *array
, int nelem
, size_t elsize
) {
192 array
= realloc(array
, (nelem
+ 32) * elsize
);
197 demux_mkv_find_track_by_num (mkv_demuxer_t
*d
, int n
, int type
)
201 for (i
=0, id
=0; i
< d
->num_tracks
; i
++)
202 if (d
->tracks
[i
] != NULL
&& d
->tracks
[i
]->type
== type
)
210 add_cluster_position (mkv_demuxer_t
*mkv_d
, uint64_t position
)
212 int i
= mkv_d
->num_cluster_pos
;
215 if (mkv_d
->cluster_positions
[i
] == position
)
218 mkv_d
->cluster_positions
= grow_array(mkv_d
->cluster_positions
,
219 mkv_d
->num_cluster_pos
,
221 mkv_d
->cluster_positions
[mkv_d
->num_cluster_pos
++] = position
;
225 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
227 aac_get_sample_rate_index (uint32_t sample_rate
)
229 if (92017 <= sample_rate
)
231 else if (75132 <= sample_rate
)
233 else if (55426 <= sample_rate
)
235 else if (46009 <= sample_rate
)
237 else if (37566 <= sample_rate
)
239 else if (27713 <= sample_rate
)
241 else if (23004 <= sample_rate
)
243 else if (18783 <= sample_rate
)
245 else if (13856 <= sample_rate
)
247 else if (11502 <= sample_rate
)
249 else if (9391 <= sample_rate
)
257 vobsub_parse_size (sh_sub_t
*sh
, const char *start
)
259 if (sscanf(&start
[6], "%dx%d", &sh
->width
, &sh
->height
) == 2)
261 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] VobSub size: %ux%u\n",
262 sh
->width
, sh
->height
);
269 vobsub_parse_palette (sh_sub_t
*sh
, const char *start
)
274 while (isspace(*start
))
276 for (i
= 0; i
< 16; i
++)
279 if (sscanf(start
, "%06x", &tmp
) != 1)
281 sh
->palette
[i
] = vobsub_palette_to_yuv(tmp
);
283 while ((*start
== ',') || isspace(*start
))
288 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] VobSub palette: %06x,%06x,"
289 "%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,"
290 "%06x,%06x,%06x\n", sh
->palette
[0],
291 sh
->palette
[1], sh
->palette
[2],
292 sh
->palette
[3], sh
->palette
[4],
293 sh
->palette
[5], sh
->palette
[6],
294 sh
->palette
[7], sh
->palette
[8],
295 sh
->palette
[9], sh
->palette
[10],
296 sh
->palette
[11], sh
->palette
[12],
297 sh
->palette
[13], sh
->palette
[14],
306 vobsub_parse_custom_colors (sh_sub_t
*sh
, const char *start
)
308 int use_custom_colors
, i
;
310 unsigned int tridx
= 0;
312 use_custom_colors
= 0;
314 while (isspace(*start
))
316 if (!strncasecmp(start
, "ON", 2) || (*start
== '1'))
317 use_custom_colors
= 1;
318 else if (!strncasecmp(start
, "OFF", 3) || (*start
== '0'))
319 use_custom_colors
= 0;
320 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] VobSub custom colors: %s\n",
321 use_custom_colors
? "ON" : "OFF");
322 if ((p
= strstr(start
, "tridx:")) != NULL
)
323 tridx
= strtoul(p
+ 6, NULL
, 2);
324 if ((start
= strstr(start
, "colors:")) != NULL
)
327 while (isspace(*start
))
329 for (i
= 0; i
< 4; i
++)
332 if (sscanf(start
, "%06x", &tmp
) != 1)
334 sh
->colors
[i
] = vobsub_rgb_to_yuv(tmp
);
335 if ((tridx
<< i
) & 0x08)
336 sh
->colors
[i
] |= 1 << 31;
338 while ((*start
== ',') || isspace(*start
))
343 sh
->custom_colors
= 4;
344 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] VobSub colors: %08x,"
345 "%08x,%08x,%08x\n", sh
->colors
[0],
346 sh
->colors
[1], sh
->colors
[2],
350 if (!use_custom_colors
)
351 sh
->custom_colors
= 0;
356 vobsub_parse_forced_subs (sh_sub_t
*sh
, const char *start
)
359 while (isspace(*start
))
361 if (!strncasecmp(start
, "on", 2) || (*start
== '1'))
362 sh
->forced_subs_only
= 1;
363 else if (!strncasecmp(start
, "off", 3) || (*start
== '0'))
364 sh
->forced_subs_only
= 0;
367 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] VobSub forced subs: %d\n",
368 sh
->forced_subs_only
);
372 /** \brief Free cached demux packets
374 * Reordering the timecodes requires caching of demux packets. This function
375 * frees all these cached packets and the memory for the cached pointers
378 * \param demuxer The demuxer for which the cache is to be freed.
381 free_cached_dps (demuxer_t
*demuxer
)
383 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
387 for (k
= 0; k
< mkv_d
->num_tracks
; k
++)
389 track
= mkv_d
->tracks
[k
];
390 for (i
= 0; i
< track
->num_cached_dps
; i
++)
391 free_demux_packet (track
->cached_dps
[i
]);
392 free(track
->cached_dps
);
393 track
->cached_dps
= NULL
;
394 track
->num_cached_dps
= 0;
395 track
->num_allocated_dps
= 0;
401 demux_mkv_parse_idx (mkv_track_t
*t
)
403 int things_found
, last
;
404 char *buf
, *pos
, *start
;
406 if ((t
->private_data
== NULL
) || (t
->private_size
== 0))
410 buf
= malloc(t
->private_size
+ 1);
413 memcpy(buf
, t
->private_data
, t
->private_size
);
414 buf
[t
->private_size
] = 0;
415 t
->sh_sub
->has_palette
= 0;
422 if ((*pos
== 0) || (*pos
== '\r') || (*pos
== '\n'))
428 if (!strncasecmp(start
, "size: ", 6))
429 things_found
|= vobsub_parse_size(t
->sh_sub
, start
);
430 else if (!strncasecmp(start
, "palette:", 8))
431 things_found
|= vobsub_parse_palette(t
->sh_sub
, start
);
432 else if (!strncasecmp(start
, "custom colors:", 14))
433 things_found
|= vobsub_parse_custom_colors(t
->sh_sub
, start
);
434 else if (!strncasecmp(start
, "forced subs:", 12))
435 things_found
|= vobsub_parse_forced_subs(t
->sh_sub
, start
);
443 while ((*pos
== '\r') || (*pos
== '\n'));
449 while (!last
&& (*start
!= 0));
453 return (things_found
& 3) == 3;
458 demux_mkv_decode (mkv_track_t
*track
, uint8_t *src
, uint8_t **dest
,
459 uint32_t *size
, uint32_t type
)
465 if (track
->num_encodings
<= 0)
468 for (i
=0; i
<track
->num_encodings
; i
++)
470 if (!(track
->encodings
[i
].scope
& type
))
474 if (track
->encodings
[i
].comp_algo
== 0)
476 /* zlib encoded track */
479 zstream
.zalloc
= (alloc_func
) 0;
480 zstream
.zfree
= (free_func
) 0;
481 zstream
.opaque
= (voidpf
) 0;
482 if (inflateInit (&zstream
) != Z_OK
)
484 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
485 MSGTR_MPDEMUX_MKV_ZlibInitializationFailed
);
488 zstream
.next_in
= (Bytef
*) src
;
489 zstream
.avail_in
= *size
;
493 zstream
.avail_out
= *size
;
496 *dest
= realloc (*dest
, *size
);
497 zstream
.next_out
= (Bytef
*) (*dest
+ zstream
.total_out
);
498 result
= inflate (&zstream
, Z_NO_FLUSH
);
499 if (result
!= Z_OK
&& result
!= Z_STREAM_END
)
501 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
502 MSGTR_MPDEMUX_MKV_ZlibDecompressionFailed
);
505 inflateEnd (&zstream
);
508 zstream
.avail_out
+= 4000;
509 } while (zstream
.avail_out
== 4000 &&
510 zstream
.avail_in
!= 0 && result
!= Z_STREAM_END
);
512 *size
= zstream
.total_out
;
513 inflateEnd (&zstream
);
516 if (track
->encodings
[i
].comp_algo
== 2)
518 /* lzo encoded track */
519 int dstlen
= *size
* 3;
525 if (dstlen
> SIZE_MAX
- LZO_OUTPUT_PADDING
) goto lzo_fail
;
526 *dest
= realloc (*dest
, dstlen
+ LZO_OUTPUT_PADDING
);
527 result
= lzo1x_decode (*dest
, &dstlen
, src
, &srclen
);
530 if (!(result
& LZO_OUTPUT_FULL
))
533 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
534 MSGTR_MPDEMUX_MKV_LzoDecompressionFailed
);
539 mp_msg (MSGT_DEMUX
, MSGL_DBG2
,
540 "[mkv] lzo decompression buffer too small.\n");
552 demux_mkv_read_info (demuxer_t
*demuxer
)
554 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
555 stream_t
*s
= demuxer
->stream
;
558 uint64_t tc_scale
= 1000000;
559 long double duration
= 0.;
561 length
= ebml_read_length (s
, NULL
);
564 switch (ebml_read_id (s
, &il
))
566 case MATROSKA_ID_TIMECODESCALE
:
568 uint64_t num
= ebml_read_uint (s
, &l
);
569 if (num
== EBML_UINT_INVALID
)
572 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + timecode scale: %"PRIu64
"\n",
577 case MATROSKA_ID_DURATION
:
579 long double num
= ebml_read_float (s
, &l
);
580 if (num
== EBML_FLOAT_INVALID
)
583 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + duration: %.3Lfs\n",
584 duration
* tc_scale
/ 1000000000.0);
589 ebml_read_skip (s
, &l
);
594 mkv_d
->tc_scale
= tc_scale
;
595 mkv_d
->duration
= duration
* tc_scale
/ 1000000000.0;
600 * \brief free array of kv_content_encoding_t
601 * \param encodings pointer to array
602 * \param numencodings number of encodings in array
605 demux_mkv_free_encodings(mkv_content_encoding_t
*encodings
, int numencodings
)
607 while (numencodings
-- > 0)
608 free(encodings
[numencodings
].comp_settings
);
613 demux_mkv_read_trackencodings (demuxer_t
*demuxer
, mkv_track_t
*track
)
615 stream_t
*s
= demuxer
->stream
;
616 mkv_content_encoding_t
*ce
, e
;
617 uint64_t len
, length
, l
;
620 ce
= malloc (sizeof (*ce
));
623 len
= length
= ebml_read_length (s
, &il
);
627 switch (ebml_read_id (s
, &il
))
629 case MATROSKA_ID_CONTENTENCODING
:
634 memset (&e
, 0, sizeof (e
));
637 len
= ebml_read_length (s
, &i
);
645 switch (ebml_read_id (s
, &il
))
647 case MATROSKA_ID_CONTENTENCODINGORDER
:
648 num
= ebml_read_uint (s
, &l
);
649 if (num
== EBML_UINT_INVALID
)
654 case MATROSKA_ID_CONTENTENCODINGSCOPE
:
655 num
= ebml_read_uint (s
, &l
);
656 if (num
== EBML_UINT_INVALID
)
661 case MATROSKA_ID_CONTENTENCODINGTYPE
:
662 num
= ebml_read_uint (s
, &l
);
663 if (num
== EBML_UINT_INVALID
)
668 case MATROSKA_ID_CONTENTCOMPRESSION
:
672 le
= ebml_read_length (s
, &i
);
680 switch (ebml_read_id (s
, &il
))
682 case MATROSKA_ID_CONTENTCOMPALGO
:
683 num
= ebml_read_uint (s
, &l
);
684 if (num
== EBML_UINT_INVALID
)
689 case MATROSKA_ID_CONTENTCOMPSETTINGS
:
690 l
= ebml_read_length (s
, &i
);
691 e
.comp_settings
= malloc (l
);
692 stream_read (s
, e
.comp_settings
, l
);
693 e
.comp_settings_len
= l
;
698 ebml_read_skip (s
, &l
);
706 mp_msg(MSGT_DEMUX
, MSGL_WARN
,
707 MSGTR_MPDEMUX_MKV_TrackEncrypted
, track
->tnum
);
709 else if (e
.type
!= 0)
711 mp_msg(MSGT_DEMUX
, MSGL_WARN
,
712 MSGTR_MPDEMUX_MKV_UnknownContentEncoding
, track
->tnum
);
715 if (e
.comp_algo
!= 0 && e
.comp_algo
!= 2)
717 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
718 MSGTR_MPDEMUX_MKV_UnknownCompression
,
719 track
->tnum
, e
.comp_algo
);
722 else if (e
.comp_algo
== 0)
724 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
725 MSGTR_MPDEMUX_MKV_ZlibCompressionUnsupported
,
734 ebml_read_skip (s
, &l
);
740 if (e
.order
<= ce
[i
].order
)
742 ce
= realloc (ce
, (n
+1) *sizeof (*ce
));
743 memmove (ce
+i
+1, ce
+i
, (n
-i
) * sizeof (*ce
));
744 memcpy (ce
+i
, &e
, sizeof (e
));
750 ebml_read_skip (s
, &l
);
757 track
->encodings
= ce
;
758 track
->num_encodings
= n
;
762 demux_mkv_free_encodings(ce
, n
);
767 demux_mkv_read_trackaudio (demuxer_t
*demuxer
, mkv_track_t
*track
)
769 stream_t
*s
= demuxer
->stream
;
770 uint64_t len
, length
, l
;
773 track
->a_sfreq
= 8000.0;
774 track
->a_channels
= 1;
776 len
= length
= ebml_read_length (s
, &il
);
780 switch (ebml_read_id (s
, &il
))
782 case MATROSKA_ID_AUDIOSAMPLINGFREQ
:
784 long double num
= ebml_read_float (s
, &l
);
785 if (num
== EBML_FLOAT_INVALID
)
787 track
->a_sfreq
= num
;
788 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Sampling frequency: %f\n",
793 case MATROSKA_ID_AUDIOBITDEPTH
:
795 uint64_t num
= ebml_read_uint (s
, &l
);
796 if (num
== EBML_UINT_INVALID
)
799 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Bit depth: %u\n",
804 case MATROSKA_ID_AUDIOCHANNELS
:
806 uint64_t num
= ebml_read_uint (s
, &l
);
807 if (num
== EBML_UINT_INVALID
)
809 track
->a_channels
= num
;
810 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Channels: %u\n",
816 ebml_read_skip (s
, &l
);
825 demux_mkv_read_trackvideo (demuxer_t
*demuxer
, mkv_track_t
*track
)
827 stream_t
*s
= demuxer
->stream
;
828 uint64_t len
, length
, l
;
831 len
= length
= ebml_read_length (s
, &il
);
835 switch (ebml_read_id (s
, &il
))
837 case MATROSKA_ID_VIDEOFRAMERATE
:
839 long double num
= ebml_read_float (s
, &l
);
840 if (num
== EBML_FLOAT_INVALID
)
842 track
->v_frate
= num
;
843 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Frame rate: %f\n",
845 if (track
->v_frate
> 0)
846 track
->default_duration
= 1 / track
->v_frate
;
850 case MATROSKA_ID_VIDEODISPLAYWIDTH
:
852 uint64_t num
= ebml_read_uint (s
, &l
);
853 if (num
== EBML_UINT_INVALID
)
855 track
->v_dwidth
= num
;
856 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display width: %u\n",
861 case MATROSKA_ID_VIDEODISPLAYHEIGHT
:
863 uint64_t num
= ebml_read_uint (s
, &l
);
864 if (num
== EBML_UINT_INVALID
)
866 track
->v_dheight
= num
;
867 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display height: %u\n",
872 case MATROSKA_ID_VIDEOPIXELWIDTH
:
874 uint64_t num
= ebml_read_uint (s
, &l
);
875 if (num
== EBML_UINT_INVALID
)
877 track
->v_width
= num
;
878 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel width: %u\n",
883 case MATROSKA_ID_VIDEOPIXELHEIGHT
:
885 uint64_t num
= ebml_read_uint (s
, &l
);
886 if (num
== EBML_UINT_INVALID
)
888 track
->v_height
= num
;
889 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel height: %u\n",
895 ebml_read_skip (s
, &l
);
904 * \brief free any data associated with given track
905 * \param track track of which to free data
908 demux_mkv_free_trackentry(mkv_track_t
*track
) {
910 free (track
->codec_id
);
911 free (track
->language
);
912 free (track
->private_data
);
913 free (track
->audio_buf
);
914 free (track
->audio_timestamp
);
915 demux_mkv_free_encodings(track
->encodings
, track
->num_encodings
);
920 demux_mkv_read_trackentry (demuxer_t
*demuxer
)
922 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
923 stream_t
*s
= demuxer
->stream
;
925 uint64_t len
, length
, l
;
928 track
= calloc (1, sizeof (*track
));
929 /* set default values */
930 track
->default_track
= 1;
932 track
->language
= strdup("eng");
934 len
= length
= ebml_read_length (s
, &il
);
938 switch (ebml_read_id (s
, &il
))
940 case MATROSKA_ID_TRACKNUMBER
:
942 uint64_t num
= ebml_read_uint (s
, &l
);
943 if (num
== EBML_UINT_INVALID
)
946 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track number: %u\n",
951 case MATROSKA_ID_TRACKNAME
:
953 track
->name
= ebml_read_utf8 (s
, &l
);
954 if (track
->name
== NULL
)
956 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Name: %s\n",
961 case MATROSKA_ID_TRACKTYPE
:
963 uint64_t num
= ebml_read_uint (s
, &l
);
964 if (num
== EBML_UINT_INVALID
)
967 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track type: ");
970 case MATROSKA_TRACK_AUDIO
:
971 mp_msg (MSGT_DEMUX
, MSGL_V
, "Audio\n");
973 case MATROSKA_TRACK_VIDEO
:
974 mp_msg (MSGT_DEMUX
, MSGL_V
, "Video\n");
976 case MATROSKA_TRACK_SUBTITLE
:
977 mp_msg (MSGT_DEMUX
, MSGL_V
, "Subtitle\n");
980 mp_msg (MSGT_DEMUX
, MSGL_V
, "unknown\n");
986 case MATROSKA_ID_TRACKAUDIO
:
987 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Audio track\n");
988 l
= demux_mkv_read_trackaudio (demuxer
, track
);
993 case MATROSKA_ID_TRACKVIDEO
:
994 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Video track\n");
995 l
= demux_mkv_read_trackvideo (demuxer
, track
);
1000 case MATROSKA_ID_CODECID
:
1001 track
->codec_id
= ebml_read_ascii (s
, &l
);
1002 if (track
->codec_id
== NULL
)
1004 if (!strcmp (track
->codec_id
, MKV_V_MSCOMP
) ||
1005 !strcmp (track
->codec_id
, MKV_A_ACM
))
1006 track
->ms_compat
= 1;
1007 else if (!strcmp (track
->codec_id
, MKV_S_VOBSUB
))
1008 track
->subtitle_type
= MATROSKA_SUBTYPE_VOBSUB
;
1009 else if (!strcmp (track
->codec_id
, MKV_S_TEXTSSA
)
1010 || !strcmp (track
->codec_id
, MKV_S_TEXTASS
)
1011 || !strcmp (track
->codec_id
, MKV_S_SSA
)
1012 || !strcmp (track
->codec_id
, MKV_S_ASS
))
1014 track
->subtitle_type
= MATROSKA_SUBTYPE_SSA
;
1016 else if (!strcmp (track
->codec_id
, MKV_S_TEXTASCII
))
1017 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
1018 if (!strcmp (track
->codec_id
, MKV_S_TEXTUTF8
))
1020 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
1022 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Codec ID: %s\n",
1026 case MATROSKA_ID_CODECPRIVATE
:
1029 uint64_t num
= ebml_read_length (s
, &x
);
1030 // audit: cheap guard against overflows later..
1031 if (num
> SIZE_MAX
- 1000) return 0;
1033 track
->private_data
= malloc (num
+ LZO_INPUT_PADDING
);
1034 if (stream_read(s
, track
->private_data
, num
) != (int) num
)
1036 track
->private_size
= num
;
1037 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + CodecPrivate, length "
1038 "%u\n", track
->private_size
);
1042 case MATROSKA_ID_TRACKLANGUAGE
:
1043 free(track
->language
);
1044 track
->language
= ebml_read_utf8 (s
, &l
);
1045 if (track
->language
== NULL
)
1047 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Language: %s\n",
1051 case MATROSKA_ID_TRACKFLAGDEFAULT
:
1053 uint64_t num
= ebml_read_uint (s
, &l
);
1054 if (num
== EBML_UINT_INVALID
)
1056 track
->default_track
= num
;
1057 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default flag: %u\n",
1058 track
->default_track
);
1062 case MATROSKA_ID_TRACKDEFAULTDURATION
:
1064 uint64_t num
= ebml_read_uint (s
, &l
);
1065 if (num
== EBML_UINT_INVALID
)
1068 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default duration: 0");
1071 track
->v_frate
= 1000000000.0 / num
;
1072 track
->default_duration
= num
/ 1000000000.0;
1073 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default duration: "
1074 "%.3fms ( = %.3f fps)\n",num
/1000000.0,track
->v_frate
);
1079 case MATROSKA_ID_TRACKENCODINGS
:
1080 l
= demux_mkv_read_trackencodings (demuxer
, track
);
1086 ebml_read_skip (s
, &l
);
1092 mkv_d
->tracks
[mkv_d
->num_tracks
++] = track
;
1096 demux_mkv_free_trackentry(track
);
1101 demux_mkv_read_tracks (demuxer_t
*demuxer
)
1103 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1104 stream_t
*s
= demuxer
->stream
;
1108 mkv_d
->tracks
= malloc (sizeof (*mkv_d
->tracks
));
1109 mkv_d
->num_tracks
= 0;
1111 length
= ebml_read_length (s
, NULL
);
1114 switch (ebml_read_id (s
, &il
))
1116 case MATROSKA_ID_TRACKENTRY
:
1117 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + a track...\n");
1118 mkv_d
->tracks
= realloc (mkv_d
->tracks
,
1119 (mkv_d
->num_tracks
+1)
1120 *sizeof (*mkv_d
->tracks
));
1121 l
= demux_mkv_read_trackentry (demuxer
);
1127 ebml_read_skip (s
, &l
);
1136 demux_mkv_read_cues (demuxer_t
*demuxer
)
1138 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1139 stream_t
*s
= demuxer
->stream
;
1140 uint64_t length
, l
, time
, track
, pos
;
1144 if (index_mode
== 0) {
1145 ebml_read_skip (s
, NULL
);
1148 off
= stream_tell (s
);
1149 for (i
=0; i
<mkv_d
->parsed_cues_num
; i
++)
1150 if (mkv_d
->parsed_cues
[i
] == off
)
1152 ebml_read_skip (s
, NULL
);
1155 mkv_d
->parsed_cues
= realloc (mkv_d
->parsed_cues
,
1156 (mkv_d
->parsed_cues_num
+1)
1158 mkv_d
->parsed_cues
[mkv_d
->parsed_cues_num
++] = off
;
1160 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing cues ] -----------\n");
1161 length
= ebml_read_length (s
, NULL
);
1165 time
= track
= pos
= EBML_UINT_INVALID
;
1167 switch (ebml_read_id (s
, &il
))
1169 case MATROSKA_ID_POINTENTRY
:
1173 len
= ebml_read_length (s
, &i
);
1181 switch (ebml_read_id (s
, &il
))
1183 case MATROSKA_ID_CUETIME
:
1184 time
= ebml_read_uint (s
, &l
);
1187 case MATROSKA_ID_CUETRACKPOSITION
:
1191 le
= ebml_read_length (s
, &i
);
1199 switch (ebml_read_id (s
, &il
))
1201 case MATROSKA_ID_CUETRACK
:
1202 track
= ebml_read_uint (s
, &l
);
1205 case MATROSKA_ID_CUECLUSTERPOSITION
:
1206 pos
= ebml_read_uint (s
, &l
);
1210 ebml_read_skip (s
, &l
);
1219 ebml_read_skip (s
, &l
);
1228 ebml_read_skip (s
, &l
);
1234 if (time
!= EBML_UINT_INVALID
&& track
!= EBML_UINT_INVALID
1235 && pos
!= EBML_UINT_INVALID
)
1237 mkv_d
->indexes
= grow_array(mkv_d
->indexes
, mkv_d
->num_indexes
,
1238 sizeof(mkv_index_t
));
1239 mkv_d
->indexes
[mkv_d
->num_indexes
].tnum
= track
;
1240 mkv_d
->indexes
[mkv_d
->num_indexes
].timecode
= time
;
1241 mkv_d
->indexes
[mkv_d
->num_indexes
].filepos
=mkv_d
->segment_start
+pos
;
1242 mp_msg (MSGT_DEMUX
, MSGL_DBG2
, "[mkv] |+ found cue point "
1243 "for track %"PRIu64
": timecode %"PRIu64
", filepos: %"PRIu64
"\n",
1244 track
, time
, mkv_d
->segment_start
+ pos
);
1245 mkv_d
->num_indexes
++;
1249 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing cues ] -----------\n");
1254 demux_mkv_read_chapters (demuxer_t
*demuxer
)
1256 stream_t
*s
= demuxer
->stream
;
1260 if (demuxer
->chapters
)
1262 ebml_read_skip (s
, NULL
);
1266 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing chapters ] ---------\n");
1267 length
= ebml_read_length (s
, NULL
);
1271 switch (ebml_read_id (s
, &il
))
1273 case MATROSKA_ID_EDITIONENTRY
:
1278 len
= ebml_read_length (s
, &i
);
1286 switch (ebml_read_id (s
, &il
))
1288 case MATROSKA_ID_CHAPTERATOM
:
1290 uint64_t len
, start
=0, end
=0;
1295 len
= ebml_read_length (s
, &i
);
1303 switch (ebml_read_id (s
, &il
))
1305 case MATROSKA_ID_CHAPTERTIMESTART
:
1306 start
= ebml_read_uint (s
, &l
) / 1000000;
1309 case MATROSKA_ID_CHAPTERTIMEEND
:
1310 end
= ebml_read_uint (s
, &l
) / 1000000;
1313 case MATROSKA_ID_CHAPTERDISPLAY
:
1318 len
= ebml_read_length (s
, &i
);
1325 switch (ebml_read_id (s
, &il
))
1327 case MATROSKA_ID_CHAPSTRING
:
1328 name
= ebml_read_utf8 (s
, &l
);
1331 ebml_read_skip (s
, &l
);
1340 ebml_read_skip (s
, &l
);
1347 name
= strdup("(unnamed)");
1349 cid
= demuxer_add_chapter(demuxer
, name
, start
, end
);
1351 mp_msg(MSGT_DEMUX
, MSGL_V
,
1352 "[mkv] Chapter %u from %02d:%02d:%02d."
1353 "%03d to %02d:%02d:%02d.%03d, %s\n",
1355 (int) (start
/ 60 / 60 / 1000),
1356 (int) ((start
/ 60 / 1000) % 60),
1357 (int) ((start
/ 1000) % 60),
1358 (int) (start
% 1000),
1359 (int) (end
/ 60 / 60 / 1000),
1360 (int) ((end
/ 60 / 1000) % 60),
1361 (int) ((end
/ 1000) % 60),
1362 (int) (end
% 1000), name
);
1369 ebml_read_skip (s
, &l
);
1378 ebml_read_skip (s
, &l
);
1385 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing chapters ] ---------\n");
1390 demux_mkv_read_tags (demuxer_t
*demuxer
)
1392 ebml_read_skip (demuxer
->stream
, NULL
);
1397 demux_mkv_read_attachments (demuxer_t
*demuxer
)
1399 stream_t
*s
= demuxer
->stream
;
1403 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing attachments ] ---------\n");
1404 length
= ebml_read_length (s
, NULL
);
1408 switch (ebml_read_id (s
, &il
))
1410 case MATROSKA_ID_ATTACHEDFILE
:
1419 len
= ebml_read_length (s
, &i
);
1422 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + an attachment...\n");
1429 switch (ebml_read_id (s
, &il
))
1431 case MATROSKA_ID_FILENAME
:
1432 name
= ebml_read_utf8 (s
, &l
);
1435 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileName: %s\n",
1439 case MATROSKA_ID_FILEMIMETYPE
:
1440 mime
= ebml_read_ascii (s
, &l
);
1443 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileMimeType: %s\n",
1447 case MATROSKA_ID_FILEDATA
:
1450 uint64_t num
= ebml_read_length (s
, &x
);
1453 data
= malloc (num
);
1454 if (stream_read(s
, data
, num
) != (int) num
)
1460 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileData, length "
1466 ebml_read_skip (s
, &l
);
1472 demuxer_add_attachment(demuxer
, name
, mime
, data
, data_size
);
1473 mp_msg(MSGT_DEMUX
, MSGL_V
,
1474 "[mkv] Attachment: %s, %s, %u bytes\n",
1475 name
, mime
, data_size
);
1480 ebml_read_skip (s
, &l
);
1486 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing attachments ] ---------\n");
1491 demux_mkv_read_seekhead (demuxer_t
*demuxer
)
1493 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1494 stream_t
*s
= demuxer
->stream
;
1495 uint64_t length
, l
, seek_pos
, saved_pos
, num
;
1500 off
= stream_tell (s
);
1501 for (i
=0; i
<mkv_d
->parsed_seekhead_num
; i
++)
1502 if (mkv_d
->parsed_seekhead
[i
] == off
)
1504 ebml_read_skip (s
, NULL
);
1507 mkv_d
->parsed_seekhead
= realloc (mkv_d
->parsed_seekhead
,
1508 (mkv_d
->parsed_seekhead_num
+1)
1510 mkv_d
->parsed_seekhead
[mkv_d
->parsed_seekhead_num
++] = off
;
1512 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing seek head ] ---------\n");
1513 length
= ebml_read_length (s
, NULL
);
1514 /* off now holds the position of the next element after the seek head. */
1515 off
= stream_tell (s
) + length
;
1516 while (length
> 0 && !res
)
1520 seek_pos
= EBML_UINT_INVALID
;
1522 switch (ebml_read_id (s
, &il
))
1524 case MATROSKA_ID_SEEKENTRY
:
1528 len
= ebml_read_length (s
, &i
);
1536 switch (ebml_read_id (s
, &il
))
1538 case MATROSKA_ID_SEEKID
:
1539 num
= ebml_read_uint (s
, &l
);
1540 if (num
!= EBML_UINT_INVALID
)
1544 case MATROSKA_ID_SEEKPOSITION
:
1545 seek_pos
= ebml_read_uint (s
, &l
);
1549 ebml_read_skip (s
, &l
);
1559 ebml_read_skip (s
, &l
);
1564 if (seek_id
== 0 || seek_id
== MATROSKA_ID_CLUSTER
1565 || seek_pos
== EBML_UINT_INVALID
||
1566 ((mkv_d
->segment_start
+ seek_pos
) >= (uint64_t)demuxer
->movi_end
))
1569 saved_pos
= stream_tell (s
);
1570 if (!stream_seek (s
, mkv_d
->segment_start
+ seek_pos
))
1574 if (ebml_read_id (s
, &il
) != seek_id
)
1579 case MATROSKA_ID_CUES
:
1580 if (demux_mkv_read_cues (demuxer
))
1584 case MATROSKA_ID_TAGS
:
1585 if (demux_mkv_read_tags (demuxer
))
1589 case MATROSKA_ID_SEEKHEAD
:
1590 if (demux_mkv_read_seekhead (demuxer
))
1594 case MATROSKA_ID_CHAPTERS
:
1595 if (demux_mkv_read_chapters (demuxer
))
1601 stream_seek (s
, saved_pos
);
1605 /* If there was an error then try to skip this seek head. */
1606 if (stream_seek (s
, off
))
1611 stream_seek (s
, stream_tell (s
) + length
);
1612 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing seek head ] ---------\n");
1617 demux_mkv_open_video (demuxer_t
*demuxer
, mkv_track_t
*track
, int vid
);
1619 demux_mkv_open_audio (demuxer_t
*demuxer
, mkv_track_t
*track
, int aid
);
1621 demux_mkv_open_sub (demuxer_t
*demuxer
, mkv_track_t
*track
, int sid
);
1624 display_create_tracks (demuxer_t
*demuxer
)
1626 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*)demuxer
->priv
;
1627 int i
, vid
=0, aid
=0, sid
=0;
1629 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
1631 char *type
= "unknown", str
[32];
1633 switch (mkv_d
->tracks
[i
]->type
)
1635 case MATROSKA_TRACK_VIDEO
:
1637 demux_mkv_open_video(demuxer
, mkv_d
->tracks
[i
], vid
);
1638 if (mkv_d
->tracks
[i
]->name
)
1639 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VID_%d_NAME=%s\n", vid
, mkv_d
->tracks
[i
]->name
);
1640 sprintf (str
, "-vid %u", vid
++);
1642 case MATROSKA_TRACK_AUDIO
:
1644 demux_mkv_open_audio(demuxer
, mkv_d
->tracks
[i
], aid
);
1645 if (mkv_d
->tracks
[i
]->name
)
1646 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_NAME=%s\n", aid
, mkv_d
->tracks
[i
]->name
);
1647 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_LANG=%s\n", aid
, mkv_d
->tracks
[i
]->language
);
1648 sprintf (str
, "-aid %u, -alang %.5s",aid
++,mkv_d
->tracks
[i
]->language
);
1650 case MATROSKA_TRACK_SUBTITLE
:
1652 demux_mkv_open_sub(demuxer
, mkv_d
->tracks
[i
], sid
);
1653 if (mkv_d
->tracks
[i
]->name
)
1654 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_NAME=%s\n", sid
, mkv_d
->tracks
[i
]->name
);
1655 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_LANG=%s\n", sid
, mkv_d
->tracks
[i
]->language
);
1656 sprintf (str
, "-sid %u, -slang %.5s",sid
++,mkv_d
->tracks
[i
]->language
);
1659 if (mkv_d
->tracks
[i
]->name
)
1660 mp_msg(MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_TrackIDName
,
1661 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
, mkv_d
->tracks
[i
]->name
, str
);
1663 mp_msg(MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_TrackID
,
1664 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
, str
);
1672 } videocodec_info_t
;
1674 static const videocodec_info_t vinfo
[] = {
1675 { MKV_V_MPEG1
, mmioFOURCC('m', 'p', 'g', '1'), 0 },
1676 { MKV_V_MPEG2
, mmioFOURCC('m', 'p', 'g', '2'), 0 },
1677 { MKV_V_MPEG4_SP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1678 { MKV_V_MPEG4_ASP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1679 { MKV_V_MPEG4_AP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1680 { MKV_V_MPEG4_AVC
, mmioFOURCC('a', 'v', 'c', '1'), 1 },
1681 { MKV_V_THEORA
, mmioFOURCC('t', 'h', 'e', 'o'), 1 },
1686 demux_mkv_open_video (demuxer_t
*demuxer
, mkv_track_t
*track
, int vid
)
1688 struct MPOpts
*opts
= demuxer
->opts
;
1689 BITMAPINFOHEADER
*bih
;
1690 void *ImageDesc
= NULL
;
1693 if (track
->ms_compat
) /* MS compatibility mode */
1695 BITMAPINFOHEADER
*src
;
1697 if (track
->private_data
== NULL
1698 || track
->private_size
< sizeof (BITMAPINFOHEADER
))
1701 src
= (BITMAPINFOHEADER
*) track
->private_data
;
1702 bih
= calloc (1, track
->private_size
);
1703 bih
->biSize
= le2me_32 (src
->biSize
);
1704 bih
->biWidth
= le2me_32 (src
->biWidth
);
1705 bih
->biHeight
= le2me_32 (src
->biHeight
);
1706 bih
->biPlanes
= le2me_16 (src
->biPlanes
);
1707 bih
->biBitCount
= le2me_16 (src
->biBitCount
);
1708 bih
->biCompression
= le2me_32 (src
->biCompression
);
1709 bih
->biSizeImage
= le2me_32 (src
->biSizeImage
);
1710 bih
->biXPelsPerMeter
= le2me_32 (src
->biXPelsPerMeter
);
1711 bih
->biYPelsPerMeter
= le2me_32 (src
->biYPelsPerMeter
);
1712 bih
->biClrUsed
= le2me_32 (src
->biClrUsed
);
1713 bih
->biClrImportant
= le2me_32 (src
->biClrImportant
);
1714 memcpy((char *) bih
+ sizeof (BITMAPINFOHEADER
),
1715 (char *) src
+ sizeof (BITMAPINFOHEADER
),
1716 track
->private_size
- sizeof (BITMAPINFOHEADER
));
1718 if (track
->v_width
== 0)
1719 track
->v_width
= bih
->biWidth
;
1720 if (track
->v_height
== 0)
1721 track
->v_height
= bih
->biHeight
;
1725 bih
= calloc (1, sizeof (BITMAPINFOHEADER
));
1726 bih
->biSize
= sizeof (BITMAPINFOHEADER
);
1727 bih
->biWidth
= track
->v_width
;
1728 bih
->biHeight
= track
->v_height
;
1729 bih
->biBitCount
= 24;
1730 bih
->biSizeImage
= bih
->biWidth
* bih
->biHeight
* bih
->biBitCount
/8;
1732 if (track
->private_size
>= RVPROPERTIES_SIZE
1733 && (!strcmp (track
->codec_id
, MKV_V_REALV10
)
1734 || !strcmp (track
->codec_id
, MKV_V_REALV20
)
1735 || !strcmp (track
->codec_id
, MKV_V_REALV30
)
1736 || !strcmp (track
->codec_id
, MKV_V_REALV40
)))
1738 unsigned char *dst
, *src
;
1742 src
= track
->private_data
+ RVPROPERTIES_SIZE
;
1744 cnt
= track
->private_size
- RVPROPERTIES_SIZE
;
1745 bih
= realloc(bih
, sizeof (BITMAPINFOHEADER
)+8+cnt
);
1746 bih
->biSize
= 48+cnt
;
1748 type2
= AV_RB32(src
- 4);
1749 if (type2
== 0x10003000 || type2
== 0x10003001)
1750 bih
->biCompression
=mmioFOURCC('R','V','1','3');
1752 bih
->biCompression
=mmioFOURCC('R','V',track
->codec_id
[9],'0');
1753 dst
= (unsigned char *) (bih
+ 1);
1754 // copy type1 and type2 info from rv properties
1755 memcpy(dst
, src
- 8, 8);
1756 stream_read(demuxer
->stream
, dst
+8, cnt
);
1757 track
->realmedia
= 1;
1759 #ifdef USE_QTX_CODECS
1761 else if (track
->private_size
>= sizeof (ImageDescription
)
1762 && !strcmp(track
->codec_id
, MKV_V_QUICKTIME
))
1764 ImageDescriptionPtr idesc
;
1766 idesc
= (ImageDescriptionPtr
) track
->private_data
;
1767 idesc
->idSize
= be2me_32 (idesc
->idSize
);
1768 idesc
->cType
= be2me_32 (idesc
->cType
);
1769 idesc
->version
= be2me_16 (idesc
->version
);
1770 idesc
->revisionLevel
= be2me_16 (idesc
->revisionLevel
);
1771 idesc
->vendor
= be2me_32 (idesc
->vendor
);
1772 idesc
->temporalQuality
= be2me_32 (idesc
->temporalQuality
);
1773 idesc
->spatialQuality
= be2me_32 (idesc
->spatialQuality
);
1774 idesc
->width
= be2me_16 (idesc
->width
);
1775 idesc
->height
= be2me_16 (idesc
->height
);
1776 idesc
->hRes
= be2me_32 (idesc
->hRes
);
1777 idesc
->vRes
= be2me_32 (idesc
->vRes
);
1778 idesc
->dataSize
= be2me_32 (idesc
->dataSize
);
1779 idesc
->frameCount
= be2me_16 (idesc
->frameCount
);
1780 idesc
->depth
= be2me_16 (idesc
->depth
);
1781 idesc
->clutID
= be2me_16 (idesc
->clutID
);
1783 bih
->biCompression
= idesc
->cType
;
1785 #endif /* USE_QTX_CODECS */
1790 const videocodec_info_t
*vi
= vinfo
;
1791 while (vi
->id
&& strcmp(vi
->id
, track
->codec_id
)) vi
++;
1792 bih
->biCompression
= vi
->fourcc
;
1793 if (vi
->extradata
&& track
->private_data
&& (track
->private_size
> 0))
1795 bih
->biSize
+= track
->private_size
;
1796 bih
= realloc (bih
, bih
->biSize
);
1797 memcpy (bih
+ 1, track
->private_data
, track
->private_size
);
1799 track
->reorder_timecodes
= opts
->user_correct_pts
== 0;
1801 mp_msg (MSGT_DEMUX
,MSGL_WARN
, MSGTR_MPDEMUX_MKV_UnknownCodecID
,
1802 track
->codec_id
, track
->tnum
);
1809 sh_v
= new_sh_video_vid (demuxer
, track
->tnum
, vid
);
1811 sh_v
->format
= sh_v
->bih
->biCompression
;
1812 if (track
->v_frate
== 0.0)
1813 track
->v_frate
= 25.0;
1814 sh_v
->fps
= track
->v_frate
;
1815 sh_v
->frametime
= 1 / track
->v_frate
;
1817 if (!track
->realmedia
)
1819 sh_v
->disp_w
= track
->v_width
;
1820 sh_v
->disp_h
= track
->v_height
;
1821 if (track
->v_dheight
)
1822 sh_v
->aspect
= (float)track
->v_dwidth
/ (float)track
->v_dheight
;
1826 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1827 // disp_w and disp_h from the RealVideo stream contents returned
1828 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1829 // the Matroska file then it has already been set to PixelWidth/Height
1830 // by check_track_information.
1831 sh_v
->disp_w
= track
->v_dwidth
;
1832 sh_v
->disp_h
= track
->v_dheight
;
1834 sh_v
->ImageDesc
= ImageDesc
;
1835 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] Aspect: %f\n", sh_v
->aspect
);
1837 sh_v
->ds
= demuxer
->video
;
1842 demux_mkv_open_audio (demuxer_t
*demuxer
, mkv_track_t
*track
, int aid
)
1844 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1845 sh_audio_t
*sh_a
= new_sh_audio_aid(demuxer
, track
->tnum
, aid
);
1848 mkv_d
->audio_tracks
[mkv_d
->last_aid
] = track
->tnum
;
1850 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
1851 sh_a
->lang
= strdup(track
->language
);
1852 sh_a
->default_track
= track
->default_track
;
1853 sh_a
->ds
= demuxer
->audio
;
1854 sh_a
->wf
= malloc (sizeof (WAVEFORMATEX
));
1855 if (track
->ms_compat
&& (track
->private_size
>= sizeof(WAVEFORMATEX
)))
1857 WAVEFORMATEX
*wf
= (WAVEFORMATEX
*)track
->private_data
;
1858 sh_a
->wf
= realloc(sh_a
->wf
, track
->private_size
);
1859 sh_a
->wf
->wFormatTag
= le2me_16 (wf
->wFormatTag
);
1860 sh_a
->wf
->nChannels
= le2me_16 (wf
->nChannels
);
1861 sh_a
->wf
->nSamplesPerSec
= le2me_32 (wf
->nSamplesPerSec
);
1862 sh_a
->wf
->nAvgBytesPerSec
= le2me_32 (wf
->nAvgBytesPerSec
);
1863 sh_a
->wf
->nBlockAlign
= le2me_16 (wf
->nBlockAlign
);
1864 sh_a
->wf
->wBitsPerSample
= le2me_16 (wf
->wBitsPerSample
);
1865 sh_a
->wf
->cbSize
= track
->private_size
- sizeof(WAVEFORMATEX
);
1866 memcpy(sh_a
->wf
+ 1, wf
+ 1, track
->private_size
- sizeof(WAVEFORMATEX
));
1867 if (track
->a_sfreq
== 0.0)
1868 track
->a_sfreq
= sh_a
->wf
->nSamplesPerSec
;
1869 if (track
->a_channels
== 0)
1870 track
->a_channels
= sh_a
->wf
->nChannels
;
1871 if (track
->a_bps
== 0)
1872 track
->a_bps
= sh_a
->wf
->wBitsPerSample
;
1873 track
->a_formattag
= sh_a
->wf
->wFormatTag
;
1877 memset(sh_a
->wf
, 0, sizeof (WAVEFORMATEX
));
1878 if (!strcmp(track
->codec_id
, MKV_A_MP3
) ||
1879 !strcmp(track
->codec_id
, MKV_A_MP2
))
1880 track
->a_formattag
= 0x0055;
1881 else if (!strncmp(track
->codec_id
, MKV_A_AC3
, strlen(MKV_A_AC3
)))
1882 track
->a_formattag
= 0x2000;
1883 else if (!strcmp(track
->codec_id
, MKV_A_DTS
))
1884 track
->a_formattag
= 0x2001;
1885 else if (!strcmp(track
->codec_id
, MKV_A_PCM
) ||
1886 !strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1887 track
->a_formattag
= 0x0001;
1888 else if (!strcmp(track
->codec_id
, MKV_A_AAC_2MAIN
) ||
1889 !strncmp(track
->codec_id
, MKV_A_AAC_2LC
,
1890 strlen(MKV_A_AAC_2LC
)) ||
1891 !strcmp(track
->codec_id
, MKV_A_AAC_2SSR
) ||
1892 !strcmp(track
->codec_id
, MKV_A_AAC_4MAIN
) ||
1893 !strncmp(track
->codec_id
, MKV_A_AAC_4LC
,
1894 strlen(MKV_A_AAC_4LC
)) ||
1895 !strcmp(track
->codec_id
, MKV_A_AAC_4SSR
) ||
1896 !strcmp(track
->codec_id
, MKV_A_AAC_4LTP
) ||
1897 !strcmp(track
->codec_id
, MKV_A_AAC
))
1898 track
->a_formattag
= mmioFOURCC('M', 'P', '4', 'A');
1899 else if (!strcmp(track
->codec_id
, MKV_A_VORBIS
))
1901 if (track
->private_data
== NULL
)
1903 track
->a_formattag
= mmioFOURCC('v', 'r', 'b', 's');
1905 else if (!strcmp(track
->codec_id
, MKV_A_QDMC
))
1906 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', 'C');
1907 else if (!strcmp(track
->codec_id
, MKV_A_QDMC2
))
1908 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', '2');
1909 else if (!strcmp(track
->codec_id
, MKV_A_WAVPACK
))
1910 track
->a_formattag
= mmioFOURCC('W', 'V', 'P', 'K');
1911 else if (!strcmp(track
->codec_id
, MKV_A_FLAC
))
1913 if (track
->private_data
== NULL
|| track
->private_size
== 0)
1915 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
1916 MSGTR_MPDEMUX_MKV_FlacTrackDoesNotContainValidHeaders
);
1919 track
->a_formattag
= mmioFOURCC ('f', 'L', 'a', 'C');
1921 else if (track
->private_size
>= RAPROPERTIES4_SIZE
)
1923 if (!strcmp(track
->codec_id
, MKV_A_REAL28
))
1924 track
->a_formattag
= mmioFOURCC('2', '8', '_', '8');
1925 else if (!strcmp(track
->codec_id
, MKV_A_REALATRC
))
1926 track
->a_formattag
= mmioFOURCC('a', 't', 'r', 'c');
1927 else if (!strcmp(track
->codec_id
, MKV_A_REALCOOK
))
1928 track
->a_formattag
= mmioFOURCC('c', 'o', 'o', 'k');
1929 else if (!strcmp(track
->codec_id
, MKV_A_REALDNET
))
1930 track
->a_formattag
= mmioFOURCC('d', 'n', 'e', 't');
1931 else if (!strcmp(track
->codec_id
, MKV_A_REALSIPR
))
1932 track
->a_formattag
= mmioFOURCC('s', 'i', 'p', 'r');
1936 mp_msg (MSGT_DEMUX
, MSGL_WARN
, MSGTR_MPDEMUX_MKV_UnknownAudioCodec
,
1937 track
->codec_id
, track
->tnum
);
1938 free_sh_audio(demuxer
, track
->tnum
);
1943 sh_a
->format
= track
->a_formattag
;
1944 sh_a
->wf
->wFormatTag
= track
->a_formattag
;
1945 sh_a
->channels
= track
->a_channels
;
1946 sh_a
->wf
->nChannels
= track
->a_channels
;
1947 sh_a
->samplerate
= (uint32_t) track
->a_sfreq
;
1948 sh_a
->wf
->nSamplesPerSec
= (uint32_t) track
->a_sfreq
;
1949 if (track
->a_bps
== 0)
1951 sh_a
->samplesize
= 2;
1952 sh_a
->wf
->wBitsPerSample
= 16;
1956 sh_a
->samplesize
= track
->a_bps
/ 8;
1957 sh_a
->wf
->wBitsPerSample
= track
->a_bps
;
1959 if (track
->a_formattag
== 0x0055) /* MP3 || MP2 */
1961 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1962 sh_a
->wf
->nBlockAlign
= 1152;
1964 else if ((track
->a_formattag
== 0x2000) || /* AC3 */
1965 (track
->a_formattag
== 0x2001)) /* DTS */
1970 else if (track
->a_formattag
== 0x0001) /* PCM || PCM_BE */
1972 sh_a
->wf
->nAvgBytesPerSec
= sh_a
->channels
* sh_a
->samplerate
*2;
1973 sh_a
->wf
->nBlockAlign
= sh_a
->wf
->nAvgBytesPerSec
;
1974 if (!strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1975 sh_a
->format
= mmioFOURCC('t', 'w', 'o', 's');
1977 else if (!strcmp(track
->codec_id
, MKV_A_QDMC
) ||
1978 !strcmp(track
->codec_id
, MKV_A_QDMC2
))
1980 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1981 sh_a
->wf
->nBlockAlign
= 1486;
1982 track
->fix_i_bps
= 1;
1983 track
->qt_last_a_pts
= 0.0;
1984 if (track
->private_data
!= NULL
)
1986 sh_a
->codecdata
=malloc(track
->private_size
);
1987 memcpy (sh_a
->codecdata
, track
->private_data
,
1988 track
->private_size
);
1989 sh_a
->codecdata_len
= track
->private_size
;
1992 else if (track
->a_formattag
== mmioFOURCC('M', 'P', '4', 'A'))
1994 int profile
, srate_idx
;
1996 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1997 sh_a
->wf
->nBlockAlign
= 1024;
1999 if (!strcmp (track
->codec_id
, MKV_A_AAC
) &&
2000 (NULL
!= track
->private_data
))
2002 sh_a
->codecdata
=malloc(track
->private_size
);
2003 memcpy (sh_a
->codecdata
, track
->private_data
,
2004 track
->private_size
);
2005 sh_a
->codecdata_len
= track
->private_size
;
2009 /* Recreate the 'private data' */
2010 /* which faad2 uses in its initialization */
2011 srate_idx
= aac_get_sample_rate_index (sh_a
->samplerate
);
2012 if (!strncmp (&track
->codec_id
[12], "MAIN", 4))
2014 else if (!strncmp (&track
->codec_id
[12], "LC", 2))
2016 else if (!strncmp (&track
->codec_id
[12], "SSR", 3))
2020 sh_a
->codecdata
= malloc (5);
2021 sh_a
->codecdata
[0] = ((profile
+1) << 3) | ((srate_idx
&0xE) >> 1);
2022 sh_a
->codecdata
[1] = ((srate_idx
&0x1)<<7)|(track
->a_channels
<<3);
2024 if (strstr(track
->codec_id
, "SBR") != NULL
)
2026 /* HE-AAC (aka SBR AAC) */
2027 sh_a
->codecdata_len
= 5;
2029 sh_a
->samplerate
*= 2;
2030 sh_a
->wf
->nSamplesPerSec
*= 2;
2031 srate_idx
= aac_get_sample_rate_index(sh_a
->samplerate
);
2032 sh_a
->codecdata
[2] = AAC_SYNC_EXTENSION_TYPE
>> 3;
2033 sh_a
->codecdata
[3] = ((AAC_SYNC_EXTENSION_TYPE
&0x07)<<5) | 5;
2034 sh_a
->codecdata
[4] = (1 << 7) | (srate_idx
<< 3);
2035 track
->default_duration
= 1024.0 / (sh_a
->samplerate
/ 2);
2039 sh_a
->codecdata_len
= 2;
2040 track
->default_duration
= 1024.0 / (float)sh_a
->samplerate
;
2043 else if (track
->a_formattag
== mmioFOURCC('v', 'r', 'b', 's')) /* VORBIS */
2045 sh_a
->wf
->cbSize
= track
->private_size
;
2046 sh_a
->wf
= realloc(sh_a
->wf
, sizeof(WAVEFORMATEX
) + sh_a
->wf
->cbSize
);
2047 memcpy((unsigned char *) (sh_a
->wf
+1), track
->private_data
, sh_a
->wf
->cbSize
);
2049 else if (track
->private_size
>= RAPROPERTIES4_SIZE
2050 && !strncmp (track
->codec_id
, MKV_A_REALATRC
, 7))
2052 /* Common initialization for all RealAudio codecs */
2053 unsigned char *src
= track
->private_data
;
2054 int codecdata_length
, version
;
2057 sh_a
->wf
->nAvgBytesPerSec
= 0; /* FIXME !? */
2059 version
= AV_RB16(src
+ 4);
2060 flavor
= AV_RB16(src
+ 22);
2061 track
->coded_framesize
= AV_RB32(src
+ 24);
2062 track
->sub_packet_h
= AV_RB16(src
+ 40);
2063 sh_a
->wf
->nBlockAlign
=
2064 track
->audiopk_size
= AV_RB16(src
+ 42);
2065 track
->sub_packet_size
= AV_RB16(src
+ 44);
2068 src
+= RAPROPERTIES4_SIZE
;
2073 src
+= RAPROPERTIES5_SIZE
;
2078 codecdata_length
= AV_RB32(src
);
2080 sh_a
->wf
->cbSize
= codecdata_length
;
2081 sh_a
->wf
= realloc (sh_a
->wf
,
2082 sizeof (WAVEFORMATEX
) +
2084 memcpy(((char *)(sh_a
->wf
+ 1)), src
, codecdata_length
);
2086 switch (track
->a_formattag
) {
2087 case mmioFOURCC('a', 't', 'r', 'c'):
2088 sh_a
->wf
->nAvgBytesPerSec
= atrc_fl2bps
[flavor
];
2089 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
2090 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
2091 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
2093 case mmioFOURCC('c', 'o', 'o', 'k'):
2094 sh_a
->wf
->nAvgBytesPerSec
= cook_fl2bps
[flavor
];
2095 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
2096 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
2097 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
2099 case mmioFOURCC('s', 'i', 'p', 'r'):
2100 sh_a
->wf
->nAvgBytesPerSec
= sipr_fl2bps
[flavor
];
2101 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
2102 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
2103 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
2105 case mmioFOURCC('2', '8', '_', '8'):
2106 sh_a
->wf
->nAvgBytesPerSec
= 3600;
2107 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
2108 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
2109 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
2113 track
->realmedia
= 1;
2115 else if (!strcmp(track
->codec_id
, MKV_A_FLAC
) ||
2116 (track
->a_formattag
== 0xf1ac))
2123 if (track
->a_formattag
== mmioFOURCC('f', 'L', 'a', 'C'))
2125 ptr
= track
->private_data
;
2126 size
= track
->private_size
;
2130 sh_a
->format
= mmioFOURCC('f', 'L', 'a', 'C');
2131 ptr
= track
->private_data
2132 + sizeof (WAVEFORMATEX
);
2133 size
= track
->private_size
- sizeof (WAVEFORMATEX
);
2135 if (size
< 4 || ptr
[0] != 'f' || ptr
[1] != 'L' ||
2136 ptr
[2] != 'a' || ptr
[3] != 'C')
2138 dp
= new_demux_packet (4);
2139 memcpy (dp
->buffer
, "fLaC", 4);
2143 dp
= new_demux_packet (size
);
2144 memcpy (dp
->buffer
, ptr
, size
);
2148 ds_add_packet (demuxer
->audio
, dp
);
2150 else if (track
->a_formattag
== mmioFOURCC('W', 'V', 'P', 'K'))
2151 { /* do nothing, still works */ }
2152 else if (!track
->ms_compat
|| (track
->private_size
< sizeof(WAVEFORMATEX
)))
2154 free_sh_audio(demuxer
, track
->tnum
);
2161 /** \brief Parse the private data for VobSub subtitle tracks.
2163 This function tries to parse the private data for all VobSub tracks.
2164 The private data contains the normal text from the original .idx file.
2165 Things like the palette, subtitle dimensions and custom colors are
2168 \param demuxer The generic demuxer.
2171 demux_mkv_parse_vobsub_data (demuxer_t
*demuxer
)
2173 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2177 for (i
= 0; i
< mkv_d
->num_tracks
; i
++)
2179 track
= mkv_d
->tracks
[i
];
2180 if ((track
->type
!= MATROSKA_TRACK_SUBTITLE
) ||
2181 (track
->subtitle_type
!= MATROSKA_SUBTYPE_VOBSUB
))
2184 if (!demux_mkv_parse_idx (track
))
2186 free (track
->private_data
);
2187 track
->private_data
= NULL
;
2188 track
->private_size
= 0;
2194 demux_mkv_open_sub (demuxer_t
*demuxer
, mkv_track_t
*track
, int sid
)
2196 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_UNKNOWN
)
2200 sh_sub_t
*sh
= new_sh_sub_sid(demuxer
, track
->tnum
, sid
);
2203 if (track
->subtitle_type
== MATROSKA_SUBTYPE_VOBSUB
)
2205 if (track
->subtitle_type
== MATROSKA_SUBTYPE_SSA
)
2207 size
= track
->private_size
;
2208 m
= demux_mkv_decode (track
,track
->private_data
,&buffer
,&size
,2);
2211 free (track
->private_data
);
2212 track
->private_data
= buffer
;
2213 track
->private_size
= size
;
2215 sh
->extradata
=malloc(track
->private_size
);
2216 memcpy (sh
->extradata
, track
->private_data
,
2217 track
->private_size
);
2218 sh
->extradata_len
= track
->private_size
;
2219 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
2220 sh
->lang
= strdup(track
->language
);
2221 sh
->default_track
= track
->default_track
;
2225 mp_msg (MSGT_DEMUX
, MSGL_ERR
, MSGTR_MPDEMUX_MKV_SubtitleTypeNotSupported
,
2234 demux_mkv_open (demuxer_t
*demuxer
)
2236 stream_t
*s
= demuxer
->stream
;
2237 mkv_demuxer_t
*mkv_d
;
2239 int i
, version
, cont
= 0;
2242 stream_seek(s
, s
->start_pos
);
2243 str
= ebml_read_header (s
, &version
);
2244 if (str
== NULL
|| strcmp (str
, "matroska") || version
> 2)
2246 mp_msg (MSGT_DEMUX
, MSGL_DBG2
, "[mkv] no head found\n");
2251 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] Found the head...\n");
2253 if (ebml_read_id (s
, NULL
) != MATROSKA_ID_SEGMENT
)
2255 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] but no segment :(\n");
2258 ebml_read_length (s
, NULL
); /* return bytes number until EOF */
2260 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] + a segment...\n");
2262 mkv_d
= calloc (1, sizeof (mkv_demuxer_t
));
2263 demuxer
->priv
= mkv_d
;
2264 mkv_d
->tc_scale
= 1000000;
2265 mkv_d
->segment_start
= stream_tell (s
);
2266 mkv_d
->parsed_cues
= malloc (sizeof (off_t
));
2267 mkv_d
->parsed_seekhead
= malloc (sizeof (off_t
));
2271 switch (ebml_read_id (s
, NULL
))
2273 case MATROSKA_ID_INFO
:
2274 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment information...\n");
2275 cont
= demux_mkv_read_info (demuxer
);
2278 case MATROSKA_ID_TRACKS
:
2279 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment tracks...\n");
2280 cont
= demux_mkv_read_tracks (demuxer
);
2283 case MATROSKA_ID_CUES
:
2284 cont
= demux_mkv_read_cues (demuxer
);
2287 case MATROSKA_ID_TAGS
:
2288 cont
= demux_mkv_read_tags (demuxer
);
2291 case MATROSKA_ID_SEEKHEAD
:
2292 cont
= demux_mkv_read_seekhead (demuxer
);
2295 case MATROSKA_ID_CHAPTERS
:
2296 cont
= demux_mkv_read_chapters (demuxer
);
2299 case MATROSKA_ID_ATTACHMENTS
:
2300 cont
= demux_mkv_read_attachments (demuxer
);
2303 case MATROSKA_ID_CLUSTER
:
2306 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ found cluster, headers are "
2307 "parsed completely :)\n");
2308 /* get the first cluster timecode */
2310 l
= ebml_read_length (s
, NULL
);
2311 while (ebml_read_id (s
, NULL
) != MATROSKA_ID_CLUSTERTIMECODE
)
2313 ebml_read_skip (s
, NULL
);
2314 if (stream_tell (s
) >= p
+ l
)
2317 if (stream_tell (s
) < p
+ l
)
2319 uint64_t num
= ebml_read_uint (s
, NULL
);
2320 if (num
== EBML_UINT_INVALID
)
2322 mkv_d
->first_tc
= num
* mkv_d
->tc_scale
/ 1000000.0;
2323 mkv_d
->has_first_tc
= 1;
2325 stream_seek (s
, p
- 4);
2333 ebml_read_skip (s
, NULL
);
2338 display_create_tracks (demuxer
);
2340 /* select video track */
2342 if (demuxer
->video
->id
== -1) /* automatically select a video track */
2344 /* search for a video track that has the 'default' flag set */
2345 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2346 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
2347 && mkv_d
->tracks
[i
]->default_track
)
2349 track
= mkv_d
->tracks
[i
];
2354 /* no track has the 'default' flag set */
2355 /* let's take the first video track */
2356 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2357 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
)
2359 track
= mkv_d
->tracks
[i
];
2363 else if (demuxer
->video
->id
!= -2) /* -2 = no video at all */
2364 track
= demux_mkv_find_track_by_num (mkv_d
, demuxer
->video
->id
,
2365 MATROSKA_TRACK_VIDEO
);
2367 if (track
&& demuxer
->v_streams
[track
->tnum
])
2369 mp_msg (MSGT_DEMUX
, MSGL_INFO
,
2370 MSGTR_MPDEMUX_MKV_WillPlayVideoTrack
, track
->tnum
);
2371 demuxer
->video
->id
= track
->tnum
;
2372 demuxer
->video
->sh
= demuxer
->v_streams
[track
->tnum
];
2376 mp_msg (MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_NoVideoTrackFound
);
2377 demuxer
->video
->id
= -2;
2380 /* select audio track */
2383 /* search for an audio track that has the 'default' flag set */
2384 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2385 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
2386 && mkv_d
->tracks
[i
]->default_track
)
2388 track
= mkv_d
->tracks
[i
];
2393 /* no track has the 'default' flag set */
2394 /* let's take the first audio track */
2395 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2396 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
)
2398 track
= mkv_d
->tracks
[i
];
2402 if (track
&& demuxer
->a_streams
[track
->tnum
])
2404 demuxer
->audio
->id
= track
->tnum
;
2405 demuxer
->audio
->sh
= demuxer
->a_streams
[track
->tnum
];
2409 mp_msg (MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_NoAudioTrackFound
);
2410 demuxer
->audio
->id
= -2;
2414 if(demuxer
->audio
->id
!= -2)
2415 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2417 if(mkv_d
->tracks
[i
]->type
!= MATROSKA_TRACK_AUDIO
)
2419 if(demuxer
->a_streams
[track
->tnum
])
2422 if(mkv_d
->last_aid
== MAX_A_STREAMS
)
2427 demux_mkv_parse_vobsub_data (demuxer
);
2429 if (demuxer
->chapters
)
2431 for (i
=0; i
< (int)demuxer
->num_chapters
; i
++)
2433 demuxer
->chapters
[i
].start
-= mkv_d
->first_tc
;
2434 demuxer
->chapters
[i
].end
-= mkv_d
->first_tc
;
2436 if (dvd_last_chapter
> 0 && dvd_last_chapter
<= demuxer
->num_chapters
)
2438 if (demuxer
->chapters
[dvd_last_chapter
-1].end
!= 0)
2439 mkv_d
->stop_timecode
= demuxer
->chapters
[dvd_last_chapter
-1].end
;
2440 else if (dvd_last_chapter
+ 1 <= demuxer
->num_chapters
)
2441 mkv_d
->stop_timecode
= demuxer
->chapters
[dvd_last_chapter
].start
;
2445 if (s
->end_pos
== 0 || (mkv_d
->indexes
== NULL
&& index_mode
< 0))
2446 demuxer
->seekable
= 0;
2449 demuxer
->movi_start
= s
->start_pos
;
2450 demuxer
->movi_end
= s
->end_pos
;
2451 demuxer
->seekable
= 1;
2454 return DEMUXER_TYPE_MATROSKA
;
2458 demux_close_mkv (demuxer_t
*demuxer
)
2460 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2465 free_cached_dps (demuxer
);
2468 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2469 demux_mkv_free_trackentry(mkv_d
->tracks
[i
]);
2470 free (mkv_d
->tracks
);
2472 free (mkv_d
->indexes
);
2473 free (mkv_d
->cluster_positions
);
2474 free (mkv_d
->parsed_cues
);
2475 free (mkv_d
->parsed_seekhead
);
2481 demux_mkv_read_block_lacing (uint8_t *buffer
, uint64_t *size
,
2482 uint8_t *laces
, uint32_t **all_lace_sizes
)
2484 uint32_t total
= 0, *lace_size
;
2488 *all_lace_sizes
= NULL
;
2494 switch ((flags
& 0x06) >> 1)
2496 case 0: /* no lacing */
2498 lace_size
= calloc(*laces
, sizeof(uint32_t));
2499 lace_size
[0] = *size
;
2502 case 1: /* xiph lacing */
2503 case 2: /* fixed-size lacing */
2504 case 3: /* EBML lacing */
2508 lace_size
= calloc(*laces
, sizeof(uint32_t));
2510 switch ((flags
& 0x06) >> 1)
2512 case 1: /* xiph lacing */
2513 for (i
=0; i
< *laces
-1; i
++)
2518 lace_size
[i
] += *buffer
;
2520 } while (*buffer
++ == 0xFF);
2521 total
+= lace_size
[i
];
2523 lace_size
[i
] = *size
- total
;
2526 case 2: /* fixed-size lacing */
2527 for (i
=0; i
< *laces
; i
++)
2528 lace_size
[i
] = *size
/ *laces
;
2531 case 3: /* EBML lacing */
2534 uint64_t num
= ebml_read_vlen_uint (buffer
, &l
);
2535 if (num
== EBML_UINT_INVALID
) {
2542 total
= lace_size
[0] = num
;
2543 for (i
=1; i
< *laces
-1; i
++)
2546 snum
= ebml_read_vlen_int (buffer
, &l
);
2547 if (snum
== EBML_INT_INVALID
) {
2553 lace_size
[i
] = lace_size
[i
-1] + snum
;
2554 total
+= lace_size
[i
];
2556 lace_size
[i
] = *size
- total
;
2562 *all_lace_sizes
= lace_size
;
2567 handle_subtitles(demuxer_t
*demuxer
, mkv_track_t
*track
, char *block
,
2568 int64_t size
, uint64_t block_duration
, uint64_t timecode
)
2572 if (block_duration
== 0)
2574 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
2575 MSGTR_MPDEMUX_MKV_NoBlockDurationForSubtitleTrackFound
);
2580 dp
= new_demux_packet(size
);
2581 memcpy(dp
->buffer
, block
, size
);
2582 dp
->pts
= timecode
/ 1000.0f
;
2583 dp
->endpts
= (timecode
+ block_duration
) / 1000.0f
;
2584 ds_add_packet(demuxer
->sub
, dp
);
2587 // Taken from demux_real.c. Thanks to the original developpers :)
2588 #define SKIP_BITS(n) buffer <<= n
2589 #define SHOW_BITS(n) ((buffer) >> (32 - (n)))
2591 static float real_fix_timestamp(mkv_track_t
*track
, unsigned char *s
,
2594 uint32_t buffer
= (s
[0] << 24) + (s
[1] << 16) + (s
[2] << 8) + s
[3];
2599 if (!strcmp(track
->codec_id
, MKV_V_REALV30
) ||
2600 !strcmp(track
->codec_id
, MKV_V_REALV40
)) {
2602 if (!strcmp(track
->codec_id
, MKV_V_REALV30
)) {
2604 pict_type
= SHOW_BITS(2);
2608 pict_type
= SHOW_BITS(2);
2609 SKIP_BITS(2 + 7 + 3);
2611 kf
= SHOW_BITS(13); // kf= 2*SHOW_BITS(12);
2613 if (pict_type
<= 1) {
2614 // I frame, sync timestamps:
2615 track
->rv_kf_base
= timestamp
- kf
;
2616 mp_msg(MSGT_DEMUX
, MSGL_DBG2
, "\nTS: base=%08X\n", track
->rv_kf_base
);
2619 // P/B frame, merge timestamps:
2620 int tmp
= timestamp
- track
->rv_kf_base
;
2621 kf
|= tmp
& (~0x1fff); // combine with packet timestamp
2622 if (kf
< (tmp
- 4096)) // workaround wrap-around problems
2624 else if (kf
> (tmp
+ 4096))
2626 kf
+= track
->rv_kf_base
;
2628 if (pict_type
!= 3) { // P || I frame -> swap timestamps
2630 kf
= track
->rv_kf_pts
;
2631 track
->rv_kf_pts
= tmp
;
2633 mp_msg(MSGT_DEMUX
, MSGL_DBG2
, "\nTS: %08X -> %08X (%04X) %d %02X %02X %02X "
2634 "%02X %5d\n", timestamp
, kf
, orig_kf
, pict_type
, s
[0], s
[1], s
[2],
2635 s
[3], kf
- (int)(1000.0 * track
->rv_pts
));
2637 v_pts
= kf
* 0.001f
;
2638 track
->rv_pts
= v_pts
;
2644 handle_realvideo (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2645 uint32_t size
, int block_bref
)
2647 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2649 uint32_t timestamp
= mkv_d
->last_pts
* 1000;
2653 #ifdef WORDS_BIGENDIAN
2659 isize
= --size
- (chunks
+1)*8;
2660 dp
= new_demux_packet (REALHEADER_SIZE
+ size
);
2661 memcpy (dp
->buffer
+ REALHEADER_SIZE
, buffer
+ (chunks
+1)*8, isize
);
2662 #ifdef WORDS_BIGENDIAN
2663 p
= (uint8_t *)(dp
->buffer
+ REALHEADER_SIZE
+ isize
);
2664 for (i
= 0; i
<(chunks
+1)*8; i
+=4) {
2665 p
[i
] = *((uint8_t *)buffer
+i
+3);
2666 p
[i
+1] = *((uint8_t *)buffer
+i
+2);
2667 p
[i
+2] = *((uint8_t *)buffer
+i
+1);
2668 p
[i
+3] = *((uint8_t *)buffer
+i
);
2671 memcpy (dp
->buffer
+ REALHEADER_SIZE
+ isize
, buffer
, (chunks
+1)*8);
2674 hdr
= (uint32_t *) dp
->buffer
;
2675 *hdr
++ = chunks
; // number of chunks
2676 *hdr
++ = timestamp
; // timestamp from packet header
2677 *hdr
++ = isize
; // length of actual data
2678 *hdr
++ = REALHEADER_SIZE
+ isize
; // offset to chunk offset array
2680 if (mkv_d
->v_skip_to_keyframe
)
2682 dp
->pts
= mkv_d
->last_pts
;
2683 track
->rv_kf_base
= 0;
2684 track
->rv_kf_pts
= timestamp
;
2687 dp
->pts
= real_fix_timestamp (track
, dp
->buffer
+ REALHEADER_SIZE
,
2689 dp
->pos
= demuxer
->filepos
;
2690 dp
->flags
= block_bref
? 0 : 0x10;
2692 ds_add_packet(demuxer
->video
, dp
);
2696 handle_realaudio (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2697 uint32_t size
, int block_bref
)
2699 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2700 int sps
= track
->sub_packet_size
;
2701 int sph
= track
->sub_packet_h
;
2702 int cfs
= track
->coded_framesize
;
2703 int w
= track
->audiopk_size
;
2704 int spc
= track
->sub_packet_cnt
;
2708 if ((track
->a_formattag
== mmioFOURCC('2', '8', '_', '8')) ||
2709 (track
->a_formattag
== mmioFOURCC('c', 'o', 'o', 'k')) ||
2710 (track
->a_formattag
== mmioFOURCC('a', 't', 'r', 'c')) ||
2711 (track
->a_formattag
== mmioFOURCC('s', 'i', 'p', 'r')))
2714 // spc = track->sub_packet_cnt = 0;
2715 switch (track
->a_formattag
) {
2716 case mmioFOURCC('2', '8', '_', '8'):
2717 for (x
= 0; x
< sph
/ 2; x
++)
2718 memcpy(track
->audio_buf
+ x
* 2 * w
+ spc
* cfs
, buffer
+ cfs
* x
, cfs
);
2720 case mmioFOURCC('c', 'o', 'o', 'k'):
2721 case mmioFOURCC('a', 't', 'r', 'c'):
2722 for (x
= 0; x
< w
/ sps
; x
++)
2723 memcpy(track
->audio_buf
+ sps
* (sph
* x
+ ((sph
+ 1) / 2) * (spc
& 1) + (spc
>> 1)), buffer
+ sps
* x
, sps
);
2725 case mmioFOURCC('s', 'i', 'p', 'r'):
2726 memcpy(track
->audio_buf
+ spc
* w
, buffer
, w
);
2730 int bs
= sph
* w
* 2 / 96; // nibbles per subpacket
2731 // Perform reordering
2732 for(n
=0; n
< 38; n
++)
2735 int i
= bs
* sipr_swaps
[n
][0];
2736 int o
= bs
* sipr_swaps
[n
][1];
2737 // swap nibbles of block 'i' with 'o' TODO: optimize
2738 for(j
= 0;j
< bs
; j
++)
2740 int x
= (i
& 1) ? (track
->audio_buf
[i
>> 1] >> 4) : (track
->audio_buf
[i
>> 1] & 0x0F);
2741 int y
= (o
& 1) ? (track
->audio_buf
[o
>> 1] >> 4) : (track
->audio_buf
[o
>> 1] & 0x0F);
2743 track
->audio_buf
[o
>> 1] = (track
->audio_buf
[o
>> 1] & 0x0F) | (x
<< 4);
2745 track
->audio_buf
[o
>> 1] = (track
->audio_buf
[o
>> 1] & 0xF0) | x
;
2747 track
->audio_buf
[i
>> 1] = (track
->audio_buf
[i
>> 1] & 0x0F) | (y
<< 4);
2749 track
->audio_buf
[i
>> 1] = (track
->audio_buf
[i
>> 1] & 0xF0) | y
;
2756 track
->audio_timestamp
[track
->sub_packet_cnt
] = (track
->ra_pts
== mkv_d
->last_pts
) ? 0 : (mkv_d
->last_pts
);
2757 track
->ra_pts
= mkv_d
->last_pts
;
2758 if (track
->sub_packet_cnt
== 0)
2759 track
->audio_filepos
= demuxer
->filepos
;
2760 if (++(track
->sub_packet_cnt
) == sph
)
2762 int apk_usize
= ((WAVEFORMATEX
*)((sh_audio_t
*)demuxer
->audio
->sh
)->wf
)->nBlockAlign
;
2763 track
->sub_packet_cnt
= 0;
2764 // Release all the audio packets
2765 for (x
= 0; x
< sph
*w
/apk_usize
; x
++)
2767 dp
= new_demux_packet(apk_usize
);
2768 memcpy(dp
->buffer
, track
->audio_buf
+ x
* apk_usize
, apk_usize
);
2769 /* Put timestamp only on packets that correspond to original audio packets in file */
2770 dp
->pts
= (x
* apk_usize
% w
) ? 0 : track
->audio_timestamp
[x
* apk_usize
/ w
];
2771 dp
->pos
= track
->audio_filepos
; // all equal
2772 dp
->flags
= x
? 0 : 0x10; // Mark first packet as keyframe
2773 ds_add_packet(demuxer
->audio
, dp
);
2776 } else { // Not a codec that require reordering
2777 dp
= new_demux_packet (size
);
2778 memcpy(dp
->buffer
, buffer
, size
);
2779 if (track
->ra_pts
== mkv_d
->last_pts
&& !mkv_d
->a_skip_to_keyframe
)
2782 dp
->pts
= mkv_d
->last_pts
;
2783 track
->ra_pts
= mkv_d
->last_pts
;
2785 dp
->pos
= demuxer
->filepos
;
2786 dp
->flags
= block_bref
? 0 : 0x10;
2787 ds_add_packet (demuxer
->audio
, dp
);
2791 /** Reorder timecodes and add cached demux packets to the queues.
2793 * Timecode reordering is needed if a video track contains B frames that
2794 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2795 * MPlayer doesn't like timestamps in display order. This function adjusts
2796 * the timestamp of cached frames (which are exactly one I/P frame followed
2797 * by one or more B frames) so that they are in coding order again.
2799 * Example: The track with 25 FPS contains four frames with the timecodes
2800 * I at 0ms, P at 120ms, B at 40ms and B at 80ms. As soon as the next I
2801 * or P frame arrives these timecodes can be changed to I at 0ms, P at 40ms,
2802 * B at 80ms and B at 120ms.
2804 * This works for simple H.264 B-frame pyramids, but not for arbitrary orders.
2806 * \param demuxer The Matroska demuxer struct for this instance.
2807 * \param track The track structure whose cache should be handled.
2810 flush_cached_dps (demuxer_t
*demuxer
, mkv_track_t
*track
)
2814 if (track
->num_cached_dps
== 0)
2819 for (i
= 1; i
< track
->num_cached_dps
; i
++)
2820 if (track
->cached_dps
[i
- 1]->pts
> track
->cached_dps
[i
]->pts
) {
2821 float tmp_pts
= track
->cached_dps
[i
- 1]->pts
;
2822 track
->cached_dps
[i
- 1]->pts
= track
->cached_dps
[i
]->pts
;
2823 track
->cached_dps
[i
]->pts
= tmp_pts
;
2828 for (i
= 0; i
< track
->num_cached_dps
; i
++)
2829 ds_add_packet (demuxer
->video
, track
->cached_dps
[i
]);
2830 track
->num_cached_dps
= 0;
2833 /** Cache video frames if timecodes have to be reordered.
2835 * Timecode reordering is needed if a video track contains B frames that
2836 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2837 * This function takes in a Matroska block read from the file, allocates a
2838 * demux packet for it, fills in its values, allocates space for storing
2839 * pointers to the cached demux packets and adds the packet to it. If
2840 * the packet contains an I or a P frame then ::flush_cached_dps is called
2841 * in order to send the old cached frames downstream.
2843 * \param demuxer The Matroska demuxer struct for this instance.
2844 * \param track The packet is meant for this track.
2845 * \param buffer The actual frame contents.
2846 * \param size The frame size in bytes.
2847 * \param block_bref A relative timecode (backward reference). If it is \c 0
2848 * then the frame is an I frame.
2849 * \param block_fref A relative timecode (forward reference). If it is \c 0
2850 * then the frame is either an I frame or a P frame depending on the value
2851 * of \a block_bref. Otherwise it's a B frame.
2854 handle_video_bframes (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2855 uint32_t size
, int block_bref
, int block_fref
)
2857 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2860 dp
= new_demux_packet (size
);
2861 memcpy(dp
->buffer
, buffer
, size
);
2862 dp
->pos
= demuxer
->filepos
;
2863 dp
->pts
= mkv_d
->last_pts
;
2864 if ((track
->num_cached_dps
> 0) && (dp
->pts
< track
->max_pts
))
2866 if (block_fref
== 0) /* I or P frame */
2867 flush_cached_dps (demuxer
, track
);
2868 if (block_bref
!= 0) /* I frame, don't cache it */
2870 if ((track
->num_cached_dps
+ 1) > track
->num_allocated_dps
)
2872 track
->cached_dps
= (demux_packet_t
**)
2873 realloc(track
->cached_dps
, (track
->num_cached_dps
+ 10) *
2874 sizeof(demux_packet_t
*));
2875 track
->num_allocated_dps
+= 10;
2877 track
->cached_dps
[track
->num_cached_dps
] = dp
;
2878 track
->num_cached_dps
++;
2879 if (dp
->pts
> track
->max_pts
)
2880 track
->max_pts
= dp
->pts
;
2884 handle_block (demuxer_t
*demuxer
, uint8_t *block
, uint64_t length
,
2885 uint64_t block_duration
, int64_t block_bref
, int64_t block_fref
, uint8_t simpleblock
)
2887 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2888 mkv_track_t
*track
= NULL
;
2889 demux_stream_t
*ds
= NULL
;
2890 uint64_t old_length
;
2892 uint32_t *lace_size
;
2893 uint8_t laces
, flags
;
2894 int i
, num
, tmp
, use_this_block
= 1;
2898 /* first byte(s): track num */
2899 num
= ebml_read_vlen_uint (block
, &tmp
);
2901 /* time (relative to cluster time) */
2902 time
= block
[0] << 8 | block
[1];
2905 old_length
= length
;
2907 if (demux_mkv_read_block_lacing (block
, &length
, &laces
, &lace_size
))
2909 block
+= old_length
- length
;
2911 tc
= ((time
*mkv_d
->tc_scale
+mkv_d
->cluster_tc
) /1000000.0 - mkv_d
->first_tc
);
2914 if (mkv_d
->stop_timecode
> 0 && tc
> mkv_d
->stop_timecode
) {
2918 current_pts
= tc
/ 1000.0;
2920 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2921 if (mkv_d
->tracks
[i
]->tnum
== num
) {
2922 track
= mkv_d
->tracks
[i
];
2930 if (num
== demuxer
->audio
->id
)
2932 ds
= demuxer
->audio
;
2934 if (mkv_d
->a_skip_to_keyframe
)
2938 if (!(flags
&0x80)) /*current frame isn't a keyframe*/
2941 else if (block_bref
!= 0)
2944 else if (mkv_d
->v_skip_to_keyframe
)
2947 if (track
->fix_i_bps
&& use_this_block
)
2949 sh_audio_t
*sh
= (sh_audio_t
*) ds
->sh
;
2951 if (block_duration
!= 0)
2953 sh
->i_bps
= length
* 1000 / block_duration
;
2954 track
->fix_i_bps
= 0;
2956 else if (track
->qt_last_a_pts
== 0.0)
2957 track
->qt_last_a_pts
= current_pts
;
2958 else if(track
->qt_last_a_pts
!= current_pts
)
2960 sh
->i_bps
= length
/ (current_pts
- track
->qt_last_a_pts
);
2961 track
->fix_i_bps
= 0;
2965 else if (tc
< mkv_d
->skip_to_timecode
)
2967 else if (num
== demuxer
->video
->id
)
2969 ds
= demuxer
->video
;
2970 if (mkv_d
->v_skip_to_keyframe
)
2974 if (!(flags
&0x80)) /*current frame isn't a keyframe*/
2977 else if (block_bref
!= 0 || block_fref
!= 0)
2981 else if (num
== demuxer
->sub
->id
)
2984 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_VOBSUB
)
2986 if (!mkv_d
->v_skip_to_keyframe
)
2987 handle_subtitles (demuxer
, track
, block
, length
,
2988 block_duration
, tc
);
2997 mkv_d
->last_pts
= current_pts
;
2998 mkv_d
->last_filepos
= demuxer
->filepos
;
3000 for (i
=0; i
< laces
; i
++)
3002 if (ds
== demuxer
->video
&& track
->realmedia
)
3003 handle_realvideo (demuxer
, track
, block
, lace_size
[i
], block_bref
);
3004 else if (ds
== demuxer
->audio
&& track
->realmedia
)
3005 handle_realaudio (demuxer
, track
, block
, lace_size
[i
], block_bref
);
3006 else if (ds
== demuxer
->video
&& track
->reorder_timecodes
)
3007 handle_video_bframes (demuxer
, track
, block
, lace_size
[i
],
3008 block_bref
, block_fref
);
3011 int modified
, size
= lace_size
[i
];
3014 modified
= demux_mkv_decode (track
, block
, &buffer
, &size
, 1);
3017 dp
= new_demux_packet (size
);
3018 memcpy (dp
->buffer
, buffer
, size
);
3021 dp
->flags
= (block_bref
== 0 && block_fref
== 0) ? 0x10 : 0;
3022 /* If default_duration is 0, assume no pts value is known
3023 * for packets after the first one (rather than all pts
3024 * values being the same) */
3025 if (i
== 0 || track
->default_duration
)
3026 dp
->pts
= mkv_d
->last_pts
+ i
* track
->default_duration
;
3027 ds_add_packet (ds
, dp
);
3030 block
+= lace_size
[i
];
3033 if (ds
== demuxer
->video
)
3035 mkv_d
->v_skip_to_keyframe
= 0;
3036 mkv_d
->skip_to_timecode
= 0;
3038 else if (ds
== demuxer
->audio
)
3039 mkv_d
->a_skip_to_keyframe
= 0;
3050 demux_mkv_fill_buffer (demuxer_t
*demuxer
, demux_stream_t
*ds
)
3052 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3053 stream_t
*s
= demuxer
->stream
;
3059 while (mkv_d
->cluster_size
> 0)
3061 uint64_t block_duration
= 0, block_length
= 0;
3062 int64_t block_bref
= 0, block_fref
= 0;
3063 uint8_t *block
= NULL
;
3065 while (mkv_d
->blockgroup_size
> 0)
3067 switch (ebml_read_id (s
, &il
))
3069 case MATROSKA_ID_BLOCKDURATION
:
3071 block_duration
= ebml_read_uint (s
, &l
);
3072 if (block_duration
== EBML_UINT_INVALID
) {
3076 block_duration
*= mkv_d
->tc_scale
/ 1000000.0;
3080 case MATROSKA_ID_BLOCK
:
3081 block_length
= ebml_read_length (s
, &tmp
);
3083 if (block_length
> SIZE_MAX
- LZO_INPUT_PADDING
) return 0;
3084 block
= malloc (block_length
+ LZO_INPUT_PADDING
);
3085 demuxer
->filepos
= stream_tell (s
);
3086 if (stream_read (s
,block
,block_length
) != (int) block_length
)
3091 l
= tmp
+ block_length
;
3094 case MATROSKA_ID_REFERENCEBLOCK
:
3096 int64_t num
= ebml_read_int (s
, &l
);
3097 if (num
== EBML_INT_INVALID
) {
3108 case EBML_ID_INVALID
:
3113 ebml_read_skip (s
, &l
);
3116 mkv_d
->blockgroup_size
-= l
+ il
;
3117 mkv_d
->cluster_size
-= l
+ il
;
3122 int res
= handle_block (demuxer
, block
, block_length
,
3123 block_duration
, block_bref
, block_fref
, 0);
3131 if (mkv_d
->cluster_size
> 0)
3133 switch (ebml_read_id (s
, &il
))
3135 case MATROSKA_ID_CLUSTERTIMECODE
:
3137 uint64_t num
= ebml_read_uint (s
, &l
);
3138 if (num
== EBML_UINT_INVALID
)
3140 if (!mkv_d
->has_first_tc
)
3142 mkv_d
->first_tc
= num
* mkv_d
->tc_scale
/ 1000000.0;
3143 mkv_d
->has_first_tc
= 1;
3145 mkv_d
->cluster_tc
= num
* mkv_d
->tc_scale
;
3149 case MATROSKA_ID_BLOCKGROUP
:
3150 mkv_d
->blockgroup_size
= ebml_read_length (s
, &tmp
);
3154 case MATROSKA_ID_SIMPLEBLOCK
:
3157 block_length
= ebml_read_length (s
, &tmp
);
3158 block
= malloc (block_length
);
3159 demuxer
->filepos
= stream_tell (s
);
3160 if (stream_read (s
,block
,block_length
) != (int) block_length
)
3165 l
= tmp
+ block_length
;
3166 res
= handle_block (demuxer
, block
, block_length
,
3167 block_duration
, block_bref
, block_fref
, 1);
3169 mkv_d
->cluster_size
-= l
+ il
;
3174 else mkv_d
->cluster_size
+= l
+ il
;
3177 case EBML_ID_INVALID
:
3181 ebml_read_skip (s
, &l
);
3184 mkv_d
->cluster_size
-= l
+ il
;
3188 if (ebml_read_id (s
, &il
) != MATROSKA_ID_CLUSTER
)
3190 add_cluster_position(mkv_d
, stream_tell(s
)-il
);
3191 mkv_d
->cluster_size
= ebml_read_length (s
, NULL
);
3198 demux_mkv_seek (demuxer_t
*demuxer
, float rel_seek_secs
, float audio_delay
, int flags
)
3200 free_cached_dps (demuxer
);
3201 if (!(flags
& SEEK_FACTOR
)) /* time in secs */
3203 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3204 stream_t
*s
= demuxer
->stream
;
3205 int64_t target_timecode
= 0, diff
, min_diff
=0xFFFFFFFFFFFFFFFLL
;
3208 if (!(flags
& SEEK_ABSOLUTE
)) /* relative seek */
3209 target_timecode
= (int64_t) (mkv_d
->last_pts
* 1000.0);
3210 target_timecode
+= (int64_t)(rel_seek_secs
* 1000.0);
3211 if (target_timecode
< 0)
3212 target_timecode
= 0;
3214 if (mkv_d
->indexes
== NULL
) /* no index was found */
3216 uint64_t target_filepos
, cluster_pos
, max_pos
;
3218 target_filepos
= (uint64_t) (target_timecode
* mkv_d
->last_filepos
3219 / (mkv_d
->last_pts
* 1000.0));
3221 max_pos
= mkv_d
->cluster_positions
[mkv_d
->num_cluster_pos
-1];
3222 if (target_filepos
> max_pos
)
3224 if ((off_t
) max_pos
> stream_tell (s
))
3225 stream_seek (s
, max_pos
);
3227 stream_seek (s
, stream_tell (s
) + mkv_d
->cluster_size
);
3228 /* parse all the clusters upto target_filepos */
3229 while (!s
->eof
&& stream_tell(s
) < (off_t
) target_filepos
)
3231 switch (ebml_read_id (s
, &i
))
3233 case MATROSKA_ID_CLUSTER
:
3234 add_cluster_position(mkv_d
, (uint64_t) stream_tell(s
)-i
);
3237 case MATROSKA_ID_CUES
:
3238 demux_mkv_read_cues (demuxer
);
3241 ebml_read_skip (s
, NULL
);
3247 if (mkv_d
->indexes
== NULL
)
3249 cluster_pos
= mkv_d
->cluster_positions
[0];
3250 /* Let's find the nearest cluster */
3251 for (i
=0; i
< mkv_d
->num_cluster_pos
; i
++)
3253 diff
= mkv_d
->cluster_positions
[i
] - target_filepos
;
3254 if (rel_seek_secs
< 0 && diff
< 0 && -diff
< min_diff
)
3256 cluster_pos
= mkv_d
->cluster_positions
[i
];
3259 else if (rel_seek_secs
> 0
3260 && (diff
< 0 ? -1 * diff
: diff
) < min_diff
)
3262 cluster_pos
= mkv_d
->cluster_positions
[i
];
3263 min_diff
= diff
< 0 ? -1 * diff
: diff
;
3266 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3267 stream_seek (s
, cluster_pos
);
3272 mkv_index_t
*index
= NULL
;
3273 int seek_id
= (demuxer
->video
->id
< 0) ? demuxer
->audio
->id
: demuxer
->video
->id
;
3275 /* let's find the entry in the indexes with the smallest */
3276 /* difference to the wanted timecode. */
3277 for (i
=0; i
< mkv_d
->num_indexes
; i
++)
3278 if (mkv_d
->indexes
[i
].tnum
== seek_id
)
3280 diff
= target_timecode
+ mkv_d
->first_tc
-
3281 (int64_t) mkv_d
->indexes
[i
].timecode
* mkv_d
->tc_scale
/ 1000000.0;
3283 if ((flags
& SEEK_ABSOLUTE
|| target_timecode
<= mkv_d
->last_pts
*1000)) {
3284 // Absolute seek or seek backward: find the last index
3285 // position before target time
3286 if (diff
< 0 || diff
>= min_diff
)
3290 // Relative seek forward: find the first index position
3291 // after target time. If no such index exists, find last
3292 // position between current position and target time.
3294 if (min_diff
<= 0 && diff
<= min_diff
)
3297 else if (diff
>= FFMIN(target_timecode
- mkv_d
->last_pts
,
3302 index
= mkv_d
->indexes
+ i
;
3305 if (index
) /* We've found an entry. */
3307 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3308 stream_seek (s
, index
->filepos
);
3312 if (demuxer
->video
->id
>= 0)
3313 mkv_d
->v_skip_to_keyframe
= 1;
3314 if (rel_seek_secs
> 0.0)
3315 mkv_d
->skip_to_timecode
= target_timecode
;
3316 mkv_d
->a_skip_to_keyframe
= 1;
3318 demux_mkv_fill_buffer(demuxer
, NULL
);
3320 else if ((demuxer
->movi_end
<= 0) || !(flags
& SEEK_ABSOLUTE
))
3321 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
3324 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3325 stream_t
*s
= demuxer
->stream
;
3326 uint64_t target_filepos
;
3327 mkv_index_t
*index
= NULL
;
3330 if (mkv_d
->indexes
== NULL
) /* no index was found */
3332 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
3336 target_filepos
= (uint64_t)(demuxer
->movi_end
* rel_seek_secs
);
3337 for (i
=0; i
< mkv_d
->num_indexes
; i
++)
3338 if (mkv_d
->indexes
[i
].tnum
== demuxer
->video
->id
)
3339 if ((index
== NULL
) ||
3340 ((mkv_d
->indexes
[i
].filepos
>= target_filepos
) &&
3341 ((index
->filepos
< target_filepos
) ||
3342 (mkv_d
->indexes
[i
].filepos
< index
->filepos
))))
3343 index
= &mkv_d
->indexes
[i
];
3348 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3349 stream_seek (s
, index
->filepos
);
3351 if (demuxer
->video
->id
>= 0)
3352 mkv_d
->v_skip_to_keyframe
= 1;
3353 mkv_d
->skip_to_timecode
= index
->timecode
;
3354 mkv_d
->a_skip_to_keyframe
= 1;
3356 demux_mkv_fill_buffer(demuxer
, NULL
);
3361 demux_mkv_control (demuxer_t
*demuxer
, int cmd
, void *arg
)
3363 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3367 case DEMUXER_CTRL_CORRECT_PTS
:
3368 return DEMUXER_CTRL_OK
;
3369 case DEMUXER_CTRL_GET_TIME_LENGTH
:
3370 if (mkv_d
->duration
== 0)
3371 return DEMUXER_CTRL_DONTKNOW
;
3373 *((double *)arg
) = (double)mkv_d
->duration
;
3374 return DEMUXER_CTRL_OK
;
3376 case DEMUXER_CTRL_GET_PERCENT_POS
:
3377 if (mkv_d
->duration
== 0)
3379 return DEMUXER_CTRL_DONTKNOW
;
3382 *((int *) arg
) = (int) (100 * mkv_d
->last_pts
/ mkv_d
->duration
);
3383 return DEMUXER_CTRL_OK
;
3385 case DEMUXER_CTRL_SWITCH_AUDIO
:
3386 if (demuxer
->audio
&& demuxer
->audio
->sh
) {
3387 sh_audio_t
*sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3388 int aid
= *(int*)arg
;
3390 aid
= (sh
->aid
+ 1) % mkv_d
->last_aid
;
3391 if (aid
!= sh
->aid
) {
3392 mkv_track_t
*track
= demux_mkv_find_track_by_num (mkv_d
, aid
, MATROSKA_TRACK_AUDIO
);
3394 demuxer
->audio
->id
= track
->tnum
;
3395 sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3396 ds_free_packs(demuxer
->audio
);
3399 *(int*)arg
= sh
->aid
;
3402 return DEMUXER_CTRL_OK
;
3405 return DEMUXER_CTRL_NOTIMPL
;
3409 const demuxer_desc_t demuxer_desc_matroska
= {
3415 DEMUXER_TYPE_MATROSKA
,
3416 1, // safe autodetect
3418 demux_mkv_fill_buffer
,