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"
35 #ifdef CONFIG_QTX_CODECS
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 */
103 float rv_pts
; /* previous video timestamp */
104 float ra_pts
; /* previous audio timestamp */
106 /** realaudio descrambling */
107 int sub_packet_size
; ///< sub packet size, per stream
108 int sub_packet_h
; ///< number of coded frames per block
109 int coded_framesize
; ///< coded frame size, per stream
110 int audiopk_size
; ///< audio packet size
111 unsigned char *audio_buf
; ///< place to store reordered audio data
112 float *audio_timestamp
; ///< timestamp for each audio packet
113 int sub_packet_cnt
; ///< number of subpacket already received
114 int audio_filepos
; ///< file position of first audio packet in block
116 /* stuff for quicktime */
122 /* The timecodes of video frames might have to be reordered if they're
123 in display order (the timecodes, not the frames themselves!). In this
124 case demux packets have to be cached with the help of these variables. */
125 int reorder_timecodes
;
126 demux_packet_t
**cached_dps
;
127 int num_cached_dps
, num_allocated_dps
;
130 /* generic content encoding support */
131 mkv_content_encoding_t
*encodings
;
134 /* For VobSubs and SSA/ASS */
138 typedef struct mkv_index
141 uint64_t timecode
, filepos
;
144 typedef struct mkv_demuxer
148 float duration
, last_pts
;
149 uint64_t last_filepos
;
151 mkv_track_t
**tracks
;
154 uint64_t tc_scale
, cluster_tc
, first_tc
;
157 uint64_t cluster_size
;
158 uint64_t blockgroup_size
;
160 mkv_index_t
*indexes
;
165 off_t
*parsed_seekhead
;
166 int parsed_seekhead_num
;
168 uint64_t *cluster_positions
;
171 int64_t skip_to_timecode
;
172 int v_skip_to_keyframe
, a_skip_to_keyframe
;
174 int64_t stop_timecode
;
177 int audio_tracks
[MAX_A_STREAMS
];
180 #define REALHEADER_SIZE 16
181 #define RVPROPERTIES_SIZE 34
182 #define RAPROPERTIES4_SIZE 56
183 #define RAPROPERTIES5_SIZE 70
186 * \brief ensures there is space for at least one additional element
187 * \param array array to grow
188 * \param nelem current number of elements in array
189 * \param elsize size of one array element
191 static void *grow_array(void *array
, int nelem
, size_t elsize
) {
193 array
= realloc(array
, (nelem
+ 32) * elsize
);
198 demux_mkv_find_track_by_num (mkv_demuxer_t
*d
, int n
, int type
)
202 for (i
=0, id
=0; i
< d
->num_tracks
; i
++)
203 if (d
->tracks
[i
] != NULL
&& d
->tracks
[i
]->type
== type
)
211 add_cluster_position (mkv_demuxer_t
*mkv_d
, uint64_t position
)
213 int i
= mkv_d
->num_cluster_pos
;
216 if (mkv_d
->cluster_positions
[i
] == position
)
219 mkv_d
->cluster_positions
= grow_array(mkv_d
->cluster_positions
,
220 mkv_d
->num_cluster_pos
,
222 mkv_d
->cluster_positions
[mkv_d
->num_cluster_pos
++] = position
;
226 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
228 aac_get_sample_rate_index (uint32_t sample_rate
)
230 if (92017 <= sample_rate
)
232 else if (75132 <= sample_rate
)
234 else if (55426 <= sample_rate
)
236 else if (46009 <= sample_rate
)
238 else if (37566 <= sample_rate
)
240 else if (27713 <= sample_rate
)
242 else if (23004 <= sample_rate
)
244 else if (18783 <= sample_rate
)
246 else if (13856 <= sample_rate
)
248 else if (11502 <= sample_rate
)
250 else if (9391 <= sample_rate
)
256 /** \brief Free cached demux packets
258 * Reordering the timecodes requires caching of demux packets. This function
259 * frees all these cached packets and the memory for the cached pointers
262 * \param demuxer The demuxer for which the cache is to be freed.
265 free_cached_dps (demuxer_t
*demuxer
)
267 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
271 for (k
= 0; k
< mkv_d
->num_tracks
; k
++)
273 track
= mkv_d
->tracks
[k
];
274 for (i
= 0; i
< track
->num_cached_dps
; i
++)
275 free_demux_packet (track
->cached_dps
[i
]);
276 free(track
->cached_dps
);
277 track
->cached_dps
= NULL
;
278 track
->num_cached_dps
= 0;
279 track
->num_allocated_dps
= 0;
285 demux_mkv_decode (mkv_track_t
*track
, uint8_t *src
, uint8_t **dest
,
286 uint32_t *size
, uint32_t type
)
292 if (track
->num_encodings
<= 0)
295 for (i
=0; i
<track
->num_encodings
; i
++)
297 if (!(track
->encodings
[i
].scope
& type
))
301 if (track
->encodings
[i
].comp_algo
== 0)
303 /* zlib encoded track */
306 zstream
.zalloc
= (alloc_func
) 0;
307 zstream
.zfree
= (free_func
) 0;
308 zstream
.opaque
= (voidpf
) 0;
309 if (inflateInit (&zstream
) != Z_OK
)
311 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
312 MSGTR_MPDEMUX_MKV_ZlibInitializationFailed
);
315 zstream
.next_in
= (Bytef
*) src
;
316 zstream
.avail_in
= *size
;
320 zstream
.avail_out
= *size
;
323 *dest
= realloc (*dest
, *size
);
324 zstream
.next_out
= (Bytef
*) (*dest
+ zstream
.total_out
);
325 result
= inflate (&zstream
, Z_NO_FLUSH
);
326 if (result
!= Z_OK
&& result
!= Z_STREAM_END
)
328 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
329 MSGTR_MPDEMUX_MKV_ZlibDecompressionFailed
);
332 inflateEnd (&zstream
);
335 zstream
.avail_out
+= 4000;
336 } while (zstream
.avail_out
== 4000 &&
337 zstream
.avail_in
!= 0 && result
!= Z_STREAM_END
);
339 *size
= zstream
.total_out
;
340 inflateEnd (&zstream
);
343 if (track
->encodings
[i
].comp_algo
== 2)
345 /* lzo encoded track */
346 int dstlen
= *size
* 3;
352 if (dstlen
> SIZE_MAX
- AV_LZO_OUTPUT_PADDING
) goto lzo_fail
;
353 *dest
= realloc (*dest
, dstlen
+ AV_LZO_OUTPUT_PADDING
);
354 result
= av_lzo1x_decode (*dest
, &dstlen
, src
, &srclen
);
357 if (!(result
& AV_LZO_OUTPUT_FULL
))
360 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
361 MSGTR_MPDEMUX_MKV_LzoDecompressionFailed
);
366 mp_msg (MSGT_DEMUX
, MSGL_DBG2
,
367 "[mkv] lzo decompression buffer too small.\n");
378 static int demux_mkv_read_info(demuxer_t
*demuxer
)
380 mkv_demuxer_t
*mkv_d
= demuxer
->priv
;
381 stream_t
*s
= demuxer
->stream
;
384 uint64_t tc_scale
= 1000000;
385 long double duration
= 0.;
387 length
= ebml_read_length(s
, NULL
);
389 uint32_t id
= ebml_read_id(s
, &i
);
392 case MATROSKA_ID_TIMECODESCALE
:
393 tc_scale
= ebml_read_uint(s
, &l
);
395 if (tc_scale
== EBML_UINT_INVALID
)
397 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + timecode scale: %"PRIu64
"\n",
401 case MATROSKA_ID_DURATION
:
402 duration
= ebml_read_float(s
, &l
);
404 if (duration
== EBML_FLOAT_INVALID
)
409 ebml_read_skip(s
, &l
);
414 mkv_d
->tc_scale
= tc_scale
;
415 mkv_d
->duration
= duration
* tc_scale
/ 1000000000.0;
417 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] | + duration: %.3fs\n",
424 * \brief free array of kv_content_encoding_t
425 * \param encodings pointer to array
426 * \param numencodings number of encodings in array
429 demux_mkv_free_encodings(mkv_content_encoding_t
*encodings
, int numencodings
)
431 while (numencodings
-- > 0)
432 free(encodings
[numencodings
].comp_settings
);
437 demux_mkv_read_trackencodings (demuxer_t
*demuxer
, mkv_track_t
*track
)
439 stream_t
*s
= demuxer
->stream
;
440 mkv_content_encoding_t
*ce
, e
;
441 uint64_t len
, length
, l
;
444 ce
= malloc (sizeof (*ce
));
447 len
= length
= ebml_read_length (s
, &il
);
451 switch (ebml_read_id (s
, &il
))
453 case MATROSKA_ID_CONTENTENCODING
:
458 memset (&e
, 0, sizeof (e
));
461 len
= ebml_read_length (s
, &i
);
469 switch (ebml_read_id (s
, &il
))
471 case MATROSKA_ID_CONTENTENCODINGORDER
:
472 num
= ebml_read_uint (s
, &l
);
473 if (num
== EBML_UINT_INVALID
)
478 case MATROSKA_ID_CONTENTENCODINGSCOPE
:
479 num
= ebml_read_uint (s
, &l
);
480 if (num
== EBML_UINT_INVALID
)
485 case MATROSKA_ID_CONTENTENCODINGTYPE
:
486 num
= ebml_read_uint (s
, &l
);
487 if (num
== EBML_UINT_INVALID
)
492 case MATROSKA_ID_CONTENTCOMPRESSION
:
496 le
= ebml_read_length (s
, &i
);
504 switch (ebml_read_id (s
, &il
))
506 case MATROSKA_ID_CONTENTCOMPALGO
:
507 num
= ebml_read_uint (s
, &l
);
508 if (num
== EBML_UINT_INVALID
)
513 case MATROSKA_ID_CONTENTCOMPSETTINGS
:
514 l
= ebml_read_length (s
, &i
);
515 e
.comp_settings
= malloc (l
);
516 stream_read (s
, e
.comp_settings
, l
);
517 e
.comp_settings_len
= l
;
522 ebml_read_skip (s
, &l
);
530 mp_msg(MSGT_DEMUX
, MSGL_WARN
,
531 MSGTR_MPDEMUX_MKV_TrackEncrypted
, track
->tnum
);
533 else if (e
.type
!= 0)
535 mp_msg(MSGT_DEMUX
, MSGL_WARN
,
536 MSGTR_MPDEMUX_MKV_UnknownContentEncoding
, track
->tnum
);
539 if (e
.comp_algo
!= 0 && e
.comp_algo
!= 2)
541 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
542 MSGTR_MPDEMUX_MKV_UnknownCompression
,
543 track
->tnum
, e
.comp_algo
);
546 else if (e
.comp_algo
== 0)
548 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
549 MSGTR_MPDEMUX_MKV_ZlibCompressionUnsupported
,
558 ebml_read_skip (s
, &l
);
564 if (e
.order
<= ce
[i
].order
)
566 ce
= realloc (ce
, (n
+1) *sizeof (*ce
));
567 memmove (ce
+i
+1, ce
+i
, (n
-i
) * sizeof (*ce
));
568 memcpy (ce
+i
, &e
, sizeof (e
));
574 ebml_read_skip (s
, &l
);
581 track
->encodings
= ce
;
582 track
->num_encodings
= n
;
586 demux_mkv_free_encodings(ce
, n
);
591 demux_mkv_read_trackaudio (demuxer_t
*demuxer
, mkv_track_t
*track
)
593 stream_t
*s
= demuxer
->stream
;
594 uint64_t len
, length
, l
;
597 track
->a_sfreq
= 8000.0;
598 track
->a_channels
= 1;
600 len
= length
= ebml_read_length (s
, &il
);
604 switch (ebml_read_id (s
, &il
))
606 case MATROSKA_ID_AUDIOSAMPLINGFREQ
:
608 long double num
= ebml_read_float (s
, &l
);
609 if (num
== EBML_FLOAT_INVALID
)
611 track
->a_sfreq
= num
;
612 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Sampling frequency: %f\n",
617 case MATROSKA_ID_AUDIOBITDEPTH
:
619 uint64_t num
= ebml_read_uint (s
, &l
);
620 if (num
== EBML_UINT_INVALID
)
623 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Bit depth: %u\n",
628 case MATROSKA_ID_AUDIOCHANNELS
:
630 uint64_t num
= ebml_read_uint (s
, &l
);
631 if (num
== EBML_UINT_INVALID
)
633 track
->a_channels
= num
;
634 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Channels: %u\n",
640 ebml_read_skip (s
, &l
);
649 demux_mkv_read_trackvideo (demuxer_t
*demuxer
, mkv_track_t
*track
)
651 stream_t
*s
= demuxer
->stream
;
652 uint64_t len
, length
, l
;
655 len
= length
= ebml_read_length (s
, &il
);
659 switch (ebml_read_id (s
, &il
))
661 case MATROSKA_ID_VIDEOFRAMERATE
:
663 long double num
= ebml_read_float (s
, &l
);
664 if (num
== EBML_FLOAT_INVALID
)
666 track
->v_frate
= num
;
667 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Frame rate: %f\n",
669 if (track
->v_frate
> 0)
670 track
->default_duration
= 1 / track
->v_frate
;
674 case MATROSKA_ID_VIDEODISPLAYWIDTH
:
676 uint64_t num
= ebml_read_uint (s
, &l
);
677 if (num
== EBML_UINT_INVALID
)
679 track
->v_dwidth
= num
;
680 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display width: %u\n",
685 case MATROSKA_ID_VIDEODISPLAYHEIGHT
:
687 uint64_t num
= ebml_read_uint (s
, &l
);
688 if (num
== EBML_UINT_INVALID
)
690 track
->v_dheight
= num
;
691 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Display height: %u\n",
696 case MATROSKA_ID_VIDEOPIXELWIDTH
:
698 uint64_t num
= ebml_read_uint (s
, &l
);
699 if (num
== EBML_UINT_INVALID
)
701 track
->v_width
= num
;
702 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel width: %u\n",
707 case MATROSKA_ID_VIDEOPIXELHEIGHT
:
709 uint64_t num
= ebml_read_uint (s
, &l
);
710 if (num
== EBML_UINT_INVALID
)
712 track
->v_height
= num
;
713 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Pixel height: %u\n",
719 ebml_read_skip (s
, &l
);
728 * \brief free any data associated with given track
729 * \param track track of which to free data
732 demux_mkv_free_trackentry(mkv_track_t
*track
) {
734 free (track
->codec_id
);
735 free (track
->language
);
736 free (track
->private_data
);
737 free (track
->audio_buf
);
738 free (track
->audio_timestamp
);
739 demux_mkv_free_encodings(track
->encodings
, track
->num_encodings
);
744 demux_mkv_read_trackentry (demuxer_t
*demuxer
)
746 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
747 stream_t
*s
= demuxer
->stream
;
749 uint64_t len
, length
, l
;
752 track
= calloc (1, sizeof (*track
));
753 /* set default values */
754 track
->default_track
= 1;
756 track
->language
= strdup("eng");
758 len
= length
= ebml_read_length (s
, &il
);
762 switch (ebml_read_id (s
, &il
))
764 case MATROSKA_ID_TRACKNUMBER
:
766 uint64_t num
= ebml_read_uint (s
, &l
);
767 if (num
== EBML_UINT_INVALID
)
770 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track number: %u\n",
775 case MATROSKA_ID_TRACKNAME
:
777 track
->name
= ebml_read_utf8 (s
, &l
);
778 if (track
->name
== NULL
)
780 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Name: %s\n",
785 case MATROSKA_ID_TRACKTYPE
:
787 uint64_t num
= ebml_read_uint (s
, &l
);
788 if (num
== EBML_UINT_INVALID
)
791 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Track type: ");
794 case MATROSKA_TRACK_AUDIO
:
795 mp_msg (MSGT_DEMUX
, MSGL_V
, "Audio\n");
797 case MATROSKA_TRACK_VIDEO
:
798 mp_msg (MSGT_DEMUX
, MSGL_V
, "Video\n");
800 case MATROSKA_TRACK_SUBTITLE
:
801 mp_msg (MSGT_DEMUX
, MSGL_V
, "Subtitle\n");
804 mp_msg (MSGT_DEMUX
, MSGL_V
, "unknown\n");
810 case MATROSKA_ID_TRACKAUDIO
:
811 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Audio track\n");
812 l
= demux_mkv_read_trackaudio (demuxer
, track
);
817 case MATROSKA_ID_TRACKVIDEO
:
818 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Video track\n");
819 l
= demux_mkv_read_trackvideo (demuxer
, track
);
824 case MATROSKA_ID_CODECID
:
825 track
->codec_id
= ebml_read_ascii (s
, &l
);
826 if (track
->codec_id
== NULL
)
828 if (!strcmp (track
->codec_id
, MKV_V_MSCOMP
) ||
829 !strcmp (track
->codec_id
, MKV_A_ACM
))
830 track
->ms_compat
= 1;
831 else if (!strcmp (track
->codec_id
, MKV_S_VOBSUB
))
832 track
->subtitle_type
= MATROSKA_SUBTYPE_VOBSUB
;
833 else if (!strcmp (track
->codec_id
, MKV_S_TEXTSSA
)
834 || !strcmp (track
->codec_id
, MKV_S_TEXTASS
)
835 || !strcmp (track
->codec_id
, MKV_S_SSA
)
836 || !strcmp (track
->codec_id
, MKV_S_ASS
))
838 track
->subtitle_type
= MATROSKA_SUBTYPE_SSA
;
840 else if (!strcmp (track
->codec_id
, MKV_S_TEXTASCII
))
841 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
842 if (!strcmp (track
->codec_id
, MKV_S_TEXTUTF8
))
844 track
->subtitle_type
= MATROSKA_SUBTYPE_TEXT
;
846 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Codec ID: %s\n",
850 case MATROSKA_ID_CODECPRIVATE
:
853 uint64_t num
= ebml_read_length (s
, &x
);
854 // audit: cheap guard against overflows later..
855 if (num
> SIZE_MAX
- 1000) return 0;
857 track
->private_data
= malloc (num
+ AV_LZO_INPUT_PADDING
);
858 if (stream_read(s
, track
->private_data
, num
) != (int) num
)
860 track
->private_size
= num
;
861 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + CodecPrivate, length "
862 "%u\n", track
->private_size
);
866 case MATROSKA_ID_TRACKLANGUAGE
:
867 free(track
->language
);
868 track
->language
= ebml_read_utf8 (s
, &l
);
869 if (track
->language
== NULL
)
871 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Language: %s\n",
875 case MATROSKA_ID_TRACKFLAGDEFAULT
:
877 uint64_t 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
);
886 case MATROSKA_ID_TRACKDEFAULTDURATION
:
888 uint64_t num
= ebml_read_uint (s
, &l
);
889 if (num
== EBML_UINT_INVALID
)
892 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default duration: 0");
895 track
->v_frate
= 1000000000.0 / num
;
896 track
->default_duration
= num
/ 1000000000.0;
897 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + Default duration: "
898 "%.3fms ( = %.3f fps)\n",num
/1000000.0,track
->v_frate
);
903 case MATROSKA_ID_TRACKENCODINGS
:
904 l
= demux_mkv_read_trackencodings (demuxer
, track
);
910 ebml_read_skip (s
, &l
);
916 mkv_d
->tracks
[mkv_d
->num_tracks
++] = track
;
920 demux_mkv_free_trackentry(track
);
925 demux_mkv_read_tracks (demuxer_t
*demuxer
)
927 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
928 stream_t
*s
= demuxer
->stream
;
932 mkv_d
->tracks
= malloc (sizeof (*mkv_d
->tracks
));
933 mkv_d
->num_tracks
= 0;
935 length
= ebml_read_length (s
, NULL
);
938 switch (ebml_read_id (s
, &il
))
940 case MATROSKA_ID_TRACKENTRY
:
941 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + a track...\n");
942 mkv_d
->tracks
= realloc (mkv_d
->tracks
,
943 (mkv_d
->num_tracks
+1)
944 *sizeof (*mkv_d
->tracks
));
945 l
= demux_mkv_read_trackentry (demuxer
);
951 ebml_read_skip (s
, &l
);
960 demux_mkv_read_cues (demuxer_t
*demuxer
)
962 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
963 stream_t
*s
= demuxer
->stream
;
964 uint64_t length
, l
, time
, track
, pos
;
968 if (index_mode
== 0) {
969 ebml_read_skip (s
, NULL
);
972 off
= stream_tell (s
);
973 for (i
=0; i
<mkv_d
->parsed_cues_num
; i
++)
974 if (mkv_d
->parsed_cues
[i
] == off
)
976 ebml_read_skip (s
, NULL
);
979 mkv_d
->parsed_cues
= realloc (mkv_d
->parsed_cues
,
980 (mkv_d
->parsed_cues_num
+1)
982 mkv_d
->parsed_cues
[mkv_d
->parsed_cues_num
++] = off
;
984 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing cues ] -----------\n");
985 length
= ebml_read_length (s
, NULL
);
989 time
= track
= pos
= EBML_UINT_INVALID
;
991 switch (ebml_read_id (s
, &il
))
993 case MATROSKA_ID_POINTENTRY
:
997 len
= ebml_read_length (s
, &i
);
1005 switch (ebml_read_id (s
, &il
))
1007 case MATROSKA_ID_CUETIME
:
1008 time
= ebml_read_uint (s
, &l
);
1011 case MATROSKA_ID_CUETRACKPOSITION
:
1015 le
= ebml_read_length (s
, &i
);
1023 switch (ebml_read_id (s
, &il
))
1025 case MATROSKA_ID_CUETRACK
:
1026 track
= ebml_read_uint (s
, &l
);
1029 case MATROSKA_ID_CUECLUSTERPOSITION
:
1030 pos
= ebml_read_uint (s
, &l
);
1034 ebml_read_skip (s
, &l
);
1043 ebml_read_skip (s
, &l
);
1052 ebml_read_skip (s
, &l
);
1058 if (time
!= EBML_UINT_INVALID
&& track
!= EBML_UINT_INVALID
1059 && pos
!= EBML_UINT_INVALID
)
1061 mkv_d
->indexes
= grow_array(mkv_d
->indexes
, mkv_d
->num_indexes
,
1062 sizeof(mkv_index_t
));
1063 mkv_d
->indexes
[mkv_d
->num_indexes
].tnum
= track
;
1064 mkv_d
->indexes
[mkv_d
->num_indexes
].timecode
= time
;
1065 mkv_d
->indexes
[mkv_d
->num_indexes
].filepos
=mkv_d
->segment_start
+pos
;
1066 mp_msg (MSGT_DEMUX
, MSGL_DBG2
, "[mkv] |+ found cue point "
1067 "for track %"PRIu64
": timecode %"PRIu64
", filepos: %"PRIu64
"\n",
1068 track
, time
, mkv_d
->segment_start
+ pos
);
1069 mkv_d
->num_indexes
++;
1073 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing cues ] -----------\n");
1077 static uint64_t read_one_chapter(demuxer_t
*demuxer
, stream_t
*s
)
1080 uint64_t start
= 0, end
= 0;
1085 len
= ebml_read_length(s
, &i
);
1086 uint64_t bytes_read
= len
+ i
;
1089 id
= ebml_read_id(s
, &i
);
1092 case MATROSKA_ID_CHAPTERTIMESTART
:
1093 start
= ebml_read_uint(s
, &l
) / 1000000;
1097 case MATROSKA_ID_CHAPTERTIMEEND
:
1098 end
= ebml_read_uint(s
, &l
) / 1000000;
1102 case MATROSKA_ID_CHAPTERDISPLAY
:;
1103 uint64_t displaylen
= ebml_read_length(s
, &i
);
1104 len
-= displaylen
+ i
;
1105 while (displaylen
> 0) {
1106 id
= ebml_read_id(s
, &i
);
1109 case MATROSKA_ID_CHAPSTRING
:
1110 name
= ebml_read_utf8(s
, &l
);
1113 ebml_read_skip(s
, &l
);
1121 ebml_read_skip(s
, &l
);
1128 name
= strdup("(unnamed)");
1130 int cid
= demuxer_add_chapter(demuxer
, name
, start
, end
);
1132 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] Chapter %u from %02d:%02d:%02d."
1133 "%03d to %02d:%02d:%02d.%03d, %s\n",
1135 (int) (start
/ 60 / 60 / 1000),
1136 (int) ((start
/ 60 / 1000) % 60),
1137 (int) ((start
/ 1000) % 60),
1138 (int) (start
% 1000),
1139 (int) (end
/ 60 / 60 / 1000),
1140 (int) ((end
/ 60 / 1000) % 60),
1141 (int) ((end
/ 1000) % 60),
1142 (int) (end
% 1000), name
);
1148 static int demux_mkv_read_chapters(struct demuxer
*demuxer
)
1150 stream_t
*s
= demuxer
->stream
;
1155 if (demuxer
->chapters
) {
1156 ebml_read_skip(s
, NULL
);
1160 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing chapters ] ---------\n");
1161 length
= ebml_read_length(s
, NULL
);
1163 while (length
> 0) {
1164 id
= ebml_read_id(s
, &i
);
1167 case MATROSKA_ID_EDITIONENTRY
:;
1168 uint64_t editionlen
= ebml_read_length(s
, &i
);
1169 length
-= editionlen
+ i
;
1170 while (editionlen
> 0) {
1171 id
= ebml_read_id(s
, &i
);
1174 case MATROSKA_ID_CHAPTERATOM
:
1175 l
= read_one_chapter(demuxer
, s
);
1178 ebml_read_skip(s
, &l
);
1186 ebml_read_skip(s
, &l
);
1192 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing chapters ] ---------\n");
1197 demux_mkv_read_tags (demuxer_t
*demuxer
)
1199 ebml_read_skip (demuxer
->stream
, NULL
);
1204 demux_mkv_read_attachments (demuxer_t
*demuxer
)
1206 stream_t
*s
= demuxer
->stream
;
1210 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing attachments ] ---------\n");
1211 length
= ebml_read_length (s
, NULL
);
1215 switch (ebml_read_id (s
, &il
))
1217 case MATROSKA_ID_ATTACHEDFILE
:
1226 len
= ebml_read_length (s
, &i
);
1229 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + an attachment...\n");
1236 switch (ebml_read_id (s
, &il
))
1238 case MATROSKA_ID_FILENAME
:
1239 name
= ebml_read_utf8 (s
, &l
);
1242 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileName: %s\n",
1246 case MATROSKA_ID_FILEMIMETYPE
:
1247 mime
= ebml_read_ascii (s
, &l
);
1250 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileMimeType: %s\n",
1254 case MATROSKA_ID_FILEDATA
:
1257 uint64_t num
= ebml_read_length (s
, &x
);
1260 data
= malloc (num
);
1261 if (stream_read(s
, data
, num
) != (int) num
)
1267 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] | + FileData, length "
1273 ebml_read_skip (s
, &l
);
1279 demuxer_add_attachment(demuxer
, name
, mime
, data
, data_size
);
1280 mp_msg(MSGT_DEMUX
, MSGL_V
,
1281 "[mkv] Attachment: %s, %s, %u bytes\n",
1282 name
, mime
, data_size
);
1287 ebml_read_skip (s
, &l
);
1293 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing attachments ] ---------\n");
1298 demux_mkv_read_seekhead (demuxer_t
*demuxer
)
1300 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1301 stream_t
*s
= demuxer
->stream
;
1302 uint64_t length
, l
, seek_pos
, saved_pos
, num
;
1307 off
= stream_tell (s
);
1308 for (i
=0; i
<mkv_d
->parsed_seekhead_num
; i
++)
1309 if (mkv_d
->parsed_seekhead
[i
] == off
)
1311 ebml_read_skip (s
, NULL
);
1314 mkv_d
->parsed_seekhead
= realloc (mkv_d
->parsed_seekhead
,
1315 (mkv_d
->parsed_seekhead_num
+1)
1317 mkv_d
->parsed_seekhead
[mkv_d
->parsed_seekhead_num
++] = off
;
1319 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] /---- [ parsing seek head ] ---------\n");
1320 length
= ebml_read_length (s
, NULL
);
1321 /* off now holds the position of the next element after the seek head. */
1322 off
= stream_tell (s
) + length
;
1323 while (length
> 0 && !res
)
1327 seek_pos
= EBML_UINT_INVALID
;
1329 switch (ebml_read_id (s
, &il
))
1331 case MATROSKA_ID_SEEKENTRY
:
1335 len
= ebml_read_length (s
, &i
);
1343 switch (ebml_read_id (s
, &il
))
1345 case MATROSKA_ID_SEEKID
:
1346 num
= ebml_read_uint (s
, &l
);
1347 if (num
!= EBML_UINT_INVALID
)
1351 case MATROSKA_ID_SEEKPOSITION
:
1352 seek_pos
= ebml_read_uint (s
, &l
);
1356 ebml_read_skip (s
, &l
);
1366 ebml_read_skip (s
, &l
);
1371 if (seek_id
== 0 || seek_id
== MATROSKA_ID_CLUSTER
1372 || seek_pos
== EBML_UINT_INVALID
||
1373 ((mkv_d
->segment_start
+ seek_pos
) >= (uint64_t)demuxer
->movi_end
))
1376 saved_pos
= stream_tell (s
);
1377 if (!stream_seek (s
, mkv_d
->segment_start
+ seek_pos
))
1381 if (ebml_read_id (s
, &il
) != seek_id
)
1386 case MATROSKA_ID_CUES
:
1387 if (demux_mkv_read_cues (demuxer
))
1391 case MATROSKA_ID_TAGS
:
1392 if (demux_mkv_read_tags (demuxer
))
1396 case MATROSKA_ID_SEEKHEAD
:
1397 if (demux_mkv_read_seekhead (demuxer
))
1401 case MATROSKA_ID_CHAPTERS
:
1402 if (demux_mkv_read_chapters (demuxer
))
1408 stream_seek (s
, saved_pos
);
1412 /* If there was an error then try to skip this seek head. */
1413 if (stream_seek (s
, off
))
1418 stream_seek (s
, stream_tell (s
) + length
);
1419 mp_msg(MSGT_DEMUX
, MSGL_V
, "[mkv] \\---- [ parsing seek head ] ---------\n");
1424 demux_mkv_open_video (demuxer_t
*demuxer
, mkv_track_t
*track
, int vid
);
1426 demux_mkv_open_audio (demuxer_t
*demuxer
, mkv_track_t
*track
, int aid
);
1428 demux_mkv_open_sub (demuxer_t
*demuxer
, mkv_track_t
*track
, int sid
);
1431 display_create_tracks (demuxer_t
*demuxer
)
1433 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*)demuxer
->priv
;
1434 int i
, vid
=0, aid
=0, sid
=0;
1436 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
1438 char *type
= "unknown", str
[32];
1440 switch (mkv_d
->tracks
[i
]->type
)
1442 case MATROSKA_TRACK_VIDEO
:
1444 demux_mkv_open_video(demuxer
, mkv_d
->tracks
[i
], vid
);
1445 if (mkv_d
->tracks
[i
]->name
)
1446 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_VID_%d_NAME=%s\n", vid
, mkv_d
->tracks
[i
]->name
);
1447 sprintf (str
, "-vid %u", vid
++);
1449 case MATROSKA_TRACK_AUDIO
:
1451 demux_mkv_open_audio(demuxer
, mkv_d
->tracks
[i
], aid
);
1452 if (mkv_d
->tracks
[i
]->name
)
1453 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_NAME=%s\n", aid
, mkv_d
->tracks
[i
]->name
);
1454 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_AID_%d_LANG=%s\n", aid
, mkv_d
->tracks
[i
]->language
);
1455 sprintf (str
, "-aid %u, -alang %.5s",aid
++,mkv_d
->tracks
[i
]->language
);
1457 case MATROSKA_TRACK_SUBTITLE
:
1459 demux_mkv_open_sub(demuxer
, mkv_d
->tracks
[i
], sid
);
1460 if (mkv_d
->tracks
[i
]->name
)
1461 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_NAME=%s\n", sid
, mkv_d
->tracks
[i
]->name
);
1462 mp_msg(MSGT_IDENTIFY
, MSGL_INFO
, "ID_SID_%d_LANG=%s\n", sid
, mkv_d
->tracks
[i
]->language
);
1463 sprintf (str
, "-sid %u, -slang %.5s",sid
++,mkv_d
->tracks
[i
]->language
);
1466 if (mkv_d
->tracks
[i
]->name
)
1467 mp_msg(MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_TrackIDName
,
1468 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
, mkv_d
->tracks
[i
]->name
, str
);
1470 mp_msg(MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_TrackID
,
1471 mkv_d
->tracks
[i
]->tnum
, type
, mkv_d
->tracks
[i
]->codec_id
, str
);
1479 } videocodec_info_t
;
1481 static const videocodec_info_t vinfo
[] = {
1482 { MKV_V_MPEG1
, mmioFOURCC('m', 'p', 'g', '1'), 0 },
1483 { MKV_V_MPEG2
, mmioFOURCC('m', 'p', 'g', '2'), 0 },
1484 { MKV_V_MPEG4_SP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1485 { MKV_V_MPEG4_ASP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1486 { MKV_V_MPEG4_AP
, mmioFOURCC('m', 'p', '4', 'v'), 1 },
1487 { MKV_V_MPEG4_AVC
, mmioFOURCC('a', 'v', 'c', '1'), 1 },
1488 { MKV_V_THEORA
, mmioFOURCC('t', 'h', 'e', 'o'), 1 },
1493 demux_mkv_open_video (demuxer_t
*demuxer
, mkv_track_t
*track
, int vid
)
1495 struct MPOpts
*opts
= demuxer
->opts
;
1496 BITMAPINFOHEADER
*bih
;
1497 void *ImageDesc
= NULL
;
1500 if (track
->ms_compat
) /* MS compatibility mode */
1502 BITMAPINFOHEADER
*src
;
1504 if (track
->private_data
== NULL
1505 || track
->private_size
< sizeof (BITMAPINFOHEADER
))
1508 src
= (BITMAPINFOHEADER
*) track
->private_data
;
1509 bih
= calloc (1, track
->private_size
);
1510 bih
->biSize
= le2me_32 (src
->biSize
);
1511 bih
->biWidth
= le2me_32 (src
->biWidth
);
1512 bih
->biHeight
= le2me_32 (src
->biHeight
);
1513 bih
->biPlanes
= le2me_16 (src
->biPlanes
);
1514 bih
->biBitCount
= le2me_16 (src
->biBitCount
);
1515 bih
->biCompression
= le2me_32 (src
->biCompression
);
1516 bih
->biSizeImage
= le2me_32 (src
->biSizeImage
);
1517 bih
->biXPelsPerMeter
= le2me_32 (src
->biXPelsPerMeter
);
1518 bih
->biYPelsPerMeter
= le2me_32 (src
->biYPelsPerMeter
);
1519 bih
->biClrUsed
= le2me_32 (src
->biClrUsed
);
1520 bih
->biClrImportant
= le2me_32 (src
->biClrImportant
);
1521 memcpy((char *) bih
+ sizeof (BITMAPINFOHEADER
),
1522 (char *) src
+ sizeof (BITMAPINFOHEADER
),
1523 track
->private_size
- sizeof (BITMAPINFOHEADER
));
1525 if (track
->v_width
== 0)
1526 track
->v_width
= bih
->biWidth
;
1527 if (track
->v_height
== 0)
1528 track
->v_height
= bih
->biHeight
;
1532 bih
= calloc (1, sizeof (BITMAPINFOHEADER
));
1533 bih
->biSize
= sizeof (BITMAPINFOHEADER
);
1534 bih
->biWidth
= track
->v_width
;
1535 bih
->biHeight
= track
->v_height
;
1536 bih
->biBitCount
= 24;
1537 bih
->biSizeImage
= bih
->biWidth
* bih
->biHeight
* bih
->biBitCount
/8;
1539 if (track
->private_size
>= RVPROPERTIES_SIZE
1540 && (!strcmp (track
->codec_id
, MKV_V_REALV10
)
1541 || !strcmp (track
->codec_id
, MKV_V_REALV20
)
1542 || !strcmp (track
->codec_id
, MKV_V_REALV30
)
1543 || !strcmp (track
->codec_id
, MKV_V_REALV40
)))
1545 unsigned char *dst
, *src
;
1549 src
= track
->private_data
+ RVPROPERTIES_SIZE
;
1551 cnt
= track
->private_size
- RVPROPERTIES_SIZE
;
1552 bih
= realloc(bih
, sizeof (BITMAPINFOHEADER
)+8+cnt
);
1553 bih
->biSize
= 48+cnt
;
1555 type2
= AV_RB32(src
- 4);
1556 if (type2
== 0x10003000 || type2
== 0x10003001)
1557 bih
->biCompression
=mmioFOURCC('R','V','1','3');
1559 bih
->biCompression
=mmioFOURCC('R','V',track
->codec_id
[9],'0');
1560 dst
= (unsigned char *) (bih
+ 1);
1561 // copy type1 and type2 info from rv properties
1562 memcpy(dst
, src
- 8, 8);
1563 stream_read(demuxer
->stream
, dst
+8, cnt
);
1564 track
->realmedia
= 1;
1566 #ifdef CONFIG_QTX_CODECS
1568 else if (track
->private_size
>= sizeof (ImageDescription
)
1569 && !strcmp(track
->codec_id
, MKV_V_QUICKTIME
))
1571 ImageDescriptionPtr idesc
;
1573 idesc
= (ImageDescriptionPtr
) track
->private_data
;
1574 idesc
->idSize
= be2me_32 (idesc
->idSize
);
1575 idesc
->cType
= be2me_32 (idesc
->cType
);
1576 idesc
->version
= be2me_16 (idesc
->version
);
1577 idesc
->revisionLevel
= be2me_16 (idesc
->revisionLevel
);
1578 idesc
->vendor
= be2me_32 (idesc
->vendor
);
1579 idesc
->temporalQuality
= be2me_32 (idesc
->temporalQuality
);
1580 idesc
->spatialQuality
= be2me_32 (idesc
->spatialQuality
);
1581 idesc
->width
= be2me_16 (idesc
->width
);
1582 idesc
->height
= be2me_16 (idesc
->height
);
1583 idesc
->hRes
= be2me_32 (idesc
->hRes
);
1584 idesc
->vRes
= be2me_32 (idesc
->vRes
);
1585 idesc
->dataSize
= be2me_32 (idesc
->dataSize
);
1586 idesc
->frameCount
= be2me_16 (idesc
->frameCount
);
1587 idesc
->depth
= be2me_16 (idesc
->depth
);
1588 idesc
->clutID
= be2me_16 (idesc
->clutID
);
1590 bih
->biCompression
= idesc
->cType
;
1592 #endif /* CONFIG_QTX_CODECS */
1597 const videocodec_info_t
*vi
= vinfo
;
1598 while (vi
->id
&& strcmp(vi
->id
, track
->codec_id
)) vi
++;
1599 bih
->biCompression
= vi
->fourcc
;
1600 if (vi
->extradata
&& track
->private_data
&& (track
->private_size
> 0))
1602 bih
->biSize
+= track
->private_size
;
1603 bih
= realloc (bih
, bih
->biSize
);
1604 memcpy (bih
+ 1, track
->private_data
, track
->private_size
);
1606 track
->reorder_timecodes
= opts
->user_correct_pts
== 0;
1608 mp_msg (MSGT_DEMUX
,MSGL_WARN
, MSGTR_MPDEMUX_MKV_UnknownCodecID
,
1609 track
->codec_id
, track
->tnum
);
1616 sh_v
= new_sh_video_vid (demuxer
, track
->tnum
, vid
);
1618 sh_v
->format
= sh_v
->bih
->biCompression
;
1619 if (track
->v_frate
== 0.0)
1620 track
->v_frate
= 25.0;
1621 sh_v
->fps
= track
->v_frate
;
1622 sh_v
->frametime
= 1 / track
->v_frate
;
1624 if (!track
->realmedia
)
1626 sh_v
->disp_w
= track
->v_width
;
1627 sh_v
->disp_h
= track
->v_height
;
1628 if (track
->v_dheight
)
1629 sh_v
->aspect
= (float)track
->v_dwidth
/ (float)track
->v_dheight
;
1633 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
1634 // disp_w and disp_h from the RealVideo stream contents returned
1635 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
1636 // the Matroska file then it has already been set to PixelWidth/Height
1637 // by check_track_information.
1638 sh_v
->disp_w
= track
->v_dwidth
;
1639 sh_v
->disp_h
= track
->v_dheight
;
1641 sh_v
->ImageDesc
= ImageDesc
;
1642 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] Aspect: %f\n", sh_v
->aspect
);
1644 sh_v
->ds
= demuxer
->video
;
1649 demux_mkv_open_audio (demuxer_t
*demuxer
, mkv_track_t
*track
, int aid
)
1651 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
1652 sh_audio_t
*sh_a
= new_sh_audio_aid(demuxer
, track
->tnum
, aid
);
1655 mkv_d
->audio_tracks
[mkv_d
->last_aid
] = track
->tnum
;
1657 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
1658 sh_a
->lang
= strdup(track
->language
);
1659 sh_a
->default_track
= track
->default_track
;
1660 sh_a
->ds
= demuxer
->audio
;
1661 sh_a
->wf
= malloc (sizeof (WAVEFORMATEX
));
1662 if (track
->ms_compat
&& (track
->private_size
>= sizeof(WAVEFORMATEX
)))
1664 WAVEFORMATEX
*wf
= (WAVEFORMATEX
*)track
->private_data
;
1665 sh_a
->wf
= realloc(sh_a
->wf
, track
->private_size
);
1666 sh_a
->wf
->wFormatTag
= le2me_16 (wf
->wFormatTag
);
1667 sh_a
->wf
->nChannels
= le2me_16 (wf
->nChannels
);
1668 sh_a
->wf
->nSamplesPerSec
= le2me_32 (wf
->nSamplesPerSec
);
1669 sh_a
->wf
->nAvgBytesPerSec
= le2me_32 (wf
->nAvgBytesPerSec
);
1670 sh_a
->wf
->nBlockAlign
= le2me_16 (wf
->nBlockAlign
);
1671 sh_a
->wf
->wBitsPerSample
= le2me_16 (wf
->wBitsPerSample
);
1672 sh_a
->wf
->cbSize
= track
->private_size
- sizeof(WAVEFORMATEX
);
1673 memcpy(sh_a
->wf
+ 1, wf
+ 1, track
->private_size
- sizeof(WAVEFORMATEX
));
1674 if (track
->a_sfreq
== 0.0)
1675 track
->a_sfreq
= sh_a
->wf
->nSamplesPerSec
;
1676 if (track
->a_channels
== 0)
1677 track
->a_channels
= sh_a
->wf
->nChannels
;
1678 if (track
->a_bps
== 0)
1679 track
->a_bps
= sh_a
->wf
->wBitsPerSample
;
1680 track
->a_formattag
= sh_a
->wf
->wFormatTag
;
1684 memset(sh_a
->wf
, 0, sizeof (WAVEFORMATEX
));
1685 if (!strcmp(track
->codec_id
, MKV_A_MP3
) ||
1686 !strcmp(track
->codec_id
, MKV_A_MP2
))
1687 track
->a_formattag
= 0x0055;
1688 else if (!strncmp(track
->codec_id
, MKV_A_AC3
, strlen(MKV_A_AC3
)))
1689 track
->a_formattag
= 0x2000;
1690 else if (!strcmp(track
->codec_id
, MKV_A_DTS
))
1691 track
->a_formattag
= 0x2001;
1692 else if (!strcmp(track
->codec_id
, MKV_A_PCM
) ||
1693 !strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1694 track
->a_formattag
= 0x0001;
1695 else if (!strcmp(track
->codec_id
, MKV_A_AAC_2MAIN
) ||
1696 !strncmp(track
->codec_id
, MKV_A_AAC_2LC
,
1697 strlen(MKV_A_AAC_2LC
)) ||
1698 !strcmp(track
->codec_id
, MKV_A_AAC_2SSR
) ||
1699 !strcmp(track
->codec_id
, MKV_A_AAC_4MAIN
) ||
1700 !strncmp(track
->codec_id
, MKV_A_AAC_4LC
,
1701 strlen(MKV_A_AAC_4LC
)) ||
1702 !strcmp(track
->codec_id
, MKV_A_AAC_4SSR
) ||
1703 !strcmp(track
->codec_id
, MKV_A_AAC_4LTP
) ||
1704 !strcmp(track
->codec_id
, MKV_A_AAC
))
1705 track
->a_formattag
= mmioFOURCC('M', 'P', '4', 'A');
1706 else if (!strcmp(track
->codec_id
, MKV_A_VORBIS
))
1708 if (track
->private_data
== NULL
)
1710 track
->a_formattag
= mmioFOURCC('v', 'r', 'b', 's');
1712 else if (!strcmp(track
->codec_id
, MKV_A_QDMC
))
1713 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', 'C');
1714 else if (!strcmp(track
->codec_id
, MKV_A_QDMC2
))
1715 track
->a_formattag
= mmioFOURCC('Q', 'D', 'M', '2');
1716 else if (!strcmp(track
->codec_id
, MKV_A_WAVPACK
))
1717 track
->a_formattag
= mmioFOURCC('W', 'V', 'P', 'K');
1718 else if (!strcmp(track
->codec_id
, MKV_A_FLAC
))
1720 if (track
->private_data
== NULL
|| track
->private_size
== 0)
1722 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
1723 MSGTR_MPDEMUX_MKV_FlacTrackDoesNotContainValidHeaders
);
1726 track
->a_formattag
= mmioFOURCC ('f', 'L', 'a', 'C');
1728 else if (track
->private_size
>= RAPROPERTIES4_SIZE
)
1730 if (!strcmp(track
->codec_id
, MKV_A_REAL28
))
1731 track
->a_formattag
= mmioFOURCC('2', '8', '_', '8');
1732 else if (!strcmp(track
->codec_id
, MKV_A_REALATRC
))
1733 track
->a_formattag
= mmioFOURCC('a', 't', 'r', 'c');
1734 else if (!strcmp(track
->codec_id
, MKV_A_REALCOOK
))
1735 track
->a_formattag
= mmioFOURCC('c', 'o', 'o', 'k');
1736 else if (!strcmp(track
->codec_id
, MKV_A_REALDNET
))
1737 track
->a_formattag
= mmioFOURCC('d', 'n', 'e', 't');
1738 else if (!strcmp(track
->codec_id
, MKV_A_REALSIPR
))
1739 track
->a_formattag
= mmioFOURCC('s', 'i', 'p', 'r');
1743 mp_msg (MSGT_DEMUX
, MSGL_WARN
, MSGTR_MPDEMUX_MKV_UnknownAudioCodec
,
1744 track
->codec_id
, track
->tnum
);
1745 free_sh_audio(demuxer
, track
->tnum
);
1750 sh_a
->format
= track
->a_formattag
;
1751 sh_a
->wf
->wFormatTag
= track
->a_formattag
;
1752 sh_a
->channels
= track
->a_channels
;
1753 sh_a
->wf
->nChannels
= track
->a_channels
;
1754 sh_a
->samplerate
= (uint32_t) track
->a_sfreq
;
1755 sh_a
->wf
->nSamplesPerSec
= (uint32_t) track
->a_sfreq
;
1756 if (track
->a_bps
== 0)
1758 sh_a
->samplesize
= 2;
1759 sh_a
->wf
->wBitsPerSample
= 16;
1763 sh_a
->samplesize
= track
->a_bps
/ 8;
1764 sh_a
->wf
->wBitsPerSample
= track
->a_bps
;
1766 if (track
->a_formattag
== 0x0055) /* MP3 || MP2 */
1768 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1769 sh_a
->wf
->nBlockAlign
= 1152;
1771 else if ((track
->a_formattag
== 0x2000) || /* AC3 */
1772 (track
->a_formattag
== 0x2001)) /* DTS */
1777 else if (track
->a_formattag
== 0x0001) /* PCM || PCM_BE */
1779 sh_a
->wf
->nAvgBytesPerSec
= sh_a
->channels
* sh_a
->samplerate
*2;
1780 sh_a
->wf
->nBlockAlign
= sh_a
->wf
->nAvgBytesPerSec
;
1781 if (!strcmp(track
->codec_id
, MKV_A_PCM_BE
))
1782 sh_a
->format
= mmioFOURCC('t', 'w', 'o', 's');
1784 else if (!strcmp(track
->codec_id
, MKV_A_QDMC
) ||
1785 !strcmp(track
->codec_id
, MKV_A_QDMC2
))
1787 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1788 sh_a
->wf
->nBlockAlign
= 1486;
1789 track
->fix_i_bps
= 1;
1790 track
->qt_last_a_pts
= 0.0;
1791 if (track
->private_data
!= NULL
)
1793 sh_a
->codecdata
=malloc(track
->private_size
);
1794 memcpy (sh_a
->codecdata
, track
->private_data
,
1795 track
->private_size
);
1796 sh_a
->codecdata_len
= track
->private_size
;
1799 else if (track
->a_formattag
== mmioFOURCC('M', 'P', '4', 'A'))
1801 int profile
, srate_idx
;
1803 sh_a
->wf
->nAvgBytesPerSec
= 16000;
1804 sh_a
->wf
->nBlockAlign
= 1024;
1806 if (!strcmp (track
->codec_id
, MKV_A_AAC
) &&
1807 (NULL
!= track
->private_data
))
1809 sh_a
->codecdata
=malloc(track
->private_size
);
1810 memcpy (sh_a
->codecdata
, track
->private_data
,
1811 track
->private_size
);
1812 sh_a
->codecdata_len
= track
->private_size
;
1816 /* Recreate the 'private data' */
1817 /* which faad2 uses in its initialization */
1818 srate_idx
= aac_get_sample_rate_index (sh_a
->samplerate
);
1819 if (!strncmp (&track
->codec_id
[12], "MAIN", 4))
1821 else if (!strncmp (&track
->codec_id
[12], "LC", 2))
1823 else if (!strncmp (&track
->codec_id
[12], "SSR", 3))
1827 sh_a
->codecdata
= malloc (5);
1828 sh_a
->codecdata
[0] = ((profile
+1) << 3) | ((srate_idx
&0xE) >> 1);
1829 sh_a
->codecdata
[1] = ((srate_idx
&0x1)<<7)|(track
->a_channels
<<3);
1831 if (strstr(track
->codec_id
, "SBR") != NULL
)
1833 /* HE-AAC (aka SBR AAC) */
1834 sh_a
->codecdata_len
= 5;
1836 sh_a
->samplerate
*= 2;
1837 sh_a
->wf
->nSamplesPerSec
*= 2;
1838 srate_idx
= aac_get_sample_rate_index(sh_a
->samplerate
);
1839 sh_a
->codecdata
[2] = AAC_SYNC_EXTENSION_TYPE
>> 3;
1840 sh_a
->codecdata
[3] = ((AAC_SYNC_EXTENSION_TYPE
&0x07)<<5) | 5;
1841 sh_a
->codecdata
[4] = (1 << 7) | (srate_idx
<< 3);
1842 track
->default_duration
= 1024.0 / (sh_a
->samplerate
/ 2);
1846 sh_a
->codecdata_len
= 2;
1847 track
->default_duration
= 1024.0 / (float)sh_a
->samplerate
;
1850 else if (track
->a_formattag
== mmioFOURCC('v', 'r', 'b', 's')) /* VORBIS */
1852 sh_a
->wf
->cbSize
= track
->private_size
;
1853 sh_a
->wf
= realloc(sh_a
->wf
, sizeof(WAVEFORMATEX
) + sh_a
->wf
->cbSize
);
1854 memcpy((unsigned char *) (sh_a
->wf
+1), track
->private_data
, sh_a
->wf
->cbSize
);
1856 else if (track
->private_size
>= RAPROPERTIES4_SIZE
1857 && !strncmp (track
->codec_id
, MKV_A_REALATRC
, 7))
1859 /* Common initialization for all RealAudio codecs */
1860 unsigned char *src
= track
->private_data
;
1861 int codecdata_length
, version
;
1864 sh_a
->wf
->nAvgBytesPerSec
= 0; /* FIXME !? */
1866 version
= AV_RB16(src
+ 4);
1867 flavor
= AV_RB16(src
+ 22);
1868 track
->coded_framesize
= AV_RB32(src
+ 24);
1869 track
->sub_packet_h
= AV_RB16(src
+ 40);
1870 sh_a
->wf
->nBlockAlign
=
1871 track
->audiopk_size
= AV_RB16(src
+ 42);
1872 track
->sub_packet_size
= AV_RB16(src
+ 44);
1875 src
+= RAPROPERTIES4_SIZE
;
1880 src
+= RAPROPERTIES5_SIZE
;
1885 codecdata_length
= AV_RB32(src
);
1887 sh_a
->wf
->cbSize
= codecdata_length
;
1888 sh_a
->wf
= realloc (sh_a
->wf
,
1889 sizeof (WAVEFORMATEX
) +
1891 memcpy(((char *)(sh_a
->wf
+ 1)), src
, codecdata_length
);
1893 switch (track
->a_formattag
) {
1894 case mmioFOURCC('a', 't', 'r', 'c'):
1895 sh_a
->wf
->nAvgBytesPerSec
= atrc_fl2bps
[flavor
];
1896 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
1897 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
1898 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
1900 case mmioFOURCC('c', 'o', 'o', 'k'):
1901 sh_a
->wf
->nAvgBytesPerSec
= cook_fl2bps
[flavor
];
1902 sh_a
->wf
->nBlockAlign
= track
->sub_packet_size
;
1903 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
1904 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
1906 case mmioFOURCC('s', 'i', 'p', 'r'):
1907 sh_a
->wf
->nAvgBytesPerSec
= sipr_fl2bps
[flavor
];
1908 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
1909 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
1910 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
1912 case mmioFOURCC('2', '8', '_', '8'):
1913 sh_a
->wf
->nAvgBytesPerSec
= 3600;
1914 sh_a
->wf
->nBlockAlign
= track
->coded_framesize
;
1915 track
->audio_buf
= malloc(track
->sub_packet_h
* track
->audiopk_size
);
1916 track
->audio_timestamp
= malloc(track
->sub_packet_h
* sizeof(float));
1920 track
->realmedia
= 1;
1922 else if (!strcmp(track
->codec_id
, MKV_A_FLAC
) ||
1923 (track
->a_formattag
== 0xf1ac))
1930 if (track
->a_formattag
== mmioFOURCC('f', 'L', 'a', 'C'))
1932 ptr
= track
->private_data
;
1933 size
= track
->private_size
;
1937 sh_a
->format
= mmioFOURCC('f', 'L', 'a', 'C');
1938 ptr
= track
->private_data
1939 + sizeof (WAVEFORMATEX
);
1940 size
= track
->private_size
- sizeof (WAVEFORMATEX
);
1942 if (size
< 4 || ptr
[0] != 'f' || ptr
[1] != 'L' ||
1943 ptr
[2] != 'a' || ptr
[3] != 'C')
1945 dp
= new_demux_packet (4);
1946 memcpy (dp
->buffer
, "fLaC", 4);
1950 dp
= new_demux_packet (size
);
1951 memcpy (dp
->buffer
, ptr
, size
);
1955 ds_add_packet (demuxer
->audio
, dp
);
1957 else if (track
->a_formattag
== mmioFOURCC('W', 'V', 'P', 'K'))
1958 { /* do nothing, still works */ }
1959 else if (!track
->ms_compat
|| (track
->private_size
< sizeof(WAVEFORMATEX
)))
1961 free_sh_audio(demuxer
, track
->tnum
);
1969 demux_mkv_open_sub (demuxer_t
*demuxer
, mkv_track_t
*track
, int sid
)
1971 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_UNKNOWN
)
1975 sh_sub_t
*sh
= new_sh_sub_sid(demuxer
, track
->tnum
, sid
);
1978 if (track
->subtitle_type
== MATROSKA_SUBTYPE_VOBSUB
)
1980 if (track
->subtitle_type
== MATROSKA_SUBTYPE_SSA
)
1982 size
= track
->private_size
;
1983 m
= demux_mkv_decode (track
,track
->private_data
,&buffer
,&size
,2);
1986 free (track
->private_data
);
1987 track
->private_data
= buffer
;
1988 track
->private_size
= size
;
1990 sh
->extradata
=malloc(track
->private_size
);
1991 memcpy (sh
->extradata
, track
->private_data
,
1992 track
->private_size
);
1993 sh
->extradata_len
= track
->private_size
;
1994 if (track
->language
&& (strcmp(track
->language
, "und") != 0))
1995 sh
->lang
= strdup(track
->language
);
1996 sh
->default_track
= track
->default_track
;
2000 mp_msg (MSGT_DEMUX
, MSGL_ERR
, MSGTR_MPDEMUX_MKV_SubtitleTypeNotSupported
,
2009 demux_mkv_open (demuxer_t
*demuxer
)
2011 stream_t
*s
= demuxer
->stream
;
2012 mkv_demuxer_t
*mkv_d
;
2014 int i
, version
, cont
= 0;
2017 stream_seek(s
, s
->start_pos
);
2018 str
= ebml_read_header (s
, &version
);
2019 if (str
== NULL
|| strcmp (str
, "matroska") || version
> 2)
2021 mp_msg (MSGT_DEMUX
, MSGL_DBG2
, "[mkv] no head found\n");
2026 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] Found the head...\n");
2028 if (ebml_read_id (s
, NULL
) != MATROSKA_ID_SEGMENT
)
2030 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] but no segment :(\n");
2033 ebml_read_length (s
, NULL
); /* return bytes number until EOF */
2035 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] + a segment...\n");
2037 mkv_d
= calloc (1, sizeof (mkv_demuxer_t
));
2038 demuxer
->priv
= mkv_d
;
2039 mkv_d
->tc_scale
= 1000000;
2040 mkv_d
->segment_start
= stream_tell (s
);
2041 mkv_d
->parsed_cues
= malloc (sizeof (off_t
));
2042 mkv_d
->parsed_seekhead
= malloc (sizeof (off_t
));
2046 switch (ebml_read_id (s
, NULL
))
2048 case MATROSKA_ID_INFO
:
2049 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment information...\n");
2050 cont
= demux_mkv_read_info (demuxer
);
2053 case MATROSKA_ID_TRACKS
:
2054 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ segment tracks...\n");
2055 cont
= demux_mkv_read_tracks (demuxer
);
2058 case MATROSKA_ID_CUES
:
2059 cont
= demux_mkv_read_cues (demuxer
);
2062 case MATROSKA_ID_TAGS
:
2063 cont
= demux_mkv_read_tags (demuxer
);
2066 case MATROSKA_ID_SEEKHEAD
:
2067 cont
= demux_mkv_read_seekhead (demuxer
);
2070 case MATROSKA_ID_CHAPTERS
:
2071 cont
= demux_mkv_read_chapters (demuxer
);
2074 case MATROSKA_ID_ATTACHMENTS
:
2075 cont
= demux_mkv_read_attachments (demuxer
);
2078 case MATROSKA_ID_CLUSTER
:
2081 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] |+ found cluster, headers are "
2082 "parsed completely :)\n");
2083 /* get the first cluster timecode */
2085 l
= ebml_read_length (s
, NULL
);
2086 while (ebml_read_id (s
, NULL
) != MATROSKA_ID_CLUSTERTIMECODE
)
2088 ebml_read_skip (s
, NULL
);
2089 if (stream_tell (s
) >= p
+ l
)
2092 if (stream_tell (s
) < p
+ l
)
2094 uint64_t num
= ebml_read_uint (s
, NULL
);
2095 if (num
== EBML_UINT_INVALID
)
2097 mkv_d
->first_tc
= num
* mkv_d
->tc_scale
/ 1000000.0;
2098 mkv_d
->has_first_tc
= 1;
2100 stream_seek (s
, p
- 4);
2108 ebml_read_skip (s
, NULL
);
2113 display_create_tracks (demuxer
);
2115 /* select video track */
2117 if (demuxer
->video
->id
== -1) /* automatically select a video track */
2119 /* search for a video track that has the 'default' flag set */
2120 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2121 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
2122 && mkv_d
->tracks
[i
]->default_track
)
2124 track
= mkv_d
->tracks
[i
];
2129 /* no track has the 'default' flag set */
2130 /* let's take the first video track */
2131 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2132 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_VIDEO
)
2134 track
= mkv_d
->tracks
[i
];
2138 else if (demuxer
->video
->id
!= -2) /* -2 = no video at all */
2139 track
= demux_mkv_find_track_by_num (mkv_d
, demuxer
->video
->id
,
2140 MATROSKA_TRACK_VIDEO
);
2142 if (track
&& demuxer
->v_streams
[track
->tnum
])
2144 mp_msg (MSGT_DEMUX
, MSGL_INFO
,
2145 MSGTR_MPDEMUX_MKV_WillPlayVideoTrack
, track
->tnum
);
2146 demuxer
->video
->id
= track
->tnum
;
2147 demuxer
->video
->sh
= demuxer
->v_streams
[track
->tnum
];
2151 mp_msg (MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_NoVideoTrackFound
);
2152 demuxer
->video
->id
= -2;
2155 /* select audio track */
2158 /* search for an audio track that has the 'default' flag set */
2159 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2160 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
2161 && mkv_d
->tracks
[i
]->default_track
)
2163 track
= mkv_d
->tracks
[i
];
2168 /* no track has the 'default' flag set */
2169 /* let's take the first audio track */
2170 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2171 if (mkv_d
->tracks
[i
]->type
== MATROSKA_TRACK_AUDIO
)
2173 track
= mkv_d
->tracks
[i
];
2177 if (track
&& demuxer
->a_streams
[track
->tnum
])
2179 demuxer
->audio
->id
= track
->tnum
;
2180 demuxer
->audio
->sh
= demuxer
->a_streams
[track
->tnum
];
2184 mp_msg (MSGT_DEMUX
, MSGL_INFO
, MSGTR_MPDEMUX_MKV_NoAudioTrackFound
);
2185 demuxer
->audio
->id
= -2;
2189 if(demuxer
->audio
->id
!= -2)
2190 for (i
=0; i
< mkv_d
->num_tracks
; i
++)
2192 if(mkv_d
->tracks
[i
]->type
!= MATROSKA_TRACK_AUDIO
)
2194 if(demuxer
->a_streams
[track
->tnum
])
2197 if(mkv_d
->last_aid
== MAX_A_STREAMS
)
2202 if (demuxer
->chapters
)
2204 for (i
=0; i
< (int)demuxer
->num_chapters
; i
++)
2206 demuxer
->chapters
[i
].start
-= mkv_d
->first_tc
;
2207 demuxer
->chapters
[i
].end
-= mkv_d
->first_tc
;
2209 if (dvd_last_chapter
> 0 && dvd_last_chapter
<= demuxer
->num_chapters
)
2211 if (demuxer
->chapters
[dvd_last_chapter
-1].end
!= 0)
2212 mkv_d
->stop_timecode
= demuxer
->chapters
[dvd_last_chapter
-1].end
;
2213 else if (dvd_last_chapter
+ 1 <= demuxer
->num_chapters
)
2214 mkv_d
->stop_timecode
= demuxer
->chapters
[dvd_last_chapter
].start
;
2218 if (s
->end_pos
== 0 || (mkv_d
->indexes
== NULL
&& index_mode
< 0))
2219 demuxer
->seekable
= 0;
2222 demuxer
->movi_start
= s
->start_pos
;
2223 demuxer
->movi_end
= s
->end_pos
;
2224 demuxer
->seekable
= 1;
2227 return DEMUXER_TYPE_MATROSKA
;
2231 demux_close_mkv (demuxer_t
*demuxer
)
2233 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2238 free_cached_dps (demuxer
);
2241 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2242 demux_mkv_free_trackentry(mkv_d
->tracks
[i
]);
2243 free (mkv_d
->tracks
);
2245 free (mkv_d
->indexes
);
2246 free (mkv_d
->cluster_positions
);
2247 free (mkv_d
->parsed_cues
);
2248 free (mkv_d
->parsed_seekhead
);
2254 demux_mkv_read_block_lacing (uint8_t *buffer
, uint64_t *size
,
2255 uint8_t *laces
, uint32_t **all_lace_sizes
)
2257 uint32_t total
= 0, *lace_size
;
2261 *all_lace_sizes
= NULL
;
2267 switch ((flags
& 0x06) >> 1)
2269 case 0: /* no lacing */
2271 lace_size
= calloc(*laces
, sizeof(uint32_t));
2272 lace_size
[0] = *size
;
2275 case 1: /* xiph lacing */
2276 case 2: /* fixed-size lacing */
2277 case 3: /* EBML lacing */
2281 lace_size
= calloc(*laces
, sizeof(uint32_t));
2283 switch ((flags
& 0x06) >> 1)
2285 case 1: /* xiph lacing */
2286 for (i
=0; i
< *laces
-1; i
++)
2291 lace_size
[i
] += *buffer
;
2293 } while (*buffer
++ == 0xFF);
2294 total
+= lace_size
[i
];
2296 lace_size
[i
] = *size
- total
;
2299 case 2: /* fixed-size lacing */
2300 for (i
=0; i
< *laces
; i
++)
2301 lace_size
[i
] = *size
/ *laces
;
2304 case 3: /* EBML lacing */
2307 uint64_t num
= ebml_read_vlen_uint (buffer
, &l
);
2308 if (num
== EBML_UINT_INVALID
) {
2315 total
= lace_size
[0] = num
;
2316 for (i
=1; i
< *laces
-1; i
++)
2319 snum
= ebml_read_vlen_int (buffer
, &l
);
2320 if (snum
== EBML_INT_INVALID
) {
2326 lace_size
[i
] = lace_size
[i
-1] + snum
;
2327 total
+= lace_size
[i
];
2329 lace_size
[i
] = *size
- total
;
2335 *all_lace_sizes
= lace_size
;
2340 handle_subtitles(demuxer_t
*demuxer
, mkv_track_t
*track
, char *block
,
2341 int64_t size
, uint64_t block_duration
, uint64_t timecode
)
2345 if (block_duration
== 0)
2347 mp_msg (MSGT_DEMUX
, MSGL_WARN
,
2348 MSGTR_MPDEMUX_MKV_NoBlockDurationForSubtitleTrackFound
);
2353 dp
= new_demux_packet(size
);
2354 memcpy(dp
->buffer
, block
, size
);
2355 dp
->pts
= timecode
/ 1000.0f
;
2356 dp
->endpts
= (timecode
+ block_duration
) / 1000.0f
;
2357 ds_add_packet(demuxer
->sub
, dp
);
2360 double real_fix_timestamp(unsigned char *buf
, unsigned int timestamp
, unsigned int format
, int64_t *kf_base
, int *kf_pts
, double *pts
);
2363 handle_realvideo (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2364 uint32_t size
, int block_bref
)
2366 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2368 uint32_t timestamp
= mkv_d
->last_pts
* 1000;
2370 dp
= new_demux_packet (size
);
2371 memcpy (dp
->buffer
, buffer
, size
);
2373 if (mkv_d
->v_skip_to_keyframe
)
2375 dp
->pts
= mkv_d
->last_pts
;
2376 track
->rv_kf_base
= 0;
2377 track
->rv_kf_pts
= timestamp
;
2380 dp
->pts
= real_fix_timestamp (dp
->buffer
, timestamp
,
2381 ((sh_video_t
*)demuxer
->video
->sh
)->bih
->biCompression
,
2382 &track
->rv_kf_base
, &track
->rv_kf_pts
, NULL
);
2383 dp
->pos
= demuxer
->filepos
;
2384 dp
->flags
= block_bref
? 0 : 0x10;
2386 ds_add_packet(demuxer
->video
, dp
);
2390 handle_realaudio (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2391 uint32_t size
, int block_bref
)
2393 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2394 int sps
= track
->sub_packet_size
;
2395 int sph
= track
->sub_packet_h
;
2396 int cfs
= track
->coded_framesize
;
2397 int w
= track
->audiopk_size
;
2398 int spc
= track
->sub_packet_cnt
;
2402 if ((track
->a_formattag
== mmioFOURCC('2', '8', '_', '8')) ||
2403 (track
->a_formattag
== mmioFOURCC('c', 'o', 'o', 'k')) ||
2404 (track
->a_formattag
== mmioFOURCC('a', 't', 'r', 'c')) ||
2405 (track
->a_formattag
== mmioFOURCC('s', 'i', 'p', 'r')))
2408 // spc = track->sub_packet_cnt = 0;
2409 switch (track
->a_formattag
) {
2410 case mmioFOURCC('2', '8', '_', '8'):
2411 for (x
= 0; x
< sph
/ 2; x
++)
2412 memcpy(track
->audio_buf
+ x
* 2 * w
+ spc
* cfs
, buffer
+ cfs
* x
, cfs
);
2414 case mmioFOURCC('c', 'o', 'o', 'k'):
2415 case mmioFOURCC('a', 't', 'r', 'c'):
2416 for (x
= 0; x
< w
/ sps
; x
++)
2417 memcpy(track
->audio_buf
+ sps
* (sph
* x
+ ((sph
+ 1) / 2) * (spc
& 1) + (spc
>> 1)), buffer
+ sps
* x
, sps
);
2419 case mmioFOURCC('s', 'i', 'p', 'r'):
2420 memcpy(track
->audio_buf
+ spc
* w
, buffer
, w
);
2424 int bs
= sph
* w
* 2 / 96; // nibbles per subpacket
2425 // Perform reordering
2426 for(n
=0; n
< 38; n
++)
2429 int i
= bs
* sipr_swaps
[n
][0];
2430 int o
= bs
* sipr_swaps
[n
][1];
2431 // swap nibbles of block 'i' with 'o' TODO: optimize
2432 for(j
= 0;j
< bs
; j
++)
2434 int x
= (i
& 1) ? (track
->audio_buf
[i
>> 1] >> 4) : (track
->audio_buf
[i
>> 1] & 0x0F);
2435 int y
= (o
& 1) ? (track
->audio_buf
[o
>> 1] >> 4) : (track
->audio_buf
[o
>> 1] & 0x0F);
2437 track
->audio_buf
[o
>> 1] = (track
->audio_buf
[o
>> 1] & 0x0F) | (x
<< 4);
2439 track
->audio_buf
[o
>> 1] = (track
->audio_buf
[o
>> 1] & 0xF0) | x
;
2441 track
->audio_buf
[i
>> 1] = (track
->audio_buf
[i
>> 1] & 0x0F) | (y
<< 4);
2443 track
->audio_buf
[i
>> 1] = (track
->audio_buf
[i
>> 1] & 0xF0) | y
;
2450 track
->audio_timestamp
[track
->sub_packet_cnt
] = (track
->ra_pts
== mkv_d
->last_pts
) ? 0 : (mkv_d
->last_pts
);
2451 track
->ra_pts
= mkv_d
->last_pts
;
2452 if (track
->sub_packet_cnt
== 0)
2453 track
->audio_filepos
= demuxer
->filepos
;
2454 if (++(track
->sub_packet_cnt
) == sph
)
2456 int apk_usize
= ((WAVEFORMATEX
*)((sh_audio_t
*)demuxer
->audio
->sh
)->wf
)->nBlockAlign
;
2457 track
->sub_packet_cnt
= 0;
2458 // Release all the audio packets
2459 for (x
= 0; x
< sph
*w
/apk_usize
; x
++)
2461 dp
= new_demux_packet(apk_usize
);
2462 memcpy(dp
->buffer
, track
->audio_buf
+ x
* apk_usize
, apk_usize
);
2463 /* Put timestamp only on packets that correspond to original audio packets in file */
2464 dp
->pts
= (x
* apk_usize
% w
) ? 0 : track
->audio_timestamp
[x
* apk_usize
/ w
];
2465 dp
->pos
= track
->audio_filepos
; // all equal
2466 dp
->flags
= x
? 0 : 0x10; // Mark first packet as keyframe
2467 ds_add_packet(demuxer
->audio
, dp
);
2470 } else { // Not a codec that require reordering
2471 dp
= new_demux_packet (size
);
2472 memcpy(dp
->buffer
, buffer
, size
);
2473 if (track
->ra_pts
== mkv_d
->last_pts
&& !mkv_d
->a_skip_to_keyframe
)
2476 dp
->pts
= mkv_d
->last_pts
;
2477 track
->ra_pts
= mkv_d
->last_pts
;
2479 dp
->pos
= demuxer
->filepos
;
2480 dp
->flags
= block_bref
? 0 : 0x10;
2481 ds_add_packet (demuxer
->audio
, dp
);
2485 /** Reorder timecodes and add cached demux packets to the queues.
2487 * Timecode reordering is needed if a video track contains B frames that
2488 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2489 * MPlayer doesn't like timestamps in display order. This function adjusts
2490 * the timestamp of cached frames (which are exactly one I/P frame followed
2491 * by one or more B frames) so that they are in coding order again.
2493 * Example: The track with 25 FPS contains four frames with the timecodes
2494 * I at 0ms, P at 120ms, B at 40ms and B at 80ms. As soon as the next I
2495 * or P frame arrives these timecodes can be changed to I at 0ms, P at 40ms,
2496 * B at 80ms and B at 120ms.
2498 * This works for simple H.264 B-frame pyramids, but not for arbitrary orders.
2500 * \param demuxer The Matroska demuxer struct for this instance.
2501 * \param track The track structure whose cache should be handled.
2504 flush_cached_dps (demuxer_t
*demuxer
, mkv_track_t
*track
)
2508 if (track
->num_cached_dps
== 0)
2513 for (i
= 1; i
< track
->num_cached_dps
; i
++)
2514 if (track
->cached_dps
[i
- 1]->pts
> track
->cached_dps
[i
]->pts
) {
2515 float tmp_pts
= track
->cached_dps
[i
- 1]->pts
;
2516 track
->cached_dps
[i
- 1]->pts
= track
->cached_dps
[i
]->pts
;
2517 track
->cached_dps
[i
]->pts
= tmp_pts
;
2522 for (i
= 0; i
< track
->num_cached_dps
; i
++)
2523 ds_add_packet (demuxer
->video
, track
->cached_dps
[i
]);
2524 track
->num_cached_dps
= 0;
2527 /** Cache video frames if timecodes have to be reordered.
2529 * Timecode reordering is needed if a video track contains B frames that
2530 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
2531 * This function takes in a Matroska block read from the file, allocates a
2532 * demux packet for it, fills in its values, allocates space for storing
2533 * pointers to the cached demux packets and adds the packet to it. If
2534 * the packet contains an I or a P frame then ::flush_cached_dps is called
2535 * in order to send the old cached frames downstream.
2537 * \param demuxer The Matroska demuxer struct for this instance.
2538 * \param track The packet is meant for this track.
2539 * \param buffer The actual frame contents.
2540 * \param size The frame size in bytes.
2541 * \param block_bref A relative timecode (backward reference). If it is \c 0
2542 * then the frame is an I frame.
2543 * \param block_fref A relative timecode (forward reference). If it is \c 0
2544 * then the frame is either an I frame or a P frame depending on the value
2545 * of \a block_bref. Otherwise it's a B frame.
2548 handle_video_bframes (demuxer_t
*demuxer
, mkv_track_t
*track
, uint8_t *buffer
,
2549 uint32_t size
, int block_bref
, int block_fref
)
2551 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2554 dp
= new_demux_packet (size
);
2555 memcpy(dp
->buffer
, buffer
, size
);
2556 dp
->pos
= demuxer
->filepos
;
2557 dp
->pts
= mkv_d
->last_pts
;
2558 if ((track
->num_cached_dps
> 0) && (dp
->pts
< track
->max_pts
))
2560 if (block_fref
== 0) /* I or P frame */
2561 flush_cached_dps (demuxer
, track
);
2562 if (block_bref
!= 0) /* I frame, don't cache it */
2564 if ((track
->num_cached_dps
+ 1) > track
->num_allocated_dps
)
2566 track
->cached_dps
= (demux_packet_t
**)
2567 realloc(track
->cached_dps
, (track
->num_cached_dps
+ 10) *
2568 sizeof(demux_packet_t
*));
2569 track
->num_allocated_dps
+= 10;
2571 track
->cached_dps
[track
->num_cached_dps
] = dp
;
2572 track
->num_cached_dps
++;
2573 if (dp
->pts
> track
->max_pts
)
2574 track
->max_pts
= dp
->pts
;
2578 handle_block (demuxer_t
*demuxer
, uint8_t *block
, uint64_t length
,
2579 uint64_t block_duration
, int64_t block_bref
, int64_t block_fref
, uint8_t simpleblock
)
2581 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2582 mkv_track_t
*track
= NULL
;
2583 demux_stream_t
*ds
= NULL
;
2584 uint64_t old_length
;
2586 uint32_t *lace_size
;
2587 uint8_t laces
, flags
;
2588 int i
, num
, tmp
, use_this_block
= 1;
2592 /* first byte(s): track num */
2593 num
= ebml_read_vlen_uint (block
, &tmp
);
2595 /* time (relative to cluster time) */
2596 time
= block
[0] << 8 | block
[1];
2599 old_length
= length
;
2601 if (demux_mkv_read_block_lacing (block
, &length
, &laces
, &lace_size
))
2603 block
+= old_length
- length
;
2605 tc
= ((time
*mkv_d
->tc_scale
+mkv_d
->cluster_tc
) /1000000.0 - mkv_d
->first_tc
);
2608 if (mkv_d
->stop_timecode
> 0 && tc
> mkv_d
->stop_timecode
) {
2612 current_pts
= tc
/ 1000.0;
2614 for (i
=0; i
<mkv_d
->num_tracks
; i
++)
2615 if (mkv_d
->tracks
[i
]->tnum
== num
) {
2616 track
= mkv_d
->tracks
[i
];
2624 if (num
== demuxer
->audio
->id
)
2626 ds
= demuxer
->audio
;
2628 if (mkv_d
->a_skip_to_keyframe
)
2632 if (!(flags
&0x80)) /*current frame isn't a keyframe*/
2635 else if (block_bref
!= 0)
2638 else if (mkv_d
->v_skip_to_keyframe
)
2641 if (track
->fix_i_bps
&& use_this_block
)
2643 sh_audio_t
*sh
= (sh_audio_t
*) ds
->sh
;
2645 if (block_duration
!= 0)
2647 sh
->i_bps
= length
* 1000 / block_duration
;
2648 track
->fix_i_bps
= 0;
2650 else if (track
->qt_last_a_pts
== 0.0)
2651 track
->qt_last_a_pts
= current_pts
;
2652 else if(track
->qt_last_a_pts
!= current_pts
)
2654 sh
->i_bps
= length
/ (current_pts
- track
->qt_last_a_pts
);
2655 track
->fix_i_bps
= 0;
2659 else if (tc
< mkv_d
->skip_to_timecode
)
2661 else if (num
== demuxer
->video
->id
)
2663 ds
= demuxer
->video
;
2664 if (mkv_d
->v_skip_to_keyframe
)
2668 if (!(flags
&0x80)) /*current frame isn't a keyframe*/
2671 else if (block_bref
!= 0 || block_fref
!= 0)
2675 else if (num
== demuxer
->sub
->id
)
2678 if (track
->subtitle_type
!= MATROSKA_SUBTYPE_VOBSUB
)
2680 if (!mkv_d
->v_skip_to_keyframe
)
2681 handle_subtitles (demuxer
, track
, block
, length
,
2682 block_duration
, tc
);
2691 mkv_d
->last_pts
= current_pts
;
2692 mkv_d
->last_filepos
= demuxer
->filepos
;
2694 for (i
=0; i
< laces
; i
++)
2696 if (ds
== demuxer
->video
&& track
->realmedia
)
2697 handle_realvideo (demuxer
, track
, block
, lace_size
[i
], block_bref
);
2698 else if (ds
== demuxer
->audio
&& track
->realmedia
)
2699 handle_realaudio (demuxer
, track
, block
, lace_size
[i
], block_bref
);
2700 else if (ds
== demuxer
->video
&& track
->reorder_timecodes
)
2701 handle_video_bframes (demuxer
, track
, block
, lace_size
[i
],
2702 block_bref
, block_fref
);
2705 int modified
, size
= lace_size
[i
];
2708 modified
= demux_mkv_decode (track
, block
, &buffer
, &size
, 1);
2711 dp
= new_demux_packet (size
);
2712 memcpy (dp
->buffer
, buffer
, size
);
2715 dp
->flags
= (block_bref
== 0 && block_fref
== 0) ? 0x10 : 0;
2716 /* If default_duration is 0, assume no pts value is known
2717 * for packets after the first one (rather than all pts
2718 * values being the same) */
2719 if (i
== 0 || track
->default_duration
)
2720 dp
->pts
= mkv_d
->last_pts
+ i
* track
->default_duration
;
2721 ds_add_packet (ds
, dp
);
2724 block
+= lace_size
[i
];
2727 if (ds
== demuxer
->video
)
2729 mkv_d
->v_skip_to_keyframe
= 0;
2730 mkv_d
->skip_to_timecode
= 0;
2732 else if (ds
== demuxer
->audio
)
2733 mkv_d
->a_skip_to_keyframe
= 0;
2744 demux_mkv_fill_buffer (demuxer_t
*demuxer
, demux_stream_t
*ds
)
2746 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2747 stream_t
*s
= demuxer
->stream
;
2753 while (mkv_d
->cluster_size
> 0)
2755 uint64_t block_duration
= 0, block_length
= 0;
2756 int64_t block_bref
= 0, block_fref
= 0;
2757 uint8_t *block
= NULL
;
2759 while (mkv_d
->blockgroup_size
> 0)
2761 switch (ebml_read_id (s
, &il
))
2763 case MATROSKA_ID_BLOCKDURATION
:
2765 block_duration
= ebml_read_uint (s
, &l
);
2766 if (block_duration
== EBML_UINT_INVALID
) {
2770 block_duration
*= mkv_d
->tc_scale
/ 1000000.0;
2774 case MATROSKA_ID_BLOCK
:
2775 block_length
= ebml_read_length (s
, &tmp
);
2777 if (block_length
> SIZE_MAX
- AV_LZO_INPUT_PADDING
) return 0;
2778 block
= malloc (block_length
+ AV_LZO_INPUT_PADDING
);
2779 demuxer
->filepos
= stream_tell (s
);
2780 if (stream_read (s
,block
,block_length
) != (int) block_length
)
2785 l
= tmp
+ block_length
;
2788 case MATROSKA_ID_REFERENCEBLOCK
:
2790 int64_t num
= ebml_read_int (s
, &l
);
2791 if (num
== EBML_INT_INVALID
) {
2802 case EBML_ID_INVALID
:
2807 ebml_read_skip (s
, &l
);
2810 mkv_d
->blockgroup_size
-= l
+ il
;
2811 mkv_d
->cluster_size
-= l
+ il
;
2816 int res
= handle_block (demuxer
, block
, block_length
,
2817 block_duration
, block_bref
, block_fref
, 0);
2825 if (mkv_d
->cluster_size
> 0)
2827 switch (ebml_read_id (s
, &il
))
2829 case MATROSKA_ID_CLUSTERTIMECODE
:
2831 uint64_t num
= ebml_read_uint (s
, &l
);
2832 if (num
== EBML_UINT_INVALID
)
2834 if (!mkv_d
->has_first_tc
)
2836 mkv_d
->first_tc
= num
* mkv_d
->tc_scale
/ 1000000.0;
2837 mkv_d
->has_first_tc
= 1;
2839 mkv_d
->cluster_tc
= num
* mkv_d
->tc_scale
;
2843 case MATROSKA_ID_BLOCKGROUP
:
2844 mkv_d
->blockgroup_size
= ebml_read_length (s
, &tmp
);
2848 case MATROSKA_ID_SIMPLEBLOCK
:
2851 block_length
= ebml_read_length (s
, &tmp
);
2852 block
= malloc (block_length
);
2853 demuxer
->filepos
= stream_tell (s
);
2854 if (stream_read (s
,block
,block_length
) != (int) block_length
)
2859 l
= tmp
+ block_length
;
2860 res
= handle_block (demuxer
, block
, block_length
,
2861 block_duration
, block_bref
, block_fref
, 1);
2863 mkv_d
->cluster_size
-= l
+ il
;
2868 else mkv_d
->cluster_size
+= l
+ il
;
2871 case EBML_ID_INVALID
:
2875 ebml_read_skip (s
, &l
);
2878 mkv_d
->cluster_size
-= l
+ il
;
2882 if (ebml_read_id (s
, &il
) != MATROSKA_ID_CLUSTER
)
2884 add_cluster_position(mkv_d
, stream_tell(s
)-il
);
2885 mkv_d
->cluster_size
= ebml_read_length (s
, NULL
);
2892 demux_mkv_seek (demuxer_t
*demuxer
, float rel_seek_secs
, float audio_delay
, int flags
)
2894 free_cached_dps (demuxer
);
2895 if (!(flags
& SEEK_FACTOR
)) /* time in secs */
2897 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
2898 stream_t
*s
= demuxer
->stream
;
2899 int64_t target_timecode
= 0, diff
, min_diff
=0xFFFFFFFFFFFFFFFLL
;
2902 if (!(flags
& SEEK_ABSOLUTE
)) /* relative seek */
2903 target_timecode
= (int64_t) (mkv_d
->last_pts
* 1000.0);
2904 target_timecode
+= (int64_t)(rel_seek_secs
* 1000.0);
2905 if (target_timecode
< 0)
2906 target_timecode
= 0;
2908 if (mkv_d
->indexes
== NULL
) /* no index was found */
2910 uint64_t target_filepos
, cluster_pos
, max_pos
;
2912 target_filepos
= (uint64_t) (target_timecode
* mkv_d
->last_filepos
2913 / (mkv_d
->last_pts
* 1000.0));
2915 max_pos
= mkv_d
->cluster_positions
[mkv_d
->num_cluster_pos
-1];
2916 if (target_filepos
> max_pos
)
2918 if ((off_t
) max_pos
> stream_tell (s
))
2919 stream_seek (s
, max_pos
);
2921 stream_seek (s
, stream_tell (s
) + mkv_d
->cluster_size
);
2922 /* parse all the clusters upto target_filepos */
2923 while (!s
->eof
&& stream_tell(s
) < (off_t
) target_filepos
)
2925 switch (ebml_read_id (s
, &i
))
2927 case MATROSKA_ID_CLUSTER
:
2928 add_cluster_position(mkv_d
, (uint64_t) stream_tell(s
)-i
);
2931 case MATROSKA_ID_CUES
:
2932 demux_mkv_read_cues (demuxer
);
2935 ebml_read_skip (s
, NULL
);
2941 if (mkv_d
->indexes
== NULL
)
2943 cluster_pos
= mkv_d
->cluster_positions
[0];
2944 /* Let's find the nearest cluster */
2945 for (i
=0; i
< mkv_d
->num_cluster_pos
; i
++)
2947 diff
= mkv_d
->cluster_positions
[i
] - target_filepos
;
2948 if (rel_seek_secs
< 0 && diff
< 0 && -diff
< min_diff
)
2950 cluster_pos
= mkv_d
->cluster_positions
[i
];
2953 else if (rel_seek_secs
> 0
2954 && (diff
< 0 ? -1 * diff
: diff
) < min_diff
)
2956 cluster_pos
= mkv_d
->cluster_positions
[i
];
2957 min_diff
= diff
< 0 ? -1 * diff
: diff
;
2960 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
2961 stream_seek (s
, cluster_pos
);
2966 mkv_index_t
*index
= NULL
;
2967 int seek_id
= (demuxer
->video
->id
< 0) ? demuxer
->audio
->id
: demuxer
->video
->id
;
2969 /* let's find the entry in the indexes with the smallest */
2970 /* difference to the wanted timecode. */
2971 for (i
=0; i
< mkv_d
->num_indexes
; i
++)
2972 if (mkv_d
->indexes
[i
].tnum
== seek_id
)
2974 diff
= target_timecode
+ mkv_d
->first_tc
-
2975 (int64_t) mkv_d
->indexes
[i
].timecode
* mkv_d
->tc_scale
/ 1000000.0;
2977 if ((flags
& SEEK_ABSOLUTE
|| target_timecode
<= mkv_d
->last_pts
*1000)) {
2978 // Absolute seek or seek backward: find the last index
2979 // position before target time
2980 if (diff
< 0 || diff
>= min_diff
)
2984 // Relative seek forward: find the first index position
2985 // after target time. If no such index exists, find last
2986 // position between current position and target time.
2988 if (min_diff
<= 0 && diff
<= min_diff
)
2991 else if (diff
>= FFMIN(target_timecode
- mkv_d
->last_pts
,
2996 index
= mkv_d
->indexes
+ i
;
2999 if (index
) /* We've found an entry. */
3001 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3002 stream_seek (s
, index
->filepos
);
3006 if (demuxer
->video
->id
>= 0)
3007 mkv_d
->v_skip_to_keyframe
= 1;
3008 if (rel_seek_secs
> 0.0)
3009 mkv_d
->skip_to_timecode
= target_timecode
;
3010 mkv_d
->a_skip_to_keyframe
= 1;
3012 demux_mkv_fill_buffer(demuxer
, NULL
);
3014 else if ((demuxer
->movi_end
<= 0) || !(flags
& SEEK_ABSOLUTE
))
3015 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
3018 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3019 stream_t
*s
= demuxer
->stream
;
3020 uint64_t target_filepos
;
3021 mkv_index_t
*index
= NULL
;
3024 if (mkv_d
->indexes
== NULL
) /* no index was found */
3026 mp_msg (MSGT_DEMUX
, MSGL_V
, "[mkv] seek unsupported flags\n");
3030 target_filepos
= (uint64_t)(demuxer
->movi_end
* rel_seek_secs
);
3031 for (i
=0; i
< mkv_d
->num_indexes
; i
++)
3032 if (mkv_d
->indexes
[i
].tnum
== demuxer
->video
->id
)
3033 if ((index
== NULL
) ||
3034 ((mkv_d
->indexes
[i
].filepos
>= target_filepos
) &&
3035 ((index
->filepos
< target_filepos
) ||
3036 (mkv_d
->indexes
[i
].filepos
< index
->filepos
))))
3037 index
= &mkv_d
->indexes
[i
];
3042 mkv_d
->cluster_size
= mkv_d
->blockgroup_size
= 0;
3043 stream_seek (s
, index
->filepos
);
3045 if (demuxer
->video
->id
>= 0)
3046 mkv_d
->v_skip_to_keyframe
= 1;
3047 mkv_d
->skip_to_timecode
= index
->timecode
;
3048 mkv_d
->a_skip_to_keyframe
= 1;
3050 demux_mkv_fill_buffer(demuxer
, NULL
);
3055 demux_mkv_control (demuxer_t
*demuxer
, int cmd
, void *arg
)
3057 mkv_demuxer_t
*mkv_d
= (mkv_demuxer_t
*) demuxer
->priv
;
3061 case DEMUXER_CTRL_CORRECT_PTS
:
3062 return DEMUXER_CTRL_OK
;
3063 case DEMUXER_CTRL_GET_TIME_LENGTH
:
3064 if (mkv_d
->duration
== 0)
3065 return DEMUXER_CTRL_DONTKNOW
;
3067 *((double *)arg
) = (double)mkv_d
->duration
;
3068 return DEMUXER_CTRL_OK
;
3070 case DEMUXER_CTRL_GET_PERCENT_POS
:
3071 if (mkv_d
->duration
== 0)
3073 return DEMUXER_CTRL_DONTKNOW
;
3076 *((int *) arg
) = (int) (100 * mkv_d
->last_pts
/ mkv_d
->duration
);
3077 return DEMUXER_CTRL_OK
;
3079 case DEMUXER_CTRL_SWITCH_AUDIO
:
3080 if (demuxer
->audio
&& demuxer
->audio
->sh
) {
3081 sh_audio_t
*sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3082 int aid
= *(int*)arg
;
3084 aid
= (sh
->aid
+ 1) % mkv_d
->last_aid
;
3085 if (aid
!= sh
->aid
) {
3086 mkv_track_t
*track
= demux_mkv_find_track_by_num (mkv_d
, aid
, MATROSKA_TRACK_AUDIO
);
3088 demuxer
->audio
->id
= track
->tnum
;
3089 sh
= demuxer
->a_streams
[demuxer
->audio
->id
];
3090 ds_free_packs(demuxer
->audio
);
3093 *(int*)arg
= sh
->aid
;
3096 return DEMUXER_CTRL_OK
;
3099 return DEMUXER_CTRL_NOTIMPL
;
3103 const demuxer_desc_t demuxer_desc_matroska
= {
3109 DEMUXER_TYPE_MATROSKA
,
3110 1, // safe autodetect
3112 demux_mkv_fill_buffer
,