2 * Matroska file demuxer
3 * Copyright (c) 2003-2008 The Libav Project
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Matroska file demuxer
25 * @author Ronald Bultje <rbultje@ronald.bitfreak.net>
26 * @author with a little help from Moritz Bunkus <moritz@bunkus.org>
27 * @author totally reworked by Aurelien Jacobs <aurel@gnuage.org>
28 * @see specs available on the Matroska project page: http://www.matroska.org/
42 #include "libavutil/avstring.h"
43 #include "libavutil/dict.h"
44 #include "libavutil/intfloat.h"
45 #include "libavutil/intreadwrite.h"
46 #include "libavutil/lzo.h"
47 #include "libavutil/mathematics.h"
49 #include "libavcodec/bytestream.h"
50 #include "libavcodec/flac.h"
51 #include "libavcodec/mpeg4audio.h"
54 #include "avio_internal.h"
59 /* For ff_codec_get_id(). */
76 typedef const struct EbmlSyntax
{
85 const struct EbmlSyntax
*n
;
89 typedef struct EbmlList
{
94 typedef struct EbmlBin
{
100 typedef struct Ebml
{
105 uint64_t doctype_version
;
108 typedef struct MatroskaTrackCompression
{
111 } MatroskaTrackCompression
;
113 typedef struct MatroskaTrackEncoding
{
116 MatroskaTrackCompression compression
;
117 } MatroskaTrackEncoding
;
119 typedef struct MatroskaTrackVideo
{
121 uint64_t display_width
;
122 uint64_t display_height
;
123 uint64_t pixel_width
;
124 uint64_t pixel_height
;
126 uint64_t stereo_mode
;
127 } MatroskaTrackVideo
;
129 typedef struct MatroskaTrackAudio
{
131 double out_samplerate
;
135 /* real audio header (extracted from extradata) */
142 uint64_t buf_timecode
;
144 } MatroskaTrackAudio
;
146 typedef struct MatroskaTrack
{
155 uint64_t default_duration
;
156 uint64_t flag_default
;
157 uint64_t flag_forced
;
158 MatroskaTrackVideo video
;
159 MatroskaTrackAudio audio
;
161 uint64_t codec_delay
;
164 int64_t end_timecode
;
168 typedef struct MatroskaAttachment
{
175 } MatroskaAttachment
;
177 typedef struct MatroskaChapter
{
186 typedef struct MatroskaIndexPos
{
191 typedef struct MatroskaIndex
{
196 typedef struct MatroskaTag
{
204 typedef struct MatroskaTagTarget
{
212 typedef struct MatroskaTags
{
213 MatroskaTagTarget target
;
217 typedef struct MatroskaSeekhead
{
222 typedef struct MatroskaLevel
{
227 typedef struct MatroskaCluster
{
232 typedef struct MatroskaDemuxContext
{
233 AVFormatContext
*ctx
;
237 MatroskaLevel levels
[EBML_MAX_DEPTH
];
245 EbmlList attachments
;
251 /* byte position of the segment inside the stream */
252 int64_t segment_start
;
254 /* the packet queue */
261 /* What to skip before effectively reading a packet. */
262 int skip_to_keyframe
;
263 uint64_t skip_to_timecode
;
265 /* File has a CUES element, but we defer parsing until it is needed. */
266 int cues_parsing_deferred
;
268 int current_cluster_num_blocks
;
269 int64_t current_cluster_pos
;
270 MatroskaCluster current_cluster
;
272 /* File has SSA subtitles which prevent incremental cluster parsing. */
274 } MatroskaDemuxContext
;
276 typedef struct MatroskaBlock
{
283 static EbmlSyntax ebml_header
[] = {
284 { EBML_ID_EBMLREADVERSION
, EBML_UINT
, 0, offsetof(Ebml
, version
), { .u
= EBML_VERSION
} },
285 { EBML_ID_EBMLMAXSIZELENGTH
, EBML_UINT
, 0, offsetof(Ebml
, max_size
), { .u
= 8 } },
286 { EBML_ID_EBMLMAXIDLENGTH
, EBML_UINT
, 0, offsetof(Ebml
, id_length
), { .u
= 4 } },
287 { EBML_ID_DOCTYPE
, EBML_STR
, 0, offsetof(Ebml
, doctype
), { .s
= "(none)" } },
288 { EBML_ID_DOCTYPEREADVERSION
, EBML_UINT
, 0, offsetof(Ebml
, doctype_version
), { .u
= 1 } },
289 { EBML_ID_EBMLVERSION
, EBML_NONE
},
290 { EBML_ID_DOCTYPEVERSION
, EBML_NONE
},
294 static EbmlSyntax ebml_syntax
[] = {
295 { EBML_ID_HEADER
, EBML_NEST
, 0, 0, { .n
= ebml_header
} },
299 static EbmlSyntax matroska_info
[] = {
300 { MATROSKA_ID_TIMECODESCALE
, EBML_UINT
, 0, offsetof(MatroskaDemuxContext
, time_scale
), { .u
= 1000000 } },
301 { MATROSKA_ID_DURATION
, EBML_FLOAT
, 0, offsetof(MatroskaDemuxContext
, duration
) },
302 { MATROSKA_ID_TITLE
, EBML_UTF8
, 0, offsetof(MatroskaDemuxContext
, title
) },
303 { MATROSKA_ID_WRITINGAPP
, EBML_NONE
},
304 { MATROSKA_ID_MUXINGAPP
, EBML_NONE
},
305 { MATROSKA_ID_DATEUTC
, EBML_NONE
},
306 { MATROSKA_ID_SEGMENTUID
, EBML_NONE
},
310 static EbmlSyntax matroska_track_video
[] = {
311 { MATROSKA_ID_VIDEOFRAMERATE
, EBML_FLOAT
, 0, offsetof(MatroskaTrackVideo
, frame_rate
) },
312 { MATROSKA_ID_VIDEODISPLAYWIDTH
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
, display_width
) },
313 { MATROSKA_ID_VIDEODISPLAYHEIGHT
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
, display_height
) },
314 { MATROSKA_ID_VIDEOPIXELWIDTH
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
, pixel_width
) },
315 { MATROSKA_ID_VIDEOPIXELHEIGHT
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
, pixel_height
) },
316 { MATROSKA_ID_VIDEOCOLORSPACE
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
, fourcc
) },
317 { MATROSKA_ID_VIDEOPIXELCROPB
, EBML_NONE
},
318 { MATROSKA_ID_VIDEOPIXELCROPT
, EBML_NONE
},
319 { MATROSKA_ID_VIDEOPIXELCROPL
, EBML_NONE
},
320 { MATROSKA_ID_VIDEOPIXELCROPR
, EBML_NONE
},
321 { MATROSKA_ID_VIDEODISPLAYUNIT
, EBML_NONE
},
322 { MATROSKA_ID_VIDEOFLAGINTERLACED
, EBML_NONE
},
323 { MATROSKA_ID_VIDEOSTEREOMODE
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
, stereo_mode
), { .u
= MATROSKA_VIDEO_STEREOMODE_TYPE_NB
} },
324 { MATROSKA_ID_VIDEOASPECTRATIO
, EBML_NONE
},
328 static EbmlSyntax matroska_track_audio
[] = {
329 { MATROSKA_ID_AUDIOSAMPLINGFREQ
, EBML_FLOAT
, 0, offsetof(MatroskaTrackAudio
, samplerate
), { .f
= 8000.0 } },
330 { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
, EBML_FLOAT
, 0, offsetof(MatroskaTrackAudio
, out_samplerate
) },
331 { MATROSKA_ID_AUDIOBITDEPTH
, EBML_UINT
, 0, offsetof(MatroskaTrackAudio
, bitdepth
) },
332 { MATROSKA_ID_AUDIOCHANNELS
, EBML_UINT
, 0, offsetof(MatroskaTrackAudio
, channels
), { .u
= 1 } },
336 static EbmlSyntax matroska_track_encoding_compression
[] = {
337 { MATROSKA_ID_ENCODINGCOMPALGO
, EBML_UINT
, 0, offsetof(MatroskaTrackCompression
, algo
), { .u
= 0 } },
338 { MATROSKA_ID_ENCODINGCOMPSETTINGS
, EBML_BIN
, 0, offsetof(MatroskaTrackCompression
, settings
) },
342 static EbmlSyntax matroska_track_encoding
[] = {
343 { MATROSKA_ID_ENCODINGSCOPE
, EBML_UINT
, 0, offsetof(MatroskaTrackEncoding
, scope
), { .u
= 1 } },
344 { MATROSKA_ID_ENCODINGTYPE
, EBML_UINT
, 0, offsetof(MatroskaTrackEncoding
, type
), { .u
= 0 } },
345 { MATROSKA_ID_ENCODINGCOMPRESSION
, EBML_NEST
, 0, offsetof(MatroskaTrackEncoding
, compression
), { .n
= matroska_track_encoding_compression
} },
346 { MATROSKA_ID_ENCODINGORDER
, EBML_NONE
},
350 static EbmlSyntax matroska_track_encodings
[] = {
351 { MATROSKA_ID_TRACKCONTENTENCODING
, EBML_NEST
, sizeof(MatroskaTrackEncoding
), offsetof(MatroskaTrack
, encodings
), { .n
= matroska_track_encoding
} },
355 static EbmlSyntax matroska_track
[] = {
356 { MATROSKA_ID_TRACKNUMBER
, EBML_UINT
, 0, offsetof(MatroskaTrack
, num
) },
357 { MATROSKA_ID_TRACKNAME
, EBML_UTF8
, 0, offsetof(MatroskaTrack
, name
) },
358 { MATROSKA_ID_TRACKUID
, EBML_UINT
, 0, offsetof(MatroskaTrack
, uid
) },
359 { MATROSKA_ID_TRACKTYPE
, EBML_UINT
, 0, offsetof(MatroskaTrack
, type
) },
360 { MATROSKA_ID_CODECID
, EBML_STR
, 0, offsetof(MatroskaTrack
, codec_id
) },
361 { MATROSKA_ID_CODECPRIVATE
, EBML_BIN
, 0, offsetof(MatroskaTrack
, codec_priv
) },
362 { MATROSKA_ID_CODECDELAY
, EBML_UINT
, 0, offsetof(MatroskaTrack
, codec_delay
) },
363 { MATROSKA_ID_TRACKLANGUAGE
, EBML_UTF8
, 0, offsetof(MatroskaTrack
, language
), { .s
= "eng" } },
364 { MATROSKA_ID_TRACKDEFAULTDURATION
, EBML_UINT
, 0, offsetof(MatroskaTrack
, default_duration
) },
365 { MATROSKA_ID_TRACKTIMECODESCALE
, EBML_FLOAT
, 0, offsetof(MatroskaTrack
, time_scale
), { .f
= 1.0 } },
366 { MATROSKA_ID_TRACKFLAGDEFAULT
, EBML_UINT
, 0, offsetof(MatroskaTrack
, flag_default
), { .u
= 1 } },
367 { MATROSKA_ID_TRACKFLAGFORCED
, EBML_UINT
, 0, offsetof(MatroskaTrack
, flag_forced
), { .u
= 0 } },
368 { MATROSKA_ID_TRACKVIDEO
, EBML_NEST
, 0, offsetof(MatroskaTrack
, video
), { .n
= matroska_track_video
} },
369 { MATROSKA_ID_TRACKAUDIO
, EBML_NEST
, 0, offsetof(MatroskaTrack
, audio
), { .n
= matroska_track_audio
} },
370 { MATROSKA_ID_TRACKCONTENTENCODINGS
, EBML_NEST
, 0, 0, { .n
= matroska_track_encodings
} },
371 { MATROSKA_ID_TRACKFLAGENABLED
, EBML_NONE
},
372 { MATROSKA_ID_TRACKFLAGLACING
, EBML_NONE
},
373 { MATROSKA_ID_CODECNAME
, EBML_NONE
},
374 { MATROSKA_ID_CODECDECODEALL
, EBML_NONE
},
375 { MATROSKA_ID_CODECINFOURL
, EBML_NONE
},
376 { MATROSKA_ID_CODECDOWNLOADURL
, EBML_NONE
},
377 { MATROSKA_ID_TRACKMINCACHE
, EBML_NONE
},
378 { MATROSKA_ID_TRACKMAXCACHE
, EBML_NONE
},
379 { MATROSKA_ID_TRACKMAXBLKADDID
, EBML_NONE
},
383 static EbmlSyntax matroska_tracks
[] = {
384 { MATROSKA_ID_TRACKENTRY
, EBML_NEST
, sizeof(MatroskaTrack
), offsetof(MatroskaDemuxContext
, tracks
), { .n
= matroska_track
} },
388 static EbmlSyntax matroska_attachment
[] = {
389 { MATROSKA_ID_FILEUID
, EBML_UINT
, 0, offsetof(MatroskaAttachment
, uid
) },
390 { MATROSKA_ID_FILENAME
, EBML_UTF8
, 0, offsetof(MatroskaAttachment
, filename
) },
391 { MATROSKA_ID_FILEMIMETYPE
, EBML_STR
, 0, offsetof(MatroskaAttachment
, mime
) },
392 { MATROSKA_ID_FILEDATA
, EBML_BIN
, 0, offsetof(MatroskaAttachment
, bin
) },
393 { MATROSKA_ID_FILEDESC
, EBML_NONE
},
397 static EbmlSyntax matroska_attachments
[] = {
398 { MATROSKA_ID_ATTACHEDFILE
, EBML_NEST
, sizeof(MatroskaAttachment
), offsetof(MatroskaDemuxContext
, attachments
), { .n
= matroska_attachment
} },
402 static EbmlSyntax matroska_chapter_display
[] = {
403 { MATROSKA_ID_CHAPSTRING
, EBML_UTF8
, 0, offsetof(MatroskaChapter
, title
) },
404 { MATROSKA_ID_CHAPLANG
, EBML_NONE
},
408 static EbmlSyntax matroska_chapter_entry
[] = {
409 { MATROSKA_ID_CHAPTERTIMESTART
, EBML_UINT
, 0, offsetof(MatroskaChapter
, start
), { .u
= AV_NOPTS_VALUE
} },
410 { MATROSKA_ID_CHAPTERTIMEEND
, EBML_UINT
, 0, offsetof(MatroskaChapter
, end
), { .u
= AV_NOPTS_VALUE
} },
411 { MATROSKA_ID_CHAPTERUID
, EBML_UINT
, 0, offsetof(MatroskaChapter
, uid
) },
412 { MATROSKA_ID_CHAPTERDISPLAY
, EBML_NEST
, 0, 0, { .n
= matroska_chapter_display
} },
413 { MATROSKA_ID_CHAPTERFLAGHIDDEN
, EBML_NONE
},
414 { MATROSKA_ID_CHAPTERFLAGENABLED
, EBML_NONE
},
415 { MATROSKA_ID_CHAPTERPHYSEQUIV
, EBML_NONE
},
416 { MATROSKA_ID_CHAPTERATOM
, EBML_NONE
},
420 static EbmlSyntax matroska_chapter
[] = {
421 { MATROSKA_ID_CHAPTERATOM
, EBML_NEST
, sizeof(MatroskaChapter
), offsetof(MatroskaDemuxContext
, chapters
), { .n
= matroska_chapter_entry
} },
422 { MATROSKA_ID_EDITIONUID
, EBML_NONE
},
423 { MATROSKA_ID_EDITIONFLAGHIDDEN
, EBML_NONE
},
424 { MATROSKA_ID_EDITIONFLAGDEFAULT
, EBML_NONE
},
425 { MATROSKA_ID_EDITIONFLAGORDERED
, EBML_NONE
},
429 static EbmlSyntax matroska_chapters
[] = {
430 { MATROSKA_ID_EDITIONENTRY
, EBML_NEST
, 0, 0, { .n
= matroska_chapter
} },
434 static EbmlSyntax matroska_index_pos
[] = {
435 { MATROSKA_ID_CUETRACK
, EBML_UINT
, 0, offsetof(MatroskaIndexPos
, track
) },
436 { MATROSKA_ID_CUECLUSTERPOSITION
, EBML_UINT
, 0, offsetof(MatroskaIndexPos
, pos
) },
437 { MATROSKA_ID_CUEBLOCKNUMBER
, EBML_NONE
},
441 static EbmlSyntax matroska_index_entry
[] = {
442 { MATROSKA_ID_CUETIME
, EBML_UINT
, 0, offsetof(MatroskaIndex
, time
) },
443 { MATROSKA_ID_CUETRACKPOSITION
, EBML_NEST
, sizeof(MatroskaIndexPos
), offsetof(MatroskaIndex
, pos
), { .n
= matroska_index_pos
} },
447 static EbmlSyntax matroska_index
[] = {
448 { MATROSKA_ID_POINTENTRY
, EBML_NEST
, sizeof(MatroskaIndex
), offsetof(MatroskaDemuxContext
, index
), { .n
= matroska_index_entry
} },
452 static EbmlSyntax matroska_simpletag
[] = {
453 { MATROSKA_ID_TAGNAME
, EBML_UTF8
, 0, offsetof(MatroskaTag
, name
) },
454 { MATROSKA_ID_TAGSTRING
, EBML_UTF8
, 0, offsetof(MatroskaTag
, string
) },
455 { MATROSKA_ID_TAGLANG
, EBML_STR
, 0, offsetof(MatroskaTag
, lang
), { .s
= "und" } },
456 { MATROSKA_ID_TAGDEFAULT
, EBML_UINT
, 0, offsetof(MatroskaTag
, def
) },
457 { MATROSKA_ID_TAGDEFAULT_BUG
, EBML_UINT
, 0, offsetof(MatroskaTag
, def
) },
458 { MATROSKA_ID_SIMPLETAG
, EBML_NEST
, sizeof(MatroskaTag
), offsetof(MatroskaTag
, sub
), { .n
= matroska_simpletag
} },
462 static EbmlSyntax matroska_tagtargets
[] = {
463 { MATROSKA_ID_TAGTARGETS_TYPE
, EBML_STR
, 0, offsetof(MatroskaTagTarget
, type
) },
464 { MATROSKA_ID_TAGTARGETS_TYPEVALUE
, EBML_UINT
, 0, offsetof(MatroskaTagTarget
, typevalue
), { .u
= 50 } },
465 { MATROSKA_ID_TAGTARGETS_TRACKUID
, EBML_UINT
, 0, offsetof(MatroskaTagTarget
, trackuid
) },
466 { MATROSKA_ID_TAGTARGETS_CHAPTERUID
, EBML_UINT
, 0, offsetof(MatroskaTagTarget
, chapteruid
) },
467 { MATROSKA_ID_TAGTARGETS_ATTACHUID
, EBML_UINT
, 0, offsetof(MatroskaTagTarget
, attachuid
) },
471 static EbmlSyntax matroska_tag
[] = {
472 { MATROSKA_ID_SIMPLETAG
, EBML_NEST
, sizeof(MatroskaTag
), offsetof(MatroskaTags
, tag
), { .n
= matroska_simpletag
} },
473 { MATROSKA_ID_TAGTARGETS
, EBML_NEST
, 0, offsetof(MatroskaTags
, target
), { .n
= matroska_tagtargets
} },
477 static EbmlSyntax matroska_tags
[] = {
478 { MATROSKA_ID_TAG
, EBML_NEST
, sizeof(MatroskaTags
), offsetof(MatroskaDemuxContext
, tags
), { .n
= matroska_tag
} },
482 static EbmlSyntax matroska_seekhead_entry
[] = {
483 { MATROSKA_ID_SEEKID
, EBML_UINT
, 0, offsetof(MatroskaSeekhead
, id
) },
484 { MATROSKA_ID_SEEKPOSITION
, EBML_UINT
, 0, offsetof(MatroskaSeekhead
, pos
), { .u
= -1 } },
488 static EbmlSyntax matroska_seekhead
[] = {
489 { MATROSKA_ID_SEEKENTRY
, EBML_NEST
, sizeof(MatroskaSeekhead
), offsetof(MatroskaDemuxContext
, seekhead
), { .n
= matroska_seekhead_entry
} },
493 static EbmlSyntax matroska_segment
[] = {
494 { MATROSKA_ID_INFO
, EBML_NEST
, 0, 0, { .n
= matroska_info
} },
495 { MATROSKA_ID_TRACKS
, EBML_NEST
, 0, 0, { .n
= matroska_tracks
} },
496 { MATROSKA_ID_ATTACHMENTS
, EBML_NEST
, 0, 0, { .n
= matroska_attachments
} },
497 { MATROSKA_ID_CHAPTERS
, EBML_NEST
, 0, 0, { .n
= matroska_chapters
} },
498 { MATROSKA_ID_CUES
, EBML_NEST
, 0, 0, { .n
= matroska_index
} },
499 { MATROSKA_ID_TAGS
, EBML_NEST
, 0, 0, { .n
= matroska_tags
} },
500 { MATROSKA_ID_SEEKHEAD
, EBML_NEST
, 0, 0, { .n
= matroska_seekhead
} },
501 { MATROSKA_ID_CLUSTER
, EBML_STOP
},
505 static EbmlSyntax matroska_segments
[] = {
506 { MATROSKA_ID_SEGMENT
, EBML_NEST
, 0, 0, { .n
= matroska_segment
} },
510 static EbmlSyntax matroska_blockgroup
[] = {
511 { MATROSKA_ID_BLOCK
, EBML_BIN
, 0, offsetof(MatroskaBlock
, bin
) },
512 { MATROSKA_ID_SIMPLEBLOCK
, EBML_BIN
, 0, offsetof(MatroskaBlock
, bin
) },
513 { MATROSKA_ID_BLOCKDURATION
, EBML_UINT
, 0, offsetof(MatroskaBlock
, duration
), { .u
= AV_NOPTS_VALUE
} },
514 { MATROSKA_ID_BLOCKREFERENCE
, EBML_UINT
, 0, offsetof(MatroskaBlock
, reference
) },
515 { MATROSKA_ID_CODECSTATE
, EBML_NONE
},
516 { 1, EBML_UINT
, 0, offsetof(MatroskaBlock
, non_simple
), { .u
= 1 } },
520 static EbmlSyntax matroska_cluster
[] = {
521 { MATROSKA_ID_CLUSTERTIMECODE
, EBML_UINT
, 0, offsetof(MatroskaCluster
, timecode
) },
522 { MATROSKA_ID_BLOCKGROUP
, EBML_NEST
, sizeof(MatroskaBlock
), offsetof(MatroskaCluster
, blocks
), { .n
= matroska_blockgroup
} },
523 { MATROSKA_ID_SIMPLEBLOCK
, EBML_PASS
, sizeof(MatroskaBlock
), offsetof(MatroskaCluster
, blocks
), { .n
= matroska_blockgroup
} },
524 { MATROSKA_ID_CLUSTERPOSITION
, EBML_NONE
},
525 { MATROSKA_ID_CLUSTERPREVSIZE
, EBML_NONE
},
529 static EbmlSyntax matroska_clusters
[] = {
530 { MATROSKA_ID_CLUSTER
, EBML_NEST
, 0, 0, { .n
= matroska_cluster
} },
531 { MATROSKA_ID_INFO
, EBML_NONE
},
532 { MATROSKA_ID_CUES
, EBML_NONE
},
533 { MATROSKA_ID_TAGS
, EBML_NONE
},
534 { MATROSKA_ID_SEEKHEAD
, EBML_NONE
},
538 static EbmlSyntax matroska_cluster_incremental_parsing
[] = {
539 { MATROSKA_ID_CLUSTERTIMECODE
, EBML_UINT
, 0, offsetof(MatroskaCluster
, timecode
) },
540 { MATROSKA_ID_BLOCKGROUP
, EBML_NEST
, sizeof(MatroskaBlock
), offsetof(MatroskaCluster
, blocks
), { .n
= matroska_blockgroup
} },
541 { MATROSKA_ID_SIMPLEBLOCK
, EBML_PASS
, sizeof(MatroskaBlock
), offsetof(MatroskaCluster
, blocks
), { .n
= matroska_blockgroup
} },
542 { MATROSKA_ID_CLUSTERPOSITION
, EBML_NONE
},
543 { MATROSKA_ID_CLUSTERPREVSIZE
, EBML_NONE
},
544 { MATROSKA_ID_INFO
, EBML_NONE
},
545 { MATROSKA_ID_CUES
, EBML_NONE
},
546 { MATROSKA_ID_TAGS
, EBML_NONE
},
547 { MATROSKA_ID_SEEKHEAD
, EBML_NONE
},
548 { MATROSKA_ID_CLUSTER
, EBML_STOP
},
552 static EbmlSyntax matroska_cluster_incremental
[] = {
553 { MATROSKA_ID_CLUSTERTIMECODE
, EBML_UINT
, 0, offsetof(MatroskaCluster
, timecode
) },
554 { MATROSKA_ID_BLOCKGROUP
, EBML_STOP
},
555 { MATROSKA_ID_SIMPLEBLOCK
, EBML_STOP
},
556 { MATROSKA_ID_CLUSTERPOSITION
, EBML_NONE
},
557 { MATROSKA_ID_CLUSTERPREVSIZE
, EBML_NONE
},
561 static EbmlSyntax matroska_clusters_incremental
[] = {
562 { MATROSKA_ID_CLUSTER
, EBML_NEST
, 0, 0, { .n
= matroska_cluster_incremental
} },
563 { MATROSKA_ID_INFO
, EBML_NONE
},
564 { MATROSKA_ID_CUES
, EBML_NONE
},
565 { MATROSKA_ID_TAGS
, EBML_NONE
},
566 { MATROSKA_ID_SEEKHEAD
, EBML_NONE
},
570 static const char *const matroska_doctypes
[] = { "matroska", "webm" };
572 static int matroska_resync(MatroskaDemuxContext
*matroska
, int64_t last_pos
)
574 AVIOContext
*pb
= matroska
->ctx
->pb
;
576 matroska
->current_id
= 0;
577 matroska
->num_levels
= 0;
579 /* seek to next position to resync from */
580 if (avio_seek(pb
, last_pos
+ 1, SEEK_SET
) < 0)
585 // try to find a toplevel element
586 while (!pb
->eof_reached
) {
587 if (id
== MATROSKA_ID_INFO
|| id
== MATROSKA_ID_TRACKS
||
588 id
== MATROSKA_ID_CUES
|| id
== MATROSKA_ID_TAGS
||
589 id
== MATROSKA_ID_SEEKHEAD
|| id
== MATROSKA_ID_ATTACHMENTS
||
590 id
== MATROSKA_ID_CLUSTER
|| id
== MATROSKA_ID_CHAPTERS
) {
591 matroska
->current_id
= id
;
594 id
= (id
<< 8) | avio_r8(pb
);
603 * Return: Whether we reached the end of a level in the hierarchy or not.
605 static int ebml_level_end(MatroskaDemuxContext
*matroska
)
607 AVIOContext
*pb
= matroska
->ctx
->pb
;
608 int64_t pos
= avio_tell(pb
);
610 if (matroska
->num_levels
> 0) {
611 MatroskaLevel
*level
= &matroska
->levels
[matroska
->num_levels
- 1];
612 if (pos
- level
->start
>= level
->length
|| matroska
->current_id
) {
613 matroska
->num_levels
--;
621 * Read: an "EBML number", which is defined as a variable-length
622 * array of bytes. The first byte indicates the length by giving a
623 * number of 0-bits followed by a one. The position of the first
624 * "one" bit inside the first byte indicates the length of this
626 * Returns: number of bytes read, < 0 on error
628 static int ebml_read_num(MatroskaDemuxContext
*matroska
, AVIOContext
*pb
,
629 int max_size
, uint64_t *number
)
634 /* The first byte tells us the length in bytes - avio_r8() can normally
635 * return 0, but since that's not a valid first ebmlID byte, we can
636 * use it safely here to catch EOS. */
637 if (!(total
= avio_r8(pb
))) {
638 /* we might encounter EOS here */
639 if (!pb
->eof_reached
) {
640 int64_t pos
= avio_tell(pb
);
641 av_log(matroska
->ctx
, AV_LOG_ERROR
,
642 "Read error at pos. %"PRIu64
" (0x%"PRIx64
")\n",
644 return pb
->error ? pb
->error
: AVERROR(EIO
);
649 /* get the length of the EBML number */
650 read
= 8 - ff_log2_tab
[total
];
651 if (read
> max_size
) {
652 int64_t pos
= avio_tell(pb
) - 1;
653 av_log(matroska
->ctx
, AV_LOG_ERROR
,
654 "Invalid EBML number size tag 0x%02x at pos %"PRIu64
" (0x%"PRIx64
")\n",
655 (uint8_t) total
, pos
, pos
);
656 return AVERROR_INVALIDDATA
;
659 /* read out length */
660 total
^= 1 << ff_log2_tab
[total
];
662 total
= (total
<< 8) | avio_r8(pb
);
670 * Read a EBML length value.
671 * This needs special handling for the "unknown length" case which has multiple
674 static int ebml_read_length(MatroskaDemuxContext
*matroska
, AVIOContext
*pb
,
677 int res
= ebml_read_num(matroska
, pb
, 8, number
);
678 if (res
> 0 && *number
+ 1 == 1ULL << (7 * res
))
679 *number
= 0xffffffffffffffULL
;
684 * Read the next element as an unsigned int.
685 * 0 is success, < 0 is failure.
687 static int ebml_read_uint(AVIOContext
*pb
, int size
, uint64_t *num
)
692 return AVERROR_INVALIDDATA
;
694 /* big-endian ordering; build up number */
697 *num
= (*num
<< 8) | avio_r8(pb
);
703 * Read the next element as a float.
704 * 0 is success, < 0 is failure.
706 static int ebml_read_float(AVIOContext
*pb
, int size
, double *num
)
711 *num
= av_int2float(avio_rb32(pb
));
713 *num
= av_int2double(avio_rb64(pb
));
715 return AVERROR_INVALIDDATA
;
721 * Read the next element as an ASCII string.
722 * 0 is success, < 0 is failure.
724 static int ebml_read_ascii(AVIOContext
*pb
, int size
, char **str
)
728 /* EBML strings are usually not 0-terminated, so we allocate one
729 * byte more, read the string and NULL-terminate it ourselves. */
730 if (!(res
= av_malloc(size
+ 1)))
731 return AVERROR(ENOMEM
);
732 if (avio_read(pb
, (uint8_t *) res
, size
) != size
) {
744 * Read the next element as binary data.
745 * 0 is success, < 0 is failure.
747 static int ebml_read_binary(AVIOContext
*pb
, int length
, EbmlBin
*bin
)
750 if (!(bin
->data
= av_mallocz(length
+ AV_INPUT_BUFFER_PADDING_SIZE
)))
751 return AVERROR(ENOMEM
);
754 bin
->pos
= avio_tell(pb
);
755 if (avio_read(pb
, bin
->data
, length
) != length
) {
756 av_freep(&bin
->data
);
764 * Read the next element, but only the header. The contents
765 * are supposed to be sub-elements which can be read separately.
766 * 0 is success, < 0 is failure.
768 static int ebml_read_master(MatroskaDemuxContext
*matroska
, uint64_t length
)
770 AVIOContext
*pb
= matroska
->ctx
->pb
;
771 MatroskaLevel
*level
;
773 if (matroska
->num_levels
>= EBML_MAX_DEPTH
) {
774 av_log(matroska
->ctx
, AV_LOG_ERROR
,
775 "File moves beyond max. allowed depth (%d)\n", EBML_MAX_DEPTH
);
776 return AVERROR(ENOSYS
);
779 level
= &matroska
->levels
[matroska
->num_levels
++];
780 level
->start
= avio_tell(pb
);
781 level
->length
= length
;
787 * Read signed/unsigned "EBML" numbers.
788 * Return: number of bytes processed, < 0 on error
790 static int matroska_ebmlnum_uint(MatroskaDemuxContext
*matroska
,
791 uint8_t *data
, uint32_t size
, uint64_t *num
)
794 ffio_init_context(&pb
, data
, size
, 0, NULL
, NULL
, NULL
, NULL
);
795 return ebml_read_num(matroska
, &pb
, FFMIN(size
, 8), num
);
799 * Same as above, but signed.
801 static int matroska_ebmlnum_sint(MatroskaDemuxContext
*matroska
,
802 uint8_t *data
, uint32_t size
, int64_t *num
)
807 /* read as unsigned number first */
808 if ((res
= matroska_ebmlnum_uint(matroska
, data
, size
, &unum
)) < 0)
811 /* make signed (weird way) */
812 *num
= unum
- ((1LL << (7 * res
- 1)) - 1);
817 static int ebml_parse_elem(MatroskaDemuxContext
*matroska
,
818 EbmlSyntax
*syntax
, void *data
);
820 static int ebml_parse_id(MatroskaDemuxContext
*matroska
, EbmlSyntax
*syntax
,
821 uint32_t id
, void *data
)
824 for (i
= 0; syntax
[i
].id
; i
++)
825 if (id
== syntax
[i
].id
)
827 if (!syntax
[i
].id
&& id
== MATROSKA_ID_CLUSTER
&&
828 matroska
->num_levels
> 0 &&
829 matroska
->levels
[matroska
->num_levels
- 1].length
== 0xffffffffffffff)
830 return 0; // we reached the end of an unknown size cluster
831 if (!syntax
[i
].id
&& id
!= EBML_ID_VOID
&& id
!= EBML_ID_CRC32
) {
832 av_log(matroska
->ctx
, AV_LOG_INFO
, "Unknown entry 0x%"PRIX32
"\n", id
);
833 if (matroska
->ctx
->error_recognition
& AV_EF_EXPLODE
)
834 return AVERROR_INVALIDDATA
;
836 return ebml_parse_elem(matroska
, &syntax
[i
], data
);
839 static int ebml_parse(MatroskaDemuxContext
*matroska
, EbmlSyntax
*syntax
,
842 if (!matroska
->current_id
) {
844 int res
= ebml_read_num(matroska
, matroska
->ctx
->pb
, 4, &id
);
847 matroska
->current_id
= id
| 1 << 7 * res
;
849 return ebml_parse_id(matroska
, syntax
, matroska
->current_id
, data
);
852 static int ebml_parse_nest(MatroskaDemuxContext
*matroska
, EbmlSyntax
*syntax
,
857 for (i
= 0; syntax
[i
].id
; i
++)
858 switch (syntax
[i
].type
) {
860 *(uint64_t *) ((char *) data
+ syntax
[i
].data_offset
) = syntax
[i
].def
.u
;
863 *(double *) ((char *) data
+ syntax
[i
].data_offset
) = syntax
[i
].def
.f
;
867 // the default may be NULL
868 if (syntax
[i
].def
.s
) {
869 uint8_t **dst
= (uint8_t **) ((uint8_t *) data
+ syntax
[i
].data_offset
);
870 *dst
= av_strdup(syntax
[i
].def
.s
);
872 return AVERROR(ENOMEM
);
877 while (!res
&& !ebml_level_end(matroska
))
878 res
= ebml_parse(matroska
, syntax
, data
);
883 static int ebml_parse_elem(MatroskaDemuxContext
*matroska
,
884 EbmlSyntax
*syntax
, void *data
)
886 static const uint64_t max_lengths
[EBML_TYPE_COUNT
] = {
889 // max. 16 MB for strings
890 [EBML_STR
] = 0x1000000,
891 [EBML_UTF8
] = 0x1000000,
892 // max. 256 MB for binary data
893 [EBML_BIN
] = 0x10000000,
894 // no limits for anything else
896 AVIOContext
*pb
= matroska
->ctx
->pb
;
897 uint32_t id
= syntax
->id
;
901 data
= (char *) data
+ syntax
->data_offset
;
902 if (syntax
->list_elem_size
) {
903 EbmlList
*list
= data
;
904 if ((res
= av_reallocp_array(&list
->elem
,
906 syntax
->list_elem_size
)) < 0) {
910 data
= (char *) list
->elem
+ list
->nb_elem
* syntax
->list_elem_size
;
911 memset(data
, 0, syntax
->list_elem_size
);
915 if (syntax
->type
!= EBML_PASS
&& syntax
->type
!= EBML_STOP
) {
916 matroska
->current_id
= 0;
917 if ((res
= ebml_read_length(matroska
, pb
, &length
)) < 0)
919 if (max_lengths
[syntax
->type
] && length
> max_lengths
[syntax
->type
]) {
920 av_log(matroska
->ctx
, AV_LOG_ERROR
,
921 "Invalid length 0x%"PRIx64
" > 0x%"PRIx64
" for syntax element %i\n",
922 length
, max_lengths
[syntax
->type
], syntax
->type
);
923 return AVERROR_INVALIDDATA
;
927 switch (syntax
->type
) {
929 res
= ebml_read_uint(pb
, length
, data
);
932 res
= ebml_read_float(pb
, length
, data
);
936 res
= ebml_read_ascii(pb
, length
, data
);
939 res
= ebml_read_binary(pb
, length
, data
);
942 if ((res
= ebml_read_master(matroska
, length
)) < 0)
944 if (id
== MATROSKA_ID_SEGMENT
)
945 matroska
->segment_start
= avio_tell(matroska
->ctx
->pb
);
946 return ebml_parse_nest(matroska
, syntax
->def
.n
, data
);
948 return ebml_parse_id(matroska
, syntax
->def
.n
, id
, data
);
952 return avio_skip(pb
, length
) < 0 ?
AVERROR(EIO
) : 0;
954 if (res
== AVERROR_INVALIDDATA
)
955 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Invalid element\n");
956 else if (res
== AVERROR(EIO
))
957 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Read error\n");
961 static void ebml_free(EbmlSyntax
*syntax
, void *data
)
964 for (i
= 0; syntax
[i
].id
; i
++) {
965 void *data_off
= (char *) data
+ syntax
[i
].data_offset
;
966 switch (syntax
[i
].type
) {
972 av_freep(&((EbmlBin
*) data_off
)->data
);
975 if (syntax
[i
].list_elem_size
) {
976 EbmlList
*list
= data_off
;
977 char *ptr
= list
->elem
;
978 for (j
= 0; j
< list
->nb_elem
;
979 j
++, ptr
+= syntax
[i
].list_elem_size
)
980 ebml_free(syntax
[i
].def
.n
, ptr
);
983 ebml_free(syntax
[i
].def
.n
, data_off
);
993 static int matroska_probe(AVProbeData
*p
)
996 int len_mask
= 0x80, size
= 1, n
= 1, i
;
999 if (AV_RB32(p
->buf
) != EBML_ID_HEADER
)
1002 /* length of header */
1004 while (size
<= 8 && !(total
& len_mask
)) {
1010 total
&= (len_mask
- 1);
1012 total
= (total
<< 8) | p
->buf
[4 + n
++];
1014 /* Does the probe data contain the whole header? */
1015 if (p
->buf_size
< 4 + size
+ total
)
1018 /* The header should contain a known document type. For now,
1019 * we don't parse the whole header but simply check for the
1020 * availability of that array of characters inside the header.
1021 * Not fully fool-proof, but good enough. */
1022 for (i
= 0; i
< FF_ARRAY_ELEMS(matroska_doctypes
); i
++) {
1023 int probelen
= strlen(matroska_doctypes
[i
]);
1024 if (total
< probelen
)
1026 for (n
= 4 + size
; n
<= 4 + size
+ total
- probelen
; n
++)
1027 if (!memcmp(p
->buf
+ n
, matroska_doctypes
[i
], probelen
))
1028 return AVPROBE_SCORE_MAX
;
1031 // probably valid EBML header but no recognized doctype
1032 return AVPROBE_SCORE_EXTENSION
;
1035 static MatroskaTrack
*matroska_find_track_by_num(MatroskaDemuxContext
*matroska
,
1038 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
1041 for (i
= 0; i
< matroska
->tracks
.nb_elem
; i
++)
1042 if (tracks
[i
].num
== num
)
1045 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Invalid track number %d\n", num
);
1049 static int matroska_decode_buffer(uint8_t **buf
, int *buf_size
,
1050 MatroskaTrack
*track
)
1052 MatroskaTrackEncoding
*encodings
= track
->encodings
.elem
;
1053 uint8_t *data
= *buf
;
1054 int isize
= *buf_size
;
1055 uint8_t *pkt_data
= NULL
;
1056 uint8_t av_unused
*newpktdata
;
1057 int pkt_size
= isize
;
1061 if (pkt_size
>= 10000000)
1062 return AVERROR_INVALIDDATA
;
1064 switch (encodings
[0].compression
.algo
) {
1065 case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
:
1067 int header_size
= encodings
[0].compression
.settings
.size
;
1068 uint8_t *header
= encodings
[0].compression
.settings
.data
;
1073 pkt_size
= isize
+ header_size
;
1074 pkt_data
= av_malloc(pkt_size
);
1076 return AVERROR(ENOMEM
);
1078 memcpy(pkt_data
, header
, header_size
);
1079 memcpy(pkt_data
+ header_size
, data
, isize
);
1083 case MATROSKA_TRACK_ENCODING_COMP_LZO
:
1085 olen
= pkt_size
*= 3;
1086 newpktdata
= av_realloc(pkt_data
, pkt_size
+ AV_LZO_OUTPUT_PADDING
);
1088 result
= AVERROR(ENOMEM
);
1091 pkt_data
= newpktdata
;
1092 result
= av_lzo1x_decode(pkt_data
, &olen
, data
, &isize
);
1093 } while (result
== AV_LZO_OUTPUT_FULL
&& pkt_size
< 10000000);
1095 result
= AVERROR_INVALIDDATA
;
1102 case MATROSKA_TRACK_ENCODING_COMP_ZLIB
:
1104 z_stream zstream
= { 0 };
1105 if (inflateInit(&zstream
) != Z_OK
)
1107 zstream
.next_in
= data
;
1108 zstream
.avail_in
= isize
;
1111 newpktdata
= av_realloc(pkt_data
, pkt_size
);
1113 inflateEnd(&zstream
);
1116 pkt_data
= newpktdata
;
1117 zstream
.avail_out
= pkt_size
- zstream
.total_out
;
1118 zstream
.next_out
= pkt_data
+ zstream
.total_out
;
1119 result
= inflate(&zstream
, Z_NO_FLUSH
);
1120 } while (result
== Z_OK
&& pkt_size
< 10000000);
1121 pkt_size
= zstream
.total_out
;
1122 inflateEnd(&zstream
);
1123 if (result
!= Z_STREAM_END
) {
1124 if (result
== Z_MEM_ERROR
)
1125 result
= AVERROR(ENOMEM
);
1127 result
= AVERROR_INVALIDDATA
;
1134 case MATROSKA_TRACK_ENCODING_COMP_BZLIB
:
1136 bz_stream bzstream
= { 0 };
1137 if (BZ2_bzDecompressInit(&bzstream
, 0, 0) != BZ_OK
)
1139 bzstream
.next_in
= data
;
1140 bzstream
.avail_in
= isize
;
1143 newpktdata
= av_realloc(pkt_data
, pkt_size
);
1145 BZ2_bzDecompressEnd(&bzstream
);
1148 pkt_data
= newpktdata
;
1149 bzstream
.avail_out
= pkt_size
- bzstream
.total_out_lo32
;
1150 bzstream
.next_out
= pkt_data
+ bzstream
.total_out_lo32
;
1151 result
= BZ2_bzDecompress(&bzstream
);
1152 } while (result
== BZ_OK
&& pkt_size
< 10000000);
1153 pkt_size
= bzstream
.total_out_lo32
;
1154 BZ2_bzDecompressEnd(&bzstream
);
1155 if (result
!= BZ_STREAM_END
) {
1156 if (result
== BZ_MEM_ERROR
)
1157 result
= AVERROR(ENOMEM
);
1159 result
= AVERROR_INVALIDDATA
;
1166 return AVERROR_INVALIDDATA
;
1170 *buf_size
= pkt_size
;
1178 static void matroska_fix_ass_packet(MatroskaDemuxContext
*matroska
,
1179 AVPacket
*pkt
, uint64_t display_duration
)
1182 char *layer
, *ptr
= pkt
->data
, *end
= ptr
+ pkt
->size
;
1184 for (; *ptr
!= ',' && ptr
< end
- 1; ptr
++)
1188 for (; *ptr
!= ',' && ptr
< end
- 1; ptr
++)
1191 int64_t end_pts
= pkt
->pts
+ display_duration
;
1192 int sc
= matroska
->time_scale
* pkt
->pts
/ 10000000;
1193 int ec
= matroska
->time_scale
* end_pts
/ 10000000;
1194 int sh
, sm
, ss
, eh
, em
, es
, len
;
1208 len
= 50 + end
- ptr
+ AV_INPUT_BUFFER_PADDING_SIZE
;
1209 if (!(line
= av_buffer_alloc(len
)))
1211 snprintf(line
->data
, len
,
1212 "Dialogue: %s,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s\r\n",
1213 layer
, sh
, sm
, ss
, sc
, eh
, em
, es
, ec
, ptr
);
1214 av_buffer_unref(&pkt
->buf
);
1216 pkt
->data
= line
->data
;
1217 pkt
->size
= strlen(line
->data
);
1221 static int matroska_merge_packets(AVPacket
*out
, AVPacket
*in
)
1223 int old_size
= out
->size
;
1224 int ret
= av_grow_packet(out
, in
->size
);
1228 memcpy(out
->data
+ old_size
, in
->data
, in
->size
);
1230 av_packet_unref(in
);
1235 static void matroska_convert_tag(AVFormatContext
*s
, EbmlList
*list
,
1236 AVDictionary
**metadata
, char *prefix
)
1238 MatroskaTag
*tags
= list
->elem
;
1242 for (i
= 0; i
< list
->nb_elem
; i
++) {
1243 const char *lang
= tags
[i
].lang
&&
1244 strcmp(tags
[i
].lang
, "und") ? tags
[i
].lang
: NULL
;
1246 if (!tags
[i
].name
) {
1247 av_log(s
, AV_LOG_WARNING
, "Skipping invalid tag with no TagName.\n");
1251 snprintf(key
, sizeof(key
), "%s/%s", prefix
, tags
[i
].name
);
1253 av_strlcpy(key
, tags
[i
].name
, sizeof(key
));
1254 if (tags
[i
].def
|| !lang
) {
1255 av_dict_set(metadata
, key
, tags
[i
].string
, 0);
1256 if (tags
[i
].sub
.nb_elem
)
1257 matroska_convert_tag(s
, &tags
[i
].sub
, metadata
, key
);
1260 av_strlcat(key
, "-", sizeof(key
));
1261 av_strlcat(key
, lang
, sizeof(key
));
1262 av_dict_set(metadata
, key
, tags
[i
].string
, 0);
1263 if (tags
[i
].sub
.nb_elem
)
1264 matroska_convert_tag(s
, &tags
[i
].sub
, metadata
, key
);
1267 ff_metadata_conv(metadata
, NULL
, ff_mkv_metadata_conv
);
1270 static void matroska_convert_tags(AVFormatContext
*s
)
1272 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1273 MatroskaTags
*tags
= matroska
->tags
.elem
;
1276 for (i
= 0; i
< matroska
->tags
.nb_elem
; i
++) {
1277 if (tags
[i
].target
.attachuid
) {
1278 MatroskaAttachment
*attachment
= matroska
->attachments
.elem
;
1280 for (j
= 0; j
< matroska
->attachments
.nb_elem
; j
++) {
1281 if (attachment
[j
].uid
== tags
[i
].target
.attachuid
&&
1282 attachment
[j
].stream
) {
1283 matroska_convert_tag(s
, &tags
[i
].tag
,
1284 &attachment
[j
].stream
->metadata
, NULL
);
1289 av_log(NULL
, AV_LOG_WARNING
,
1290 "The tags at index %d refer to a "
1291 "non-existent attachment %"PRId64
".\n",
1292 i
, tags
[i
].target
.attachuid
);
1294 } else if (tags
[i
].target
.chapteruid
) {
1295 MatroskaChapter
*chapter
= matroska
->chapters
.elem
;
1297 for (j
= 0; j
< matroska
->chapters
.nb_elem
; j
++) {
1298 if (chapter
[j
].uid
== tags
[i
].target
.chapteruid
&&
1299 chapter
[j
].chapter
) {
1300 matroska_convert_tag(s
, &tags
[i
].tag
,
1301 &chapter
[j
].chapter
->metadata
, NULL
);
1306 av_log(NULL
, AV_LOG_WARNING
,
1307 "The tags at index %d refer to a non-existent chapter "
1309 i
, tags
[i
].target
.chapteruid
);
1311 } else if (tags
[i
].target
.trackuid
) {
1312 MatroskaTrack
*track
= matroska
->tracks
.elem
;
1314 for (j
= 0; j
< matroska
->tracks
.nb_elem
; j
++) {
1315 if (track
[j
].uid
== tags
[i
].target
.trackuid
&&
1317 matroska_convert_tag(s
, &tags
[i
].tag
,
1318 &track
[j
].stream
->metadata
, NULL
);
1323 av_log(NULL
, AV_LOG_WARNING
,
1324 "The tags at index %d refer to a non-existent track "
1326 i
, tags
[i
].target
.trackuid
);
1329 matroska_convert_tag(s
, &tags
[i
].tag
, &s
->metadata
,
1330 tags
[i
].target
.type
);
1335 static int matroska_parse_seekhead_entry(MatroskaDemuxContext
*matroska
,
1338 EbmlList
*seekhead_list
= &matroska
->seekhead
;
1339 uint32_t level_up
= matroska
->level_up
;
1340 uint32_t saved_id
= matroska
->current_id
;
1341 MatroskaSeekhead
*seekhead
= seekhead_list
->elem
;
1342 int64_t before_pos
= avio_tell(matroska
->ctx
->pb
);
1343 MatroskaLevel level
;
1347 if (idx
>= seekhead_list
->nb_elem
||
1348 seekhead
[idx
].id
== MATROSKA_ID_SEEKHEAD
||
1349 seekhead
[idx
].id
== MATROSKA_ID_CLUSTER
)
1353 offset
= seekhead
[idx
].pos
+ matroska
->segment_start
;
1354 if (avio_seek(matroska
->ctx
->pb
, offset
, SEEK_SET
) == offset
) {
1355 /* We don't want to lose our seekhead level, so we add
1356 * a dummy. This is a crude hack. */
1357 if (matroska
->num_levels
== EBML_MAX_DEPTH
) {
1358 av_log(matroska
->ctx
, AV_LOG_INFO
,
1359 "Max EBML element depth (%d) reached, "
1360 "cannot parse further.\n", EBML_MAX_DEPTH
);
1361 ret
= AVERROR_INVALIDDATA
;
1364 level
.length
= (uint64_t) -1;
1365 matroska
->levels
[matroska
->num_levels
] = level
;
1366 matroska
->num_levels
++;
1367 matroska
->current_id
= 0;
1369 ret
= ebml_parse(matroska
, matroska_segment
, matroska
);
1371 /* remove dummy level */
1372 while (matroska
->num_levels
) {
1373 uint64_t length
= matroska
->levels
[--matroska
->num_levels
].length
;
1374 if (length
== (uint64_t) -1)
1380 avio_seek(matroska
->ctx
->pb
, before_pos
, SEEK_SET
);
1381 matroska
->level_up
= level_up
;
1382 matroska
->current_id
= saved_id
;
1387 static void matroska_execute_seekhead(MatroskaDemuxContext
*matroska
)
1389 EbmlList
*seekhead_list
= &matroska
->seekhead
;
1390 int64_t before_pos
= avio_tell(matroska
->ctx
->pb
);
1393 // we should not do any seeking in the streaming case
1394 if (!matroska
->ctx
->pb
->seekable
||
1395 (matroska
->ctx
->flags
& AVFMT_FLAG_IGNIDX
))
1398 for (i
= 0; i
< seekhead_list
->nb_elem
; i
++) {
1399 MatroskaSeekhead
*seekhead
= seekhead_list
->elem
;
1400 if (seekhead
[i
].pos
<= before_pos
)
1403 // defer cues parsing until we actually need cue data.
1404 if (seekhead
[i
].id
== MATROSKA_ID_CUES
) {
1405 matroska
->cues_parsing_deferred
= 1;
1409 if (matroska_parse_seekhead_entry(matroska
, i
) < 0)
1414 static void matroska_parse_cues(MatroskaDemuxContext
*matroska
)
1416 EbmlList
*seekhead_list
= &matroska
->seekhead
;
1417 MatroskaSeekhead
*seekhead
= seekhead_list
->elem
;
1418 EbmlList
*index_list
;
1419 MatroskaIndex
*index
;
1420 int index_scale
= 1;
1423 for (i
= 0; i
< seekhead_list
->nb_elem
; i
++)
1424 if (seekhead
[i
].id
== MATROSKA_ID_CUES
)
1426 assert(i
<= seekhead_list
->nb_elem
);
1428 matroska_parse_seekhead_entry(matroska
, i
);
1430 index_list
= &matroska
->index
;
1431 index
= index_list
->elem
;
1432 if (index_list
->nb_elem
&&
1433 index
[0].time
> 1E14
/ matroska
->time_scale
) {
1434 av_log(matroska
->ctx
, AV_LOG_WARNING
, "Working around broken index.\n");
1435 index_scale
= matroska
->time_scale
;
1437 for (i
= 0; i
< index_list
->nb_elem
; i
++) {
1438 EbmlList
*pos_list
= &index
[i
].pos
;
1439 MatroskaIndexPos
*pos
= pos_list
->elem
;
1440 for (j
= 0; j
< pos_list
->nb_elem
; j
++) {
1441 MatroskaTrack
*track
= matroska_find_track_by_num(matroska
,
1443 if (track
&& track
->stream
)
1444 av_add_index_entry(track
->stream
,
1445 pos
[j
].pos
+ matroska
->segment_start
,
1446 index
[i
].time
/ index_scale
, 0, 0,
1452 static int matroska_aac_profile(char *codec_id
)
1454 static const char *const aac_profiles
[] = { "MAIN", "LC", "SSR" };
1457 for (profile
= 0; profile
< FF_ARRAY_ELEMS(aac_profiles
); profile
++)
1458 if (strstr(codec_id
, aac_profiles
[profile
]))
1463 static int matroska_aac_sri(int samplerate
)
1467 for (sri
= 0; sri
< FF_ARRAY_ELEMS(avpriv_mpeg4audio_sample_rates
); sri
++)
1468 if (avpriv_mpeg4audio_sample_rates
[sri
] == samplerate
)
1473 static int matroska_parse_flac(AVFormatContext
*s
,
1474 MatroskaTrack
*track
,
1477 AVStream
*st
= track
->stream
;
1478 uint8_t *p
= track
->codec_priv
.data
;
1479 int size
= track
->codec_priv
.size
;
1481 if (size
< 8 + FLAC_STREAMINFO_SIZE
|| p
[4] & 0x7f) {
1482 av_log(s
, AV_LOG_WARNING
, "Invalid FLAC private data\n");
1483 track
->codec_priv
.size
= 0;
1487 track
->codec_priv
.size
= 8 + FLAC_STREAMINFO_SIZE
;
1489 p
+= track
->codec_priv
.size
;
1490 size
-= track
->codec_priv
.size
;
1492 /* parse the remaining metadata blocks if present */
1494 int block_last
, block_type
, block_size
;
1496 flac_parse_block_header(p
, &block_last
, &block_type
, &block_size
);
1500 if (block_size
> size
)
1503 /* check for the channel mask */
1504 if (block_type
== FLAC_METADATA_TYPE_VORBIS_COMMENT
) {
1505 AVDictionary
*dict
= NULL
;
1506 AVDictionaryEntry
*chmask
;
1508 ff_vorbis_comment(s
, &dict
, p
, block_size
, 0);
1509 chmask
= av_dict_get(dict
, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL
, 0);
1511 uint64_t mask
= strtol(chmask
->value
, NULL
, 0);
1512 if (!mask
|| mask
& ~0x3ffffULL
) {
1513 av_log(s
, AV_LOG_WARNING
,
1514 "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
1516 st
->codecpar
->channel_layout
= mask
;
1518 av_dict_free(&dict
);
1528 static void mkv_stereo_mode_display_mul(int stereo_mode
,
1529 int *h_width
, int *h_height
)
1531 switch (stereo_mode
) {
1532 case MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
:
1533 case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL
:
1534 case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR
:
1535 case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
:
1536 case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR
:
1538 case MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
:
1539 case MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
:
1540 case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL
:
1541 case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR
:
1544 case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP
:
1545 case MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
:
1546 case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
:
1547 case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
:
1553 static int matroska_parse_tracks(AVFormatContext
*s
)
1555 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1556 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
1560 for (i
= 0; i
< matroska
->tracks
.nb_elem
; i
++) {
1561 MatroskaTrack
*track
= &tracks
[i
];
1562 enum AVCodecID codec_id
= AV_CODEC_ID_NONE
;
1563 EbmlList
*encodings_list
= &track
->encodings
;
1564 MatroskaTrackEncoding
*encodings
= encodings_list
->elem
;
1565 uint8_t *extradata
= NULL
;
1566 int extradata_size
= 0;
1567 int extradata_offset
= 0;
1570 /* Apply some sanity checks. */
1571 if (track
->type
!= MATROSKA_TRACK_TYPE_VIDEO
&&
1572 track
->type
!= MATROSKA_TRACK_TYPE_AUDIO
&&
1573 track
->type
!= MATROSKA_TRACK_TYPE_SUBTITLE
) {
1574 av_log(matroska
->ctx
, AV_LOG_INFO
,
1575 "Unknown or unsupported track type %"PRIu64
"\n",
1579 if (!track
->codec_id
)
1582 if (track
->type
== MATROSKA_TRACK_TYPE_VIDEO
) {
1583 if (!track
->default_duration
&& track
->video
.frame_rate
> 0)
1584 track
->default_duration
= 1000000000 / track
->video
.frame_rate
;
1585 if (!track
->video
.display_width
)
1586 track
->video
.display_width
= track
->video
.pixel_width
;
1587 if (!track
->video
.display_height
)
1588 track
->video
.display_height
= track
->video
.pixel_height
;
1589 } else if (track
->type
== MATROSKA_TRACK_TYPE_AUDIO
) {
1590 if (!track
->audio
.out_samplerate
)
1591 track
->audio
.out_samplerate
= track
->audio
.samplerate
;
1593 if (encodings_list
->nb_elem
> 1) {
1594 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1595 "Multiple combined encodings not supported");
1596 } else if (encodings_list
->nb_elem
== 1) {
1597 if (encodings
[0].type
||
1600 encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_ZLIB
&&
1603 encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_BZLIB
&&
1606 encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_LZO
&&
1608 encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
)) {
1609 encodings
[0].scope
= 0;
1610 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1611 "Unsupported encoding type");
1612 } else if (track
->codec_priv
.size
&& encodings
[0].scope
& 2) {
1613 uint8_t *codec_priv
= track
->codec_priv
.data
;
1614 int ret
= matroska_decode_buffer(&track
->codec_priv
.data
,
1615 &track
->codec_priv
.size
,
1618 track
->codec_priv
.data
= NULL
;
1619 track
->codec_priv
.size
= 0;
1620 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1621 "Failed to decode codec private data\n");
1624 if (codec_priv
!= track
->codec_priv
.data
)
1625 av_free(codec_priv
);
1629 for (j
= 0; ff_mkv_codec_tags
[j
].id
!= AV_CODEC_ID_NONE
; j
++) {
1630 if (!strncmp(ff_mkv_codec_tags
[j
].str
, track
->codec_id
,
1631 strlen(ff_mkv_codec_tags
[j
].str
))) {
1632 codec_id
= ff_mkv_codec_tags
[j
].id
;
1637 st
= track
->stream
= avformat_new_stream(s
, NULL
);
1639 return AVERROR(ENOMEM
);
1641 if (!strcmp(track
->codec_id
, "V_MS/VFW/FOURCC") &&
1642 track
->codec_priv
.size
>= 40 &&
1643 track
->codec_priv
.data
) {
1644 track
->ms_compat
= 1;
1645 track
->video
.fourcc
= AV_RL32(track
->codec_priv
.data
+ 16);
1646 codec_id
= ff_codec_get_id(ff_codec_bmp_tags
,
1647 track
->video
.fourcc
);
1648 extradata_offset
= 40;
1649 } else if (!strcmp(track
->codec_id
, "A_MS/ACM") &&
1650 track
->codec_priv
.size
>= 14 &&
1651 track
->codec_priv
.data
) {
1653 ffio_init_context(&b
, track
->codec_priv
.data
,
1654 track
->codec_priv
.size
,
1655 0, NULL
, NULL
, NULL
, NULL
);
1656 ret
= ff_get_wav_header(s
, &b
, st
->codecpar
, track
->codec_priv
.size
);
1659 codec_id
= st
->codecpar
->codec_id
;
1660 extradata_offset
= FFMIN(track
->codec_priv
.size
, 18);
1661 } else if (!strcmp(track
->codec_id
, "V_QUICKTIME") &&
1662 (track
->codec_priv
.size
>= 86) &&
1663 (track
->codec_priv
.data
)) {
1664 if (track
->codec_priv
.size
== AV_RB32(track
->codec_priv
.data
)) {
1665 track
->video
.fourcc
= AV_RL32(track
->codec_priv
.data
+ 4);
1666 codec_id
= ff_codec_get_id(ff_codec_movvideo_tags
,
1667 track
->video
.fourcc
);
1669 if (codec_id
== AV_CODEC_ID_NONE
) {
1670 track
->video
.fourcc
= AV_RL32(track
->codec_priv
.data
);
1671 codec_id
= ff_codec_get_id(ff_codec_movvideo_tags
,
1672 track
->video
.fourcc
);
1674 if (codec_id
== AV_CODEC_ID_NONE
) {
1676 av_get_codec_tag_string(buf
, sizeof(buf
), track
->video
.fourcc
);
1677 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1678 "mov FourCC not found %s.\n", buf
);
1680 } else if (codec_id
== AV_CODEC_ID_PCM_S16BE
) {
1681 switch (track
->audio
.bitdepth
) {
1683 codec_id
= AV_CODEC_ID_PCM_U8
;
1686 codec_id
= AV_CODEC_ID_PCM_S24BE
;
1689 codec_id
= AV_CODEC_ID_PCM_S32BE
;
1692 } else if (codec_id
== AV_CODEC_ID_PCM_S16LE
) {
1693 switch (track
->audio
.bitdepth
) {
1695 codec_id
= AV_CODEC_ID_PCM_U8
;
1698 codec_id
= AV_CODEC_ID_PCM_S24LE
;
1701 codec_id
= AV_CODEC_ID_PCM_S32LE
;
1704 } else if (codec_id
== AV_CODEC_ID_PCM_F32LE
&&
1705 track
->audio
.bitdepth
== 64) {
1706 codec_id
= AV_CODEC_ID_PCM_F64LE
;
1707 } else if (codec_id
== AV_CODEC_ID_AAC
&& !track
->codec_priv
.size
) {
1708 int profile
= matroska_aac_profile(track
->codec_id
);
1709 int sri
= matroska_aac_sri(track
->audio
.samplerate
);
1710 extradata
= av_mallocz(5 + AV_INPUT_BUFFER_PADDING_SIZE
);
1712 return AVERROR(ENOMEM
);
1713 extradata
[0] = (profile
<< 3) | ((sri
& 0x0E) >> 1);
1714 extradata
[1] = ((sri
& 0x01) << 7) | (track
->audio
.channels
<< 3);
1715 if (strstr(track
->codec_id
, "SBR")) {
1716 sri
= matroska_aac_sri(track
->audio
.out_samplerate
);
1717 extradata
[2] = 0x56;
1718 extradata
[3] = 0xE5;
1719 extradata
[4] = 0x80 | (sri
<< 3);
1723 } else if (codec_id
== AV_CODEC_ID_ALAC
&& track
->codec_priv
.size
) {
1724 /* Only ALAC's magic cookie is stored in Matroska's track headers.
1725 * Create the "atom size", "tag", and "tag version" fields the
1726 * decoder expects manually. */
1727 extradata_size
= 12 + track
->codec_priv
.size
;
1728 extradata
= av_mallocz(extradata_size
+
1729 AV_INPUT_BUFFER_PADDING_SIZE
);
1731 return AVERROR(ENOMEM
);
1732 AV_WB32(extradata
, extradata_size
);
1733 memcpy(&extradata
[4], "alac", 4);
1734 AV_WB32(&extradata
[8], 0);
1735 memcpy(&extradata
[12], track
->codec_priv
.data
,
1736 track
->codec_priv
.size
);
1737 } else if (codec_id
== AV_CODEC_ID_TTA
) {
1738 extradata_size
= 30;
1739 extradata
= av_mallocz(extradata_size
);
1741 return AVERROR(ENOMEM
);
1742 ffio_init_context(&b
, extradata
, extradata_size
, 1,
1743 NULL
, NULL
, NULL
, NULL
);
1744 avio_write(&b
, "TTA1", 4);
1746 avio_wl16(&b
, track
->audio
.channels
);
1747 avio_wl16(&b
, track
->audio
.bitdepth
);
1748 avio_wl32(&b
, track
->audio
.out_samplerate
);
1749 avio_wl32(&b
, matroska
->ctx
->duration
*
1750 track
->audio
.out_samplerate
);
1751 } else if (codec_id
== AV_CODEC_ID_RV10
||
1752 codec_id
== AV_CODEC_ID_RV20
||
1753 codec_id
== AV_CODEC_ID_RV30
||
1754 codec_id
== AV_CODEC_ID_RV40
) {
1755 extradata_offset
= 26;
1756 } else if (codec_id
== AV_CODEC_ID_RA_144
) {
1757 track
->audio
.out_samplerate
= 8000;
1758 track
->audio
.channels
= 1;
1759 } else if (codec_id
== AV_CODEC_ID_RA_288
||
1760 codec_id
== AV_CODEC_ID_COOK
||
1761 codec_id
== AV_CODEC_ID_ATRAC3
||
1762 codec_id
== AV_CODEC_ID_SIPR
) {
1764 ffio_init_context(&b
, track
->codec_priv
.data
,
1765 track
->codec_priv
.size
,
1766 0, NULL
, NULL
, NULL
, NULL
);
1768 flavor
= avio_rb16(&b
);
1769 track
->audio
.coded_framesize
= avio_rb32(&b
);
1771 track
->audio
.sub_packet_h
= avio_rb16(&b
);
1772 track
->audio
.frame_size
= avio_rb16(&b
);
1773 track
->audio
.sub_packet_size
= avio_rb16(&b
);
1775 track
->audio
.coded_framesize
<= 0 ||
1776 track
->audio
.sub_packet_h
<= 0 ||
1777 track
->audio
.frame_size
<= 0 ||
1778 track
->audio
.sub_packet_size
<= 0)
1779 return AVERROR_INVALIDDATA
;
1780 track
->audio
.buf
= av_malloc(track
->audio
.frame_size
*
1781 track
->audio
.sub_packet_h
);
1782 if (!track
->audio
.buf
)
1783 return AVERROR(ENOMEM
);
1784 if (codec_id
== AV_CODEC_ID_RA_288
) {
1785 st
->codecpar
->block_align
= track
->audio
.coded_framesize
;
1786 track
->codec_priv
.size
= 0;
1788 if (codec_id
== AV_CODEC_ID_SIPR
&& flavor
< 4) {
1789 const int sipr_bit_rate
[4] = { 6504, 8496, 5000, 16000 };
1790 track
->audio
.sub_packet_size
= ff_sipr_subpk_size
[flavor
];
1791 st
->codecpar
->bit_rate
= sipr_bit_rate
[flavor
];
1793 st
->codecpar
->block_align
= track
->audio
.sub_packet_size
;
1794 extradata_offset
= 78;
1796 } else if (codec_id
== AV_CODEC_ID_FLAC
&& track
->codec_priv
.size
) {
1797 ret
= matroska_parse_flac(s
, track
, &extradata_offset
);
1801 track
->codec_priv
.size
-= extradata_offset
;
1803 if (codec_id
== AV_CODEC_ID_NONE
)
1804 av_log(matroska
->ctx
, AV_LOG_INFO
,
1805 "Unknown/unsupported AVCodecID %s.\n", track
->codec_id
);
1807 if (track
->time_scale
< 0.01)
1808 track
->time_scale
= 1.0;
1809 avpriv_set_pts_info(st
, 64, matroska
->time_scale
* track
->time_scale
,
1810 1000 * 1000 * 1000); /* 64 bit pts in ns */
1812 /* convert the delay from ns to the track timebase */
1813 track
->codec_delay
= av_rescale_q(track
->codec_delay
,
1814 (AVRational
){ 1, 1000000000 },
1817 st
->codecpar
->codec_id
= codec_id
;
1819 if (strcmp(track
->language
, "und"))
1820 av_dict_set(&st
->metadata
, "language", track
->language
, 0);
1821 av_dict_set(&st
->metadata
, "title", track
->name
, 0);
1823 if (track
->flag_default
)
1824 st
->disposition
|= AV_DISPOSITION_DEFAULT
;
1825 if (track
->flag_forced
)
1826 st
->disposition
|= AV_DISPOSITION_FORCED
;
1828 if (!st
->codecpar
->extradata
) {
1830 st
->codecpar
->extradata
= extradata
;
1831 st
->codecpar
->extradata_size
= extradata_size
;
1832 } else if (track
->codec_priv
.data
&& track
->codec_priv
.size
> 0) {
1833 st
->codecpar
->extradata
= av_mallocz(track
->codec_priv
.size
+
1834 AV_INPUT_BUFFER_PADDING_SIZE
);
1835 if (!st
->codecpar
->extradata
)
1836 return AVERROR(ENOMEM
);
1837 st
->codecpar
->extradata_size
= track
->codec_priv
.size
;
1838 memcpy(st
->codecpar
->extradata
,
1839 track
->codec_priv
.data
+ extradata_offset
,
1840 track
->codec_priv
.size
);
1844 if (track
->type
== MATROSKA_TRACK_TYPE_VIDEO
) {
1845 int display_width_mul
= 1;
1846 int display_height_mul
= 1;
1848 st
->codecpar
->codec_type
= AVMEDIA_TYPE_VIDEO
;
1849 st
->codecpar
->codec_tag
= track
->video
.fourcc
;
1850 st
->codecpar
->width
= track
->video
.pixel_width
;
1851 st
->codecpar
->height
= track
->video
.pixel_height
;
1853 if (track
->video
.stereo_mode
&& track
->video
.stereo_mode
< MATROSKA_VIDEO_STEREOMODE_TYPE_NB
)
1854 mkv_stereo_mode_display_mul(track
->video
.stereo_mode
, &display_width_mul
, &display_height_mul
);
1856 av_reduce(&st
->sample_aspect_ratio
.num
,
1857 &st
->sample_aspect_ratio
.den
,
1858 st
->codecpar
->height
* track
->video
.display_width
* display_width_mul
,
1859 st
->codecpar
->width
* track
->video
.display_height
* display_height_mul
,
1861 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_H264
&&
1862 st
->codecpar
->codec_id
!= AV_CODEC_ID_HEVC
)
1863 st
->need_parsing
= AVSTREAM_PARSE_HEADERS
;
1864 if (track
->default_duration
) {
1865 av_reduce(&st
->avg_frame_rate
.num
, &st
->avg_frame_rate
.den
,
1866 1000000000, track
->default_duration
, 30000);
1868 // add stream level stereo3d side data if it is a supported format
1869 if (track
->video
.stereo_mode
< MATROSKA_VIDEO_STEREOMODE_TYPE_NB
&&
1870 track
->video
.stereo_mode
!= 10 && track
->video
.stereo_mode
!= 12) {
1871 int ret
= ff_mkv_stereo3d_conv(st
, track
->video
.stereo_mode
);
1875 } else if (track
->type
== MATROSKA_TRACK_TYPE_AUDIO
) {
1876 st
->codecpar
->codec_type
= AVMEDIA_TYPE_AUDIO
;
1877 st
->codecpar
->sample_rate
= track
->audio
.out_samplerate
;
1878 st
->codecpar
->channels
= track
->audio
.channels
;
1879 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_AAC
)
1880 st
->need_parsing
= AVSTREAM_PARSE_HEADERS
;
1881 if (st
->codecpar
->codec_id
== AV_CODEC_ID_MP3
)
1882 st
->need_parsing
= AVSTREAM_PARSE_FULL
;
1883 } else if (track
->type
== MATROSKA_TRACK_TYPE_SUBTITLE
) {
1884 st
->codecpar
->codec_type
= AVMEDIA_TYPE_SUBTITLE
;
1885 if (st
->codecpar
->codec_id
== AV_CODEC_ID_SSA
)
1886 matroska
->contains_ssa
= 1;
1893 static int matroska_read_header(AVFormatContext
*s
)
1895 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1896 EbmlList
*attachments_list
= &matroska
->attachments
;
1897 EbmlList
*chapters_list
= &matroska
->chapters
;
1898 MatroskaAttachment
*attachments
;
1899 MatroskaChapter
*chapters
;
1900 uint64_t max_start
= 0;
1907 /* First read the EBML header. */
1908 if (ebml_parse(matroska
, ebml_syntax
, &ebml
) || !ebml
.doctype
) {
1909 av_log(matroska
->ctx
, AV_LOG_ERROR
, "EBML header parsing failed\n");
1910 ebml_free(ebml_syntax
, &ebml
);
1911 return AVERROR_INVALIDDATA
;
1913 if (ebml
.version
> EBML_VERSION
||
1914 ebml
.max_size
> sizeof(uint64_t) ||
1915 ebml
.id_length
> sizeof(uint32_t) ||
1916 ebml
.doctype_version
> 3) {
1917 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1918 "EBML header using unsupported features\n"
1919 "(EBML version %"PRIu64
", doctype %s, doc version %"PRIu64
")\n",
1920 ebml
.version
, ebml
.doctype
, ebml
.doctype_version
);
1921 ebml_free(ebml_syntax
, &ebml
);
1922 return AVERROR_PATCHWELCOME
;
1924 for (i
= 0; i
< FF_ARRAY_ELEMS(matroska_doctypes
); i
++)
1925 if (!strcmp(ebml
.doctype
, matroska_doctypes
[i
]))
1927 if (i
>= FF_ARRAY_ELEMS(matroska_doctypes
)) {
1928 av_log(s
, AV_LOG_WARNING
, "Unknown EBML doctype '%s'\n", ebml
.doctype
);
1929 if (matroska
->ctx
->error_recognition
& AV_EF_EXPLODE
) {
1930 ebml_free(ebml_syntax
, &ebml
);
1931 return AVERROR_INVALIDDATA
;
1934 ebml_free(ebml_syntax
, &ebml
);
1936 /* The next thing is a segment. */
1937 pos
= avio_tell(matroska
->ctx
->pb
);
1938 res
= ebml_parse(matroska
, matroska_segments
, matroska
);
1939 // try resyncing until we find a EBML_STOP type element.
1941 res
= matroska_resync(matroska
, pos
);
1944 pos
= avio_tell(matroska
->ctx
->pb
);
1945 res
= ebml_parse(matroska
, matroska_segment
, matroska
);
1947 matroska_execute_seekhead(matroska
);
1949 if (!matroska
->time_scale
)
1950 matroska
->time_scale
= 1000000;
1951 if (matroska
->duration
)
1952 matroska
->ctx
->duration
= matroska
->duration
* matroska
->time_scale
*
1953 1000 / AV_TIME_BASE
;
1954 av_dict_set(&s
->metadata
, "title", matroska
->title
, 0);
1956 res
= matroska_parse_tracks(s
);
1960 attachments
= attachments_list
->elem
;
1961 for (j
= 0; j
< attachments_list
->nb_elem
; j
++) {
1962 if (!(attachments
[j
].filename
&& attachments
[j
].mime
&&
1963 attachments
[j
].bin
.data
&& attachments
[j
].bin
.size
> 0)) {
1964 av_log(matroska
->ctx
, AV_LOG_ERROR
, "incomplete attachment\n");
1966 AVStream
*st
= avformat_new_stream(s
, NULL
);
1969 av_dict_set(&st
->metadata
, "filename", attachments
[j
].filename
, 0);
1970 av_dict_set(&st
->metadata
, "mimetype", attachments
[j
].mime
, 0);
1971 st
->codecpar
->codec_id
= AV_CODEC_ID_NONE
;
1973 for (i
= 0; ff_mkv_image_mime_tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++) {
1974 if (!strncmp(ff_mkv_image_mime_tags
[i
].str
, attachments
[j
].mime
,
1975 strlen(ff_mkv_image_mime_tags
[i
].str
))) {
1976 st
->codecpar
->codec_id
= ff_mkv_image_mime_tags
[i
].id
;
1981 attachments
[j
].stream
= st
;
1983 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_NONE
) {
1984 st
->disposition
|= AV_DISPOSITION_ATTACHED_PIC
;
1985 st
->codecpar
->codec_type
= AVMEDIA_TYPE_VIDEO
;
1987 av_init_packet(&st
->attached_pic
);
1988 if ((res
= av_new_packet(&st
->attached_pic
, attachments
[j
].bin
.size
)) < 0)
1990 memcpy(st
->attached_pic
.data
, attachments
[j
].bin
.data
, attachments
[j
].bin
.size
);
1991 st
->attached_pic
.stream_index
= st
->index
;
1992 st
->attached_pic
.flags
|= AV_PKT_FLAG_KEY
;
1994 st
->codecpar
->codec_type
= AVMEDIA_TYPE_ATTACHMENT
;
1995 st
->codecpar
->extradata
= av_malloc(attachments
[j
].bin
.size
);
1996 if (!st
->codecpar
->extradata
)
1999 st
->codecpar
->extradata_size
= attachments
[j
].bin
.size
;
2000 memcpy(st
->codecpar
->extradata
, attachments
[j
].bin
.data
,
2001 attachments
[j
].bin
.size
);
2003 for (i
= 0; ff_mkv_mime_tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++) {
2004 if (!strncmp(ff_mkv_mime_tags
[i
].str
, attachments
[j
].mime
,
2005 strlen(ff_mkv_mime_tags
[i
].str
))) {
2006 st
->codecpar
->codec_id
= ff_mkv_mime_tags
[i
].id
;
2014 chapters
= chapters_list
->elem
;
2015 for (i
= 0; i
< chapters_list
->nb_elem
; i
++)
2016 if (chapters
[i
].start
!= AV_NOPTS_VALUE
&& chapters
[i
].uid
&&
2017 (max_start
== 0 || chapters
[i
].start
> max_start
)) {
2018 chapters
[i
].chapter
=
2019 avpriv_new_chapter(s
, chapters
[i
].uid
,
2020 (AVRational
) { 1, 1000000000 },
2021 chapters
[i
].start
, chapters
[i
].end
,
2023 av_dict_set(&chapters
[i
].chapter
->metadata
,
2024 "title", chapters
[i
].title
, 0);
2025 max_start
= chapters
[i
].start
;
2028 matroska_convert_tags(s
);
2034 * Put one packet in an application-supplied AVPacket struct.
2035 * Returns 0 on success or -1 on failure.
2037 static int matroska_deliver_packet(MatroskaDemuxContext
*matroska
,
2040 if (matroska
->num_packets
> 0) {
2041 memcpy(pkt
, matroska
->packets
[0], sizeof(AVPacket
));
2042 av_free(matroska
->packets
[0]);
2043 if (matroska
->num_packets
> 1) {
2045 memmove(&matroska
->packets
[0], &matroska
->packets
[1],
2046 (matroska
->num_packets
- 1) * sizeof(AVPacket
*));
2047 newpackets
= av_realloc(matroska
->packets
,
2048 (matroska
->num_packets
- 1) *
2049 sizeof(AVPacket
*));
2051 matroska
->packets
= newpackets
;
2053 av_freep(&matroska
->packets
);
2054 matroska
->prev_pkt
= NULL
;
2056 matroska
->num_packets
--;
2064 * Free all packets in our internal queue.
2066 static void matroska_clear_queue(MatroskaDemuxContext
*matroska
)
2068 matroska
->prev_pkt
= NULL
;
2069 if (matroska
->packets
) {
2071 for (n
= 0; n
< matroska
->num_packets
; n
++) {
2072 av_packet_unref(matroska
->packets
[n
]);
2073 av_free(matroska
->packets
[n
]);
2075 av_freep(&matroska
->packets
);
2076 matroska
->num_packets
= 0;
2080 static int matroska_parse_laces(MatroskaDemuxContext
*matroska
, uint8_t **buf
,
2081 int *buf_size
, int type
,
2082 uint32_t **lace_buf
, int *laces
)
2084 int res
= 0, n
, size
= *buf_size
;
2085 uint8_t *data
= *buf
;
2086 uint32_t *lace_size
;
2090 *lace_buf
= av_mallocz(sizeof(int));
2092 return AVERROR(ENOMEM
);
2094 *lace_buf
[0] = size
;
2102 lace_size
= av_mallocz(*laces
* sizeof(int));
2104 return AVERROR(ENOMEM
);
2107 case 0x1: /* Xiph lacing */
2111 for (n
= 0; res
== 0 && n
< *laces
- 1; n
++) {
2118 lace_size
[n
] += temp
;
2124 total
+= lace_size
[n
];
2126 if (size
<= total
) {
2127 res
= AVERROR_INVALIDDATA
;
2131 lace_size
[n
] = size
- total
;
2135 case 0x2: /* fixed-size lacing */
2136 if (size
% (*laces
)) {
2137 res
= AVERROR_INVALIDDATA
;
2140 for (n
= 0; n
< *laces
; n
++)
2141 lace_size
[n
] = size
/ *laces
;
2144 case 0x3: /* EBML lacing */
2148 n
= matroska_ebmlnum_uint(matroska
, data
, size
, &num
);
2150 av_log(matroska
->ctx
, AV_LOG_INFO
,
2151 "EBML block data error\n");
2157 total
= lace_size
[0] = num
;
2158 for (n
= 1; res
== 0 && n
< *laces
- 1; n
++) {
2161 r
= matroska_ebmlnum_sint(matroska
, data
, size
, &snum
);
2163 av_log(matroska
->ctx
, AV_LOG_INFO
,
2164 "EBML block data error\n");
2170 lace_size
[n
] = lace_size
[n
- 1] + snum
;
2171 total
+= lace_size
[n
];
2173 if (size
<= total
) {
2174 res
= AVERROR_INVALIDDATA
;
2177 lace_size
[*laces
- 1] = size
- total
;
2183 *lace_buf
= lace_size
;
2189 static int matroska_parse_rm_audio(MatroskaDemuxContext
*matroska
,
2190 MatroskaTrack
*track
, AVStream
*st
,
2191 uint8_t *data
, int size
, uint64_t timecode
,
2192 uint64_t duration
, int64_t pos
)
2194 int a
= st
->codecpar
->block_align
;
2195 int sps
= track
->audio
.sub_packet_size
;
2196 int cfs
= track
->audio
.coded_framesize
;
2197 int h
= track
->audio
.sub_packet_h
;
2198 int y
= track
->audio
.sub_packet_cnt
;
2199 int w
= track
->audio
.frame_size
;
2202 if (!track
->audio
.pkt_cnt
) {
2203 if (track
->audio
.sub_packet_cnt
== 0)
2204 track
->audio
.buf_timecode
= timecode
;
2205 if (st
->codecpar
->codec_id
== AV_CODEC_ID_RA_288
) {
2206 if (size
< cfs
* h
/ 2) {
2207 av_log(matroska
->ctx
, AV_LOG_ERROR
,
2208 "Corrupt int4 RM-style audio packet size\n");
2209 return AVERROR_INVALIDDATA
;
2211 for (x
= 0; x
< h
/ 2; x
++)
2212 memcpy(track
->audio
.buf
+ x
* 2 * w
+ y
* cfs
,
2213 data
+ x
* cfs
, cfs
);
2214 } else if (st
->codecpar
->codec_id
== AV_CODEC_ID_SIPR
) {
2216 av_log(matroska
->ctx
, AV_LOG_ERROR
,
2217 "Corrupt sipr RM-style audio packet size\n");
2218 return AVERROR_INVALIDDATA
;
2220 memcpy(track
->audio
.buf
+ y
* w
, data
, w
);
2222 if (size
< sps
* w
/ sps
) {
2223 av_log(matroska
->ctx
, AV_LOG_ERROR
,
2224 "Corrupt generic RM-style audio packet size\n");
2225 return AVERROR_INVALIDDATA
;
2227 for (x
= 0; x
< w
/ sps
; x
++)
2228 memcpy(track
->audio
.buf
+
2229 sps
* (h
* x
+ ((h
+ 1) / 2) * (y
& 1) + (y
>> 1)),
2230 data
+ x
* sps
, sps
);
2233 if (++track
->audio
.sub_packet_cnt
>= h
) {
2234 if (st
->codecpar
->codec_id
== AV_CODEC_ID_SIPR
)
2235 ff_rm_reorder_sipr_data(track
->audio
.buf
, h
, w
);
2236 track
->audio
.sub_packet_cnt
= 0;
2237 track
->audio
.pkt_cnt
= h
* w
/ a
;
2241 while (track
->audio
.pkt_cnt
) {
2243 AVPacket
*pkt
= av_mallocz(sizeof(AVPacket
));
2245 return AVERROR(ENOMEM
);
2247 ret
= av_new_packet(pkt
, a
);
2253 track
->audio
.buf
+ a
* (h
* w
/ a
- track
->audio
.pkt_cnt
--),
2255 pkt
->pts
= track
->audio
.buf_timecode
;
2256 track
->audio
.buf_timecode
= AV_NOPTS_VALUE
;
2258 pkt
->stream_index
= st
->index
;
2259 dynarray_add(&matroska
->packets
, &matroska
->num_packets
, pkt
);
2265 /* reconstruct full wavpack blocks from mangled matroska ones */
2266 static int matroska_parse_wavpack(MatroskaTrack
*track
, uint8_t *src
,
2267 uint8_t **pdst
, int *size
)
2269 uint8_t *dst
= NULL
;
2274 int ret
, offset
= 0;
2276 if (srclen
< 12 || track
->stream
->codecpar
->extradata_size
< 2)
2277 return AVERROR_INVALIDDATA
;
2279 ver
= AV_RL16(track
->stream
->codecpar
->extradata
);
2281 samples
= AV_RL32(src
);
2285 while (srclen
>= 8) {
2290 uint32_t flags
= AV_RL32(src
);
2291 uint32_t crc
= AV_RL32(src
+ 4);
2295 multiblock
= (flags
& 0x1800) != 0x1800;
2298 ret
= AVERROR_INVALIDDATA
;
2301 blocksize
= AV_RL32(src
);
2307 if (blocksize
> srclen
) {
2308 ret
= AVERROR_INVALIDDATA
;
2312 tmp
= av_realloc(dst
, dstlen
+ blocksize
+ 32);
2314 ret
= AVERROR(ENOMEM
);
2318 dstlen
+= blocksize
+ 32;
2320 AV_WL32(dst
+ offset
, MKTAG('w', 'v', 'p', 'k')); // tag
2321 AV_WL32(dst
+ offset
+ 4, blocksize
+ 24); // blocksize - 8
2322 AV_WL16(dst
+ offset
+ 8, ver
); // version
2323 AV_WL16(dst
+ offset
+ 10, 0); // track/index_no
2324 AV_WL32(dst
+ offset
+ 12, 0); // total samples
2325 AV_WL32(dst
+ offset
+ 16, 0); // block index
2326 AV_WL32(dst
+ offset
+ 20, samples
); // number of samples
2327 AV_WL32(dst
+ offset
+ 24, flags
); // flags
2328 AV_WL32(dst
+ offset
+ 28, crc
); // crc
2329 memcpy(dst
+ offset
+ 32, src
, blocksize
); // block data
2332 srclen
-= blocksize
;
2333 offset
+= blocksize
+ 32;
2346 static int matroska_parse_frame(MatroskaDemuxContext
*matroska
,
2347 MatroskaTrack
*track
, AVStream
*st
,
2348 uint8_t *data
, int pkt_size
,
2349 uint64_t timecode
, uint64_t duration
,
2350 int64_t pos
, int is_keyframe
)
2352 MatroskaTrackEncoding
*encodings
= track
->encodings
.elem
;
2353 uint8_t *pkt_data
= data
;
2354 int offset
= 0, res
;
2357 if (encodings
&& encodings
->scope
& 1) {
2358 res
= matroska_decode_buffer(&pkt_data
, &pkt_size
, track
);
2363 if (st
->codecpar
->codec_id
== AV_CODEC_ID_WAVPACK
) {
2365 res
= matroska_parse_wavpack(track
, pkt_data
, &wv_data
, &pkt_size
);
2367 av_log(matroska
->ctx
, AV_LOG_ERROR
,
2368 "Error parsing a wavpack block.\n");
2371 if (pkt_data
!= data
)
2372 av_freep(&pkt_data
);
2376 if (st
->codecpar
->codec_id
== AV_CODEC_ID_PRORES
)
2379 pkt
= av_mallocz(sizeof(AVPacket
));
2381 av_freep(&pkt_data
);
2382 return AVERROR(ENOMEM
);
2384 /* XXX: prevent data copy... */
2385 if (av_new_packet(pkt
, pkt_size
+ offset
) < 0) {
2387 av_freep(&pkt_data
);
2388 return AVERROR(ENOMEM
);
2391 if (st
->codecpar
->codec_id
== AV_CODEC_ID_PRORES
) {
2392 uint8_t *buf
= pkt
->data
;
2393 bytestream_put_be32(&buf
, pkt_size
);
2394 bytestream_put_be32(&buf
, MKBETAG('i', 'c', 'p', 'f'));
2397 memcpy(pkt
->data
+ offset
, pkt_data
, pkt_size
);
2399 if (pkt_data
!= data
)
2402 pkt
->flags
= is_keyframe
;
2403 pkt
->stream_index
= st
->index
;
2405 if (track
->ms_compat
)
2406 pkt
->dts
= timecode
;
2408 pkt
->pts
= timecode
;
2410 if (track
->type
!= MATROSKA_TRACK_TYPE_SUBTITLE
|| st
->codecpar
->codec_id
== AV_CODEC_ID_TEXT
)
2411 pkt
->duration
= duration
;
2412 #if FF_API_CONVERGENCE_DURATION
2413 FF_DISABLE_DEPRECATION_WARNINGS
2414 if (st
->codecpar
->codec_id
== AV_CODEC_ID_TEXT
)
2415 pkt
->convergence_duration
= duration
;
2416 FF_ENABLE_DEPRECATION_WARNINGS
2419 if (st
->codecpar
->codec_id
== AV_CODEC_ID_SSA
)
2420 matroska_fix_ass_packet(matroska
, pkt
, duration
);
2422 if (matroska
->prev_pkt
&&
2423 timecode
!= AV_NOPTS_VALUE
&&
2424 matroska
->prev_pkt
->pts
== timecode
&&
2425 matroska
->prev_pkt
->stream_index
== st
->index
&&
2426 st
->codecpar
->codec_id
== AV_CODEC_ID_SSA
)
2427 matroska_merge_packets(matroska
->prev_pkt
, pkt
);
2429 dynarray_add(&matroska
->packets
, &matroska
->num_packets
, pkt
);
2430 matroska
->prev_pkt
= pkt
;
2436 if (pkt_data
!= data
)
2437 av_freep(&pkt_data
);
2441 static int matroska_parse_block(MatroskaDemuxContext
*matroska
, uint8_t *data
,
2442 int size
, int64_t pos
, uint64_t cluster_time
,
2443 uint64_t block_duration
, int is_keyframe
,
2444 int64_t cluster_pos
)
2446 uint64_t timecode
= AV_NOPTS_VALUE
;
2447 MatroskaTrack
*track
;
2451 uint32_t *lace_size
= NULL
;
2452 int n
, flags
, laces
= 0;
2453 uint64_t num
, duration
;
2455 if ((n
= matroska_ebmlnum_uint(matroska
, data
, size
, &num
)) < 0) {
2456 av_log(matroska
->ctx
, AV_LOG_ERROR
, "EBML block data error\n");
2462 track
= matroska_find_track_by_num(matroska
, num
);
2463 if (!track
|| !track
->stream
) {
2464 av_log(matroska
->ctx
, AV_LOG_INFO
,
2465 "Invalid stream %"PRIu64
" or size %u\n", num
, size
);
2466 return AVERROR_INVALIDDATA
;
2467 } else if (size
<= 3)
2470 if (st
->discard
>= AVDISCARD_ALL
)
2473 block_time
= AV_RB16(data
);
2477 if (is_keyframe
== -1)
2478 is_keyframe
= flags
& 0x80 ? AV_PKT_FLAG_KEY
: 0;
2480 if (cluster_time
!= (uint64_t) -1 &&
2481 (block_time
>= 0 || cluster_time
>= -block_time
)) {
2482 timecode
= cluster_time
+ block_time
- track
->codec_delay
;
2483 if (track
->type
== MATROSKA_TRACK_TYPE_SUBTITLE
&&
2484 timecode
< track
->end_timecode
)
2485 is_keyframe
= 0; /* overlapping subtitles are not key frame */
2487 av_add_index_entry(st
, cluster_pos
, timecode
, 0, 0,
2491 if (matroska
->skip_to_keyframe
&&
2492 track
->type
!= MATROSKA_TRACK_TYPE_SUBTITLE
) {
2493 if (!is_keyframe
|| timecode
< matroska
->skip_to_timecode
)
2495 matroska
->skip_to_keyframe
= 0;
2498 res
= matroska_parse_laces(matroska
, &data
, &size
, (flags
& 0x06) >> 1,
2499 &lace_size
, &laces
);
2504 if (block_duration
!= AV_NOPTS_VALUE
) {
2505 duration
= block_duration
/ laces
;
2506 if (block_duration
!= duration
* laces
) {
2507 av_log(matroska
->ctx
, AV_LOG_WARNING
,
2508 "Incorrect block_duration, possibly corrupted container");
2511 duration
= track
->default_duration
/ matroska
->time_scale
;
2512 block_duration
= duration
* laces
;
2515 if (timecode
!= AV_NOPTS_VALUE
)
2516 track
->end_timecode
=
2517 FFMAX(track
->end_timecode
, timecode
+ block_duration
);
2519 for (n
= 0; n
< laces
; n
++) {
2520 if ((st
->codecpar
->codec_id
== AV_CODEC_ID_RA_288
||
2521 st
->codecpar
->codec_id
== AV_CODEC_ID_COOK
||
2522 st
->codecpar
->codec_id
== AV_CODEC_ID_SIPR
||
2523 st
->codecpar
->codec_id
== AV_CODEC_ID_ATRAC3
) &&
2524 st
->codecpar
->block_align
&& track
->audio
.sub_packet_size
) {
2525 res
= matroska_parse_rm_audio(matroska
, track
, st
, data
,
2527 timecode
, duration
, pos
);
2531 res
= matroska_parse_frame(matroska
, track
, st
, data
, lace_size
[n
],
2532 timecode
, duration
, pos
,
2533 !n ? is_keyframe
: 0);
2538 if (timecode
!= AV_NOPTS_VALUE
)
2539 timecode
= duration ? timecode
+ duration
: AV_NOPTS_VALUE
;
2540 data
+= lace_size
[n
];
2548 static int matroska_parse_cluster_incremental(MatroskaDemuxContext
*matroska
)
2550 EbmlList
*blocks_list
;
2551 MatroskaBlock
*blocks
;
2553 res
= ebml_parse(matroska
,
2554 matroska_cluster_incremental_parsing
,
2555 &matroska
->current_cluster
);
2558 if (matroska
->current_cluster_pos
)
2559 ebml_level_end(matroska
);
2560 ebml_free(matroska_cluster
, &matroska
->current_cluster
);
2561 memset(&matroska
->current_cluster
, 0, sizeof(MatroskaCluster
));
2562 matroska
->current_cluster_num_blocks
= 0;
2563 matroska
->current_cluster_pos
= avio_tell(matroska
->ctx
->pb
);
2564 matroska
->prev_pkt
= NULL
;
2565 /* sizeof the ID which was already read */
2566 if (matroska
->current_id
)
2567 matroska
->current_cluster_pos
-= 4;
2568 res
= ebml_parse(matroska
,
2569 matroska_clusters_incremental
,
2570 &matroska
->current_cluster
);
2571 /* Try parsing the block again. */
2573 res
= ebml_parse(matroska
,
2574 matroska_cluster_incremental_parsing
,
2575 &matroska
->current_cluster
);
2579 matroska
->current_cluster_num_blocks
<
2580 matroska
->current_cluster
.blocks
.nb_elem
) {
2581 blocks_list
= &matroska
->current_cluster
.blocks
;
2582 blocks
= blocks_list
->elem
;
2584 matroska
->current_cluster_num_blocks
= blocks_list
->nb_elem
;
2585 i
= blocks_list
->nb_elem
- 1;
2586 if (blocks
[i
].bin
.size
> 0 && blocks
[i
].bin
.data
) {
2587 int is_keyframe
= blocks
[i
].non_simple ?
!blocks
[i
].reference
: -1;
2588 if (!blocks
[i
].non_simple
)
2589 blocks
[i
].duration
= AV_NOPTS_VALUE
;
2590 res
= matroska_parse_block(matroska
, blocks
[i
].bin
.data
,
2591 blocks
[i
].bin
.size
, blocks
[i
].bin
.pos
,
2592 matroska
->current_cluster
.timecode
,
2593 blocks
[i
].duration
, is_keyframe
,
2594 matroska
->current_cluster_pos
);
2603 static int matroska_parse_cluster(MatroskaDemuxContext
*matroska
)
2605 MatroskaCluster cluster
= { 0 };
2606 EbmlList
*blocks_list
;
2607 MatroskaBlock
*blocks
;
2611 if (!matroska
->contains_ssa
)
2612 return matroska_parse_cluster_incremental(matroska
);
2613 pos
= avio_tell(matroska
->ctx
->pb
);
2614 matroska
->prev_pkt
= NULL
;
2615 if (matroska
->current_id
)
2616 pos
-= 4; /* sizeof the ID which was already read */
2617 res
= ebml_parse(matroska
, matroska_clusters
, &cluster
);
2618 blocks_list
= &cluster
.blocks
;
2619 blocks
= blocks_list
->elem
;
2620 for (i
= 0; i
< blocks_list
->nb_elem
&& !res
; i
++)
2621 if (blocks
[i
].bin
.size
> 0 && blocks
[i
].bin
.data
) {
2622 int is_keyframe
= blocks
[i
].non_simple ?
!blocks
[i
].reference
: -1;
2623 if (!blocks
[i
].non_simple
)
2624 blocks
[i
].duration
= AV_NOPTS_VALUE
;
2625 res
= matroska_parse_block(matroska
, blocks
[i
].bin
.data
,
2626 blocks
[i
].bin
.size
, blocks
[i
].bin
.pos
,
2627 cluster
.timecode
, blocks
[i
].duration
,
2630 ebml_free(matroska_cluster
, &cluster
);
2634 static int matroska_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
2636 MatroskaDemuxContext
*matroska
= s
->priv_data
;
2639 while (!ret
&& matroska_deliver_packet(matroska
, pkt
)) {
2640 int64_t pos
= avio_tell(matroska
->ctx
->pb
);
2643 if (matroska_parse_cluster(matroska
) < 0)
2644 ret
= matroska_resync(matroska
, pos
);
2647 if (ret
== AVERROR_INVALIDDATA
&& pkt
->data
) {
2648 pkt
->flags
|= AV_PKT_FLAG_CORRUPT
;
2655 static int matroska_read_seek(AVFormatContext
*s
, int stream_index
,
2656 int64_t timestamp
, int flags
)
2658 MatroskaDemuxContext
*matroska
= s
->priv_data
;
2659 MatroskaTrack
*tracks
= NULL
;
2660 AVStream
*st
= s
->streams
[stream_index
];
2661 int i
, index
, index_sub
, index_min
;
2663 /* Parse the CUES now since we need the index data to seek. */
2664 if (matroska
->cues_parsing_deferred
) {
2665 matroska_parse_cues(matroska
);
2666 matroska
->cues_parsing_deferred
= 0;
2669 if (!st
->nb_index_entries
)
2671 timestamp
= FFMAX(timestamp
, st
->index_entries
[0].timestamp
);
2673 if ((index
= av_index_search_timestamp(st
, timestamp
, flags
)) < 0) {
2674 avio_seek(s
->pb
, st
->index_entries
[st
->nb_index_entries
- 1].pos
,
2676 matroska
->current_id
= 0;
2677 while ((index
= av_index_search_timestamp(st
, timestamp
, flags
)) < 0) {
2678 matroska_clear_queue(matroska
);
2679 if (matroska_parse_cluster(matroska
) < 0)
2684 matroska_clear_queue(matroska
);
2689 tracks
= matroska
->tracks
.elem
;
2690 for (i
= 0; i
< matroska
->tracks
.nb_elem
; i
++) {
2691 tracks
[i
].audio
.pkt_cnt
= 0;
2692 tracks
[i
].audio
.sub_packet_cnt
= 0;
2693 tracks
[i
].audio
.buf_timecode
= AV_NOPTS_VALUE
;
2694 tracks
[i
].end_timecode
= 0;
2695 if (tracks
[i
].type
== MATROSKA_TRACK_TYPE_SUBTITLE
&&
2696 tracks
[i
].stream
->discard
!= AVDISCARD_ALL
) {
2697 index_sub
= av_index_search_timestamp(
2698 tracks
[i
].stream
, st
->index_entries
[index
].timestamp
,
2699 AVSEEK_FLAG_BACKWARD
);
2700 if (index_sub
>= 0 &&
2701 st
->index_entries
[index_sub
].pos
< st
->index_entries
[index_min
].pos
&&
2702 st
->index_entries
[index
].timestamp
-
2703 st
->index_entries
[index_sub
].timestamp
< 30000000000 / matroska
->time_scale
)
2704 index_min
= index_sub
;
2708 avio_seek(s
->pb
, st
->index_entries
[index_min
].pos
, SEEK_SET
);
2709 matroska
->current_id
= 0;
2710 matroska
->skip_to_keyframe
= !(flags
& AVSEEK_FLAG_ANY
);
2711 matroska
->skip_to_timecode
= st
->index_entries
[index
].timestamp
;
2713 ff_update_cur_dts(s
, st
, st
->index_entries
[index
].timestamp
);
2717 static int matroska_read_close(AVFormatContext
*s
)
2719 MatroskaDemuxContext
*matroska
= s
->priv_data
;
2720 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
2723 matroska_clear_queue(matroska
);
2725 for (n
= 0; n
< matroska
->tracks
.nb_elem
; n
++)
2726 if (tracks
[n
].type
== MATROSKA_TRACK_TYPE_AUDIO
)
2727 av_free(tracks
[n
].audio
.buf
);
2728 ebml_free(matroska_cluster
, &matroska
->current_cluster
);
2729 ebml_free(matroska_segment
, matroska
);
2734 AVInputFormat ff_matroska_demuxer
= {
2735 .name
= "matroska,webm",
2736 .long_name
= NULL_IF_CONFIG_SMALL("Matroska / WebM"),
2737 .extensions
= "mkv,mk3d,mka,mks",
2738 .priv_data_size
= sizeof(MatroskaDemuxContext
),
2739 .read_probe
= matroska_probe
,
2740 .read_header
= matroska_read_header
,
2741 .read_packet
= matroska_read_packet
,
2742 .read_close
= matroska_read_close
,
2743 .read_seek
= matroska_read_seek
,
2744 .mime_type
= "audio/webm,audio/x-matroska,video/webm,video/x-matroska"