2 * Matroska file demuxer
3 * Copyright (c) 2003-2008 The FFmpeg Project
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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/
32 #include "config_components.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/base64.h"
39 #include "libavutil/bprint.h"
40 #include "libavutil/dict.h"
41 #include "libavutil/display.h"
42 #include "libavutil/hdr_dynamic_metadata.h"
43 #include "libavutil/intfloat.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/lzo.h"
46 #include "libavutil/mastering_display_metadata.h"
47 #include "libavutil/mathematics.h"
48 #include "libavutil/mem.h"
49 #include "libavutil/opt.h"
50 #include "libavutil/pixdesc.h"
51 #include "libavutil/time_internal.h"
52 #include "libavutil/spherical.h"
54 #include "libavcodec/bytestream.h"
55 #include "libavcodec/defs.h"
56 #include "libavcodec/flac.h"
57 #include "libavcodec/itut35.h"
58 #include "libavcodec/mpeg4audio.h"
59 #include "libavcodec/packet_internal.h"
62 #include "avio_internal.h"
64 #include "dovi_isom.h"
69 /* For ff_codec_get_id(). */
80 #include "qtpalette.h"
82 #define EBML_UNKNOWN_LENGTH UINT64_MAX /* EBML unknown length, in uint64_t */
83 #define NEEDS_CHECKING 2 /* Indicates that some error checks
84 * still need to be performed */
85 #define LEVEL_ENDED 3 /* return value of ebml_parse when the
86 * syntax level used for parsing ended. */
87 #define SKIP_THRESHOLD 1024 * 1024 /* In non-seekable mode, if more than SKIP_THRESHOLD
88 * of unknown, potentially damaged data is encountered,
89 * it is considered an error. */
90 #define UNKNOWN_EQUIV 50 * 1024 /* An unknown element is considered equivalent
91 * to this many bytes of unknown data for the
92 * SKIP_THRESHOLD check. */
108 typedef struct CountedElement
{
118 typedef const struct EbmlSyntax
{
122 size_t list_elem_size
;
129 const struct EbmlSyntax
*n
;
133 typedef struct EbmlList
{
135 unsigned int alloc_elem_size
;
139 typedef struct EbmlBin
{
146 typedef struct Ebml
{
151 uint64_t doctype_version
;
154 typedef struct MatroskaTrackCompression
{
157 } MatroskaTrackCompression
;
159 typedef struct MatroskaTrackEncryption
{
162 } MatroskaTrackEncryption
;
164 typedef struct MatroskaTrackEncoding
{
167 MatroskaTrackCompression compression
;
168 MatroskaTrackEncryption encryption
;
169 } MatroskaTrackEncoding
;
171 typedef struct MatroskaMasteringMeta
{
180 double max_luminance
;
181 CountedElement min_luminance
;
182 } MatroskaMasteringMeta
;
184 typedef struct MatroskaTrackVideoColor
{
185 uint64_t matrix_coefficients
;
186 uint64_t bits_per_channel
;
187 uint64_t chroma_sub_horz
;
188 uint64_t chroma_sub_vert
;
189 uint64_t cb_sub_horz
;
190 uint64_t cb_sub_vert
;
191 uint64_t chroma_siting_horz
;
192 uint64_t chroma_siting_vert
;
194 uint64_t transfer_characteristics
;
198 MatroskaMasteringMeta mastering_meta
;
199 } MatroskaTrackVideoColor
;
201 typedef struct MatroskaTrackVideoProjection
{
207 } MatroskaTrackVideoProjection
;
209 typedef struct MatroskaTrackVideo
{
211 uint64_t display_width
;
212 uint64_t display_height
;
213 uint64_t pixel_width
;
214 uint64_t pixel_height
;
215 uint64_t cropped_width
;
216 uint64_t cropped_height
;
218 uint64_t pixel_cropt
;
219 uint64_t pixel_cropl
;
220 uint64_t pixel_cropb
;
221 uint64_t pixel_cropr
;
222 uint64_t display_unit
;
224 uint64_t field_order
;
225 uint64_t stereo_mode
;
228 MatroskaTrackVideoProjection projection
;
229 } MatroskaTrackVideo
;
231 typedef struct MatroskaTrackAudio
{
233 double out_samplerate
;
237 /* real audio header (extracted from extradata) */
244 uint64_t buf_timecode
;
246 } MatroskaTrackAudio
;
248 typedef struct MatroskaTrackPlane
{
251 } MatroskaTrackPlane
;
253 typedef struct MatroskaTrackOperation
{
254 EbmlList combine_planes
;
255 } MatroskaTrackOperation
;
257 typedef struct MatroskaBlockAdditionMapping
{
262 } MatroskaBlockAdditionMapping
;
264 typedef struct MatroskaTrack
{
273 uint64_t default_duration
;
274 uint64_t flag_default
;
275 uint64_t flag_forced
;
276 uint64_t flag_comment
;
277 uint64_t flag_hearingimpaired
;
278 uint64_t flag_visualimpaired
;
279 uint64_t flag_textdescriptions
;
280 CountedElement flag_original
;
281 uint64_t seek_preroll
;
282 MatroskaTrackVideo video
;
283 MatroskaTrackAudio audio
;
284 MatroskaTrackOperation operation
;
286 uint64_t codec_delay
;
287 uint64_t codec_delay_in_track_tb
;
290 int64_t end_timecode
;
293 uint64_t max_block_additional_id
;
294 EbmlList block_addition_mappings
;
296 uint32_t palette
[AVPALETTE_COUNT
];
300 typedef struct MatroskaAttachment
{
308 } MatroskaAttachment
;
310 typedef struct MatroskaChapter
{
319 typedef struct MatroskaIndexPos
{
324 typedef struct MatroskaIndex
{
329 typedef struct MatroskaTag
{
337 typedef struct MatroskaTagTarget
{
345 typedef struct MatroskaTags
{
346 MatroskaTagTarget target
;
350 typedef struct MatroskaSeekhead
{
355 typedef struct MatroskaLevel
{
360 typedef struct MatroskaBlockMore
{
361 uint64_t additional_id
;
365 typedef struct MatroskaBlock
{
367 CountedElement reference
;
371 int64_t discard_padding
;
374 typedef struct MatroskaCluster
{
380 typedef struct MatroskaLevel1Element
{
384 } MatroskaLevel1Element
;
386 typedef struct MatroskaDemuxContext
{
387 const AVClass
*class;
388 AVFormatContext
*ctx
;
391 MatroskaLevel levels
[EBML_MAX_DEPTH
];
403 EbmlList attachments
;
409 /* byte position of the segment inside the stream */
410 int64_t segment_start
;
412 /* This packet coincides with FFFormatContext.parse_pkt
413 * and is not owned by us. */
416 /* the packet queue */
421 /* What to skip before effectively reading a packet. */
422 int skip_to_keyframe
;
423 uint64_t skip_to_timecode
;
425 /* File has a CUES element, but we defer parsing until it is needed. */
426 int cues_parsing_deferred
;
428 /* Level1 elements and whether they were read yet */
429 MatroskaLevel1Element level1_elems
[64];
430 int num_level1_elems
;
432 MatroskaCluster current_cluster
;
436 /* WebM DASH Manifest live flag */
439 /* Bandwidth value for WebM DASH Manifest */
441 } MatroskaDemuxContext
;
443 #define CHILD_OF(parent) { .def = { .n = parent } }
445 // The following forward declarations need their size because
446 // a tentative definition with internal linkage must not be an
447 // incomplete type (6.7.2 in C90, 6.9.2 in C99).
448 // Removing the sizes breaks MSVC.
449 static EbmlSyntax ebml_syntax
[3], matroska_segment
[9], matroska_track_video_color
[15], matroska_track_video
[19],
450 matroska_track
[33], matroska_track_encoding
[6], matroska_track_encodings
[2],
451 matroska_track_combine_planes
[2], matroska_track_operation
[2], matroska_block_addition_mapping
[5], matroska_tracks
[2],
452 matroska_attachments
[2], matroska_chapter_entry
[9], matroska_chapter
[6], matroska_chapters
[2],
453 matroska_index_entry
[3], matroska_index
[2], matroska_tag
[3], matroska_tags
[2], matroska_seekhead
[2],
454 matroska_blockadditions
[2], matroska_blockgroup
[8], matroska_cluster_parsing
[8];
456 static EbmlSyntax ebml_header
[] = {
457 { EBML_ID_EBMLREADVERSION
, EBML_UINT
, 0, 0, offsetof(Ebml
, version
), { .u
= EBML_VERSION
} },
458 { EBML_ID_EBMLMAXSIZELENGTH
, EBML_UINT
, 0, 0, offsetof(Ebml
, max_size
), { .u
= 8 } },
459 { EBML_ID_EBMLMAXIDLENGTH
, EBML_UINT
, 0, 0, offsetof(Ebml
, id_length
), { .u
= 4 } },
460 { EBML_ID_DOCTYPE
, EBML_STR
, 0, 0, offsetof(Ebml
, doctype
), { .s
= "(none)" } },
461 { EBML_ID_DOCTYPEREADVERSION
, EBML_UINT
, 0, 0, offsetof(Ebml
, doctype_version
), { .u
= 1 } },
462 { EBML_ID_EBMLVERSION
, EBML_NONE
},
463 { EBML_ID_DOCTYPEVERSION
, EBML_NONE
},
464 CHILD_OF(ebml_syntax
)
467 static EbmlSyntax ebml_syntax
[] = {
468 { EBML_ID_HEADER
, EBML_NEST
, 0, 0, 0, { .n
= ebml_header
} },
469 { MATROSKA_ID_SEGMENT
, EBML_STOP
},
473 static EbmlSyntax matroska_info
[] = {
474 { MATROSKA_ID_TIMECODESCALE
, EBML_UINT
, 0, 0, offsetof(MatroskaDemuxContext
, time_scale
), { .u
= 1000000 } },
475 { MATROSKA_ID_DURATION
, EBML_FLOAT
, 0, 0, offsetof(MatroskaDemuxContext
, duration
) },
476 { MATROSKA_ID_TITLE
, EBML_UTF8
, 0, 0, offsetof(MatroskaDemuxContext
, title
) },
477 { MATROSKA_ID_WRITINGAPP
, EBML_NONE
},
478 { MATROSKA_ID_MUXINGAPP
, EBML_UTF8
, 0, 0, offsetof(MatroskaDemuxContext
, muxingapp
) },
479 { MATROSKA_ID_DATEUTC
, EBML_BIN
, 0, 0, offsetof(MatroskaDemuxContext
, date_utc
) },
480 { MATROSKA_ID_SEGMENTUID
, EBML_NONE
},
481 CHILD_OF(matroska_segment
)
484 static EbmlSyntax matroska_mastering_meta
[] = {
485 { MATROSKA_ID_VIDEOCOLOR_RX
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, r_x
) },
486 { MATROSKA_ID_VIDEOCOLOR_RY
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, r_y
) },
487 { MATROSKA_ID_VIDEOCOLOR_GX
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, g_x
) },
488 { MATROSKA_ID_VIDEOCOLOR_GY
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, g_y
) },
489 { MATROSKA_ID_VIDEOCOLOR_BX
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, b_x
) },
490 { MATROSKA_ID_VIDEOCOLOR_BY
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, b_y
) },
491 { MATROSKA_ID_VIDEOCOLOR_WHITEX
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, white_x
) },
492 { MATROSKA_ID_VIDEOCOLOR_WHITEY
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, white_y
) },
493 { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN
, EBML_FLOAT
, 1, 0, offsetof(MatroskaMasteringMeta
, min_luminance
) },
494 { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX
, EBML_FLOAT
, 0, 0, offsetof(MatroskaMasteringMeta
, max_luminance
) },
495 CHILD_OF(matroska_track_video_color
)
498 static EbmlSyntax matroska_track_video_color
[] = {
499 { MATROSKA_ID_VIDEOCOLORMATRIXCOEFF
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, matrix_coefficients
), { .u
= AVCOL_SPC_UNSPECIFIED
} },
500 { MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, bits_per_channel
), { .u
= 0 } },
501 { MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, chroma_sub_horz
) },
502 { MATROSKA_ID_VIDEOCOLORCHROMASUBVERT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, chroma_sub_vert
) },
503 { MATROSKA_ID_VIDEOCOLORCBSUBHORZ
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, cb_sub_horz
) },
504 { MATROSKA_ID_VIDEOCOLORCBSUBVERT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, cb_sub_vert
) },
505 { MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, chroma_siting_horz
), { .u
= MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
} },
506 { MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, chroma_siting_vert
), { .u
= MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED
} },
507 { MATROSKA_ID_VIDEOCOLORRANGE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, range
), { .u
= AVCOL_RANGE_UNSPECIFIED
} },
508 { MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, transfer_characteristics
), { .u
= AVCOL_TRC_UNSPECIFIED
} },
509 { MATROSKA_ID_VIDEOCOLORPRIMARIES
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, primaries
), { .u
= AVCOL_PRI_UNSPECIFIED
} },
510 { MATROSKA_ID_VIDEOCOLORMAXCLL
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, max_cll
) },
511 { MATROSKA_ID_VIDEOCOLORMAXFALL
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoColor
, max_fall
) },
512 { MATROSKA_ID_VIDEOCOLORMASTERINGMETA
, EBML_NEST
, 0, 0, offsetof(MatroskaTrackVideoColor
, mastering_meta
), { .n
= matroska_mastering_meta
} },
513 CHILD_OF(matroska_track_video
)
516 static EbmlSyntax matroska_track_video_projection
[] = {
517 { MATROSKA_ID_VIDEOPROJECTIONTYPE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideoProjection
, type
), { .u
= MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR
} },
518 { MATROSKA_ID_VIDEOPROJECTIONPRIVATE
, EBML_BIN
, 0, 0, offsetof(MatroskaTrackVideoProjection
, private) },
519 { MATROSKA_ID_VIDEOPROJECTIONPOSEYAW
, EBML_FLOAT
, 0, 0, offsetof(MatroskaTrackVideoProjection
, yaw
), { .f
= 0.0 } },
520 { MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH
, EBML_FLOAT
, 0, 0, offsetof(MatroskaTrackVideoProjection
, pitch
), { .f
= 0.0 } },
521 { MATROSKA_ID_VIDEOPROJECTIONPOSEROLL
, EBML_FLOAT
, 0, 0, offsetof(MatroskaTrackVideoProjection
, roll
), { .f
= 0.0 } },
522 CHILD_OF(matroska_track_video
)
525 static EbmlSyntax matroska_track_video
[] = {
526 { MATROSKA_ID_VIDEOFRAMERATE
, EBML_FLOAT
, 0, 0, offsetof(MatroskaTrackVideo
, frame_rate
) },
527 { MATROSKA_ID_VIDEODISPLAYWIDTH
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, display_width
), { .u
=-1 } },
528 { MATROSKA_ID_VIDEODISPLAYHEIGHT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, display_height
), { .u
=-1 } },
529 { MATROSKA_ID_VIDEOPIXELWIDTH
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, pixel_width
) },
530 { MATROSKA_ID_VIDEOPIXELHEIGHT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, pixel_height
) },
531 { MATROSKA_ID_VIDEOCOLORSPACE
, EBML_BIN
, 0, 0, offsetof(MatroskaTrackVideo
, color_space
) },
532 { MATROSKA_ID_VIDEOALPHAMODE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, alpha_mode
), { .u
= 0 } },
533 { MATROSKA_ID_VIDEOCOLOR
, EBML_NEST
, 0, sizeof(MatroskaTrackVideoColor
), offsetof(MatroskaTrackVideo
, color
), { .n
= matroska_track_video_color
} },
534 { MATROSKA_ID_VIDEOPROJECTION
, EBML_NEST
, 0, 0, offsetof(MatroskaTrackVideo
, projection
), { .n
= matroska_track_video_projection
} },
535 { MATROSKA_ID_VIDEOPIXELCROPB
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, pixel_cropb
), {.u
= 0 } },
536 { MATROSKA_ID_VIDEOPIXELCROPT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, pixel_cropt
), {.u
= 0 } },
537 { MATROSKA_ID_VIDEOPIXELCROPL
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, pixel_cropl
), {.u
= 0 } },
538 { MATROSKA_ID_VIDEOPIXELCROPR
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, pixel_cropr
), {.u
= 0 } },
539 { MATROSKA_ID_VIDEODISPLAYUNIT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, display_unit
), { .u
= MATROSKA_VIDEO_DISPLAYUNIT_PIXELS
} },
540 { MATROSKA_ID_VIDEOFLAGINTERLACED
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, interlaced
), { .u
= MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
} },
541 { MATROSKA_ID_VIDEOFIELDORDER
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, field_order
), { .u
= MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
} },
542 { MATROSKA_ID_VIDEOSTEREOMODE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackVideo
, stereo_mode
), { .u
= MATROSKA_VIDEO_STEREOMODE_TYPE_NB
} },
543 { MATROSKA_ID_VIDEOASPECTRATIO
, EBML_NONE
},
544 CHILD_OF(matroska_track
)
547 static EbmlSyntax matroska_track_audio
[] = {
548 { MATROSKA_ID_AUDIOSAMPLINGFREQ
, EBML_FLOAT
, 0, 0, offsetof(MatroskaTrackAudio
, samplerate
), { .f
= 8000.0 } },
549 { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
, EBML_FLOAT
, 0, 0, offsetof(MatroskaTrackAudio
, out_samplerate
) },
550 { MATROSKA_ID_AUDIOBITDEPTH
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackAudio
, bitdepth
) },
551 { MATROSKA_ID_AUDIOCHANNELS
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackAudio
, channels
), { .u
= 1 } },
552 CHILD_OF(matroska_track
)
555 static EbmlSyntax matroska_track_encoding_compression
[] = {
556 { MATROSKA_ID_ENCODINGCOMPALGO
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackCompression
, algo
), { .u
= MATROSKA_TRACK_ENCODING_COMP_ZLIB
} },
557 { MATROSKA_ID_ENCODINGCOMPSETTINGS
, EBML_BIN
, 0, 0, offsetof(MatroskaTrackCompression
, settings
) },
558 CHILD_OF(matroska_track_encoding
)
561 static EbmlSyntax matroska_track_encoding_encryption
[] = {
562 { MATROSKA_ID_ENCODINGENCALGO
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackEncryption
,algo
), {.u
= 0} },
563 { MATROSKA_ID_ENCODINGENCKEYID
, EBML_BIN
, 0, 0, offsetof(MatroskaTrackEncryption
,key_id
) },
564 { MATROSKA_ID_ENCODINGENCAESSETTINGS
, EBML_NONE
},
565 { MATROSKA_ID_ENCODINGSIGALGO
, EBML_NONE
},
566 { MATROSKA_ID_ENCODINGSIGHASHALGO
, EBML_NONE
},
567 { MATROSKA_ID_ENCODINGSIGKEYID
, EBML_NONE
},
568 { MATROSKA_ID_ENCODINGSIGNATURE
, EBML_NONE
},
569 CHILD_OF(matroska_track_encoding
)
571 static EbmlSyntax matroska_track_encoding
[] = {
572 { MATROSKA_ID_ENCODINGSCOPE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackEncoding
, scope
), { .u
= 1 } },
573 { MATROSKA_ID_ENCODINGTYPE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackEncoding
, type
), { .u
= 0 } },
574 { MATROSKA_ID_ENCODINGCOMPRESSION
, EBML_NEST
, 0, 0, offsetof(MatroskaTrackEncoding
, compression
), { .n
= matroska_track_encoding_compression
} },
575 { MATROSKA_ID_ENCODINGENCRYPTION
, EBML_NEST
, 0, 0, offsetof(MatroskaTrackEncoding
, encryption
), { .n
= matroska_track_encoding_encryption
} },
576 { MATROSKA_ID_ENCODINGORDER
, EBML_NONE
},
577 CHILD_OF(matroska_track_encodings
)
580 static EbmlSyntax matroska_track_encodings
[] = {
581 { MATROSKA_ID_TRACKCONTENTENCODING
, EBML_NEST
, 0, sizeof(MatroskaTrackEncoding
), offsetof(MatroskaTrack
, encodings
), { .n
= matroska_track_encoding
} },
582 CHILD_OF(matroska_track
)
585 static EbmlSyntax matroska_track_plane
[] = {
586 { MATROSKA_ID_TRACKPLANEUID
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackPlane
,uid
) },
587 { MATROSKA_ID_TRACKPLANETYPE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrackPlane
,type
) },
588 CHILD_OF(matroska_track_combine_planes
)
591 static EbmlSyntax matroska_track_combine_planes
[] = {
592 { MATROSKA_ID_TRACKPLANE
, EBML_NEST
, 0, sizeof(MatroskaTrackPlane
), offsetof(MatroskaTrackOperation
,combine_planes
), {.n
= matroska_track_plane
} },
593 CHILD_OF(matroska_track_operation
)
596 static EbmlSyntax matroska_track_operation
[] = {
597 { MATROSKA_ID_TRACKCOMBINEPLANES
, EBML_NEST
, 0, 0, 0, {.n
= matroska_track_combine_planes
} },
598 CHILD_OF(matroska_track
)
601 static EbmlSyntax matroska_block_addition_mapping
[] = {
602 { MATROSKA_ID_BLKADDIDVALUE
, EBML_UINT
, 0, 0, offsetof(MatroskaBlockAdditionMapping
, value
) },
603 { MATROSKA_ID_BLKADDIDNAME
, EBML_STR
, 0, 0, offsetof(MatroskaBlockAdditionMapping
, name
) },
604 { MATROSKA_ID_BLKADDIDTYPE
, EBML_UINT
, 0, 0, offsetof(MatroskaBlockAdditionMapping
, type
), { .u
= MATROSKA_BLOCK_ADD_ID_TYPE_DEFAULT
} },
605 { MATROSKA_ID_BLKADDIDEXTRADATA
, EBML_BIN
, 0, 0, offsetof(MatroskaBlockAdditionMapping
, extradata
) },
606 CHILD_OF(matroska_track
)
609 static EbmlSyntax matroska_track
[] = {
610 { MATROSKA_ID_TRACKNUMBER
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, num
) },
611 { MATROSKA_ID_TRACKNAME
, EBML_UTF8
, 0, 0, offsetof(MatroskaTrack
, name
) },
612 { MATROSKA_ID_TRACKUID
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, uid
) },
613 { MATROSKA_ID_TRACKTYPE
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, type
) },
614 { MATROSKA_ID_CODECID
, EBML_STR
, 0, 0, offsetof(MatroskaTrack
, codec_id
) },
615 { MATROSKA_ID_CODECPRIVATE
, EBML_BIN
, 0, 0, offsetof(MatroskaTrack
, codec_priv
) },
616 { MATROSKA_ID_CODECDELAY
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, codec_delay
), { .u
= 0 } },
617 { MATROSKA_ID_TRACKLANGUAGE
, EBML_STR
, 0, 0, offsetof(MatroskaTrack
, language
), { .s
= "eng" } },
618 { MATROSKA_ID_TRACKDEFAULTDURATION
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, default_duration
) },
619 { MATROSKA_ID_TRACKTIMECODESCALE
, EBML_FLOAT
, 0, 0, offsetof(MatroskaTrack
, time_scale
), { .f
= 1.0 } },
620 { MATROSKA_ID_TRACKFLAGCOMMENTARY
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, flag_comment
), { .u
= 0 } },
621 { MATROSKA_ID_TRACKFLAGDEFAULT
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, flag_default
), { .u
= 1 } },
622 { MATROSKA_ID_TRACKFLAGFORCED
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, flag_forced
), { .u
= 0 } },
623 { MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, flag_hearingimpaired
), { .u
= 0 } },
624 { MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, flag_visualimpaired
), { .u
= 0 } },
625 { MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, flag_textdescriptions
), { .u
= 0 } },
626 { MATROSKA_ID_TRACKFLAGORIGINAL
, EBML_UINT
, 1, 0, offsetof(MatroskaTrack
, flag_original
), {.u
= 0 } },
627 { MATROSKA_ID_TRACKVIDEO
, EBML_NEST
, 0, 0, offsetof(MatroskaTrack
, video
), { .n
= matroska_track_video
} },
628 { MATROSKA_ID_TRACKAUDIO
, EBML_NEST
, 0, 0, offsetof(MatroskaTrack
, audio
), { .n
= matroska_track_audio
} },
629 { MATROSKA_ID_TRACKOPERATION
, EBML_NEST
, 0, 0, offsetof(MatroskaTrack
, operation
), { .n
= matroska_track_operation
} },
630 { MATROSKA_ID_TRACKCONTENTENCODINGS
, EBML_NEST
, 0, 0, 0, { .n
= matroska_track_encodings
} },
631 { MATROSKA_ID_TRACKMAXBLKADDID
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, max_block_additional_id
), { .u
= 0 } },
632 { MATROSKA_ID_TRACKBLKADDMAPPING
, EBML_NEST
, 0, sizeof(MatroskaBlockAdditionMapping
), offsetof(MatroskaTrack
, block_addition_mappings
), { .n
= matroska_block_addition_mapping
} },
633 { MATROSKA_ID_SEEKPREROLL
, EBML_UINT
, 0, 0, offsetof(MatroskaTrack
, seek_preroll
), { .u
= 0 } },
634 { MATROSKA_ID_TRACKFLAGENABLED
, EBML_NONE
},
635 { MATROSKA_ID_TRACKFLAGLACING
, EBML_NONE
},
636 { MATROSKA_ID_CODECNAME
, EBML_NONE
},
637 { MATROSKA_ID_CODECDECODEALL
, EBML_NONE
},
638 { MATROSKA_ID_CODECINFOURL
, EBML_NONE
},
639 { MATROSKA_ID_CODECDOWNLOADURL
, EBML_NONE
},
640 { MATROSKA_ID_TRACKMINCACHE
, EBML_NONE
},
641 { MATROSKA_ID_TRACKMAXCACHE
, EBML_NONE
},
642 CHILD_OF(matroska_tracks
)
645 static EbmlSyntax matroska_tracks
[] = {
646 { MATROSKA_ID_TRACKENTRY
, EBML_NEST
, 0, sizeof(MatroskaTrack
), offsetof(MatroskaDemuxContext
, tracks
), { .n
= matroska_track
} },
647 CHILD_OF(matroska_segment
)
650 static EbmlSyntax matroska_attachment
[] = {
651 { MATROSKA_ID_FILEUID
, EBML_UINT
, 0, 0, offsetof(MatroskaAttachment
, uid
) },
652 { MATROSKA_ID_FILENAME
, EBML_UTF8
, 0, 0, offsetof(MatroskaAttachment
, filename
) },
653 { MATROSKA_ID_FILEMIMETYPE
, EBML_STR
, 0, 0, offsetof(MatroskaAttachment
, mime
) },
654 { MATROSKA_ID_FILEDATA
, EBML_BIN
, 0, 0, offsetof(MatroskaAttachment
, bin
) },
655 { MATROSKA_ID_FILEDESC
, EBML_UTF8
, 0, 0, offsetof(MatroskaAttachment
, description
) },
656 CHILD_OF(matroska_attachments
)
659 static EbmlSyntax matroska_attachments
[] = {
660 { MATROSKA_ID_ATTACHEDFILE
, EBML_NEST
, 0, sizeof(MatroskaAttachment
), offsetof(MatroskaDemuxContext
, attachments
), { .n
= matroska_attachment
} },
661 CHILD_OF(matroska_segment
)
664 static EbmlSyntax matroska_chapter_display
[] = {
665 { MATROSKA_ID_CHAPSTRING
, EBML_UTF8
, 0, 0, offsetof(MatroskaChapter
, title
) },
666 { MATROSKA_ID_CHAPLANG
, EBML_NONE
},
667 { MATROSKA_ID_CHAPCOUNTRY
, EBML_NONE
},
668 CHILD_OF(matroska_chapter_entry
)
671 static EbmlSyntax matroska_chapter_entry
[] = {
672 { MATROSKA_ID_CHAPTERTIMESTART
, EBML_UINT
, 0, 0, offsetof(MatroskaChapter
, start
), { .u
= AV_NOPTS_VALUE
} },
673 { MATROSKA_ID_CHAPTERTIMEEND
, EBML_UINT
, 0, 0, offsetof(MatroskaChapter
, end
), { .u
= AV_NOPTS_VALUE
} },
674 { MATROSKA_ID_CHAPTERUID
, EBML_UINT
, 0, 0, offsetof(MatroskaChapter
, uid
) },
675 { MATROSKA_ID_CHAPTERDISPLAY
, EBML_NEST
, 0, 0, 0, { .n
= matroska_chapter_display
} },
676 { MATROSKA_ID_CHAPTERFLAGHIDDEN
, EBML_NONE
},
677 { MATROSKA_ID_CHAPTERFLAGENABLED
, EBML_NONE
},
678 { MATROSKA_ID_CHAPTERPHYSEQUIV
, EBML_NONE
},
679 { MATROSKA_ID_CHAPTERATOM
, EBML_NONE
},
680 CHILD_OF(matroska_chapter
)
683 static EbmlSyntax matroska_chapter
[] = {
684 { MATROSKA_ID_CHAPTERATOM
, EBML_NEST
, 0, sizeof(MatroskaChapter
), offsetof(MatroskaDemuxContext
, chapters
), { .n
= matroska_chapter_entry
} },
685 { MATROSKA_ID_EDITIONUID
, EBML_NONE
},
686 { MATROSKA_ID_EDITIONFLAGHIDDEN
, EBML_NONE
},
687 { MATROSKA_ID_EDITIONFLAGDEFAULT
, EBML_NONE
},
688 { MATROSKA_ID_EDITIONFLAGORDERED
, EBML_NONE
},
689 CHILD_OF(matroska_chapters
)
692 static EbmlSyntax matroska_chapters
[] = {
693 { MATROSKA_ID_EDITIONENTRY
, EBML_NEST
, 0, 0, 0, { .n
= matroska_chapter
} },
694 CHILD_OF(matroska_segment
)
697 static EbmlSyntax matroska_index_pos
[] = {
698 { MATROSKA_ID_CUETRACK
, EBML_UINT
, 0, 0, offsetof(MatroskaIndexPos
, track
) },
699 { MATROSKA_ID_CUECLUSTERPOSITION
, EBML_UINT
, 0, 0, offsetof(MatroskaIndexPos
, pos
) },
700 { MATROSKA_ID_CUERELATIVEPOSITION
,EBML_NONE
},
701 { MATROSKA_ID_CUEDURATION
, EBML_NONE
},
702 { MATROSKA_ID_CUEBLOCKNUMBER
, EBML_NONE
},
703 CHILD_OF(matroska_index_entry
)
706 static EbmlSyntax matroska_index_entry
[] = {
707 { MATROSKA_ID_CUETIME
, EBML_UINT
, 0, 0, offsetof(MatroskaIndex
, time
) },
708 { MATROSKA_ID_CUETRACKPOSITION
, EBML_NEST
, 0, sizeof(MatroskaIndexPos
), offsetof(MatroskaIndex
, pos
), { .n
= matroska_index_pos
} },
709 CHILD_OF(matroska_index
)
712 static EbmlSyntax matroska_index
[] = {
713 { MATROSKA_ID_POINTENTRY
, EBML_NEST
, 0, sizeof(MatroskaIndex
), offsetof(MatroskaDemuxContext
, index
), { .n
= matroska_index_entry
} },
714 CHILD_OF(matroska_segment
)
717 static EbmlSyntax matroska_simpletag
[] = {
718 { MATROSKA_ID_TAGNAME
, EBML_UTF8
, 0, 0, offsetof(MatroskaTag
, name
) },
719 { MATROSKA_ID_TAGSTRING
, EBML_UTF8
, 0, 0, offsetof(MatroskaTag
, string
) },
720 { MATROSKA_ID_TAGLANG
, EBML_STR
, 0, 0, offsetof(MatroskaTag
, lang
), { .s
= "und" } },
721 { MATROSKA_ID_TAGDEFAULT
, EBML_UINT
, 0, 0, offsetof(MatroskaTag
, def
) },
722 { MATROSKA_ID_TAGDEFAULT_BUG
, EBML_UINT
, 0, 0, offsetof(MatroskaTag
, def
) },
723 { MATROSKA_ID_SIMPLETAG
, EBML_NEST
, 0, sizeof(MatroskaTag
), offsetof(MatroskaTag
, sub
), { .n
= matroska_simpletag
} },
724 CHILD_OF(matroska_tag
)
727 static EbmlSyntax matroska_tagtargets
[] = {
728 { MATROSKA_ID_TAGTARGETS_TYPE
, EBML_STR
, 0, 0, offsetof(MatroskaTagTarget
, type
) },
729 { MATROSKA_ID_TAGTARGETS_TYPEVALUE
, EBML_UINT
, 0, 0, offsetof(MatroskaTagTarget
, typevalue
), { .u
= 50 } },
730 { MATROSKA_ID_TAGTARGETS_TRACKUID
, EBML_UINT
, 0, 0, offsetof(MatroskaTagTarget
, trackuid
), { .u
= 0 } },
731 { MATROSKA_ID_TAGTARGETS_CHAPTERUID
, EBML_UINT
, 0, 0, offsetof(MatroskaTagTarget
, chapteruid
), { .u
= 0 } },
732 { MATROSKA_ID_TAGTARGETS_ATTACHUID
, EBML_UINT
, 0, 0, offsetof(MatroskaTagTarget
, attachuid
), { .u
= 0 } },
733 CHILD_OF(matroska_tag
)
736 static EbmlSyntax matroska_tag
[] = {
737 { MATROSKA_ID_SIMPLETAG
, EBML_NEST
, 0, sizeof(MatroskaTag
), offsetof(MatroskaTags
, tag
), { .n
= matroska_simpletag
} },
738 { MATROSKA_ID_TAGTARGETS
, EBML_NEST
, 0, 0, offsetof(MatroskaTags
, target
), { .n
= matroska_tagtargets
} },
739 CHILD_OF(matroska_tags
)
742 static EbmlSyntax matroska_tags
[] = {
743 { MATROSKA_ID_TAG
, EBML_NEST
, 0, sizeof(MatroskaTags
), offsetof(MatroskaDemuxContext
, tags
), { .n
= matroska_tag
} },
744 CHILD_OF(matroska_segment
)
747 static EbmlSyntax matroska_seekhead_entry
[] = {
748 { MATROSKA_ID_SEEKID
, EBML_UINT
, 0, 0, offsetof(MatroskaSeekhead
, id
) },
749 { MATROSKA_ID_SEEKPOSITION
, EBML_UINT
, 0, 0, offsetof(MatroskaSeekhead
, pos
), { .u
= -1 } },
750 CHILD_OF(matroska_seekhead
)
753 static EbmlSyntax matroska_seekhead
[] = {
754 { MATROSKA_ID_SEEKENTRY
, EBML_NEST
, 0, sizeof(MatroskaSeekhead
), offsetof(MatroskaDemuxContext
, seekhead
), { .n
= matroska_seekhead_entry
} },
755 CHILD_OF(matroska_segment
)
758 static EbmlSyntax matroska_segment
[] = {
759 { MATROSKA_ID_CLUSTER
, EBML_STOP
},
760 { MATROSKA_ID_INFO
, EBML_LEVEL1
, 0, 0, 0, { .n
= matroska_info
} },
761 { MATROSKA_ID_TRACKS
, EBML_LEVEL1
, 0, 0, 0, { .n
= matroska_tracks
} },
762 { MATROSKA_ID_ATTACHMENTS
, EBML_LEVEL1
, 0, 0, 0, { .n
= matroska_attachments
} },
763 { MATROSKA_ID_CHAPTERS
, EBML_LEVEL1
, 0, 0, 0, { .n
= matroska_chapters
} },
764 { MATROSKA_ID_CUES
, EBML_LEVEL1
, 0, 0, 0, { .n
= matroska_index
} },
765 { MATROSKA_ID_TAGS
, EBML_LEVEL1
, 0, 0, 0, { .n
= matroska_tags
} },
766 { MATROSKA_ID_SEEKHEAD
, EBML_LEVEL1
, 0, 0, 0, { .n
= matroska_seekhead
} },
767 { 0 } /* We don't want to go back to level 0, so don't add the parent. */
770 static EbmlSyntax matroska_segments
[] = {
771 { MATROSKA_ID_SEGMENT
, EBML_NEST
, 0, 0, 0, { .n
= matroska_segment
} },
775 static EbmlSyntax matroska_blockmore
[] = {
776 { MATROSKA_ID_BLOCKADDID
, EBML_UINT
, 0, 0, offsetof(MatroskaBlockMore
,additional_id
), { .u
= MATROSKA_BLOCK_ADD_ID_OPAQUE
} },
777 { MATROSKA_ID_BLOCKADDITIONAL
, EBML_BIN
, 0, 0, offsetof(MatroskaBlockMore
,additional
) },
778 CHILD_OF(matroska_blockadditions
)
781 static EbmlSyntax matroska_blockadditions
[] = {
782 { MATROSKA_ID_BLOCKMORE
, EBML_NEST
, 0, sizeof(MatroskaBlockMore
), offsetof(MatroskaBlock
, blockmore
), { .n
= matroska_blockmore
} },
783 CHILD_OF(matroska_blockgroup
)
786 static EbmlSyntax matroska_blockgroup
[] = {
787 { MATROSKA_ID_BLOCK
, EBML_BIN
, 0, 0, offsetof(MatroskaBlock
, bin
) },
788 { MATROSKA_ID_BLOCKADDITIONS
, EBML_NEST
, 0, 0, 0, { .n
= matroska_blockadditions
} },
789 { MATROSKA_ID_BLOCKDURATION
, EBML_UINT
, 0, 0, offsetof(MatroskaBlock
, duration
) },
790 { MATROSKA_ID_DISCARDPADDING
, EBML_SINT
, 0, 0, offsetof(MatroskaBlock
, discard_padding
) },
791 { MATROSKA_ID_BLOCKREFERENCE
, EBML_SINT
, 1, 0, offsetof(MatroskaBlock
, reference
) },
792 { MATROSKA_ID_CODECSTATE
, EBML_NONE
},
793 { 1, EBML_UINT
, 0, 0, offsetof(MatroskaBlock
, non_simple
), { .u
= 1 } },
794 CHILD_OF(matroska_cluster_parsing
)
797 // The following array contains SimpleBlock and BlockGroup twice
798 // in order to reuse the other values for matroska_cluster_enter.
799 static EbmlSyntax matroska_cluster_parsing
[] = {
800 { MATROSKA_ID_SIMPLEBLOCK
, EBML_BIN
, 0, 0, offsetof(MatroskaBlock
, bin
) },
801 { MATROSKA_ID_BLOCKGROUP
, EBML_NEST
, 0, 0, 0, { .n
= matroska_blockgroup
} },
802 { MATROSKA_ID_CLUSTERTIMECODE
, EBML_UINT
, 0, 0, offsetof(MatroskaCluster
, timecode
) },
803 { MATROSKA_ID_SIMPLEBLOCK
, EBML_STOP
},
804 { MATROSKA_ID_BLOCKGROUP
, EBML_STOP
},
805 { MATROSKA_ID_CLUSTERPOSITION
, EBML_NONE
},
806 { MATROSKA_ID_CLUSTERPREVSIZE
, EBML_NONE
},
807 CHILD_OF(matroska_segment
)
810 static EbmlSyntax matroska_cluster_enter
[] = {
811 { MATROSKA_ID_CLUSTER
, EBML_NEST
, 0, 0, 0, { .n
= &matroska_cluster_parsing
[2] } },
816 static const CodecMime mkv_image_mime_tags
[] = {
817 {"image/gif" , AV_CODEC_ID_GIF
},
818 {"image/jpeg" , AV_CODEC_ID_MJPEG
},
819 {"image/png" , AV_CODEC_ID_PNG
},
820 {"image/tiff" , AV_CODEC_ID_TIFF
},
822 {"" , AV_CODEC_ID_NONE
}
825 static const CodecMime mkv_mime_tags
[] = {
826 {"application/x-truetype-font", AV_CODEC_ID_TTF
},
827 {"application/x-font" , AV_CODEC_ID_TTF
},
828 {"application/vnd.ms-opentype", AV_CODEC_ID_OTF
},
829 {"binary" , AV_CODEC_ID_BIN_DATA
},
831 {"" , AV_CODEC_ID_NONE
}
834 static const char * const matroska_video_stereo_plane
[MATROSKA_VIDEO_STEREO_PLANE_COUNT
] = {
840 static const char *const matroska_doctypes
[] = { "matroska", "webm" };
843 * This function prepares the status for parsing of level 1 elements.
845 static int matroska_reset_status(MatroskaDemuxContext
*matroska
,
846 uint32_t id
, int64_t position
)
850 err
= avio_seek(matroska
->ctx
->pb
, position
, SEEK_SET
);
854 position
= avio_tell(matroska
->ctx
->pb
);
856 matroska
->current_id
= id
;
857 matroska
->num_levels
= 1;
858 matroska
->unknown_count
= 0;
859 matroska
->resync_pos
= position
;
861 matroska
->resync_pos
-= (av_log2(id
) + 7) / 8;
866 static int matroska_resync(MatroskaDemuxContext
*matroska
, int64_t last_pos
)
868 AVIOContext
*pb
= matroska
->ctx
->pb
;
871 /* Try to seek to the last position to resync from. If this doesn't work,
872 * we resync from the earliest position available: The start of the buffer. */
873 if (last_pos
< avio_tell(pb
) && avio_seek(pb
, last_pos
+ 1, SEEK_SET
) < 0) {
874 av_log(matroska
->ctx
, AV_LOG_WARNING
,
875 "Seek to desired resync point failed. Seeking to "
876 "earliest point available instead.\n");
877 avio_seek(pb
, FFMAX(avio_tell(pb
) + (pb
->buffer
- pb
->buf_ptr
),
878 last_pos
+ 1), SEEK_SET
);
883 // try to find a toplevel element
884 while (!avio_feof(pb
)) {
885 if (id
== MATROSKA_ID_INFO
|| id
== MATROSKA_ID_TRACKS
||
886 id
== MATROSKA_ID_CUES
|| id
== MATROSKA_ID_TAGS
||
887 id
== MATROSKA_ID_SEEKHEAD
|| id
== MATROSKA_ID_ATTACHMENTS
||
888 id
== MATROSKA_ID_CLUSTER
|| id
== MATROSKA_ID_CHAPTERS
) {
889 /* Prepare the context for parsing of a level 1 element. */
890 matroska_reset_status(matroska
, id
, -1);
891 /* Given that we are here means that an error has occurred,
892 * so treat the segment as unknown length in order not to
893 * discard valid data that happens to be beyond the designated
894 * end of the segment. */
895 matroska
->levels
[0].length
= EBML_UNKNOWN_LENGTH
;
898 id
= (id
<< 8) | avio_r8(pb
);
902 return pb
->error
? pb
->error
: AVERROR_EOF
;
906 * Read: an "EBML number", which is defined as a variable-length
907 * array of bytes. The first byte indicates the length by giving a
908 * number of 0-bits followed by a one. The position of the first
909 * "one" bit inside the first byte indicates the length of this
911 * Returns: number of bytes read, < 0 on error
913 static int ebml_read_num(MatroskaDemuxContext
*matroska
, AVIOContext
*pb
,
914 int max_size
, uint64_t *number
, int eof_forbidden
)
920 /* The first byte tells us the length in bytes - except when it is zero. */
925 /* get the length of the EBML number */
926 read
= 8 - ff_log2_tab
[total
];
928 if (!total
|| read
> max_size
) {
929 pos
= avio_tell(pb
) - 1;
931 av_log(matroska
->ctx
, AV_LOG_ERROR
,
932 "0x00 at pos %"PRId64
" (0x%"PRIx64
") invalid as first byte "
933 "of an EBML number\n", pos
, pos
);
935 av_log(matroska
->ctx
, AV_LOG_ERROR
,
936 "Length %d indicated by an EBML number's first byte 0x%02x "
937 "at pos %"PRId64
" (0x%"PRIx64
") exceeds max length %d.\n",
938 read
, (uint8_t) total
, pos
, pos
, max_size
);
940 return AVERROR_INVALIDDATA
;
943 /* read out length */
944 total
^= 1 << ff_log2_tab
[total
];
946 total
= (total
<< 8) | avio_r8(pb
);
948 if (pb
->eof_reached
) {
960 av_log(matroska
->ctx
, AV_LOG_ERROR
,
961 "Read error at pos. %"PRIu64
" (0x%"PRIx64
")\n",
966 av_log(matroska
->ctx
, AV_LOG_ERROR
, "File ended prematurely "
967 "at pos. %"PRIu64
" (0x%"PRIx64
")\n", pos
, pos
);
974 * Read a EBML length value.
975 * This needs special handling for the "unknown length" case which has multiple
978 static int ebml_read_length(MatroskaDemuxContext
*matroska
, AVIOContext
*pb
,
981 int res
= ebml_read_num(matroska
, pb
, 8, number
, 1);
982 if (res
> 0 && *number
+ 1 == 1ULL << (7 * res
))
983 *number
= EBML_UNKNOWN_LENGTH
;
988 * Read the next element as an unsigned int.
989 * Returns NEEDS_CHECKING unless size == 0.
991 static int ebml_read_uint(AVIOContext
*pb
, int size
,
992 uint64_t default_value
, uint64_t *num
)
997 *num
= default_value
;
1000 /* big-endian ordering; build up number */
1003 *num
= (*num
<< 8) | avio_r8(pb
);
1005 return NEEDS_CHECKING
;
1009 * Read the next element as a signed int.
1010 * Returns NEEDS_CHECKING unless size == 0.
1012 static int ebml_read_sint(AVIOContext
*pb
, int size
,
1013 int64_t default_value
, int64_t *num
)
1018 *num
= default_value
;
1021 *num
= sign_extend(avio_r8(pb
), 8);
1023 /* big-endian ordering; build up number */
1025 *num
= ((uint64_t)*num
<< 8) | avio_r8(pb
);
1028 return NEEDS_CHECKING
;
1032 * Read the next element as a float.
1033 * Returns 0 if size == 0, NEEDS_CHECKING or < 0 on obvious failure.
1035 static int ebml_read_float(AVIOContext
*pb
, int size
,
1036 double default_value
, double *num
)
1039 *num
= default_value
;
1041 } else if (size
== 4) {
1042 *num
= av_int2float(avio_rb32(pb
));
1043 } else if (size
== 8) {
1044 *num
= av_int2double(avio_rb64(pb
));
1046 return AVERROR_INVALIDDATA
;
1048 return NEEDS_CHECKING
;
1052 * Read the next element as an ASCII string.
1053 * 0 is success, < 0 or NEEDS_CHECKING is failure.
1055 static int ebml_read_ascii(AVIOContext
*pb
, int size
,
1056 const char *default_value
, char **str
)
1061 if (size
== 0 && default_value
) {
1062 res
= av_strdup(default_value
);
1064 return AVERROR(ENOMEM
);
1066 /* EBML strings are usually not 0-terminated, so we allocate one
1067 * byte more, read the string and NUL-terminate it ourselves. */
1068 if (!(res
= av_malloc(size
+ 1)))
1069 return AVERROR(ENOMEM
);
1070 if ((ret
= avio_read(pb
, (uint8_t *) res
, size
)) != size
) {
1072 return ret
< 0 ? ret
: NEEDS_CHECKING
;
1083 * Read the next element as binary data.
1084 * 0 is success, < 0 or NEEDS_CHECKING is failure.
1086 static int ebml_read_binary(AVIOContext
*pb
, int length
,
1087 int64_t pos
, EbmlBin
*bin
)
1091 ret
= av_buffer_realloc(&bin
->buf
, length
+ AV_INPUT_BUFFER_PADDING_SIZE
);
1094 memset(bin
->buf
->data
+ length
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
1096 bin
->data
= bin
->buf
->data
;
1099 if ((ret
= avio_read(pb
, bin
->data
, length
)) != length
) {
1100 av_buffer_unref(&bin
->buf
);
1103 return ret
< 0 ? ret
: NEEDS_CHECKING
;
1110 * Read the next element, but only the header. The contents
1111 * are supposed to be sub-elements which can be read separately.
1112 * 0 is success, < 0 is failure.
1114 static int ebml_read_master(MatroskaDemuxContext
*matroska
,
1115 uint64_t length
, int64_t pos
)
1117 MatroskaLevel
*level
;
1119 if (matroska
->num_levels
>= EBML_MAX_DEPTH
) {
1120 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1121 "File moves beyond max. allowed depth (%d)\n", EBML_MAX_DEPTH
);
1122 return AVERROR(ENOSYS
);
1125 level
= &matroska
->levels
[matroska
->num_levels
++];
1127 level
->length
= length
;
1133 * Read a signed "EBML number"
1134 * Return: number of bytes processed, < 0 on error
1136 static int matroska_ebmlnum_sint(MatroskaDemuxContext
*matroska
,
1137 AVIOContext
*pb
, int64_t *num
)
1142 /* read as unsigned number first */
1143 if ((res
= ebml_read_num(matroska
, pb
, 8, &unum
, 1)) < 0)
1146 /* make signed (weird way) */
1147 *num
= unum
- ((1LL << (7 * res
- 1)) - 1);
1152 static int ebml_parse(MatroskaDemuxContext
*matroska
,
1153 EbmlSyntax
*syntax
, void *data
);
1155 static EbmlSyntax
*ebml_parse_id(EbmlSyntax
*syntax
, uint32_t id
)
1159 // Whoever touches this should be aware of the duplication
1160 // existing in matroska_cluster_parsing.
1161 for (i
= 0; syntax
[i
].id
; i
++)
1162 if (id
== syntax
[i
].id
)
1168 static int ebml_parse_nest(MatroskaDemuxContext
*matroska
, EbmlSyntax
*syntax
,
1174 for (int i
= 0; syntax
[i
].id
; i
++) {
1175 void *dst
= (char *)data
+ syntax
[i
].data_offset
;
1176 switch (syntax
[i
].type
) {
1178 *(uint64_t *)dst
= syntax
[i
].def
.u
;
1181 *(int64_t *) dst
= syntax
[i
].def
.i
;
1184 *(double *) dst
= syntax
[i
].def
.f
;
1188 // the default may be NULL
1189 if (syntax
[i
].def
.s
) {
1190 *(char**)dst
= av_strdup(syntax
[i
].def
.s
);
1192 return AVERROR(ENOMEM
);
1198 if (!matroska
->levels
[matroska
->num_levels
- 1].length
) {
1199 matroska
->num_levels
--;
1205 res
= ebml_parse(matroska
, syntax
, data
);
1208 return res
== LEVEL_ENDED
? 0 : res
;
1211 static int is_ebml_id_valid(uint32_t id
)
1213 // Due to endian nonsense in Matroska, the highest byte with any bits set
1214 // will contain the leading length bit. This bit in turn identifies the
1215 // total byte length of the element by its position within the byte.
1216 unsigned int bits
= av_log2(id
);
1217 return id
&& (bits
+ 7) / 8 == (8 - bits
% 8);
1221 * Allocate and return the entry for the level1 element with the given ID. If
1222 * an entry already exists, return the existing entry.
1224 static MatroskaLevel1Element
*matroska_find_level1_elem(MatroskaDemuxContext
*matroska
,
1225 uint32_t id
, int64_t pos
)
1228 MatroskaLevel1Element
*elem
;
1230 if (!is_ebml_id_valid(id
))
1233 // Some files link to all clusters; useless.
1234 if (id
== MATROSKA_ID_CLUSTER
)
1237 // There can be multiple SeekHeads and Tags.
1238 for (i
= 0; i
< matroska
->num_level1_elems
; i
++) {
1239 if (matroska
->level1_elems
[i
].id
== id
) {
1240 if (matroska
->level1_elems
[i
].pos
== pos
||
1241 id
!= MATROSKA_ID_SEEKHEAD
&& id
!= MATROSKA_ID_TAGS
)
1242 return &matroska
->level1_elems
[i
];
1246 // Only a completely broken file would have more elements.
1247 if (matroska
->num_level1_elems
>= FF_ARRAY_ELEMS(matroska
->level1_elems
)) {
1248 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Too many level1 elements.\n");
1252 elem
= &matroska
->level1_elems
[matroska
->num_level1_elems
++];
1253 *elem
= (MatroskaLevel1Element
){.id
= id
};
1258 static int ebml_parse(MatroskaDemuxContext
*matroska
,
1259 EbmlSyntax
*syntax
, void *data
)
1261 static const uint64_t max_lengths
[EBML_TYPE_COUNT
] = {
1262 // Forbid unknown-length EBML_NONE elements.
1263 [EBML_NONE
] = EBML_UNKNOWN_LENGTH
- 1,
1267 // max. 16 MB for strings
1268 [EBML_STR
] = 0x1000000,
1269 [EBML_UTF8
] = 0x1000000,
1270 // max. 256 MB for binary data
1271 [EBML_BIN
] = 0x10000000,
1272 // no limits for anything else
1274 AVIOContext
*pb
= matroska
->ctx
->pb
;
1277 int64_t pos
= avio_tell(pb
), pos_alt
;
1278 int res
, update_pos
= 1, level_check
;
1279 MatroskaLevel1Element
*level1_elem
;
1280 MatroskaLevel
*level
= matroska
->num_levels
? &matroska
->levels
[matroska
->num_levels
- 1] : NULL
;
1282 if (!matroska
->current_id
) {
1284 res
= ebml_read_num(matroska
, pb
, 4, &id
, 0);
1286 if (pb
->eof_reached
&& res
== AVERROR_EOF
) {
1287 if (matroska
->is_live
)
1288 // in live mode, finish parsing if EOF is reached.
1290 if (level
&& pos
== avio_tell(pb
)) {
1291 if (level
->length
== EBML_UNKNOWN_LENGTH
) {
1292 // Unknown-length levels automatically end at EOF.
1293 matroska
->num_levels
--;
1296 av_log(matroska
->ctx
, AV_LOG_ERROR
, "File ended prematurely "
1297 "at pos. %"PRIu64
" (0x%"PRIx64
")\n", pos
, pos
);
1303 matroska
->current_id
= id
| 1 << 7 * res
;
1304 pos_alt
= pos
+ res
;
1307 pos
-= (av_log2(matroska
->current_id
) + 7) / 8;
1310 id
= matroska
->current_id
;
1312 syntax
= ebml_parse_id(syntax
, id
);
1313 if (!syntax
->id
&& id
!= EBML_ID_VOID
&& id
!= EBML_ID_CRC32
) {
1314 if (level
&& level
->length
== EBML_UNKNOWN_LENGTH
) {
1315 // Unknown-length levels end when an element from an upper level
1316 // in the hierarchy is encountered.
1317 while (syntax
->def
.n
) {
1318 syntax
= ebml_parse_id(syntax
->def
.n
, id
);
1320 matroska
->num_levels
--;
1323 // We have not encountered a known element; syntax is a sentinel.
1324 av_assert1(syntax
->type
== EBML_NONE
);
1328 av_log(matroska
->ctx
, AV_LOG_DEBUG
, "Unknown entry 0x%"PRIX32
" at pos. "
1329 "%"PRId64
"\n", id
, pos
);
1330 update_pos
= 0; /* Don't update resync_pos as an error might have happened. */
1334 data
= (char *) data
+ syntax
->data_offset
;
1335 if (syntax
->list_elem_size
) {
1336 EbmlList
*list
= data
;
1339 if ((unsigned)list
->nb_elem
+ 1 >= UINT_MAX
/ syntax
->list_elem_size
)
1340 return AVERROR(ENOMEM
);
1341 newelem
= av_fast_realloc(list
->elem
,
1342 &list
->alloc_elem_size
,
1343 (list
->nb_elem
+ 1) * syntax
->list_elem_size
);
1345 return AVERROR(ENOMEM
);
1346 list
->elem
= newelem
;
1347 data
= (char *) list
->elem
+ list
->nb_elem
* syntax
->list_elem_size
;
1348 memset(data
, 0, syntax
->list_elem_size
);
1353 if (syntax
->type
!= EBML_STOP
) {
1354 matroska
->current_id
= 0;
1355 if ((res
= ebml_read_length(matroska
, pb
, &length
)) < 0)
1360 if (matroska
->num_levels
> 0) {
1361 if (length
!= EBML_UNKNOWN_LENGTH
&&
1362 level
->length
!= EBML_UNKNOWN_LENGTH
) {
1363 uint64_t elem_end
= pos_alt
+ length
,
1364 level_end
= level
->start
+ level
->length
;
1366 if (elem_end
< level_end
) {
1368 } else if (elem_end
== level_end
) {
1369 level_check
= LEVEL_ENDED
;
1371 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1372 "Element at 0x%"PRIx64
" ending at 0x%"PRIx64
" exceeds "
1373 "containing master element ending at 0x%"PRIx64
"\n",
1374 pos
, elem_end
, level_end
);
1375 return AVERROR_INVALIDDATA
;
1377 } else if (length
!= EBML_UNKNOWN_LENGTH
) {
1379 } else if (level
->length
!= EBML_UNKNOWN_LENGTH
) {
1380 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Unknown-sized element "
1381 "at 0x%"PRIx64
" inside parent with finite size\n", pos
);
1382 return AVERROR_INVALIDDATA
;
1385 if (id
!= MATROSKA_ID_CLUSTER
&& (syntax
->type
== EBML_LEVEL1
1386 || syntax
->type
== EBML_NEST
)) {
1387 // According to the current specifications only clusters and
1388 // segments are allowed to be unknown-length. We also accept
1389 // other unknown-length master elements.
1390 av_log(matroska
->ctx
, AV_LOG_WARNING
,
1391 "Found unknown-length element 0x%"PRIX32
" other than "
1392 "a cluster at 0x%"PRIx64
". Spec-incompliant, but "
1393 "parsing will nevertheless be attempted.\n", id
, pos
);
1400 if (max_lengths
[syntax
->type
] && length
> max_lengths
[syntax
->type
]) {
1401 if (length
!= EBML_UNKNOWN_LENGTH
) {
1402 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1403 "Invalid length 0x%"PRIx64
" > 0x%"PRIx64
" for element "
1404 "with ID 0x%"PRIX32
" at 0x%"PRIx64
"\n",
1405 length
, max_lengths
[syntax
->type
], id
, pos
);
1406 } else if (syntax
->type
!= EBML_NONE
) {
1407 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1408 "Element with ID 0x%"PRIX32
" at pos. 0x%"PRIx64
" has "
1409 "unknown length, yet the length of an element of its "
1410 "type must be known.\n", id
, pos
);
1412 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1413 "Found unknown-length element with ID 0x%"PRIX32
" at "
1414 "pos. 0x%"PRIx64
" for which no syntax for parsing is "
1415 "available.\n", id
, pos
);
1417 return AVERROR_INVALIDDATA
;
1420 if (!(pb
->seekable
& AVIO_SEEKABLE_NORMAL
)) {
1421 // Losing sync will likely manifest itself as encountering unknown
1422 // elements which are not reliably distinguishable from elements
1423 // belonging to future extensions of the format.
1424 // We use a heuristic to detect such situations: If the current
1425 // element is not expected at the current syntax level and there
1426 // were only a few unknown elements in a row, then the element is
1427 // skipped or considered defective based upon the length of the
1428 // current element (i.e. how much would be skipped); if there were
1429 // more than a few skipped elements in a row and skipping the current
1430 // element would lead us more than SKIP_THRESHOLD away from the last
1431 // known good position, then it is inferred that an error occurred.
1432 // The dependency on the number of unknown elements in a row exists
1433 // because the distance to the last known good position is
1434 // automatically big if the last parsed element was big.
1435 // In both cases, each unknown element is considered equivalent to
1436 // UNKNOWN_EQUIV of skipped bytes for the check.
1437 // The whole check is only done for non-seekable output, because
1438 // in this situation skipped data can't simply be rechecked later.
1439 // This is especially important when using unknown length elements
1440 // as the check for whether a child exceeds its containing master
1441 // element is not effective in this situation.
1443 matroska
->unknown_count
= 0;
1445 int64_t dist
= length
+ UNKNOWN_EQUIV
* matroska
->unknown_count
++;
1447 if (matroska
->unknown_count
> 3)
1448 dist
+= pos_alt
- matroska
->resync_pos
;
1450 if (dist
> SKIP_THRESHOLD
) {
1451 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1452 "Unknown element %"PRIX32
" at pos. 0x%"PRIx64
" with "
1453 "length 0x%"PRIx64
" considered as invalid data. Last "
1454 "known good position 0x%"PRIx64
", %d unknown elements"
1455 " in a row\n", id
, pos
, length
, matroska
->resync_pos
,
1456 matroska
->unknown_count
);
1457 return AVERROR_INVALIDDATA
;
1462 if (update_pos
> 0) {
1463 // We have found an element that is allowed at this place
1464 // in the hierarchy and it passed all checks, so treat the beginning
1465 // of the element as the "last known good" position.
1466 matroska
->resync_pos
= pos
;
1469 if (!data
&& length
!= EBML_UNKNOWN_LENGTH
)
1473 switch (syntax
->type
) {
1475 res
= ebml_read_uint(pb
, length
, syntax
->def
.u
, data
);
1478 res
= ebml_read_sint(pb
, length
, syntax
->def
.i
, data
);
1481 res
= ebml_read_float(pb
, length
, syntax
->def
.f
, data
);
1485 res
= ebml_read_ascii(pb
, length
, syntax
->def
.s
, data
);
1488 res
= ebml_read_binary(pb
, length
, pos_alt
, data
);
1492 if ((res
= ebml_read_master(matroska
, length
, pos_alt
)) < 0)
1494 if (id
== MATROSKA_ID_SEGMENT
)
1495 matroska
->segment_start
= pos_alt
;
1496 if (id
== MATROSKA_ID_CUES
)
1497 matroska
->cues_parsing_deferred
= 0;
1498 if (syntax
->type
== EBML_LEVEL1
&&
1499 (level1_elem
= matroska_find_level1_elem(matroska
, syntax
->id
, pos
))) {
1500 if (!level1_elem
->pos
) {
1501 // Zero is not a valid position for a level 1 element.
1502 level1_elem
->pos
= pos
;
1503 } else if (level1_elem
->pos
!= pos
)
1504 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Duplicate element\n");
1505 level1_elem
->parsed
= 1;
1507 if (res
= ebml_parse_nest(matroska
, syntax
->def
.n
, data
))
1516 if (ffio_limit(pb
, length
) != length
) {
1517 // ffio_limit emits its own error message,
1518 // so we don't have to.
1519 return AVERROR(EIO
);
1521 if ((res2
= avio_skip(pb
, length
- 1)) >= 0) {
1522 // avio_skip might take us past EOF. We check for this
1523 // by skipping only length - 1 bytes, reading a byte and
1524 // checking the error flags. This is done in order to check
1525 // that the element has been properly skipped even when
1526 // no filesize (that ffio_limit relies on) is available.
1528 res
= NEEDS_CHECKING
;
1535 if (res
== NEEDS_CHECKING
) {
1536 if (pb
->eof_reached
) {
1545 if (res
== AVERROR_INVALIDDATA
)
1546 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Invalid element\n");
1547 else if (res
== AVERROR(EIO
))
1548 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Read error\n");
1549 else if (res
== AVERROR_EOF
) {
1550 av_log(matroska
->ctx
, AV_LOG_ERROR
, "File ended prematurely\n");
1558 if (syntax
->is_counted
&& data
) {
1559 CountedElement
*elem
= data
;
1560 if (elem
->count
!= UINT_MAX
)
1564 if (level_check
== LEVEL_ENDED
&& matroska
->num_levels
) {
1565 level
= &matroska
->levels
[matroska
->num_levels
- 1];
1566 pos
= avio_tell(pb
);
1568 // Given that pos >= level->start no check for
1569 // level->length != EBML_UNKNOWN_LENGTH is necessary.
1570 while (matroska
->num_levels
&& pos
== level
->start
+ level
->length
) {
1571 matroska
->num_levels
--;
1579 static void ebml_free(EbmlSyntax
*syntax
, void *data
)
1582 for (i
= 0; syntax
[i
].id
; i
++) {
1583 void *data_off
= (char *) data
+ syntax
[i
].data_offset
;
1584 switch (syntax
[i
].type
) {
1590 av_buffer_unref(&((EbmlBin
*) data_off
)->buf
);
1594 if (syntax
[i
].list_elem_size
) {
1595 EbmlList
*list
= data_off
;
1596 char *ptr
= list
->elem
;
1597 for (j
= 0; j
< list
->nb_elem
;
1598 j
++, ptr
+= syntax
[i
].list_elem_size
)
1599 ebml_free(syntax
[i
].def
.n
, ptr
);
1600 av_freep(&list
->elem
);
1602 list
->alloc_elem_size
= 0;
1604 ebml_free(syntax
[i
].def
.n
, data_off
);
1614 static int matroska_probe(const AVProbeData
*p
)
1617 int len_mask
= 0x80, size
= 1, n
= 1, i
;
1620 if (AV_RB32(p
->buf
) != EBML_ID_HEADER
)
1623 /* length of header */
1625 while (size
<= 8 && !(total
& len_mask
)) {
1631 total
&= (len_mask
- 1);
1633 total
= (total
<< 8) | p
->buf
[4 + n
++];
1635 if (total
+ 1 == 1ULL << (7 * size
)){
1636 /* Unknown-length header - simply parse the whole buffer. */
1637 total
= p
->buf_size
- 4 - size
;
1639 /* Does the probe data contain the whole header? */
1640 if (p
->buf_size
< 4 + size
+ total
)
1644 /* The header should contain a known document type. For now,
1645 * we don't parse the whole header but simply check for the
1646 * availability of that array of characters inside the header.
1647 * Not fully fool-proof, but good enough. */
1648 for (i
= 0; i
< FF_ARRAY_ELEMS(matroska_doctypes
); i
++) {
1649 size_t probelen
= strlen(matroska_doctypes
[i
]);
1650 if (total
< probelen
)
1652 for (n
= 4 + size
; n
<= 4 + size
+ total
- probelen
; n
++)
1653 if (!memcmp(p
->buf
+ n
, matroska_doctypes
[i
], probelen
))
1654 return AVPROBE_SCORE_MAX
;
1657 // probably valid EBML header but no recognized doctype
1658 return AVPROBE_SCORE_EXTENSION
;
1661 static MatroskaTrack
*matroska_find_track_by_num(MatroskaDemuxContext
*matroska
,
1664 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
1667 for (i
= 0; i
< matroska
->tracks
.nb_elem
; i
++)
1668 if (tracks
[i
].num
== num
)
1671 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Invalid track number %"PRIu64
"\n", num
);
1675 static int matroska_decode_buffer(uint8_t **buf
, int *buf_size
,
1676 MatroskaTrack
*track
)
1678 MatroskaTrackEncoding
*encodings
= track
->encodings
.elem
;
1679 uint8_t *data
= *buf
;
1680 int isize
= *buf_size
;
1681 uint8_t *pkt_data
= NULL
;
1682 av_unused
uint8_t *newpktdata
;
1683 int pkt_size
= isize
;
1687 if (pkt_size
>= 10000000U)
1688 return AVERROR_INVALIDDATA
;
1690 switch (encodings
[0].compression
.algo
) {
1691 case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
:
1693 int header_size
= encodings
[0].compression
.settings
.size
;
1694 uint8_t *header
= encodings
[0].compression
.settings
.data
;
1696 if (header_size
&& !header
) {
1697 av_log(NULL
, AV_LOG_ERROR
, "Compression size but no data in headerstrip\n");
1704 pkt_size
= isize
+ header_size
;
1705 pkt_data
= av_malloc(pkt_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
1707 return AVERROR(ENOMEM
);
1709 memcpy(pkt_data
, header
, header_size
);
1710 memcpy(pkt_data
+ header_size
, data
, isize
);
1713 case MATROSKA_TRACK_ENCODING_COMP_LZO
:
1716 olen
= pkt_size
*= 3;
1717 newpktdata
= av_realloc(pkt_data
, pkt_size
+ AV_LZO_OUTPUT_PADDING
1718 + AV_INPUT_BUFFER_PADDING_SIZE
);
1720 result
= AVERROR(ENOMEM
);
1723 pkt_data
= newpktdata
;
1724 result
= av_lzo1x_decode(pkt_data
, &olen
, data
, &insize
);
1725 } while (result
== AV_LZO_OUTPUT_FULL
&& pkt_size
< 10000000);
1727 result
= AVERROR_INVALIDDATA
;
1733 case MATROSKA_TRACK_ENCODING_COMP_ZLIB
:
1735 z_stream zstream
= { 0 };
1736 if (!pkt_size
|| inflateInit(&zstream
) != Z_OK
)
1738 zstream
.next_in
= data
;
1739 zstream
.avail_in
= isize
;
1742 newpktdata
= av_realloc(pkt_data
, pkt_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
1744 inflateEnd(&zstream
);
1745 result
= AVERROR(ENOMEM
);
1748 pkt_data
= newpktdata
;
1749 zstream
.avail_out
= pkt_size
- zstream
.total_out
;
1750 zstream
.next_out
= pkt_data
+ zstream
.total_out
;
1751 result
= inflate(&zstream
, Z_NO_FLUSH
);
1752 } while (result
== Z_OK
&& pkt_size
< 10000000);
1753 pkt_size
= zstream
.total_out
;
1754 inflateEnd(&zstream
);
1755 if (result
!= Z_STREAM_END
) {
1756 if (result
== Z_MEM_ERROR
)
1757 result
= AVERROR(ENOMEM
);
1759 result
= AVERROR_INVALIDDATA
;
1766 case MATROSKA_TRACK_ENCODING_COMP_BZLIB
:
1768 bz_stream bzstream
= { 0 };
1769 if (!pkt_size
|| BZ2_bzDecompressInit(&bzstream
, 0, 0) != BZ_OK
)
1771 bzstream
.next_in
= data
;
1772 bzstream
.avail_in
= isize
;
1775 newpktdata
= av_realloc(pkt_data
, pkt_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
1777 BZ2_bzDecompressEnd(&bzstream
);
1778 result
= AVERROR(ENOMEM
);
1781 pkt_data
= newpktdata
;
1782 bzstream
.avail_out
= pkt_size
- bzstream
.total_out_lo32
;
1783 bzstream
.next_out
= pkt_data
+ bzstream
.total_out_lo32
;
1784 result
= BZ2_bzDecompress(&bzstream
);
1785 } while (result
== BZ_OK
&& pkt_size
< 10000000);
1786 pkt_size
= bzstream
.total_out_lo32
;
1787 BZ2_bzDecompressEnd(&bzstream
);
1788 if (result
!= BZ_STREAM_END
) {
1789 if (result
== BZ_MEM_ERROR
)
1790 result
= AVERROR(ENOMEM
);
1792 result
= AVERROR_INVALIDDATA
;
1799 return AVERROR_INVALIDDATA
;
1802 memset(pkt_data
+ pkt_size
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
1805 *buf_size
= pkt_size
;
1813 static void matroska_convert_tag(AVFormatContext
*s
, EbmlList
*list
,
1814 AVDictionary
**metadata
, char *prefix
)
1816 MatroskaTag
*tags
= list
->elem
;
1820 for (i
= 0; i
< list
->nb_elem
; i
++) {
1821 const char *lang
= tags
[i
].lang
&&
1822 strcmp(tags
[i
].lang
, "und") ? tags
[i
].lang
: NULL
;
1824 if (!tags
[i
].name
) {
1825 av_log(s
, AV_LOG_WARNING
, "Skipping invalid tag with no TagName.\n");
1829 snprintf(key
, sizeof(key
), "%s/%s", prefix
, tags
[i
].name
);
1831 av_strlcpy(key
, tags
[i
].name
, sizeof(key
));
1832 if (tags
[i
].def
|| !lang
) {
1833 av_dict_set(metadata
, key
, tags
[i
].string
, 0);
1834 if (tags
[i
].sub
.nb_elem
)
1835 matroska_convert_tag(s
, &tags
[i
].sub
, metadata
, key
);
1838 av_strlcat(key
, "-", sizeof(key
));
1839 av_strlcat(key
, lang
, sizeof(key
));
1840 av_dict_set(metadata
, key
, tags
[i
].string
, 0);
1841 if (tags
[i
].sub
.nb_elem
)
1842 matroska_convert_tag(s
, &tags
[i
].sub
, metadata
, key
);
1845 ff_metadata_conv(metadata
, NULL
, ff_mkv_metadata_conv
);
1848 static void matroska_convert_tags(AVFormatContext
*s
)
1850 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1851 MatroskaTags
*tags
= matroska
->tags
.elem
;
1854 for (i
= 0; i
< matroska
->tags
.nb_elem
; i
++) {
1855 if (tags
[i
].target
.attachuid
) {
1856 MatroskaAttachment
*attachment
= matroska
->attachments
.elem
;
1858 for (j
= 0; j
< matroska
->attachments
.nb_elem
; j
++) {
1859 if (attachment
[j
].uid
== tags
[i
].target
.attachuid
&&
1860 attachment
[j
].stream
) {
1861 matroska_convert_tag(s
, &tags
[i
].tag
,
1862 &attachment
[j
].stream
->metadata
, NULL
);
1867 av_log(s
, AV_LOG_WARNING
,
1868 "The tags at index %d refer to a "
1869 "non-existent attachment %"PRId64
".\n",
1870 i
, tags
[i
].target
.attachuid
);
1872 } else if (tags
[i
].target
.chapteruid
) {
1873 MatroskaChapter
*chapter
= matroska
->chapters
.elem
;
1875 for (j
= 0; j
< matroska
->chapters
.nb_elem
; j
++) {
1876 if (chapter
[j
].uid
== tags
[i
].target
.chapteruid
&&
1877 chapter
[j
].chapter
) {
1878 matroska_convert_tag(s
, &tags
[i
].tag
,
1879 &chapter
[j
].chapter
->metadata
, NULL
);
1884 av_log(s
, AV_LOG_WARNING
,
1885 "The tags at index %d refer to a non-existent chapter "
1887 i
, tags
[i
].target
.chapteruid
);
1889 } else if (tags
[i
].target
.trackuid
) {
1890 MatroskaTrack
*track
= matroska
->tracks
.elem
;
1892 for (j
= 0; j
< matroska
->tracks
.nb_elem
; j
++) {
1893 if (track
[j
].uid
== tags
[i
].target
.trackuid
&&
1895 matroska_convert_tag(s
, &tags
[i
].tag
,
1896 &track
[j
].stream
->metadata
, NULL
);
1901 av_log(s
, AV_LOG_WARNING
,
1902 "The tags at index %d refer to a non-existent track "
1904 i
, tags
[i
].target
.trackuid
);
1907 matroska_convert_tag(s
, &tags
[i
].tag
, &s
->metadata
,
1908 tags
[i
].target
.type
);
1913 static int matroska_parse_seekhead_entry(MatroskaDemuxContext
*matroska
,
1916 uint32_t saved_id
= matroska
->current_id
;
1917 int64_t before_pos
= avio_tell(matroska
->ctx
->pb
);
1922 if (avio_seek(matroska
->ctx
->pb
, pos
, SEEK_SET
) == pos
) {
1923 /* We don't want to lose our seekhead level, so we add
1924 * a dummy. This is a crude hack. */
1925 if (matroska
->num_levels
== EBML_MAX_DEPTH
) {
1926 av_log(matroska
->ctx
, AV_LOG_INFO
,
1927 "Max EBML element depth (%d) reached, "
1928 "cannot parse further.\n", EBML_MAX_DEPTH
);
1929 ret
= AVERROR_INVALIDDATA
;
1931 matroska
->levels
[matroska
->num_levels
] = (MatroskaLevel
) { 0, EBML_UNKNOWN_LENGTH
};
1932 matroska
->num_levels
++;
1933 matroska
->current_id
= 0;
1935 ret
= ebml_parse(matroska
, matroska_segment
, matroska
);
1936 if (ret
== LEVEL_ENDED
) {
1937 /* This can only happen if the seek brought us beyond EOF. */
1942 /* Seek back - notice that in all instances where this is used
1943 * it is safe to set the level to 1. */
1944 ret2
= matroska_reset_status(matroska
, saved_id
, before_pos
);
1951 static void matroska_execute_seekhead(MatroskaDemuxContext
*matroska
)
1953 EbmlList
*seekhead_list
= &matroska
->seekhead
;
1956 // we should not do any seeking in the streaming case
1957 if (!(matroska
->ctx
->pb
->seekable
& AVIO_SEEKABLE_NORMAL
))
1960 for (i
= 0; i
< seekhead_list
->nb_elem
; i
++) {
1961 MatroskaSeekhead
*seekheads
= seekhead_list
->elem
;
1962 uint32_t id
= seekheads
[i
].id
;
1963 int64_t pos
= seekheads
[i
].pos
+ matroska
->segment_start
;
1964 MatroskaLevel1Element
*elem
;
1966 if (id
!= seekheads
[i
].id
|| pos
< matroska
->segment_start
)
1969 elem
= matroska_find_level1_elem(matroska
, id
, pos
);
1970 if (!elem
|| elem
->parsed
)
1975 // defer cues parsing until we actually need cue data.
1976 if (id
== MATROSKA_ID_CUES
)
1979 if (matroska_parse_seekhead_entry(matroska
, pos
) < 0) {
1980 // mark index as broken
1981 matroska
->cues_parsing_deferred
= -1;
1989 static void matroska_add_index_entries(MatroskaDemuxContext
*matroska
)
1991 EbmlList
*index_list
;
1992 MatroskaIndex
*index
;
1993 uint64_t index_scale
= 1;
1996 if (matroska
->ctx
->flags
& AVFMT_FLAG_IGNIDX
)
1999 index_list
= &matroska
->index
;
2000 index
= index_list
->elem
;
2001 if (index_list
->nb_elem
< 2)
2003 if (index
[1].time
> 1E14
/ matroska
->time_scale
) {
2004 av_log(matroska
->ctx
, AV_LOG_WARNING
, "Dropping apparently-broken index.\n");
2007 for (i
= 0; i
< index_list
->nb_elem
; i
++) {
2008 EbmlList
*pos_list
= &index
[i
].pos
;
2009 MatroskaIndexPos
*pos
= pos_list
->elem
;
2010 for (j
= 0; j
< pos_list
->nb_elem
; j
++) {
2011 MatroskaTrack
*track
= matroska_find_track_by_num(matroska
,
2013 if (track
&& track
->stream
)
2014 av_add_index_entry(track
->stream
,
2015 pos
[j
].pos
+ matroska
->segment_start
,
2016 index
[i
].time
/ index_scale
, 0, 0,
2022 static void matroska_parse_cues(MatroskaDemuxContext
*matroska
) {
2025 if (matroska
->ctx
->flags
& AVFMT_FLAG_IGNIDX
)
2028 for (i
= 0; i
< matroska
->num_level1_elems
; i
++) {
2029 MatroskaLevel1Element
*elem
= &matroska
->level1_elems
[i
];
2030 if (elem
->id
== MATROSKA_ID_CUES
&& !elem
->parsed
) {
2031 if (matroska_parse_seekhead_entry(matroska
, elem
->pos
) < 0)
2032 matroska
->cues_parsing_deferred
= -1;
2038 matroska_add_index_entries(matroska
);
2041 static int matroska_parse_content_encodings(MatroskaTrackEncoding
*encodings
,
2042 unsigned nb_encodings
,
2043 MatroskaTrack
*track
,
2044 char **key_id_base64
, void *logctx
)
2046 if (nb_encodings
> 1) {
2047 av_log(logctx
, AV_LOG_ERROR
,
2048 "Multiple combined encodings not supported\n");
2053 if (encodings
->type
) {
2054 if (encodings
->encryption
.key_id
.size
> 0) {
2055 /* Save the encryption key id to be stored later
2056 * as a metadata tag. */
2057 const int b64_size
= AV_BASE64_SIZE(encodings
->encryption
.key_id
.size
);
2058 *key_id_base64
= av_malloc(b64_size
);
2059 if (!*key_id_base64
)
2060 return AVERROR(ENOMEM
);
2062 av_base64_encode(*key_id_base64
, b64_size
,
2063 encodings
->encryption
.key_id
.data
,
2064 encodings
->encryption
.key_id
.size
);
2066 encodings
->scope
= 0;
2067 av_log(logctx
, AV_LOG_ERROR
, "Unsupported encoding type\n");
2071 encodings
->compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_ZLIB
&&
2074 encodings
->compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_BZLIB
&&
2076 encodings
->compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_LZO
&&
2077 encodings
->compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
) {
2078 encodings
->scope
= 0;
2079 av_log(logctx
, AV_LOG_ERROR
, "Unsupported encoding type\n");
2080 } else if (track
->codec_priv
.size
&& encodings
[0].scope
& 2) {
2081 uint8_t *codec_priv
= track
->codec_priv
.data
;
2082 int ret
= matroska_decode_buffer(&track
->codec_priv
.data
,
2083 &track
->codec_priv
.size
,
2086 track
->codec_priv
.data
= NULL
;
2087 track
->codec_priv
.size
= 0;
2088 av_log(logctx
, AV_LOG_ERROR
,
2089 "Failed to decode codec private data\n");
2092 if (codec_priv
!= track
->codec_priv
.data
) {
2093 av_buffer_unref(&track
->codec_priv
.buf
);
2094 if (track
->codec_priv
.data
) {
2095 track
->codec_priv
.buf
= av_buffer_create(track
->codec_priv
.data
,
2096 track
->codec_priv
.size
+ AV_INPUT_BUFFER_PADDING_SIZE
,
2098 if (!track
->codec_priv
.buf
) {
2099 av_freep(&track
->codec_priv
.data
);
2100 track
->codec_priv
.size
= 0;
2101 return AVERROR(ENOMEM
);
2106 track
->needs_decoding
= !encodings
->type
&&
2107 encodings
->scope
& 1 &&
2108 (encodings
->compression
.algo
!=
2109 MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
||
2110 encodings
->compression
.settings
.size
);
2115 static int matroska_aac_profile(char *codec_id
)
2117 static const char *const aac_profiles
[] = { "MAIN", "LC", "SSR" };
2120 for (profile
= 0; profile
< FF_ARRAY_ELEMS(aac_profiles
); profile
++)
2121 if (strstr(codec_id
, aac_profiles
[profile
]))
2126 static int matroska_aac_sri(int samplerate
)
2130 for (sri
= 0; sri
< FF_ARRAY_ELEMS(ff_mpeg4audio_sample_rates
); sri
++)
2131 if (ff_mpeg4audio_sample_rates
[sri
] == samplerate
)
2136 static void matroska_metadata_creation_time(AVDictionary
**metadata
, int64_t date_utc
)
2138 /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */
2139 ff_dict_set_timestamp(metadata
, "creation_time", date_utc
/ 1000 + 978307200000000LL);
2142 static int matroska_parse_flac(AVFormatContext
*s
,
2143 MatroskaTrack
*track
,
2146 AVStream
*st
= track
->stream
;
2147 uint8_t *p
= track
->codec_priv
.data
;
2148 int size
= track
->codec_priv
.size
;
2150 if (size
< 8 + FLAC_STREAMINFO_SIZE
|| p
[4] & 0x7f) {
2151 av_log(s
, AV_LOG_WARNING
, "Invalid FLAC private data\n");
2152 track
->codec_priv
.size
= 0;
2156 track
->codec_priv
.size
= 8 + FLAC_STREAMINFO_SIZE
;
2158 p
+= track
->codec_priv
.size
;
2159 size
-= track
->codec_priv
.size
;
2161 /* parse the remaining metadata blocks if present */
2163 int block_last
, block_type
, block_size
;
2165 flac_parse_block_header(p
, &block_last
, &block_type
, &block_size
);
2169 if (block_size
> size
)
2172 /* check for the channel mask */
2173 if (block_type
== FLAC_METADATA_TYPE_VORBIS_COMMENT
) {
2174 AVDictionary
*dict
= NULL
;
2175 AVDictionaryEntry
*chmask
;
2177 ff_vorbis_comment(s
, &dict
, p
, block_size
, 0);
2178 chmask
= av_dict_get(dict
, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL
, 0);
2180 uint64_t mask
= strtol(chmask
->value
, NULL
, 0);
2181 if (!mask
|| mask
& ~0x3ffffULL
) {
2182 av_log(s
, AV_LOG_WARNING
,
2183 "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
2185 av_channel_layout_from_mask(&st
->codecpar
->ch_layout
, mask
);
2187 av_dict_free(&dict
);
2197 static int mkv_field_order(const MatroskaDemuxContext
*matroska
, uint64_t field_order
)
2199 int minor
, micro
, bttb
= 0;
2201 /* workaround a bug in our Matroska muxer, introduced in version 57.36 alongside
2202 * this function, and fixed in 57.52 */
2203 if (matroska
->muxingapp
&& sscanf(matroska
->muxingapp
, "Lavf57.%d.%d", &minor
, µ
) == 2)
2204 bttb
= (minor
>= 36 && minor
<= 51 && micro
>= 100);
2206 switch (field_order
) {
2207 case MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE
:
2208 return AV_FIELD_PROGRESSIVE
;
2209 case MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
:
2210 return AV_FIELD_UNKNOWN
;
2211 case MATROSKA_VIDEO_FIELDORDER_TT
:
2213 case MATROSKA_VIDEO_FIELDORDER_BB
:
2215 case MATROSKA_VIDEO_FIELDORDER_BT
:
2216 return bttb
? AV_FIELD_TB
: AV_FIELD_BT
;
2217 case MATROSKA_VIDEO_FIELDORDER_TB
:
2218 return bttb
? AV_FIELD_BT
: AV_FIELD_TB
;
2220 return AV_FIELD_UNKNOWN
;
2224 static void mkv_stereo_mode_display_mul(int stereo_mode
,
2225 int *h_width
, int *h_height
)
2227 switch (stereo_mode
) {
2228 case MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
:
2229 case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL
:
2230 case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR
:
2231 case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
:
2232 case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR
:
2234 case MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
:
2235 case MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
:
2236 case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL
:
2237 case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR
:
2240 case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP
:
2241 case MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
:
2242 case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
:
2243 case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
:
2249 static int mkv_stereo3d_conv(AVStream
*st
, MatroskaVideoStereoModeType stereo_mode
)
2251 static const struct {
2254 } stereo_mode_conv
[] = {
2255 #define STEREO_MODE_CONV(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
2256 [(STEREOMODETYPE)] = { .type = (STEREO3DTYPE), .flags = (FLAGS) },
2257 #define NOTHING(STEREOMODETYPE, WDIV, HDIV, WEBM)
2258 STEREOMODE_STEREO3D_MAPPING(STEREO_MODE_CONV
, NOTHING
)
2263 stereo
= av_stereo3d_alloc_size(&size
);
2265 return AVERROR(ENOMEM
);
2267 stereo
->type
= stereo_mode_conv
[stereo_mode
].type
;
2268 stereo
->flags
= stereo_mode_conv
[stereo_mode
].flags
;
2270 if (!av_packet_side_data_add(&st
->codecpar
->coded_side_data
, &st
->codecpar
->nb_coded_side_data
,
2271 AV_PKT_DATA_STEREO3D
, stereo
, size
, 0)) {
2273 return AVERROR(ENOMEM
);
2279 static int mkv_parse_video_color(AVStream
*st
, const MatroskaTrack
*track
) {
2280 const MatroskaTrackVideoColor
*color
= track
->video
.color
.elem
;
2281 const MatroskaMasteringMeta
*mastering_meta
;
2282 int has_mastering_primaries
, has_mastering_luminance
;
2284 if (!track
->video
.color
.nb_elem
)
2287 mastering_meta
= &color
->mastering_meta
;
2288 // Mastering primaries are CIE 1931 coords, and must be > 0.
2289 has_mastering_primaries
=
2290 mastering_meta
->r_x
> 0 && mastering_meta
->r_y
> 0 &&
2291 mastering_meta
->g_x
> 0 && mastering_meta
->g_y
> 0 &&
2292 mastering_meta
->b_x
> 0 && mastering_meta
->b_y
> 0 &&
2293 mastering_meta
->white_x
> 0 && mastering_meta
->white_y
> 0;
2294 has_mastering_luminance
= mastering_meta
->max_luminance
>
2295 mastering_meta
->min_luminance
.el
.f
&&
2296 mastering_meta
->min_luminance
.el
.f
>= 0 &&
2297 mastering_meta
->min_luminance
.count
;
2299 if (color
->matrix_coefficients
!= AVCOL_SPC_RESERVED
)
2300 st
->codecpar
->color_space
= color
->matrix_coefficients
;
2301 if (color
->primaries
!= AVCOL_PRI_RESERVED
&&
2302 color
->primaries
!= AVCOL_PRI_RESERVED0
)
2303 st
->codecpar
->color_primaries
= color
->primaries
;
2304 if (color
->transfer_characteristics
!= AVCOL_TRC_RESERVED
&&
2305 color
->transfer_characteristics
!= AVCOL_TRC_RESERVED0
)
2306 st
->codecpar
->color_trc
= color
->transfer_characteristics
;
2307 if (color
->range
!= AVCOL_RANGE_UNSPECIFIED
&&
2308 color
->range
<= AVCOL_RANGE_JPEG
)
2309 st
->codecpar
->color_range
= color
->range
;
2310 if (color
->chroma_siting_horz
!= MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
&&
2311 color
->chroma_siting_vert
!= MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED
&&
2312 color
->chroma_siting_horz
< MATROSKA_COLOUR_CHROMASITINGHORZ_NB
&&
2313 color
->chroma_siting_vert
< MATROSKA_COLOUR_CHROMASITINGVERT_NB
) {
2314 st
->codecpar
->chroma_location
=
2315 av_chroma_location_pos_to_enum((color
->chroma_siting_horz
- 1) << 7,
2316 (color
->chroma_siting_vert
- 1) << 7);
2318 if (color
->max_cll
&& color
->max_fall
) {
2320 AVContentLightMetadata
*metadata
= av_content_light_metadata_alloc(&size
);
2322 return AVERROR(ENOMEM
);
2323 if (!av_packet_side_data_add(&st
->codecpar
->coded_side_data
, &st
->codecpar
->nb_coded_side_data
,
2324 AV_PKT_DATA_CONTENT_LIGHT_LEVEL
, metadata
, size
, 0)) {
2325 av_freep(&metadata
);
2326 return AVERROR(ENOMEM
);
2328 metadata
->MaxCLL
= color
->max_cll
;
2329 metadata
->MaxFALL
= color
->max_fall
;
2332 if (has_mastering_primaries
|| has_mastering_luminance
) {
2334 AVMasteringDisplayMetadata
*metadata
= av_mastering_display_metadata_alloc_size(&size
);
2336 return AVERROR(ENOMEM
);
2337 if (!av_packet_side_data_add(&st
->codecpar
->coded_side_data
, &st
->codecpar
->nb_coded_side_data
,
2338 AV_PKT_DATA_MASTERING_DISPLAY_METADATA
, metadata
, size
, 0)) {
2339 av_freep(&metadata
);
2340 return AVERROR(ENOMEM
);
2342 if (has_mastering_primaries
) {
2343 metadata
->display_primaries
[0][0] = av_d2q(mastering_meta
->r_x
, INT_MAX
);
2344 metadata
->display_primaries
[0][1] = av_d2q(mastering_meta
->r_y
, INT_MAX
);
2345 metadata
->display_primaries
[1][0] = av_d2q(mastering_meta
->g_x
, INT_MAX
);
2346 metadata
->display_primaries
[1][1] = av_d2q(mastering_meta
->g_y
, INT_MAX
);
2347 metadata
->display_primaries
[2][0] = av_d2q(mastering_meta
->b_x
, INT_MAX
);
2348 metadata
->display_primaries
[2][1] = av_d2q(mastering_meta
->b_y
, INT_MAX
);
2349 metadata
->white_point
[0] = av_d2q(mastering_meta
->white_x
, INT_MAX
);
2350 metadata
->white_point
[1] = av_d2q(mastering_meta
->white_y
, INT_MAX
);
2351 metadata
->has_primaries
= 1;
2353 if (has_mastering_luminance
) {
2354 metadata
->max_luminance
= av_d2q(mastering_meta
->max_luminance
, INT_MAX
);
2355 metadata
->min_luminance
= av_d2q(mastering_meta
->min_luminance
.el
.f
, INT_MAX
);
2356 metadata
->has_luminance
= 1;
2362 static int mkv_create_display_matrix(AVStream
*st
,
2363 const MatroskaTrackVideoProjection
*proj
,
2366 AVPacketSideData
*sd
;
2367 double pitch
= proj
->pitch
, yaw
= proj
->yaw
, roll
= proj
->roll
;
2371 if (pitch
== 0.0 && yaw
== 0.0 && roll
== 0.0)
2374 /* Note: The following constants are exactly representable
2375 * as floating-point numbers. */
2376 if (pitch
!= 0.0 || (yaw
!= 0.0 && yaw
!= 180.0 && yaw
!= -180.0) ||
2378 av_log(logctx
, AV_LOG_WARNING
, "Ignoring non-2D rectangular "
2379 "projection in stream %u (yaw %f, pitch %f, roll %f)\n",
2380 st
->index
, yaw
, pitch
, roll
);
2383 sd
= av_packet_side_data_new(&st
->codecpar
->coded_side_data
,
2384 &st
->codecpar
->nb_coded_side_data
,
2385 AV_PKT_DATA_DISPLAYMATRIX
,
2386 9 * sizeof(*matrix
), 0);
2388 return AVERROR(ENOMEM
);
2389 matrix
= (int32_t*)sd
->data
;
2392 /* ProjectionPoseRoll is in the counter-clockwise direction
2393 * whereas av_display_rotation_set() expects its argument
2394 * to be oriented clockwise, so we need to negate roll.
2395 * Furthermore, if hflip is set, we need to negate it again
2396 * to account for the fact that the Matroska specifications
2397 * require the yaw rotation to be applied first. */
2398 av_display_rotation_set(matrix
, roll
* (2 * hflip
- 1));
2399 av_display_matrix_flip(matrix
, hflip
, 0);
2404 static int mkv_parse_video_projection(AVStream
*st
, const MatroskaTrack
*track
,
2407 AVSphericalMapping
*spherical
;
2408 const MatroskaTrackVideoProjection
*mkv_projection
= &track
->video
.projection
;
2409 const uint8_t *priv_data
= mkv_projection
->private.data
;
2410 enum AVSphericalProjection projection
;
2411 size_t spherical_size
;
2412 uint32_t l
= 0, t
= 0, r
= 0, b
= 0;
2413 uint32_t padding
= 0;
2415 if (mkv_projection
->private.size
&& priv_data
[0] != 0) {
2416 av_log(logctx
, AV_LOG_WARNING
, "Unknown spherical metadata\n");
2420 switch (track
->video
.projection
.type
) {
2421 case MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR
:
2422 return mkv_create_display_matrix(st
, mkv_projection
, logctx
);
2423 case MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
:
2424 if (track
->video
.projection
.private.size
== 20) {
2425 t
= AV_RB32(priv_data
+ 4);
2426 b
= AV_RB32(priv_data
+ 8);
2427 l
= AV_RB32(priv_data
+ 12);
2428 r
= AV_RB32(priv_data
+ 16);
2430 if (b
>= UINT_MAX
- t
|| r
>= UINT_MAX
- l
) {
2431 av_log(logctx
, AV_LOG_ERROR
,
2432 "Invalid bounding rectangle coordinates "
2433 "%"PRIu32
",%"PRIu32
",%"PRIu32
",%"PRIu32
"\n",
2435 return AVERROR_INVALIDDATA
;
2437 } else if (track
->video
.projection
.private.size
!= 0) {
2438 av_log(logctx
, AV_LOG_ERROR
, "Unknown spherical metadata\n");
2439 return AVERROR_INVALIDDATA
;
2442 if (l
|| t
|| r
|| b
)
2443 projection
= AV_SPHERICAL_EQUIRECTANGULAR_TILE
;
2445 projection
= AV_SPHERICAL_EQUIRECTANGULAR
;
2447 case MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP
:
2448 if (track
->video
.projection
.private.size
< 4) {
2449 av_log(logctx
, AV_LOG_ERROR
, "Missing projection private properties\n");
2450 return AVERROR_INVALIDDATA
;
2451 } else if (track
->video
.projection
.private.size
== 12) {
2452 uint32_t layout
= AV_RB32(priv_data
+ 4);
2454 av_log(logctx
, AV_LOG_WARNING
,
2455 "Unknown spherical cubemap layout %"PRIu32
"\n", layout
);
2458 projection
= AV_SPHERICAL_CUBEMAP
;
2459 padding
= AV_RB32(priv_data
+ 8);
2461 av_log(logctx
, AV_LOG_ERROR
, "Unknown spherical metadata\n");
2462 return AVERROR_INVALIDDATA
;
2466 av_log(logctx
, AV_LOG_WARNING
,
2467 "Unknown spherical metadata type %"PRIu64
"\n",
2468 track
->video
.projection
.type
);
2472 spherical
= av_spherical_alloc(&spherical_size
);
2474 return AVERROR(ENOMEM
);
2476 spherical
->projection
= projection
;
2478 spherical
->yaw
= (int32_t) (track
->video
.projection
.yaw
* (1 << 16));
2479 spherical
->pitch
= (int32_t) (track
->video
.projection
.pitch
* (1 << 16));
2480 spherical
->roll
= (int32_t) (track
->video
.projection
.roll
* (1 << 16));
2482 spherical
->padding
= padding
;
2484 spherical
->bound_left
= l
;
2485 spherical
->bound_top
= t
;
2486 spherical
->bound_right
= r
;
2487 spherical
->bound_bottom
= b
;
2489 if (!av_packet_side_data_add(&st
->codecpar
->coded_side_data
, &st
->codecpar
->nb_coded_side_data
,
2490 AV_PKT_DATA_SPHERICAL
, spherical
, spherical_size
, 0)) {
2491 av_freep(&spherical
);
2492 return AVERROR(ENOMEM
);
2498 static int mkv_parse_dvcc_dvvc(AVFormatContext
*s
, AVStream
*st
, const MatroskaTrack
*track
,
2501 return ff_isom_parse_dvcc_dvvc(s
, st
, bin
->data
, bin
->size
);
2504 static int mkv_parse_block_addition_mappings(AVFormatContext
*s
, AVStream
*st
, MatroskaTrack
*track
)
2506 const EbmlList
*mappings_list
= &track
->block_addition_mappings
;
2507 MatroskaBlockAdditionMapping
*mappings
= mappings_list
->elem
;
2510 for (int i
= 0; i
< mappings_list
->nb_elem
; i
++) {
2511 MatroskaBlockAdditionMapping
*mapping
= &mappings
[i
];
2512 uint64_t type
= mapping
->type
;
2514 switch (mapping
->type
) {
2515 case MATROSKA_BLOCK_ADD_ID_TYPE_DEFAULT
:
2516 av_log(s
, AV_LOG_DEBUG
,
2517 "Explicit block Addition Mapping type \"Use BlockAddIDValue\", value %"PRIu64
","
2518 " name \"%s\" found.\n", mapping
->value
, mapping
->name
? mapping
->name
: "");
2519 type
= MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE
;
2521 case MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE
:
2522 case MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35
:
2523 if (mapping
->value
!= type
) {
2524 int strict
= s
->strict_std_compliance
>= FF_COMPLIANCE_STRICT
;
2525 av_log(s
, strict
? AV_LOG_ERROR
: AV_LOG_WARNING
,
2526 "Invalid Block Addition Value 0x%"PRIx64
" for Block Addition Mapping Type "
2527 "0x%"PRIx64
", name \"%s\"\n", mapping
->value
, mapping
->type
,
2528 mapping
->name
? mapping
->name
: "");
2530 return AVERROR_INVALIDDATA
;
2533 case MATROSKA_BLOCK_ADD_ID_TYPE_DVCC
:
2534 case MATROSKA_BLOCK_ADD_ID_TYPE_DVVC
:
2535 if ((ret
= mkv_parse_dvcc_dvvc(s
, st
, track
, &mapping
->extradata
)) < 0)
2540 av_log(s
, AV_LOG_DEBUG
,
2541 "Unknown Block Addition Mapping type 0x%"PRIx64
", value %"PRIu64
", name \"%s\"\n",
2542 mapping
->type
, mapping
->value
, mapping
->name
? mapping
->name
: "");
2543 if (mapping
->value
< 2) {
2544 int strict
= s
->strict_std_compliance
>= FF_COMPLIANCE_STRICT
;
2545 av_log(s
, strict
? AV_LOG_ERROR
: AV_LOG_WARNING
,
2546 "Invalid Block Addition value 0x%"PRIu64
" for unknown Block Addition Mapping "
2547 "type %"PRIx64
", name \"%s\"\n", mapping
->value
, mapping
->type
,
2548 mapping
->name
? mapping
->name
: "");
2550 return AVERROR_INVALIDDATA
;
2559 static int get_qt_codec(MatroskaTrack
*track
, uint32_t *fourcc
, enum AVCodecID
*codec_id
)
2561 const AVCodecTag
*codec_tags
;
2563 codec_tags
= track
->type
== MATROSKA_TRACK_TYPE_VIDEO
?
2564 ff_codec_movvideo_tags
: ff_codec_movaudio_tags
;
2566 /* Normalize noncompliant private data that starts with the fourcc
2567 * by expanding/shifting the data by 4 bytes and storing the data
2568 * size at the start. */
2569 if (ff_codec_get_id(codec_tags
, AV_RL32(track
->codec_priv
.data
))) {
2570 int ret
= av_buffer_realloc(&track
->codec_priv
.buf
,
2571 track
->codec_priv
.size
+ 4 + AV_INPUT_BUFFER_PADDING_SIZE
);
2575 track
->codec_priv
.data
= track
->codec_priv
.buf
->data
;
2576 memmove(track
->codec_priv
.data
+ 4, track
->codec_priv
.data
, track
->codec_priv
.size
);
2577 track
->codec_priv
.size
+= 4;
2578 AV_WB32(track
->codec_priv
.data
, track
->codec_priv
.size
);
2581 *fourcc
= AV_RL32(track
->codec_priv
.data
+ 4);
2582 *codec_id
= ff_codec_get_id(codec_tags
, *fourcc
);
2587 /* An enum with potential return values of the functions for parsing a track.
2588 * Apart from that all these functions can also indicate ordinary errors via
2589 * negative return values. */
2594 #define AAC_MAX_EXTRADATA_SIZE 5
2595 #define TTA_EXTRADATA_SIZE 22
2596 #define WAVPACK_EXTRADATA_SIZE 2
2597 /* Performs the codec-specific part of parsing an audio track. */
2598 static int mka_parse_audio_codec(MatroskaTrack
*track
, AVCodecParameters
*par
,
2599 const MatroskaDemuxContext
*matroska
,
2600 AVFormatContext
*s
, int *extradata_offset
)
2602 uint8_t extradata
[FFMAX3(AAC_MAX_EXTRADATA_SIZE
,
2604 WAVPACK_EXTRADATA_SIZE
)];
2605 int extradata_size
= 0; // > 0 means that the extradata buffer is used
2608 if (!strcmp(track
->codec_id
, "A_MS/ACM") &&
2609 track
->codec_priv
.size
>= 14) {
2611 ffio_init_read_context(&b
, track
->codec_priv
.data
,
2612 track
->codec_priv
.size
);
2613 ret
= ff_get_wav_header(s
, &b
.pub
, par
,
2614 track
->codec_priv
.size
, 0);
2617 *extradata_offset
= FFMIN(track
->codec_priv
.size
, 18);
2619 } else if (!strcmp(track
->codec_id
, "A_QUICKTIME") &&
2620 /* Normally 36, but allow noncompliant private data */
2621 track
->codec_priv
.size
>= 32) {
2622 enum AVCodecID codec_id
;
2624 uint16_t sample_size
;
2626 ret
= get_qt_codec(track
, &fourcc
, &codec_id
);
2629 sample_size
= AV_RB16(track
->codec_priv
.data
+ 26);
2631 if (sample_size
== 8) {
2632 fourcc
= MKTAG('r','a','w',' ');
2633 codec_id
= ff_codec_get_id(ff_codec_movaudio_tags
, fourcc
);
2634 } else if (sample_size
== 16) {
2635 fourcc
= MKTAG('t','w','o','s');
2636 codec_id
= ff_codec_get_id(ff_codec_movaudio_tags
, fourcc
);
2639 if ((fourcc
== MKTAG('t','w','o','s') ||
2640 fourcc
== MKTAG('s','o','w','t')) && sample_size
== 8)
2641 codec_id
= AV_CODEC_ID_PCM_S8
;
2642 par
->codec_id
= codec_id
;
2643 par
->codec_tag
= fourcc
;
2647 switch (par
->codec_id
) {
2648 case AV_CODEC_ID_PCM_S16BE
:
2649 switch (track
->audio
.bitdepth
) {
2651 par
->codec_id
= AV_CODEC_ID_PCM_U8
;
2654 par
->codec_id
= AV_CODEC_ID_PCM_S24BE
;
2657 par
->codec_id
= AV_CODEC_ID_PCM_S32BE
;
2661 case AV_CODEC_ID_PCM_S16LE
:
2662 switch (track
->audio
.bitdepth
) {
2664 par
->codec_id
= AV_CODEC_ID_PCM_U8
;
2667 par
->codec_id
= AV_CODEC_ID_PCM_S24LE
;
2670 par
->codec_id
= AV_CODEC_ID_PCM_S32LE
;
2674 case AV_CODEC_ID_PCM_F32LE
:
2675 if (track
->audio
.bitdepth
== 64)
2676 par
->codec_id
= AV_CODEC_ID_PCM_F64LE
;
2678 case AV_CODEC_ID_AAC
:
2679 if (!track
->codec_priv
.size
) {
2680 int profile
= matroska_aac_profile(track
->codec_id
);
2681 int sri
= matroska_aac_sri(track
->audio
.samplerate
);
2683 extradata
[0] = (profile
<< 3) | ((sri
& 0x0E) >> 1);
2684 extradata
[1] = ((sri
& 0x01) << 7) | (track
->audio
.channels
<< 3);
2685 if (strstr(track
->codec_id
, "SBR")) {
2686 sri
= matroska_aac_sri(track
->audio
.out_samplerate
);
2687 extradata
[2] = 0x56;
2688 extradata
[3] = 0xE5;
2689 extradata
[4] = 0x80 | (sri
<< 3);
2695 case AV_CODEC_ID_ALAC
:
2696 if (track
->codec_priv
.size
&& track
->codec_priv
.size
< INT_MAX
- 12 - AV_INPUT_BUFFER_PADDING_SIZE
) {
2697 /* Only ALAC's magic cookie is stored in Matroska's track headers.
2698 * Create the "atom size", "tag", and "tag version" fields the
2699 * decoder expects manually. */
2700 ret
= ff_alloc_extradata(par
, 12 + track
->codec_priv
.size
);
2703 AV_WB32(par
->extradata
, par
->extradata_size
);
2704 AV_WB32(&par
->extradata
[4], MKBETAG('a', 'l', 'a', 'c'));
2705 AV_WB32(&par
->extradata
[8], 0);
2706 memcpy(&par
->extradata
[12], track
->codec_priv
.data
,
2707 track
->codec_priv
.size
);
2710 case AV_CODEC_ID_TTA
:
2713 if (track
->audio
.channels
> UINT16_MAX
||
2714 track
->audio
.bitdepth
> UINT16_MAX
) {
2715 av_log(matroska
->ctx
, AV_LOG_WARNING
,
2716 "Too large audio channel number %"PRIu64
2717 " or bitdepth %"PRIu64
". Skipping track.\n",
2718 track
->audio
.channels
, track
->audio
.bitdepth
);
2719 if (matroska
->ctx
->error_recognition
& AV_EF_EXPLODE
)
2720 return AVERROR_INVALIDDATA
;
2724 if (track
->audio
.out_samplerate
< 0 || track
->audio
.out_samplerate
> INT_MAX
)
2725 return AVERROR_INVALIDDATA
;
2726 extradata_size
= TTA_EXTRADATA_SIZE
;
2728 bytestream_put_be32(&ptr
, AV_RB32("TTA1"));
2729 bytestream_put_le16(&ptr
, 1);
2730 bytestream_put_le16(&ptr
, track
->audio
.channels
);
2731 bytestream_put_le16(&ptr
, track
->audio
.bitdepth
);
2732 bytestream_put_le32(&ptr
, track
->audio
.out_samplerate
);
2733 bytestream_put_le32(&ptr
, av_rescale(matroska
->duration
* matroska
->time_scale
,
2734 track
->audio
.out_samplerate
,
2735 AV_TIME_BASE
* 1000));
2738 case AV_CODEC_ID_RA_144
:
2739 track
->audio
.out_samplerate
= 8000;
2740 track
->audio
.channels
= 1;
2742 case AV_CODEC_ID_RA_288
:
2743 case AV_CODEC_ID_COOK
:
2744 case AV_CODEC_ID_ATRAC3
:
2745 case AV_CODEC_ID_SIPR
:
2747 const uint8_t *ptr
= track
->codec_priv
.data
;
2750 if (!track
->codec_priv
.size
)
2753 if (track
->codec_priv
.size
< 46)
2754 return AVERROR_INVALIDDATA
;
2756 flavor
= bytestream_get_be16(&ptr
);
2757 track
->audio
.coded_framesize
= bytestream_get_be32(&ptr
);
2759 track
->audio
.sub_packet_h
= bytestream_get_be16(&ptr
);
2760 track
->audio
.frame_size
= bytestream_get_be16(&ptr
);
2761 track
->audio
.sub_packet_size
= bytestream_get_be16(&ptr
);
2762 if (track
->audio
.coded_framesize
<= 0 ||
2763 track
->audio
.sub_packet_h
<= 0 ||
2764 track
->audio
.frame_size
<= 0)
2765 return AVERROR_INVALIDDATA
;
2767 if (par
->codec_id
== AV_CODEC_ID_RA_288
) {
2768 if (track
->audio
.sub_packet_h
& 1 || 2 * track
->audio
.frame_size
2769 != (int64_t)track
->audio
.sub_packet_h
* track
->audio
.coded_framesize
)
2770 return AVERROR_INVALIDDATA
;
2771 par
->block_align
= track
->audio
.coded_framesize
;
2772 track
->codec_priv
.size
= 0;
2774 if (par
->codec_id
== AV_CODEC_ID_SIPR
) {
2775 static const int sipr_bit_rate
[4] = { 6504, 8496, 5000, 16000 };
2777 return AVERROR_INVALIDDATA
;
2778 track
->audio
.sub_packet_size
= ff_sipr_subpk_size
[flavor
];
2779 par
->bit_rate
= sipr_bit_rate
[flavor
];
2780 } else if (track
->audio
.sub_packet_size
<= 0 ||
2781 track
->audio
.frame_size
% track
->audio
.sub_packet_size
)
2782 return AVERROR_INVALIDDATA
;
2783 par
->block_align
= track
->audio
.sub_packet_size
;
2784 *extradata_offset
= 78;
2786 track
->audio
.buf
= av_malloc_array(track
->audio
.sub_packet_h
,
2787 track
->audio
.frame_size
);
2788 if (!track
->audio
.buf
)
2789 return AVERROR(ENOMEM
);
2792 case AV_CODEC_ID_ATRAC1
:
2793 /* ATRAC1 uses a constant frame size.
2794 * Typical ATRAC1 streams are either mono or stereo.
2795 * At most, ATRAC1 was used to store 8 channels of audio. */
2796 if (track
->audio
.channels
> 8)
2797 return AVERROR_INVALIDDATA
;
2798 par
->block_align
= track
->audio
.channels
* 212;
2800 case AV_CODEC_ID_FLAC
:
2801 if (track
->codec_priv
.size
) {
2802 ret
= matroska_parse_flac(s
, track
, extradata_offset
);
2807 case AV_CODEC_ID_WAVPACK
:
2808 if (track
->codec_priv
.size
< 2) {
2809 av_log(matroska
->ctx
, AV_LOG_INFO
, "Assuming WavPack version 4.10 "
2810 "in absence of valid CodecPrivate.\n");
2811 extradata_size
= WAVPACK_EXTRADATA_SIZE
;
2812 AV_WL16(extradata
, 0x410);
2817 if (extradata_size
> 0) {
2818 ret
= ff_alloc_extradata(par
, extradata_size
);
2821 memcpy(par
->extradata
, extradata
, extradata_size
);
2827 /* Performs the generic part of parsing an audio track. */
2828 static int mka_parse_audio(MatroskaTrack
*track
, AVStream
*st
,
2829 AVCodecParameters
*par
,
2830 const MatroskaDemuxContext
*matroska
,
2831 AVFormatContext
*s
, int *extradata_offset
)
2833 FFStream
*const sti
= ffstream(st
);
2836 ret
= mka_parse_audio_codec(track
, par
, matroska
,
2837 s
, extradata_offset
);
2841 par
->codec_type
= AVMEDIA_TYPE_AUDIO
;
2842 par
->sample_rate
= track
->audio
.out_samplerate
;
2843 // channel layout may be already set by codec private checks above
2844 if (!av_channel_layout_check(&par
->ch_layout
)) {
2845 if (track
->audio
.channels
> INT32_MAX
)
2846 return AVERROR_PATCHWELCOME
;
2847 par
->ch_layout
.order
= AV_CHANNEL_ORDER_UNSPEC
;
2848 par
->ch_layout
.nb_channels
= track
->audio
.channels
;
2850 if (!par
->bits_per_coded_sample
)
2851 par
->bits_per_coded_sample
= track
->audio
.bitdepth
;
2852 if (par
->codec_id
== AV_CODEC_ID_MP3
||
2853 par
->codec_id
== AV_CODEC_ID_MLP
||
2854 par
->codec_id
== AV_CODEC_ID_TRUEHD
)
2855 sti
->need_parsing
= AVSTREAM_PARSE_FULL
;
2856 else if (par
->codec_id
!= AV_CODEC_ID_AAC
)
2857 sti
->need_parsing
= AVSTREAM_PARSE_HEADERS
;
2858 if (track
->codec_delay
> 0) {
2859 par
->initial_padding
= av_rescale_q(track
->codec_delay
,
2860 (AVRational
){1, 1000000000},
2861 (AVRational
){1, par
->codec_id
== AV_CODEC_ID_OPUS
?
2862 48000 : par
->sample_rate
});
2864 if (track
->seek_preroll
> 0) {
2865 par
->seek_preroll
= av_rescale_q(track
->seek_preroll
,
2866 (AVRational
){1, 1000000000},
2867 (AVRational
){1, par
->sample_rate
});
2873 /* Performs the codec-specific part of parsing a video track. */
2874 static int mkv_parse_video_codec(MatroskaTrack
*track
, AVCodecParameters
*par
,
2875 const MatroskaDemuxContext
*matroska
,
2876 int *extradata_offset
)
2878 if (!strcmp(track
->codec_id
, "V_MS/VFW/FOURCC") &&
2879 track
->codec_priv
.size
>= 40) {
2880 uint32_t size
= AV_RL32A(track
->codec_priv
.data
);
2881 // VFW extradata is padded to an even length, yet
2882 // the size field contains the real length.
2883 if (size
& 1 && size
== track
->codec_priv
.size
- 1)
2884 --track
->codec_priv
.size
;
2885 track
->ms_compat
= 1;
2886 par
->bits_per_coded_sample
= AV_RL16(track
->codec_priv
.data
+ 14);
2887 par
->codec_tag
= AV_RL32(track
->codec_priv
.data
+ 16);
2888 par
->codec_id
= ff_codec_get_id(ff_codec_bmp_tags
,
2891 par
->codec_id
= ff_codec_get_id(ff_codec_movvideo_tags
,
2893 *extradata_offset
= 40;
2895 } else if (!strcmp(track
->codec_id
, "V_QUICKTIME") &&
2896 track
->codec_priv
.size
>= 21) {
2897 enum AVCodecID codec_id
;
2899 int ret
= get_qt_codec(track
, &fourcc
, &codec_id
);
2902 if (codec_id
== AV_CODEC_ID_NONE
&& AV_RL32(track
->codec_priv
.data
+4) == AV_RL32("SMI ")) {
2903 fourcc
= MKTAG('S','V','Q','3');
2904 codec_id
= ff_codec_get_id(ff_codec_movvideo_tags
, fourcc
);
2906 par
->codec_id
= codec_id
;
2907 if (codec_id
== AV_CODEC_ID_NONE
)
2908 av_log(matroska
->ctx
, AV_LOG_ERROR
,
2909 "mov FourCC not found %s.\n", av_fourcc2str(fourcc
));
2910 if (track
->codec_priv
.size
>= 86) {
2912 unsigned bit_depth
= AV_RB16(track
->codec_priv
.data
+ 82);
2913 ffio_init_read_context(&b
, track
->codec_priv
.data
,
2914 track
->codec_priv
.size
);
2915 if (ff_get_qtpalette(codec_id
, &b
.pub
, track
->palette
)) {
2917 track
->has_palette
= 1;
2919 par
->bits_per_coded_sample
= bit_depth
;
2921 par
->codec_tag
= fourcc
;
2925 switch (par
->codec_id
) {
2926 case AV_CODEC_ID_RV10
:
2927 case AV_CODEC_ID_RV20
:
2928 case AV_CODEC_ID_RV30
:
2929 case AV_CODEC_ID_RV40
:
2930 *extradata_offset
= 26;
2932 case AV_CODEC_ID_PRORES
:
2933 if (track
->codec_priv
.size
== 4)
2934 par
->codec_tag
= AV_RL32(track
->codec_priv
.data
);
2936 case AV_CODEC_ID_VP9
:
2937 /* we don't need any value stored in CodecPrivate.
2938 * make sure that it's not exported as extradata. */
2939 track
->codec_priv
.size
= 0;
2946 /* Performs the generic part of parsing a video track. */
2947 static int mkv_parse_video(MatroskaTrack
*track
, AVStream
*st
,
2948 AVCodecParameters
*par
,
2949 const MatroskaDemuxContext
*matroska
,
2950 int *extradata_offset
)
2952 FFStream
*const sti
= ffstream(st
);
2953 MatroskaTrackPlane
*planes
;
2954 int display_width_mul
= 1;
2955 int display_height_mul
= 1;
2958 if (track
->video
.color_space
.size
== 4)
2959 par
->codec_tag
= AV_RL32(track
->video
.color_space
.data
);
2961 ret
= mkv_parse_video_codec(track
, par
, matroska
,
2966 par
->codec_type
= AVMEDIA_TYPE_VIDEO
;
2967 par
->width
= track
->video
.pixel_width
;
2968 par
->height
= track
->video
.pixel_height
;
2970 if (track
->video
.interlaced
== MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
)
2971 par
->field_order
= mkv_field_order(matroska
, track
->video
.field_order
);
2972 else if (track
->video
.interlaced
== MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE
)
2973 par
->field_order
= AV_FIELD_PROGRESSIVE
;
2975 if (track
->video
.stereo_mode
&& track
->video
.stereo_mode
< MATROSKA_VIDEO_STEREOMODE_TYPE_NB
)
2976 mkv_stereo_mode_display_mul(track
->video
.stereo_mode
,
2977 &display_width_mul
, &display_height_mul
);
2979 if (track
->video
.display_unit
< MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN
) {
2980 if (track
->video
.display_width
&& track
->video
.display_height
&&
2981 track
->video
.display_width
!= -1 && track
->video
.display_height
!= -1 &&
2982 track
->video
.cropped_height
< INT64_MAX
/ track
->video
.display_width
/ display_width_mul
&&
2983 track
->video
.cropped_width
< INT64_MAX
/ track
->video
.display_height
/ display_height_mul
)
2984 av_reduce(&st
->sample_aspect_ratio
.num
,
2985 &st
->sample_aspect_ratio
.den
,
2986 track
->video
.cropped_height
* track
->video
.display_width
* display_width_mul
,
2987 track
->video
.cropped_width
* track
->video
.display_height
* display_height_mul
,
2990 if (track
->video
.cropped_width
!= track
->video
.pixel_width
||
2991 track
->video
.cropped_height
!= track
->video
.pixel_height
) {
2993 AVPacketSideData
*sd
= av_packet_side_data_new(&st
->codecpar
->coded_side_data
,
2994 &st
->codecpar
->nb_coded_side_data
,
2995 AV_PKT_DATA_FRAME_CROPPING
,
2996 sizeof(uint32_t) * 4, 0);
2998 return AVERROR(ENOMEM
);
3000 cropping
= sd
->data
;
3001 bytestream_put_le32(&cropping
, track
->video
.pixel_cropt
);
3002 bytestream_put_le32(&cropping
, track
->video
.pixel_cropb
);
3003 bytestream_put_le32(&cropping
, track
->video
.pixel_cropl
);
3004 bytestream_put_le32(&cropping
, track
->video
.pixel_cropr
);
3006 if (par
->codec_id
!= AV_CODEC_ID_HEVC
)
3007 sti
->need_parsing
= AVSTREAM_PARSE_HEADERS
;
3009 if (track
->default_duration
) {
3010 int div
= track
->default_duration
<= INT64_MAX
? 1 : 2;
3011 av_reduce(&st
->avg_frame_rate
.num
, &st
->avg_frame_rate
.den
,
3012 1000000000 / div
, track
->default_duration
/ div
, 30000);
3013 #if FF_API_R_FRAME_RATE
3014 if ( st
->avg_frame_rate
.num
< st
->avg_frame_rate
.den
* 1000LL
3015 && st
->avg_frame_rate
.num
> st
->avg_frame_rate
.den
* 5LL)
3016 st
->r_frame_rate
= st
->avg_frame_rate
;
3020 /* export stereo mode flag as metadata tag */
3021 if (track
->video
.stereo_mode
&& track
->video
.stereo_mode
< MATROSKA_VIDEO_STEREOMODE_TYPE_NB
)
3022 av_dict_set(&st
->metadata
, "stereo_mode", ff_matroska_video_stereo_mode
[track
->video
.stereo_mode
], 0);
3024 /* export alpha mode flag as metadata tag */
3025 if (track
->video
.alpha_mode
)
3026 av_dict_set_int(&st
->metadata
, "alpha_mode", 1, 0);
3028 /* if we have virtual track, mark the real tracks */
3029 planes
= track
->operation
.combine_planes
.elem
;
3030 for (int j
= 0; j
< track
->operation
.combine_planes
.nb_elem
; j
++) {
3031 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
3033 if (planes
[j
].type
>= MATROSKA_VIDEO_STEREO_PLANE_COUNT
)
3035 snprintf(buf
, sizeof(buf
), "%s_%d",
3036 matroska_video_stereo_plane
[planes
[j
].type
], st
->index
);
3037 for (int k
= 0; k
< matroska
->tracks
.nb_elem
; k
++)
3038 if (planes
[j
].uid
== tracks
[k
].uid
&& tracks
[k
].stream
) {
3039 av_dict_set(&tracks
[k
].stream
->metadata
,
3040 "stereo_mode", buf
, 0);
3044 // add stream level stereo3d side data if it is a supported format
3045 if (track
->video
.stereo_mode
< MATROSKA_VIDEO_STEREOMODE_TYPE_NB
&&
3046 track
->video
.stereo_mode
!= MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED
&&
3047 track
->video
.stereo_mode
!= MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG
) {
3048 int ret
= mkv_stereo3d_conv(st
, track
->video
.stereo_mode
);
3053 ret
= mkv_parse_video_color(st
, track
);
3056 ret
= mkv_parse_video_projection(st
, track
, matroska
->ctx
);
3063 /* Performs the codec-specific part of parsing a subtitle track. */
3064 static int mkv_parse_subtitle_codec(MatroskaTrack
*track
, AVStream
*st
,
3065 AVCodecParameters
*par
,
3066 const MatroskaDemuxContext
*matroska
)
3068 switch (par
->codec_id
) {
3069 case AV_CODEC_ID_ARIB_CAPTION
:
3070 if (track
->codec_priv
.size
== 3) {
3071 int component_tag
= track
->codec_priv
.data
[0];
3072 int data_component_id
= AV_RB16(track
->codec_priv
.data
+ 1);
3074 switch (data_component_id
) {
3076 // [0x30..0x37] are component tags utilized for
3077 // non-mobile captioning service ("profile A").
3078 if (component_tag
>= 0x30 && component_tag
<= 0x37) {
3079 par
->profile
= AV_PROFILE_ARIB_PROFILE_A
;
3083 // component tag 0x87 signifies a mobile/partial reception
3084 // (1seg) captioning service ("profile C").
3085 if (component_tag
== 0x87) {
3086 par
->profile
= AV_PROFILE_ARIB_PROFILE_C
;
3093 if (par
->profile
== AV_PROFILE_UNKNOWN
)
3094 av_log(matroska
->ctx
, AV_LOG_WARNING
,
3095 "Unknown ARIB caption profile utilized: %02x / %04x\n",
3096 component_tag
, data_component_id
);
3098 track
->codec_priv
.size
= 0;
3101 case AV_CODEC_ID_WEBVTT
:
3102 if (!strcmp(track
->codec_id
, "D_WEBVTT/CAPTIONS")) {
3103 st
->disposition
|= AV_DISPOSITION_CAPTIONS
;
3104 } else if (!strcmp(track
->codec_id
, "D_WEBVTT/DESCRIPTIONS")) {
3105 st
->disposition
|= AV_DISPOSITION_DESCRIPTIONS
;
3106 } else if (!strcmp(track
->codec_id
, "D_WEBVTT/METADATA")) {
3107 st
->disposition
|= AV_DISPOSITION_METADATA
;
3115 static int matroska_parse_tracks(AVFormatContext
*s
)
3117 MatroskaDemuxContext
*matroska
= s
->priv_data
;
3118 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
3121 for (i
= 0; i
< matroska
->tracks
.nb_elem
; i
++) {
3122 MatroskaTrack
*track
= &tracks
[i
];
3123 enum AVCodecID codec_id
= AV_CODEC_ID_NONE
;
3124 AVCodecParameters
*par
;
3125 MatroskaTrackType type
;
3126 int extradata_offset
= 0;
3128 char* key_id_base64
= NULL
;
3130 /* Apply some sanity checks. */
3131 if (track
->type
!= MATROSKA_TRACK_TYPE_VIDEO
&&
3132 track
->type
!= MATROSKA_TRACK_TYPE_AUDIO
&&
3133 track
->type
!= MATROSKA_TRACK_TYPE_SUBTITLE
&&
3134 track
->type
!= MATROSKA_TRACK_TYPE_METADATA
) {
3135 av_log(matroska
->ctx
, AV_LOG_INFO
,
3136 "Unknown or unsupported track type %"PRIu64
"\n",
3140 if (!track
->codec_id
)
3143 if ( track
->type
== MATROSKA_TRACK_TYPE_AUDIO
&& track
->codec_id
[0] != 'A'
3144 || track
->type
== MATROSKA_TRACK_TYPE_VIDEO
&& track
->codec_id
[0] != 'V'
3145 || track
->type
== MATROSKA_TRACK_TYPE_SUBTITLE
&& track
->codec_id
[0] != 'D' && track
->codec_id
[0] != 'S'
3146 || track
->type
== MATROSKA_TRACK_TYPE_METADATA
&& track
->codec_id
[0] != 'D' && track
->codec_id
[0] != 'S'
3148 av_log(matroska
->ctx
, AV_LOG_INFO
, "Inconsistent track type\n");
3152 if (track
->audio
.samplerate
< 0 || track
->audio
.samplerate
> INT_MAX
||
3153 isnan(track
->audio
.samplerate
)) {
3154 av_log(matroska
->ctx
, AV_LOG_WARNING
,
3155 "Invalid sample rate %f, defaulting to 8000 instead.\n",
3156 track
->audio
.samplerate
);
3157 track
->audio
.samplerate
= 8000;
3160 if (track
->type
== MATROSKA_TRACK_TYPE_VIDEO
) {
3161 if (!track
->default_duration
&& track
->video
.frame_rate
> 0) {
3162 double default_duration
= 1000000000 / track
->video
.frame_rate
;
3163 if (default_duration
> UINT64_MAX
|| default_duration
< 0) {
3164 av_log(matroska
->ctx
, AV_LOG_WARNING
,
3165 "Invalid frame rate %e. Cannot calculate default duration.\n",
3166 track
->video
.frame_rate
);
3168 track
->default_duration
= default_duration
;
3171 int has_dimensions
= track
->video
.pixel_width
|| track
->video
.pixel_height
;
3172 if ((matroska
->ctx
->strict_std_compliance
>= FF_COMPLIANCE_STRICT
&&
3173 (!track
->video
.pixel_width
|| !track
->video
.pixel_height
)) ||
3174 (track
->video
.pixel_cropl
>= INT_MAX
- track
->video
.pixel_cropr
||
3175 track
->video
.pixel_cropt
>= INT_MAX
- track
->video
.pixel_cropb
||
3176 (track
->video
.pixel_cropl
+ track
->video
.pixel_cropr
) >= track
->video
.pixel_width
+ !has_dimensions
||
3177 (track
->video
.pixel_cropt
+ track
->video
.pixel_cropb
) >= track
->video
.pixel_height
+ !has_dimensions
)) {
3178 av_log(matroska
->ctx
, AV_LOG_ERROR
,
3179 "Invalid coded dimensions %"PRId64
"x%"PRId64
" [%"PRId64
", %"PRId64
", %"PRId64
", %"PRId64
"].\n",
3180 track
->video
.pixel_width
, track
->video
.pixel_height
,
3181 track
->video
.pixel_cropl
, track
->video
.pixel_cropr
,
3182 track
->video
.pixel_cropt
, track
->video
.pixel_cropb
);
3183 return AVERROR_INVALIDDATA
;
3185 track
->video
.cropped_width
= track
->video
.pixel_width
-
3186 track
->video
.pixel_cropl
- track
->video
.pixel_cropr
;
3187 track
->video
.cropped_height
= track
->video
.pixel_height
-
3188 track
->video
.pixel_cropt
- track
->video
.pixel_cropb
;
3189 if (track
->video
.display_unit
== MATROSKA_VIDEO_DISPLAYUNIT_PIXELS
) {
3190 if (track
->video
.display_width
== -1)
3191 track
->video
.display_width
= track
->video
.cropped_width
;
3192 if (track
->video
.display_height
== -1)
3193 track
->video
.display_height
= track
->video
.cropped_height
;
3195 } else if (track
->type
== MATROSKA_TRACK_TYPE_AUDIO
) {
3196 if (!track
->audio
.out_samplerate
)
3197 track
->audio
.out_samplerate
= track
->audio
.samplerate
;
3199 ret
= matroska_parse_content_encodings(track
->encodings
.elem
,
3200 track
->encodings
.nb_elem
,
3201 track
, &key_id_base64
, matroska
->ctx
);
3205 for (j
= 0; ff_mkv_codec_tags
[j
].id
!= AV_CODEC_ID_NONE
; j
++) {
3206 if (av_strstart(track
->codec_id
, ff_mkv_codec_tags
[j
].str
, NULL
)) {
3207 codec_id
= ff_mkv_codec_tags
[j
].id
;
3212 st
= track
->stream
= avformat_new_stream(s
, NULL
);
3214 av_free(key_id_base64
);
3215 return AVERROR(ENOMEM
);
3219 par
->codec_id
= codec_id
;
3221 if (track
->flag_default
)
3222 st
->disposition
|= AV_DISPOSITION_DEFAULT
;
3223 if (track
->flag_forced
)
3224 st
->disposition
|= AV_DISPOSITION_FORCED
;
3225 if (track
->flag_comment
)
3226 st
->disposition
|= AV_DISPOSITION_COMMENT
;
3227 if (track
->flag_hearingimpaired
)
3228 st
->disposition
|= AV_DISPOSITION_HEARING_IMPAIRED
;
3229 if (track
->flag_visualimpaired
)
3230 st
->disposition
|= AV_DISPOSITION_VISUAL_IMPAIRED
;
3231 if (track
->flag_original
.count
> 0)
3232 st
->disposition
|= track
->flag_original
.el
.u
? AV_DISPOSITION_ORIGINAL
3233 : AV_DISPOSITION_DUB
;
3235 if (key_id_base64
) {
3236 /* export encryption key id as base64 metadata tag */
3237 av_dict_set(&st
->metadata
, "enc_key_id", key_id_base64
,
3238 AV_DICT_DONT_STRDUP_VAL
);
3241 if (strcmp(track
->language
, "und"))
3242 av_dict_set(&st
->metadata
, "language", track
->language
, 0);
3243 av_dict_set(&st
->metadata
, "title", track
->name
, 0);
3245 if (track
->time_scale
< 0.01) {
3246 av_log(matroska
->ctx
, AV_LOG_WARNING
,
3247 "Track TimestampScale too small %f, assuming 1.0.\n",
3249 track
->time_scale
= 1.0;
3252 if (matroska
->time_scale
* track
->time_scale
> UINT_MAX
)
3253 return AVERROR_INVALIDDATA
;
3255 avpriv_set_pts_info(st
, 64, matroska
->time_scale
* track
->time_scale
,
3256 1000 * 1000 * 1000); /* 64 bit pts in ns */
3258 /* convert the delay from ns to the track timebase */
3259 track
->codec_delay_in_track_tb
= av_rescale_q(track
->codec_delay
,
3260 (AVRational
){ 1, 1000000000 },
3264 if (par
->codec_id
== AV_CODEC_ID_WEBVTT
)
3265 type
= MATROSKA_TRACK_TYPE_SUBTITLE
;
3267 case MATROSKA_TRACK_TYPE_AUDIO
:
3268 ret
= mka_parse_audio(track
, st
, par
, matroska
,
3269 s
, &extradata_offset
);
3272 if (ret
== SKIP_TRACK
)
3275 case MATROSKA_TRACK_TYPE_VIDEO
:
3276 ret
= mkv_parse_video(track
, st
, par
, matroska
, &extradata_offset
);
3280 case MATROSKA_TRACK_TYPE_SUBTITLE
:
3281 ret
= mkv_parse_subtitle_codec(track
, st
, par
, matroska
);
3284 par
->codec_type
= AVMEDIA_TYPE_SUBTITLE
;
3286 if (track
->flag_textdescriptions
)
3287 st
->disposition
|= AV_DISPOSITION_DESCRIPTIONS
;
3291 if (par
->codec_id
== AV_CODEC_ID_NONE
)
3292 av_log(matroska
->ctx
, AV_LOG_INFO
,
3293 "Unknown/unsupported AVCodecID %s.\n", track
->codec_id
);
3295 if (!par
->extradata
&& track
->codec_priv
.size
> extradata_offset
) {
3296 const uint8_t *src
= track
->codec_priv
.data
+ extradata_offset
;
3297 unsigned extra_size
= track
->codec_priv
.size
- extradata_offset
;
3298 ret
= ff_alloc_extradata(par
, extra_size
);
3301 memcpy(par
->extradata
, src
, extra_size
);
3304 ret
= mkv_parse_block_addition_mappings(s
, st
, track
);
3312 static int matroska_read_header(AVFormatContext
*s
)
3314 FFFormatContext
*const si
= ffformatcontext(s
);
3315 MatroskaDemuxContext
*matroska
= s
->priv_data
;
3316 EbmlList
*attachments_list
= &matroska
->attachments
;
3317 EbmlList
*chapters_list
= &matroska
->chapters
;
3318 MatroskaAttachment
*attachments
;
3319 MatroskaChapter
*chapters
;
3320 uint64_t max_start
= 0;
3326 matroska
->cues_parsing_deferred
= 1;
3328 /* First read the EBML header. */
3329 if (ebml_parse(matroska
, ebml_syntax
, &ebml
) || !ebml
.doctype
) {
3330 av_log(matroska
->ctx
, AV_LOG_ERROR
, "EBML header parsing failed\n");
3331 ebml_free(ebml_syntax
, &ebml
);
3332 return AVERROR_INVALIDDATA
;
3334 if (ebml
.version
> EBML_VERSION
||
3335 ebml
.max_size
> sizeof(uint64_t) ||
3336 ebml
.id_length
> sizeof(uint32_t) ||
3337 ebml
.doctype_version
> 3) {
3338 avpriv_report_missing_feature(matroska
->ctx
,
3339 "EBML version %"PRIu64
", doctype %s, doc version %"PRIu64
,
3340 ebml
.version
, ebml
.doctype
, ebml
.doctype_version
);
3341 ebml_free(ebml_syntax
, &ebml
);
3342 return AVERROR_PATCHWELCOME
;
3343 } else if (ebml
.doctype_version
== 3) {
3344 av_log(matroska
->ctx
, AV_LOG_WARNING
,
3345 "EBML header using unsupported features\n"
3346 "(EBML version %"PRIu64
", doctype %s, doc version %"PRIu64
")\n",
3347 ebml
.version
, ebml
.doctype
, ebml
.doctype_version
);
3349 for (i
= 0; i
< FF_ARRAY_ELEMS(matroska_doctypes
); i
++)
3350 if (!strcmp(ebml
.doctype
, matroska_doctypes
[i
]))
3352 if (i
>= FF_ARRAY_ELEMS(matroska_doctypes
)) {
3353 av_log(s
, AV_LOG_WARNING
, "Unknown EBML doctype '%s'\n", ebml
.doctype
);
3354 if (matroska
->ctx
->error_recognition
& AV_EF_EXPLODE
) {
3355 ebml_free(ebml_syntax
, &ebml
);
3356 return AVERROR_INVALIDDATA
;
3359 matroska
->is_webm
= !strcmp(ebml
.doctype
, "webm");
3361 ebml_free(ebml_syntax
, &ebml
);
3363 matroska
->pkt
= si
->parse_pkt
;
3365 /* The next thing is a segment. */
3366 pos
= avio_tell(matroska
->ctx
->pb
);
3367 res
= ebml_parse(matroska
, matroska_segments
, matroska
);
3368 // Try resyncing until we find an EBML_STOP type element.
3370 res
= matroska_resync(matroska
, pos
);
3373 pos
= avio_tell(matroska
->ctx
->pb
);
3374 res
= ebml_parse(matroska
, matroska_segment
, matroska
);
3375 if (res
== AVERROR(EIO
)) // EOF is translated to EIO, this exists the loop on EOF
3378 /* Set data_offset as it might be needed later by seek_frame_generic. */
3379 if (matroska
->current_id
== MATROSKA_ID_CLUSTER
)
3380 si
->data_offset
= avio_tell(matroska
->ctx
->pb
) - 4;
3381 matroska_execute_seekhead(matroska
);
3383 if (!matroska
->time_scale
)
3384 matroska
->time_scale
= 1000000;
3385 if (isnan(matroska
->duration
))
3386 matroska
->duration
= 0;
3387 if (matroska
->duration
)
3388 matroska
->ctx
->duration
= matroska
->duration
* matroska
->time_scale
*
3389 1000 / AV_TIME_BASE
;
3390 av_dict_set(&s
->metadata
, "title", matroska
->title
, 0);
3391 av_dict_set(&s
->metadata
, "encoder", matroska
->muxingapp
, 0);
3393 if (matroska
->date_utc
.size
== 8)
3394 matroska_metadata_creation_time(&s
->metadata
, AV_RB64(matroska
->date_utc
.data
));
3396 res
= matroska_parse_tracks(s
);
3400 attachments
= attachments_list
->elem
;
3401 for (j
= 0; j
< attachments_list
->nb_elem
; j
++) {
3402 if (!(attachments
[j
].filename
&& attachments
[j
].mime
&&
3403 attachments
[j
].bin
.data
&& attachments
[j
].bin
.size
> 0)) {
3404 av_log(matroska
->ctx
, AV_LOG_ERROR
, "incomplete attachment\n");
3406 AVStream
*st
= avformat_new_stream(s
, NULL
);
3409 av_dict_set(&st
->metadata
, "filename", attachments
[j
].filename
, 0);
3410 av_dict_set(&st
->metadata
, "mimetype", attachments
[j
].mime
, 0);
3411 if (attachments
[j
].description
)
3412 av_dict_set(&st
->metadata
, "title", attachments
[j
].description
, 0);
3413 st
->codecpar
->codec_id
= AV_CODEC_ID_NONE
;
3415 for (i
= 0; mkv_image_mime_tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++) {
3416 if (av_strstart(attachments
[j
].mime
, mkv_image_mime_tags
[i
].str
, NULL
)) {
3417 st
->codecpar
->codec_id
= mkv_image_mime_tags
[i
].id
;
3422 attachments
[j
].stream
= st
;
3424 if (st
->codecpar
->codec_id
!= AV_CODEC_ID_NONE
) {
3425 res
= ff_add_attached_pic(s
, st
, NULL
, &attachments
[j
].bin
.buf
, 0);
3429 st
->codecpar
->codec_type
= AVMEDIA_TYPE_ATTACHMENT
;
3430 if (ff_alloc_extradata(st
->codecpar
, attachments
[j
].bin
.size
))
3432 memcpy(st
->codecpar
->extradata
, attachments
[j
].bin
.data
,
3433 attachments
[j
].bin
.size
);
3435 for (i
= 0; mkv_mime_tags
[i
].id
!= AV_CODEC_ID_NONE
; i
++) {
3436 if (av_strstart(attachments
[j
].mime
, mkv_mime_tags
[i
].str
, NULL
)) {
3437 st
->codecpar
->codec_id
= mkv_mime_tags
[i
].id
;
3445 chapters
= chapters_list
->elem
;
3446 for (i
= 0; i
< chapters_list
->nb_elem
; i
++)
3447 if (chapters
[i
].start
!= AV_NOPTS_VALUE
&& chapters
[i
].uid
&&
3448 (max_start
== 0 || chapters
[i
].start
> max_start
)) {
3449 chapters
[i
].chapter
=
3450 avpriv_new_chapter(s
, chapters
[i
].uid
,
3451 (AVRational
) { 1, 1000000000 },
3452 chapters
[i
].start
, chapters
[i
].end
,
3454 max_start
= chapters
[i
].start
;
3457 matroska_add_index_entries(matroska
);
3459 matroska_convert_tags(s
);
3465 * Put one packet in an application-supplied AVPacket struct.
3466 * Returns 0 on success or -1 on failure.
3468 static int matroska_deliver_packet(MatroskaDemuxContext
*matroska
,
3471 if (matroska
->queue
.head
) {
3472 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
3473 MatroskaTrack
*track
;
3475 avpriv_packet_list_get(&matroska
->queue
, pkt
);
3476 track
= &tracks
[pkt
->stream_index
];
3477 if (track
->has_palette
) {
3478 uint8_t *pal
= av_packet_new_side_data(pkt
, AV_PKT_DATA_PALETTE
, AVPALETTE_SIZE
);
3480 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Cannot append palette to packet\n");
3482 memcpy(pal
, track
->palette
, AVPALETTE_SIZE
);
3484 track
->has_palette
= 0;
3493 * Free all packets in our internal queue.
3495 static void matroska_clear_queue(MatroskaDemuxContext
*matroska
)
3497 avpriv_packet_list_free(&matroska
->queue
);
3500 static int matroska_parse_laces(MatroskaDemuxContext
*matroska
, uint8_t **buf
,
3501 int size
, int type
, AVIOContext
*pb
,
3502 uint32_t lace_size
[256], int *laces
)
3505 uint8_t *data
= *buf
;
3509 lace_size
[0] = size
;
3514 return AVERROR_INVALIDDATA
;
3521 case 0x1: /* Xiph lacing */
3525 for (n
= 0; n
< *laces
- 1; n
++) {
3530 return AVERROR_INVALIDDATA
;
3533 lace_size
[n
] += temp
;
3536 } while (temp
== 0xff);
3539 return AVERROR_INVALIDDATA
;
3541 lace_size
[n
] = size
- total
;
3545 case 0x2: /* fixed-size lacing */
3546 if (size
% (*laces
))
3547 return AVERROR_INVALIDDATA
;
3548 for (n
= 0; n
< *laces
; n
++)
3549 lace_size
[n
] = size
/ *laces
;
3552 case 0x3: /* EBML lacing */
3560 n
= ebml_read_num(matroska
, pb
, 8, &num
, 1);
3564 return AVERROR_INVALIDDATA
;
3566 total
= lace_size
[0] = num
;
3568 for (n
= 1; n
< *laces
- 1; n
++) {
3571 r
= matroska_ebmlnum_sint(matroska
, pb
, &snum
);
3574 if (lace_size
[n
- 1] + snum
> (uint64_t)INT_MAX
)
3575 return AVERROR_INVALIDDATA
;
3577 lace_size
[n
] = lace_size
[n
- 1] + snum
;
3578 total
+= lace_size
[n
];
3584 return AVERROR_INVALIDDATA
;
3586 lace_size
[*laces
- 1] = size
- total
;
3596 static int matroska_parse_rm_audio(MatroskaDemuxContext
*matroska
,
3597 MatroskaTrack
*track
, AVStream
*st
,
3598 uint8_t *data
, int size
, uint64_t timecode
,
3601 const int a
= st
->codecpar
->block_align
;
3602 const int sps
= track
->audio
.sub_packet_size
;
3603 const int cfs
= track
->audio
.coded_framesize
;
3604 const int h
= track
->audio
.sub_packet_h
;
3605 const int w
= track
->audio
.frame_size
;
3606 int y
= track
->audio
.sub_packet_cnt
;
3609 if (!track
->audio
.pkt_cnt
) {
3610 if (track
->audio
.sub_packet_cnt
== 0)
3611 track
->audio
.buf_timecode
= timecode
;
3612 if (st
->codecpar
->codec_id
== AV_CODEC_ID_RA_288
) {
3613 if (size
< cfs
* h
/ 2) {
3614 av_log(matroska
->ctx
, AV_LOG_ERROR
,
3615 "Corrupt int4 RM-style audio packet size\n");
3616 return AVERROR_INVALIDDATA
;
3618 for (x
= 0; x
< h
/ 2; x
++)
3619 memcpy(track
->audio
.buf
+ x
* 2 * w
+ y
* cfs
,
3620 data
+ x
* cfs
, cfs
);
3621 } else if (st
->codecpar
->codec_id
== AV_CODEC_ID_SIPR
) {
3623 av_log(matroska
->ctx
, AV_LOG_ERROR
,
3624 "Corrupt sipr RM-style audio packet size\n");
3625 return AVERROR_INVALIDDATA
;
3627 memcpy(track
->audio
.buf
+ y
* w
, data
, w
);
3630 av_log(matroska
->ctx
, AV_LOG_ERROR
,
3631 "Corrupt generic RM-style audio packet size\n");
3632 return AVERROR_INVALIDDATA
;
3634 for (x
= 0; x
< w
/ sps
; x
++)
3635 memcpy(track
->audio
.buf
+
3636 sps
* (h
* x
+ ((h
+ 1) / 2) * (y
& 1) + (y
>> 1)),
3637 data
+ x
* sps
, sps
);
3640 if (++track
->audio
.sub_packet_cnt
>= h
) {
3641 if (st
->codecpar
->codec_id
== AV_CODEC_ID_SIPR
)
3642 ff_rm_reorder_sipr_data(track
->audio
.buf
, h
, w
);
3643 track
->audio
.sub_packet_cnt
= 0;
3644 track
->audio
.pkt_cnt
= h
* w
/ a
;
3648 while (track
->audio
.pkt_cnt
) {
3650 AVPacket
*pkt
= matroska
->pkt
;
3652 ret
= av_new_packet(pkt
, a
);
3657 track
->audio
.buf
+ a
* (h
* w
/ a
- track
->audio
.pkt_cnt
--),
3659 pkt
->pts
= track
->audio
.buf_timecode
;
3660 track
->audio
.buf_timecode
= AV_NOPTS_VALUE
;
3662 pkt
->stream_index
= st
->index
;
3663 ret
= avpriv_packet_list_put(&matroska
->queue
, pkt
, NULL
, 0);
3665 av_packet_unref(pkt
);
3666 return AVERROR(ENOMEM
);
3673 /* reconstruct full wavpack blocks from mangled matroska ones */
3674 static int matroska_parse_wavpack(MatroskaTrack
*track
,
3675 uint8_t **data
, int *size
)
3677 uint8_t *dst
= NULL
;
3678 uint8_t *src
= *data
;
3683 int ret
, offset
= 0;
3686 return AVERROR_INVALIDDATA
;
3688 av_assert1(track
->stream
->codecpar
->extradata_size
>= 2);
3689 ver
= AV_RL16(track
->stream
->codecpar
->extradata
);
3691 samples
= AV_RL32(src
);
3695 while (srclen
>= 8) {
3700 uint32_t flags
= AV_RL32(src
);
3701 uint32_t crc
= AV_RL32(src
+ 4);
3705 multiblock
= (flags
& 0x1800) != 0x1800;
3708 ret
= AVERROR_INVALIDDATA
;
3711 blocksize
= AV_RL32(src
);
3717 if (blocksize
> srclen
) {
3718 ret
= AVERROR_INVALIDDATA
;
3722 tmp
= av_realloc(dst
, dstlen
+ blocksize
+ 32 + AV_INPUT_BUFFER_PADDING_SIZE
);
3724 ret
= AVERROR(ENOMEM
);
3728 dstlen
+= blocksize
+ 32;
3730 AV_WL32(dst
+ offset
, MKTAG('w', 'v', 'p', 'k')); // tag
3731 AV_WL32(dst
+ offset
+ 4, blocksize
+ 24); // blocksize - 8
3732 AV_WL16(dst
+ offset
+ 8, ver
); // version
3733 AV_WL16(dst
+ offset
+ 10, 0); // track/index_no
3734 AV_WL32(dst
+ offset
+ 12, 0); // total samples
3735 AV_WL32(dst
+ offset
+ 16, 0); // block index
3736 AV_WL32(dst
+ offset
+ 20, samples
); // number of samples
3737 AV_WL32(dst
+ offset
+ 24, flags
); // flags
3738 AV_WL32(dst
+ offset
+ 28, crc
); // crc
3739 memcpy(dst
+ offset
+ 32, src
, blocksize
); // block data
3742 srclen
-= blocksize
;
3743 offset
+= blocksize
+ 32;
3746 memset(dst
+ dstlen
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
3758 static int matroska_parse_prores(MatroskaTrack
*track
,
3759 uint8_t **data
, int *size
)
3762 int dstlen
= *size
+ 8;
3764 dst
= av_malloc(dstlen
+ AV_INPUT_BUFFER_PADDING_SIZE
);
3766 return AVERROR(ENOMEM
);
3768 AV_WB32(dst
, dstlen
);
3769 AV_WB32(dst
+ 4, MKBETAG('i', 'c', 'p', 'f'));
3770 memcpy(dst
+ 8, *data
, dstlen
- 8);
3771 memset(dst
+ dstlen
, 0, AV_INPUT_BUFFER_PADDING_SIZE
);
3779 static int matroska_parse_webvtt(MatroskaDemuxContext
*matroska
,
3780 MatroskaTrack
*track
,
3782 uint8_t *data
, int data_len
,
3787 AVPacket
*pkt
= matroska
->pkt
;
3788 uint8_t *id
, *settings
, *text
, *buf
;
3789 int id_len
, settings_len
, text_len
;
3794 return AVERROR_INVALIDDATA
;
3797 q
= data
+ data_len
;
3802 if (*p
== '\r' || *p
== '\n') {
3811 if (p
>= q
|| *p
!= '\n')
3812 return AVERROR_INVALIDDATA
;
3818 if (*p
== '\r' || *p
== '\n') {
3819 settings_len
= p
- settings
;
3827 if (p
>= q
|| *p
!= '\n')
3828 return AVERROR_INVALIDDATA
;
3833 while (text_len
> 0) {
3834 const int len
= text_len
- 1;
3835 const uint8_t c
= p
[len
];
3836 if (c
!= '\r' && c
!= '\n')
3841 err
= av_new_packet(pkt
, text_len
);
3846 memcpy(pkt
->data
, text
, text_len
);
3849 buf
= av_packet_new_side_data(pkt
,
3850 AV_PKT_DATA_WEBVTT_IDENTIFIER
,
3853 av_packet_unref(pkt
);
3854 return AVERROR(ENOMEM
);
3856 memcpy(buf
, id
, id_len
);
3859 if (settings_len
> 0) {
3860 buf
= av_packet_new_side_data(pkt
,
3861 AV_PKT_DATA_WEBVTT_SETTINGS
,
3864 av_packet_unref(pkt
);
3865 return AVERROR(ENOMEM
);
3867 memcpy(buf
, settings
, settings_len
);
3870 // Do we need this for subtitles?
3871 // pkt->flags = AV_PKT_FLAG_KEY;
3873 pkt
->stream_index
= st
->index
;
3874 pkt
->pts
= timecode
;
3876 // Do we need this for subtitles?
3877 // pkt->dts = timecode;
3879 pkt
->duration
= duration
;
3882 err
= avpriv_packet_list_put(&matroska
->queue
, pkt
, NULL
, 0);
3884 av_packet_unref(pkt
);
3885 return AVERROR(ENOMEM
);
3891 static int matroska_parse_block_additional(MatroskaDemuxContext
*matroska
,
3892 MatroskaTrack
*track
, AVPacket
*pkt
,
3893 const uint8_t *data
, int size
, uint64_t id
)
3895 const EbmlList
*mappings_list
= &track
->block_addition_mappings
;
3896 MatroskaBlockAdditionMapping
*mappings
= mappings_list
->elem
, *mapping
= NULL
;
3900 if (!matroska
->is_webm
&& track
->max_block_additional_id
&& id
> track
->max_block_additional_id
) {
3901 int strict
= matroska
->ctx
->strict_std_compliance
>= FF_COMPLIANCE_STRICT
;
3902 av_log(matroska
->ctx
, strict
? AV_LOG_ERROR
: AV_LOG_WARNING
,
3903 "BlockAddID %"PRIu64
" is higher than the reported MaxBlockAdditionID %"PRIu64
" "
3904 "for Track with TrackNumber %"PRIu64
"\n", id
, track
->max_block_additional_id
,
3907 return AVERROR_INVALIDDATA
;
3910 for (int i
= 0; i
< mappings_list
->nb_elem
; i
++) {
3911 if (id
!= mappings
[i
].value
)
3913 mapping
= &mappings
[i
];
3917 if (id
!= 1 && !matroska
->is_webm
&& !mapping
) {
3918 av_log(matroska
->ctx
, AV_LOG_WARNING
, "BlockAddID %"PRIu64
" has no mapping. Skipping\n", id
);
3922 if (mapping
&& mapping
->type
)
3926 case MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35
: {
3928 int country_code
, provider_code
;
3929 int provider_oriented_code
, application_identifier
;
3930 size_t hdrplus_size
;
3931 AVDynamicHDRPlus
*hdrplus
;
3936 bytestream2_init(&bc
, data
, size
);
3938 /* ITU-T T.35 metadata */
3939 country_code
= bytestream2_get_byteu(&bc
);
3940 provider_code
= bytestream2_get_be16u(&bc
);
3942 if (country_code
!= ITU_T_T35_COUNTRY_CODE_US
||
3943 provider_code
!= ITU_T_T35_PROVIDER_CODE_SAMSUNG
)
3946 provider_oriented_code
= bytestream2_get_be16u(&bc
);
3947 application_identifier
= bytestream2_get_byteu(&bc
);
3949 if (provider_oriented_code
!= 1 || application_identifier
!= 4)
3952 hdrplus
= av_dynamic_hdr_plus_alloc(&hdrplus_size
);
3954 return AVERROR(ENOMEM
);
3956 if ((res
= av_dynamic_hdr_plus_from_t35(hdrplus
, bc
.buffer
,
3957 bytestream2_get_bytes_left(&bc
))) < 0 ||
3958 (res
= av_packet_add_side_data(pkt
, AV_PKT_DATA_DYNAMIC_HDR10_PLUS
,
3959 (uint8_t *)hdrplus
, hdrplus_size
)) < 0) {
3970 side_data
= av_packet_new_side_data(pkt
, AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
,
3973 return AVERROR(ENOMEM
);
3975 AV_WB64(side_data
, id
);
3976 memcpy(side_data
+ 8, data
, size
);
3981 static int matroska_parse_frame(MatroskaDemuxContext
*matroska
,
3982 MatroskaTrack
*track
, AVStream
*st
,
3983 AVBufferRef
*buf
, uint8_t *data
, int pkt_size
,
3984 uint64_t timecode
, uint64_t lace_duration
,
3985 int64_t pos
, int is_keyframe
,
3986 MatroskaBlockMore
*blockmore
, int nb_blockmore
,
3987 int64_t discard_padding
)
3989 uint8_t *pkt_data
= data
;
3991 AVPacket
*pkt
= matroska
->pkt
;
3993 if (st
->codecpar
->codec_id
== AV_CODEC_ID_WAVPACK
) {
3994 res
= matroska_parse_wavpack(track
, &pkt_data
, &pkt_size
);
3996 av_log(matroska
->ctx
, AV_LOG_ERROR
,
3997 "Error parsing a wavpack block.\n");
4005 if (st
->codecpar
->codec_id
== AV_CODEC_ID_PRORES
&&
4006 AV_RB32(pkt_data
+ 4) != MKBETAG('i', 'c', 'p', 'f')) {
4007 res
= matroska_parse_prores(track
, &pkt_data
, &pkt_size
);
4009 av_log(matroska
->ctx
, AV_LOG_ERROR
,
4010 "Error parsing a prores block.\n");
4018 if (!pkt_size
&& !nb_blockmore
)
4021 if (!matroska
->is_webm
&& nb_blockmore
&& !track
->max_block_additional_id
) {
4022 int strict
= matroska
->ctx
->strict_std_compliance
>= FF_COMPLIANCE_STRICT
;
4023 av_log(matroska
->ctx
, strict
? AV_LOG_ERROR
: AV_LOG_WARNING
,
4024 "Unexpected BlockAdditions found in a Block from Track with TrackNumber %"PRIu64
" "
4025 "where MaxBlockAdditionID is 0\n", track
->num
);
4027 res
= AVERROR_INVALIDDATA
;
4033 pkt
->buf
= av_buffer_create(pkt_data
, pkt_size
+ AV_INPUT_BUFFER_PADDING_SIZE
,
4036 pkt
->buf
= av_buffer_ref(buf
);
4039 res
= AVERROR(ENOMEM
);
4043 pkt
->data
= pkt_data
;
4044 pkt
->size
= pkt_size
;
4045 pkt
->flags
= is_keyframe
;
4046 pkt
->stream_index
= st
->index
;
4048 for (int i
= 0; i
< nb_blockmore
; i
++) {
4049 MatroskaBlockMore
*more
= &blockmore
[i
];
4051 if (!more
->additional
.size
)
4054 res
= matroska_parse_block_additional(matroska
, track
, pkt
, more
->additional
.data
,
4055 more
->additional
.size
, more
->additional_id
);
4057 av_packet_unref(pkt
);
4062 if (discard_padding
) {
4063 uint8_t *side_data
= av_packet_new_side_data(pkt
,
4064 AV_PKT_DATA_SKIP_SAMPLES
,
4067 av_packet_unref(pkt
);
4068 return AVERROR(ENOMEM
);
4070 discard_padding
= av_rescale_q(discard_padding
,
4071 (AVRational
){1, 1000000000},
4072 (AVRational
){1, st
->codecpar
->sample_rate
});
4073 if (discard_padding
> 0) {
4074 AV_WL32A(side_data
+ 4, discard_padding
);
4076 AV_WL32A(side_data
, -discard_padding
);
4080 if (track
->ms_compat
)
4081 pkt
->dts
= timecode
;
4083 pkt
->pts
= timecode
;
4085 pkt
->duration
= lace_duration
;
4087 res
= avpriv_packet_list_put(&matroska
->queue
, pkt
, NULL
, 0);
4089 av_packet_unref(pkt
);
4090 return AVERROR(ENOMEM
);
4102 static int matroska_parse_block(MatroskaDemuxContext
*matroska
, AVBufferRef
*buf
, uint8_t *data
,
4103 int size
, int64_t pos
, uint64_t cluster_time
,
4104 uint64_t block_duration
, int is_keyframe
,
4105 MatroskaBlockMore
*blockmore
, int nb_blockmore
,
4106 int64_t cluster_pos
, int64_t discard_padding
)
4108 uint64_t timecode
= AV_NOPTS_VALUE
;
4109 MatroskaTrack
*track
;
4114 uint32_t lace_size
[256];
4115 int n
, flags
, laces
= 0;
4117 int trust_default_duration
;
4121 ffio_init_read_context(&pb
, data
, size
);
4123 if ((n
= ebml_read_num(matroska
, &pb
.pub
, 8, &num
, 1)) < 0)
4128 track
= matroska_find_track_by_num(matroska
, num
);
4129 if (!track
|| size
< 3)
4130 return AVERROR_INVALIDDATA
;
4132 if (!(st
= track
->stream
)) {
4133 av_log(matroska
->ctx
, AV_LOG_VERBOSE
,
4134 "No stream associated to TrackNumber %"PRIu64
". "
4135 "Ignoring Block with this TrackNumber.\n", num
);
4139 if (st
->discard
>= AVDISCARD_ALL
)
4141 if (block_duration
> INT64_MAX
)
4142 block_duration
= INT64_MAX
;
4144 block_time
= sign_extend(AV_RB16(data
), 16);
4148 if (is_keyframe
== -1)
4149 is_keyframe
= flags
& 0x80 ? AV_PKT_FLAG_KEY
: 0;
4151 if (cluster_time
!= (uint64_t) -1 &&
4152 (block_time
>= 0 || cluster_time
>= -block_time
)) {
4153 uint64_t timecode_cluster_in_track_tb
= (double) cluster_time
/ track
->time_scale
;
4154 timecode
= timecode_cluster_in_track_tb
+ block_time
- track
->codec_delay_in_track_tb
;
4155 if (track
->type
== MATROSKA_TRACK_TYPE_SUBTITLE
&&
4156 timecode
< track
->end_timecode
)
4157 is_keyframe
= 0; /* overlapping subtitles are not key frame */
4159 ff_reduce_index(matroska
->ctx
, st
->index
);
4160 av_add_index_entry(st
, cluster_pos
, timecode
, 0, 0,
4165 if (matroska
->skip_to_keyframe
&&
4166 track
->type
!= MATROSKA_TRACK_TYPE_SUBTITLE
) {
4167 // Compare signed timecodes. Timecode may be negative due to codec delay
4168 // offset. We don't support timestamps greater than int64_t anyway - see
4170 if ((int64_t)timecode
< (int64_t)matroska
->skip_to_timecode
)
4173 matroska
->skip_to_keyframe
= 0;
4174 else if (!ffstream(st
)->skip_to_keyframe
) {
4175 av_log(matroska
->ctx
, AV_LOG_ERROR
, "File is broken, keyframes not correctly marked!\n");
4176 matroska
->skip_to_keyframe
= 0;
4180 res
= matroska_parse_laces(matroska
, &data
, size
, (flags
& 0x06) >> 1,
4181 &pb
.pub
, lace_size
, &laces
);
4183 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Error parsing frame sizes.\n");
4187 trust_default_duration
= track
->default_duration
!= 0;
4188 if (track
->audio
.samplerate
== 8000 && trust_default_duration
) {
4189 // If this is needed for more codecs, then add them here
4190 if (st
->codecpar
->codec_id
== AV_CODEC_ID_AC3
) {
4191 if (track
->audio
.samplerate
!= st
->codecpar
->sample_rate
|| !st
->codecpar
->frame_size
)
4192 trust_default_duration
= 0;
4196 if (!block_duration
&& trust_default_duration
)
4197 block_duration
= track
->default_duration
* laces
/ matroska
->time_scale
;
4199 if (cluster_time
!= (uint64_t)-1 && (block_time
>= 0 || cluster_time
>= -block_time
))
4200 track
->end_timecode
=
4201 FFMAX(track
->end_timecode
, timecode
+ block_duration
);
4203 for (n
= 0; n
< laces
; n
++) {
4204 int64_t lace_duration
= block_duration
*(n
+1) / laces
- block_duration
*n
/ laces
;
4205 uint8_t *out_data
= data
;
4206 int out_size
= lace_size
[n
];
4208 if (track
->needs_decoding
) {
4209 res
= matroska_decode_buffer(&out_data
, &out_size
, track
);
4212 /* Given that we are here means that out_data is no longer
4213 * owned by buf, so set it to NULL. This depends upon
4214 * zero-length header removal compression being ignored. */
4215 av_assert1(out_data
!= data
);
4219 if (track
->audio
.buf
) {
4220 res
= matroska_parse_rm_audio(matroska
, track
, st
,
4227 } else if (st
->codecpar
->codec_id
== AV_CODEC_ID_WEBVTT
) {
4228 res
= matroska_parse_webvtt(matroska
, track
, st
,
4230 timecode
, lace_duration
,
4237 res
= matroska_parse_frame(matroska
, track
, st
, buf
, out_data
,
4238 out_size
, timecode
, lace_duration
,
4240 blockmore
, nb_blockmore
,
4246 if (timecode
!= AV_NOPTS_VALUE
)
4247 timecode
= lace_duration
? timecode
+ lace_duration
: AV_NOPTS_VALUE
;
4248 data
+= lace_size
[n
];
4254 static int matroska_parse_cluster(MatroskaDemuxContext
*matroska
)
4256 MatroskaCluster
*cluster
= &matroska
->current_cluster
;
4257 MatroskaBlock
*block
= &cluster
->block
;
4260 av_assert0(matroska
->num_levels
<= 2U);
4262 if (matroska
->num_levels
== 1) {
4263 res
= ebml_parse(matroska
, matroska_segment
, NULL
);
4266 /* Found a cluster: subtract the size of the ID already read. */
4267 cluster
->pos
= avio_tell(matroska
->ctx
->pb
) - 4;
4269 res
= ebml_parse(matroska
, matroska_cluster_enter
, cluster
);
4275 if (matroska
->num_levels
== 2) {
4276 /* We are inside a cluster. */
4277 res
= ebml_parse(matroska
, matroska_cluster_parsing
, cluster
);
4279 if (res
>= 0 && block
->bin
.size
> 0) {
4280 int is_keyframe
= block
->non_simple
? block
->reference
.count
== 0 : -1;
4282 res
= matroska_parse_block(matroska
, block
->bin
.buf
, block
->bin
.data
,
4283 block
->bin
.size
, block
->bin
.pos
,
4284 cluster
->timecode
, block
->duration
,
4285 is_keyframe
, block
->blockmore
.elem
,
4286 block
->blockmore
.nb_elem
, cluster
->pos
,
4287 block
->discard_padding
);
4290 ebml_free(matroska_blockgroup
, block
);
4291 memset(block
, 0, sizeof(*block
));
4292 } else if (!matroska
->num_levels
) {
4293 if (!avio_feof(matroska
->ctx
->pb
)) {
4294 avio_r8(matroska
->ctx
->pb
);
4295 if (!avio_feof(matroska
->ctx
->pb
)) {
4296 av_log(matroska
->ctx
, AV_LOG_WARNING
, "File extends beyond "
4297 "end of segment.\n");
4298 return AVERROR_INVALIDDATA
;
4308 static int matroska_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
4310 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4313 if (matroska
->resync_pos
== -1) {
4314 // This can only happen if generic seeking has been used.
4315 matroska
->resync_pos
= avio_tell(s
->pb
);
4318 while (matroska_deliver_packet(matroska
, pkt
)) {
4320 return (ret
< 0) ? ret
: AVERROR_EOF
;
4321 if (matroska_parse_cluster(matroska
) < 0 && !matroska
->done
)
4322 ret
= matroska_resync(matroska
, matroska
->resync_pos
);
4328 static int matroska_read_seek(AVFormatContext
*s
, int stream_index
,
4329 int64_t timestamp
, int flags
)
4331 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4332 MatroskaTrack
*tracks
= NULL
;
4333 AVStream
*st
= s
->streams
[stream_index
];
4334 FFStream
*const sti
= ffstream(st
);
4337 /* Parse the CUES now since we need the index data to seek. */
4338 if (matroska
->cues_parsing_deferred
> 0) {
4339 matroska
->cues_parsing_deferred
= 0;
4340 matroska_parse_cues(matroska
);
4343 if (!sti
->nb_index_entries
)
4345 timestamp
= FFMAX(timestamp
, sti
->index_entries
[0].timestamp
);
4347 if ((index
= av_index_search_timestamp(st
, timestamp
, flags
)) < 0 ||
4348 index
== sti
->nb_index_entries
- 1) {
4349 matroska_reset_status(matroska
, 0, sti
->index_entries
[sti
->nb_index_entries
- 1].pos
);
4350 while ((index
= av_index_search_timestamp(st
, timestamp
, flags
)) < 0 ||
4351 index
== sti
->nb_index_entries
- 1) {
4352 matroska_clear_queue(matroska
);
4353 if (matroska_parse_cluster(matroska
) < 0)
4358 matroska_clear_queue(matroska
);
4359 if (index
< 0 || (matroska
->cues_parsing_deferred
< 0 &&
4360 index
== sti
->nb_index_entries
- 1))
4363 tracks
= matroska
->tracks
.elem
;
4364 for (i
= 0; i
< matroska
->tracks
.nb_elem
; i
++) {
4365 tracks
[i
].audio
.pkt_cnt
= 0;
4366 tracks
[i
].audio
.sub_packet_cnt
= 0;
4367 tracks
[i
].audio
.buf_timecode
= AV_NOPTS_VALUE
;
4368 tracks
[i
].end_timecode
= 0;
4371 /* We seek to a level 1 element, so set the appropriate status. */
4372 matroska_reset_status(matroska
, 0, sti
->index_entries
[index
].pos
);
4373 if (flags
& AVSEEK_FLAG_ANY
) {
4374 sti
->skip_to_keyframe
= 0;
4375 matroska
->skip_to_timecode
= timestamp
;
4377 sti
->skip_to_keyframe
= 1;
4378 matroska
->skip_to_timecode
= sti
->index_entries
[index
].timestamp
;
4380 matroska
->skip_to_keyframe
= 1;
4382 avpriv_update_cur_dts(s
, st
, sti
->index_entries
[index
].timestamp
);
4385 // slightly hackish but allows proper fallback to
4386 // the generic seeking code.
4387 matroska_reset_status(matroska
, 0, -1);
4388 matroska
->resync_pos
= -1;
4389 matroska_clear_queue(matroska
);
4390 sti
->skip_to_keyframe
=
4391 matroska
->skip_to_keyframe
= 0;
4396 static int matroska_read_close(AVFormatContext
*s
)
4398 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4399 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
4402 matroska_clear_queue(matroska
);
4404 for (n
= 0; n
< matroska
->tracks
.nb_elem
; n
++)
4405 if (tracks
[n
].type
== MATROSKA_TRACK_TYPE_AUDIO
)
4406 av_freep(&tracks
[n
].audio
.buf
);
4407 ebml_free(matroska_segment
, matroska
);
4412 #if CONFIG_WEBM_DASH_MANIFEST_DEMUXER
4414 int64_t start_time_ns
;
4415 int64_t end_time_ns
;
4416 int64_t start_offset
;
4420 /* This function searches all the Cues and returns the CueDesc corresponding to
4421 * the timestamp ts. Returned CueDesc will be such that start_time_ns <= ts <
4422 * end_time_ns. All 4 fields will be set to -1 if ts >= file's duration or
4423 * if an error occurred.
4425 static CueDesc
get_cue_desc(AVFormatContext
*s
, int64_t ts
, int64_t cues_start
) {
4426 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4427 FFStream
*const sti
= ffstream(s
->streams
[0]);
4428 AVIndexEntry
*const index_entries
= sti
->index_entries
;
4429 int nb_index_entries
= sti
->nb_index_entries
;
4433 if (ts
>= (int64_t)(matroska
->duration
* matroska
->time_scale
))
4434 return (CueDesc
) {-1, -1, -1, -1};
4435 for (i
= 1; i
< nb_index_entries
; i
++) {
4436 if (index_entries
[i
- 1].timestamp
* matroska
->time_scale
<= ts
&&
4437 index_entries
[i
].timestamp
* matroska
->time_scale
> ts
) {
4442 if (index_entries
[i
].timestamp
> matroska
->duration
)
4443 return (CueDesc
) {-1, -1, -1, -1};
4444 cue_desc
.start_time_ns
= index_entries
[i
].timestamp
* matroska
->time_scale
;
4445 cue_desc
.start_offset
= index_entries
[i
].pos
- matroska
->segment_start
;
4446 if (i
!= nb_index_entries
- 1) {
4447 cue_desc
.end_time_ns
= index_entries
[i
+ 1].timestamp
* matroska
->time_scale
;
4448 cue_desc
.end_offset
= index_entries
[i
+ 1].pos
- matroska
->segment_start
;
4450 cue_desc
.end_time_ns
= matroska
->duration
* matroska
->time_scale
;
4451 // FIXME: this needs special handling for files where Cues appear
4452 // before Clusters. the current logic assumes Cues appear after
4454 cue_desc
.end_offset
= cues_start
- matroska
->segment_start
;
4459 static int webm_clusters_start_with_keyframe(AVFormatContext
*s
)
4461 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4462 AVStream
*const st
= s
->streams
[0];
4463 FFStream
*const sti
= ffstream(st
);
4464 uint32_t id
= matroska
->current_id
;
4465 int64_t cluster_pos
, before_pos
;
4468 if (sti
->nb_index_entries
<= 0)
4471 // seek to the first cluster using cues.
4472 index
= av_index_search_timestamp(st
, 0, 0);
4475 cluster_pos
= sti
->index_entries
[index
].pos
;
4476 before_pos
= avio_tell(s
->pb
);
4478 uint64_t cluster_id
, cluster_length
;
4481 avio_seek(s
->pb
, cluster_pos
, SEEK_SET
);
4482 // read cluster id and length
4483 read
= ebml_read_num(matroska
, matroska
->ctx
->pb
, 4, &cluster_id
, 1);
4484 if (read
< 0 || cluster_id
!= 0xF43B675) // done with all clusters
4486 read
= ebml_read_length(matroska
, matroska
->ctx
->pb
, &cluster_length
);
4490 matroska_reset_status(matroska
, 0, cluster_pos
);
4491 matroska_clear_queue(matroska
);
4492 if (matroska_parse_cluster(matroska
) < 0 ||
4493 !matroska
->queue
.head
) {
4496 pkt
= &matroska
->queue
.head
->pkt
;
4497 // 4 + read is the length of the cluster id and the cluster length field.
4498 cluster_pos
+= 4 + read
+ cluster_length
;
4499 if (!(pkt
->flags
& AV_PKT_FLAG_KEY
)) {
4505 /* Restore the status after matroska_read_header: */
4506 matroska_reset_status(matroska
, id
, before_pos
);
4511 static int buffer_size_after_time_downloaded(int64_t time_ns
, double search_sec
, int64_t bps
,
4512 double min_buffer
, double* buffer
,
4513 double* sec_to_download
, AVFormatContext
*s
,
4516 double nano_seconds_per_second
= 1000000000.0;
4517 double time_sec
= time_ns
/ nano_seconds_per_second
;
4519 int64_t time_to_search_ns
= (int64_t)(search_sec
* nano_seconds_per_second
);
4520 int64_t end_time_ns
= time_ns
+ time_to_search_ns
;
4521 double sec_downloaded
= 0.0;
4522 CueDesc desc_curr
= get_cue_desc(s
, time_ns
, cues_start
);
4523 if (desc_curr
.start_time_ns
== -1)
4525 *sec_to_download
= 0.0;
4527 // Check for non cue start time.
4528 if (time_ns
> desc_curr
.start_time_ns
) {
4529 int64_t cue_nano
= desc_curr
.end_time_ns
- time_ns
;
4530 double percent
= (double)(cue_nano
) / (desc_curr
.end_time_ns
- desc_curr
.start_time_ns
);
4531 double cueBytes
= (desc_curr
.end_offset
- desc_curr
.start_offset
) * percent
;
4532 double timeToDownload
= (cueBytes
* 8.0) / bps
;
4534 sec_downloaded
+= (cue_nano
/ nano_seconds_per_second
) - timeToDownload
;
4535 *sec_to_download
+= timeToDownload
;
4537 // Check if the search ends within the first cue.
4538 if (desc_curr
.end_time_ns
>= end_time_ns
) {
4539 double desc_end_time_sec
= desc_curr
.end_time_ns
/ nano_seconds_per_second
;
4540 double percent_to_sub
= search_sec
/ (desc_end_time_sec
- time_sec
);
4541 sec_downloaded
= percent_to_sub
* sec_downloaded
;
4542 *sec_to_download
= percent_to_sub
* *sec_to_download
;
4545 if ((sec_downloaded
+ *buffer
) <= min_buffer
) {
4549 // Get the next Cue.
4550 desc_curr
= get_cue_desc(s
, desc_curr
.end_time_ns
, cues_start
);
4553 while (desc_curr
.start_time_ns
!= -1) {
4554 int64_t desc_bytes
= desc_curr
.end_offset
- desc_curr
.start_offset
;
4555 int64_t desc_ns
= desc_curr
.end_time_ns
- desc_curr
.start_time_ns
;
4556 double desc_sec
= desc_ns
/ nano_seconds_per_second
;
4557 double bits
= (desc_bytes
* 8.0);
4558 double time_to_download
= bits
/ bps
;
4560 sec_downloaded
+= desc_sec
- time_to_download
;
4561 *sec_to_download
+= time_to_download
;
4563 if (desc_curr
.end_time_ns
>= end_time_ns
) {
4564 double desc_end_time_sec
= desc_curr
.end_time_ns
/ nano_seconds_per_second
;
4565 double percent_to_sub
= search_sec
/ (desc_end_time_sec
- time_sec
);
4566 sec_downloaded
= percent_to_sub
* sec_downloaded
;
4567 *sec_to_download
= percent_to_sub
* *sec_to_download
;
4569 if ((sec_downloaded
+ *buffer
) <= min_buffer
)
4574 if ((sec_downloaded
+ *buffer
) <= min_buffer
) {
4579 desc_curr
= get_cue_desc(s
, desc_curr
.end_time_ns
, cues_start
);
4581 *buffer
= *buffer
+ sec_downloaded
;
4585 /* This function computes the bandwidth of the WebM file with the help of
4586 * buffer_size_after_time_downloaded() function. Both of these functions are
4587 * adapted from WebM Tools project and are adapted to work with FFmpeg's
4588 * Matroska parsing mechanism.
4590 * Returns the bandwidth of the file on success; -1 on error.
4592 static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext
*s
, int64_t cues_start
)
4594 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4595 AVStream
*st
= s
->streams
[0];
4596 FFStream
*const sti
= ffstream(st
);
4597 double bandwidth
= 0.0;
4599 for (int i
= 0; i
< sti
->nb_index_entries
; i
++) {
4600 int64_t prebuffer_ns
= 1000000000;
4601 int64_t time_ns
= sti
->index_entries
[i
].timestamp
* matroska
->time_scale
;
4602 double nano_seconds_per_second
= 1000000000.0;
4603 int64_t prebuffered_ns
;
4604 double prebuffer_bytes
= 0.0;
4605 int64_t temp_prebuffer_ns
= prebuffer_ns
;
4606 int64_t pre_bytes
, pre_ns
;
4607 double pre_sec
, prebuffer
, bits_per_second
;
4608 CueDesc desc_beg
= get_cue_desc(s
, time_ns
, cues_start
);
4609 // Start with the first Cue.
4610 CueDesc desc_end
= desc_beg
;
4612 if (time_ns
> INT64_MAX
- prebuffer_ns
)
4614 prebuffered_ns
= time_ns
+ prebuffer_ns
;
4616 // Figure out how much data we have downloaded for the prebuffer. This will
4617 // be used later to adjust the bits per sample to try.
4618 while (desc_end
.start_time_ns
!= -1 && desc_end
.end_time_ns
< prebuffered_ns
) {
4619 // Prebuffered the entire Cue.
4620 prebuffer_bytes
+= desc_end
.end_offset
- desc_end
.start_offset
;
4621 temp_prebuffer_ns
-= desc_end
.end_time_ns
- desc_end
.start_time_ns
;
4622 desc_end
= get_cue_desc(s
, desc_end
.end_time_ns
, cues_start
);
4624 if (desc_end
.start_time_ns
== -1) {
4625 // The prebuffer is larger than the duration.
4626 if (matroska
->duration
* matroska
->time_scale
>= prebuffered_ns
)
4628 bits_per_second
= 0.0;
4630 // The prebuffer ends in the last Cue. Estimate how much data was
4632 pre_bytes
= desc_end
.end_offset
- desc_end
.start_offset
;
4633 if (desc_end
.end_time_ns
<= desc_end
.start_time_ns
||
4634 desc_end
.end_time_ns
- (uint64_t)desc_end
.start_time_ns
> INT64_MAX
)
4636 pre_ns
= desc_end
.end_time_ns
- desc_end
.start_time_ns
;
4637 pre_sec
= pre_ns
/ nano_seconds_per_second
;
4639 pre_bytes
* ((temp_prebuffer_ns
/ nano_seconds_per_second
) / pre_sec
);
4641 prebuffer
= prebuffer_ns
/ nano_seconds_per_second
;
4643 // Set this to 0.0 in case our prebuffer buffers the entire video.
4644 bits_per_second
= 0.0;
4646 int64_t desc_bytes
= desc_end
.end_offset
- desc_beg
.start_offset
;
4647 int64_t desc_ns
= desc_end
.end_time_ns
- desc_beg
.start_time_ns
;
4648 double desc_sec
, calc_bits_per_second
, percent
, mod_bits_per_second
;
4649 if (desc_bytes
<= 0 || desc_bytes
> INT64_MAX
/8)
4652 desc_sec
= desc_ns
/ nano_seconds_per_second
;
4653 calc_bits_per_second
= (desc_bytes
* 8) / desc_sec
;
4655 // Drop the bps by the percentage of bytes buffered.
4656 percent
= (desc_bytes
- prebuffer_bytes
) / desc_bytes
;
4657 mod_bits_per_second
= calc_bits_per_second
* percent
;
4659 if (prebuffer
< desc_sec
) {
4661 (double)(matroska
->duration
* matroska
->time_scale
) / nano_seconds_per_second
;
4663 // Add 1 so the bits per second should be a little bit greater than file
4665 int64_t bps
= (int64_t)(mod_bits_per_second
) + 1;
4666 const double min_buffer
= 0.0;
4667 double buffer
= prebuffer
;
4668 double sec_to_download
= 0.0;
4670 int rv
= buffer_size_after_time_downloaded(prebuffered_ns
, search_sec
, bps
,
4671 min_buffer
, &buffer
, &sec_to_download
,
4675 } else if (rv
== 0) {
4676 bits_per_second
= (double)(bps
);
4681 desc_end
= get_cue_desc(s
, desc_end
.end_time_ns
, cues_start
);
4682 } while (desc_end
.start_time_ns
!= -1);
4684 if (bandwidth
< bits_per_second
) bandwidth
= bits_per_second
;
4686 return (int64_t)bandwidth
;
4689 static int webm_dash_manifest_cues(AVFormatContext
*s
, int64_t init_range
)
4691 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4692 EbmlList
*seekhead_list
= &matroska
->seekhead
;
4693 MatroskaSeekhead
*seekhead
= seekhead_list
->elem
;
4694 AVStream
*const st
= s
->streams
[0];
4695 FFStream
*const sti
= ffstream(st
);
4698 int64_t cues_start
= -1, cues_end
= -1, before_pos
, bandwidth
;
4702 // determine cues start and end positions
4703 for (i
= 0; i
< seekhead_list
->nb_elem
; i
++)
4704 if (seekhead
[i
].id
== MATROSKA_ID_CUES
)
4707 if (i
>= seekhead_list
->nb_elem
) return -1;
4709 before_pos
= avio_tell(matroska
->ctx
->pb
);
4710 cues_start
= seekhead
[i
].pos
+ matroska
->segment_start
;
4711 if (avio_seek(matroska
->ctx
->pb
, cues_start
, SEEK_SET
) == cues_start
) {
4712 // cues_end is computed as cues_start + cues_length + length of the
4713 // Cues element ID (i.e. 4) + EBML length of the Cues element.
4714 // cues_end is inclusive and the above sum is reduced by 1.
4715 uint64_t cues_length
, cues_id
;
4717 bytes_read
= ebml_read_num (matroska
, matroska
->ctx
->pb
, 4, &cues_id
, 1);
4718 if (bytes_read
< 0 || cues_id
!= (MATROSKA_ID_CUES
& 0xfffffff))
4719 return bytes_read
< 0 ? bytes_read
: AVERROR_INVALIDDATA
;
4720 bytes_read
= ebml_read_length(matroska
, matroska
->ctx
->pb
, &cues_length
);
4723 cues_end
= cues_start
+ 4 + bytes_read
+ cues_length
- 1;
4725 avio_seek(matroska
->ctx
->pb
, before_pos
, SEEK_SET
);
4726 if (cues_start
== -1 || cues_end
== -1) return -1;
4729 matroska_parse_cues(matroska
);
4731 if (!sti
->nb_index_entries
)
4732 return AVERROR_INVALIDDATA
;
4735 av_dict_set_int(&s
->streams
[0]->metadata
, CUES_START
, cues_start
, 0);
4738 av_dict_set_int(&s
->streams
[0]->metadata
, CUES_END
, cues_end
, 0);
4740 // if the file has cues at the start, fix up the init range so that
4741 // it does not include it
4742 if (cues_start
<= init_range
)
4743 av_dict_set_int(&s
->streams
[0]->metadata
, INITIALIZATION_RANGE
, cues_start
- 1, 0);
4746 bandwidth
= webm_dash_manifest_compute_bandwidth(s
, cues_start
);
4747 if (bandwidth
< 0) return -1;
4748 av_dict_set_int(&s
->streams
[0]->metadata
, BANDWIDTH
, bandwidth
, 0);
4750 // check if all clusters start with key frames
4751 av_dict_set_int(&s
->streams
[0]->metadata
, CLUSTER_KEYFRAME
, webm_clusters_start_with_keyframe(s
), 0);
4753 // Store cue point timestamps as a comma separated list
4754 // for checking subsegment alignment in the muxer.
4755 av_bprint_init(&bprint
, 0, AV_BPRINT_SIZE_UNLIMITED
);
4756 for (int i
= 0; i
< sti
->nb_index_entries
; i
++)
4757 av_bprintf(&bprint
, "%" PRId64
",", sti
->index_entries
[i
].timestamp
);
4758 if (!av_bprint_is_complete(&bprint
)) {
4759 av_bprint_finalize(&bprint
, NULL
);
4760 return AVERROR(ENOMEM
);
4762 // Remove the trailing ','
4763 bprint
.str
[--bprint
.len
] = '\0';
4764 if ((ret
= av_bprint_finalize(&bprint
, &buf
)) < 0)
4766 av_dict_set(&s
->streams
[0]->metadata
, CUE_TIMESTAMPS
,
4767 buf
, AV_DICT_DONT_STRDUP_VAL
);
4772 static int webm_dash_manifest_read_header(AVFormatContext
*s
)
4775 int ret
= matroska_read_header(s
);
4777 MatroskaTrack
*tracks
;
4778 MatroskaDemuxContext
*matroska
= s
->priv_data
;
4780 av_log(s
, AV_LOG_ERROR
, "Failed to read file headers\n");
4783 if (!matroska
->tracks
.nb_elem
|| !s
->nb_streams
) {
4784 av_log(s
, AV_LOG_ERROR
, "No track found\n");
4785 return AVERROR_INVALIDDATA
;
4788 if (!matroska
->is_live
) {
4789 buf
= av_asprintf("%g", matroska
->duration
);
4791 return AVERROR(ENOMEM
);
4792 av_dict_set(&s
->streams
[0]->metadata
, DURATION
,
4793 buf
, AV_DICT_DONT_STRDUP_VAL
);
4795 // initialization range
4796 // 5 is the offset of Cluster ID.
4797 init_range
= avio_tell(s
->pb
) - 5;
4798 av_dict_set_int(&s
->streams
[0]->metadata
, INITIALIZATION_RANGE
, init_range
, 0);
4801 // basename of the file
4802 buf
= strrchr(s
->url
, '/');
4803 av_dict_set(&s
->streams
[0]->metadata
, FILENAME
, buf
? ++buf
: s
->url
, 0);
4806 tracks
= matroska
->tracks
.elem
;
4807 av_dict_set_int(&s
->streams
[0]->metadata
, TRACK_NUMBER
, tracks
[0].num
, 0);
4809 // parse the cues and populate Cue related fields
4810 if (!matroska
->is_live
) {
4811 ret
= webm_dash_manifest_cues(s
, init_range
);
4813 av_log(s
, AV_LOG_ERROR
, "Error parsing Cues\n");
4818 // use the bandwidth from the command line if it was provided
4819 if (matroska
->bandwidth
> 0) {
4820 av_dict_set_int(&s
->streams
[0]->metadata
, BANDWIDTH
,
4821 matroska
->bandwidth
, 0);
4826 static int webm_dash_manifest_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
4831 #define OFFSET(x) offsetof(MatroskaDemuxContext, x)
4832 static const AVOption options
[] = {
4833 { "live", "flag indicating that the input is a live file that only has the headers.", OFFSET(is_live
), AV_OPT_TYPE_BOOL
, {.i64
= 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM
},
4834 { "bandwidth", "bandwidth of this stream to be specified in the DASH manifest.", OFFSET(bandwidth
), AV_OPT_TYPE_INT
, {.i64
= 0}, 0, INT_MAX
, AV_OPT_FLAG_DECODING_PARAM
},
4838 static const AVClass webm_dash_class
= {
4839 .class_name
= "WebM DASH Manifest demuxer",
4840 .item_name
= av_default_item_name
,
4842 .version
= LIBAVUTIL_VERSION_INT
,
4845 const FFInputFormat ff_webm_dash_manifest_demuxer
= {
4846 .p
.name
= "webm_dash_manifest",
4847 .p
.long_name
= NULL_IF_CONFIG_SMALL("WebM DASH Manifest"),
4848 .p
.priv_class
= &webm_dash_class
,
4849 .priv_data_size
= sizeof(MatroskaDemuxContext
),
4850 .flags_internal
= FF_INFMT_FLAG_INIT_CLEANUP
,
4851 .read_header
= webm_dash_manifest_read_header
,
4852 .read_packet
= webm_dash_manifest_read_packet
,
4853 .read_close
= matroska_read_close
,
4857 const FFInputFormat ff_matroska_demuxer
= {
4858 .p
.name
= "matroska,webm",
4859 .p
.long_name
= NULL_IF_CONFIG_SMALL("Matroska / WebM"),
4860 .p
.extensions
= "mkv,mk3d,mka,mks,webm",
4861 .p
.mime_type
= "audio/webm,audio/x-matroska,video/webm,video/x-matroska",
4862 .priv_data_size
= sizeof(MatroskaDemuxContext
),
4863 .flags_internal
= FF_INFMT_FLAG_INIT_CLEANUP
,
4864 .read_probe
= matroska_probe
,
4865 .read_header
= matroska_read_header
,
4866 .read_packet
= matroska_read_packet
,
4867 .read_close
= matroska_read_close
,
4868 .read_seek
= matroska_read_seek
,