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 * by Ronald Bultje <rbultje@ronald.bitfreak.net>
26 * with a little help from Moritz Bunkus <moritz@bunkus.org>
27 * totally reworked by Aurelien Jacobs <aurel@gnuage.org>
28 * Specs available on the Matroska project page: http://www.matroska.org/.
32 /* For codec_get_id(). */
36 #include "libavcodec/mpeg4audio.h"
37 #include "libavutil/intfloat_readwrite.h"
38 #include "libavutil/avstring.h"
39 #include "libavutil/lzo.h"
59 typedef const struct EbmlSyntax
{
68 const struct EbmlSyntax
*n
;
88 uint64_t doctype_version
;
94 } MatroskaTrackCompression
;
99 MatroskaTrackCompression compression
;
100 } MatroskaTrackEncoding
;
104 uint64_t display_width
;
105 uint64_t display_height
;
106 uint64_t pixel_width
;
107 uint64_t pixel_height
;
109 } MatroskaTrackVideo
;
113 double out_samplerate
;
117 /* real audio header (extracted from extradata) */
125 } MatroskaTrackAudio
;
134 uint64_t default_duration
;
135 uint64_t flag_default
;
136 MatroskaTrackVideo video
;
137 MatroskaTrackAudio audio
;
147 } MatroskaAttachement
;
183 AVFormatContext
*ctx
;
187 MatroskaLevel levels
[EBML_MAX_DEPTH
];
194 EbmlList attachments
;
200 /* byte position of the segment inside the stream */
201 offset_t segment_start
;
203 /* the packet queue */
210 /* What to skip before effectively reading a packet. */
211 int skip_to_keyframe
;
212 AVStream
*skip_to_stream
;
213 } MatroskaDemuxContext
;
226 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x))
228 static EbmlSyntax ebml_header
[] = {
229 { EBML_ID_EBMLREADVERSION
, EBML_UINT
, 0, offsetof(Ebml
,version
), {.u
=EBML_VERSION
} },
230 { EBML_ID_EBMLMAXSIZELENGTH
, EBML_UINT
, 0, offsetof(Ebml
,max_size
), {.u
=8} },
231 { EBML_ID_EBMLMAXIDLENGTH
, EBML_UINT
, 0, offsetof(Ebml
,id_length
), {.u
=4} },
232 { EBML_ID_DOCTYPE
, EBML_STR
, 0, offsetof(Ebml
,doctype
), {.s
="(none)"} },
233 { EBML_ID_DOCTYPEREADVERSION
, EBML_UINT
, 0, offsetof(Ebml
,doctype_version
), {.u
=1} },
234 { EBML_ID_EBMLVERSION
, EBML_NONE
},
235 { EBML_ID_DOCTYPEVERSION
, EBML_NONE
},
239 static EbmlSyntax ebml_syntax
[] = {
240 { EBML_ID_HEADER
, EBML_NEST
, 0, 0, {.n
=ebml_header
} },
244 static EbmlSyntax matroska_info
[] = {
245 { MATROSKA_ID_TIMECODESCALE
, EBML_UINT
, 0, offsetof(MatroskaDemuxContext
,time_scale
), {.u
=1000000} },
246 { MATROSKA_ID_DURATION
, EBML_FLOAT
, 0, offsetof(MatroskaDemuxContext
,duration
) },
247 { MATROSKA_ID_TITLE
, EBML_UTF8
, 0, offsetof(MatroskaDemuxContext
,title
) },
248 { MATROSKA_ID_WRITINGAPP
, EBML_NONE
},
249 { MATROSKA_ID_MUXINGAPP
, EBML_NONE
},
250 { MATROSKA_ID_DATEUTC
, EBML_NONE
},
251 { MATROSKA_ID_SEGMENTUID
, EBML_NONE
},
255 static EbmlSyntax matroska_track_video
[] = {
256 { MATROSKA_ID_VIDEOFRAMERATE
, EBML_FLOAT
,0, offsetof(MatroskaTrackVideo
,frame_rate
) },
257 { MATROSKA_ID_VIDEODISPLAYWIDTH
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
,display_width
) },
258 { MATROSKA_ID_VIDEODISPLAYHEIGHT
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
,display_height
) },
259 { MATROSKA_ID_VIDEOPIXELWIDTH
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
,pixel_width
) },
260 { MATROSKA_ID_VIDEOPIXELHEIGHT
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
,pixel_height
) },
261 { MATROSKA_ID_VIDEOCOLORSPACE
, EBML_UINT
, 0, offsetof(MatroskaTrackVideo
,fourcc
) },
262 { MATROSKA_ID_VIDEOPIXELCROPB
, EBML_NONE
},
263 { MATROSKA_ID_VIDEOPIXELCROPT
, EBML_NONE
},
264 { MATROSKA_ID_VIDEOPIXELCROPL
, EBML_NONE
},
265 { MATROSKA_ID_VIDEOPIXELCROPR
, EBML_NONE
},
266 { MATROSKA_ID_VIDEODISPLAYUNIT
, EBML_NONE
},
267 { MATROSKA_ID_VIDEOFLAGINTERLACED
,EBML_NONE
},
268 { MATROSKA_ID_VIDEOSTEREOMODE
, EBML_NONE
},
269 { MATROSKA_ID_VIDEOASPECTRATIO
, EBML_NONE
},
273 static EbmlSyntax matroska_track_audio
[] = {
274 { MATROSKA_ID_AUDIOSAMPLINGFREQ
, EBML_FLOAT
,0, offsetof(MatroskaTrackAudio
,samplerate
), {.f
=8000.0} },
275 { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
,EBML_FLOAT
,0,offsetof(MatroskaTrackAudio
,out_samplerate
) },
276 { MATROSKA_ID_AUDIOBITDEPTH
, EBML_UINT
, 0, offsetof(MatroskaTrackAudio
,bitdepth
) },
277 { MATROSKA_ID_AUDIOCHANNELS
, EBML_UINT
, 0, offsetof(MatroskaTrackAudio
,channels
), {.u
=1} },
281 static EbmlSyntax matroska_track_encoding_compression
[] = {
282 { MATROSKA_ID_ENCODINGCOMPALGO
, EBML_UINT
, 0, offsetof(MatroskaTrackCompression
,algo
), {.u
=0} },
283 { MATROSKA_ID_ENCODINGCOMPSETTINGS
,EBML_BIN
, 0, offsetof(MatroskaTrackCompression
,settings
) },
287 static EbmlSyntax matroska_track_encoding
[] = {
288 { MATROSKA_ID_ENCODINGSCOPE
, EBML_UINT
, 0, offsetof(MatroskaTrackEncoding
,scope
), {.u
=1} },
289 { MATROSKA_ID_ENCODINGTYPE
, EBML_UINT
, 0, offsetof(MatroskaTrackEncoding
,type
), {.u
=0} },
290 { MATROSKA_ID_ENCODINGCOMPRESSION
,EBML_NEST
, 0, offsetof(MatroskaTrackEncoding
,compression
), {.n
=matroska_track_encoding_compression
} },
291 { MATROSKA_ID_ENCODINGORDER
, EBML_NONE
},
295 static EbmlSyntax matroska_track_encodings
[] = {
296 { MATROSKA_ID_TRACKCONTENTENCODING
, EBML_NEST
, sizeof(MatroskaTrackEncoding
), offsetof(MatroskaTrack
,encodings
), {.n
=matroska_track_encoding
} },
300 static EbmlSyntax matroska_track
[] = {
301 { MATROSKA_ID_TRACKNUMBER
, EBML_UINT
, 0, offsetof(MatroskaTrack
,num
) },
302 { MATROSKA_ID_TRACKTYPE
, EBML_UINT
, 0, offsetof(MatroskaTrack
,type
) },
303 { MATROSKA_ID_CODECID
, EBML_STR
, 0, offsetof(MatroskaTrack
,codec_id
) },
304 { MATROSKA_ID_CODECPRIVATE
, EBML_BIN
, 0, offsetof(MatroskaTrack
,codec_priv
) },
305 { MATROSKA_ID_TRACKLANGUAGE
, EBML_UTF8
, 0, offsetof(MatroskaTrack
,language
), {.s
="eng"} },
306 { MATROSKA_ID_TRACKDEFAULTDURATION
, EBML_UINT
, 0, offsetof(MatroskaTrack
,default_duration
) },
307 { MATROSKA_ID_TRACKTIMECODESCALE
, EBML_FLOAT
,0, offsetof(MatroskaTrack
,time_scale
), {.f
=1.0} },
308 { MATROSKA_ID_TRACKFLAGDEFAULT
, EBML_UINT
, 0, offsetof(MatroskaTrack
,flag_default
), {.u
=1} },
309 { MATROSKA_ID_TRACKVIDEO
, EBML_NEST
, 0, offsetof(MatroskaTrack
,video
), {.n
=matroska_track_video
} },
310 { MATROSKA_ID_TRACKAUDIO
, EBML_NEST
, 0, offsetof(MatroskaTrack
,audio
), {.n
=matroska_track_audio
} },
311 { MATROSKA_ID_TRACKCONTENTENCODINGS
,EBML_NEST
, 0, 0, {.n
=matroska_track_encodings
} },
312 { MATROSKA_ID_TRACKUID
, EBML_NONE
},
313 { MATROSKA_ID_TRACKNAME
, EBML_NONE
},
314 { MATROSKA_ID_TRACKFLAGENABLED
, EBML_NONE
},
315 { MATROSKA_ID_TRACKFLAGFORCED
, EBML_NONE
},
316 { MATROSKA_ID_TRACKFLAGLACING
, EBML_NONE
},
317 { MATROSKA_ID_CODECNAME
, EBML_NONE
},
318 { MATROSKA_ID_CODECDECODEALL
, EBML_NONE
},
319 { MATROSKA_ID_CODECINFOURL
, EBML_NONE
},
320 { MATROSKA_ID_CODECDOWNLOADURL
, EBML_NONE
},
321 { MATROSKA_ID_TRACKMINCACHE
, EBML_NONE
},
322 { MATROSKA_ID_TRACKMAXCACHE
, EBML_NONE
},
323 { MATROSKA_ID_TRACKMAXBLKADDID
, EBML_NONE
},
327 static EbmlSyntax matroska_tracks
[] = {
328 { MATROSKA_ID_TRACKENTRY
, EBML_NEST
, sizeof(MatroskaTrack
), offsetof(MatroskaDemuxContext
,tracks
), {.n
=matroska_track
} },
332 static EbmlSyntax matroska_attachment
[] = {
333 { MATROSKA_ID_FILENAME
, EBML_UTF8
, 0, offsetof(MatroskaAttachement
,filename
) },
334 { MATROSKA_ID_FILEMIMETYPE
, EBML_STR
, 0, offsetof(MatroskaAttachement
,mime
) },
335 { MATROSKA_ID_FILEDATA
, EBML_BIN
, 0, offsetof(MatroskaAttachement
,bin
) },
336 { MATROSKA_ID_FILEDESC
, EBML_NONE
},
337 { MATROSKA_ID_FILEUID
, EBML_NONE
},
341 static EbmlSyntax matroska_attachments
[] = {
342 { MATROSKA_ID_ATTACHEDFILE
, EBML_NEST
, sizeof(MatroskaAttachement
), offsetof(MatroskaDemuxContext
,attachments
), {.n
=matroska_attachment
} },
346 static EbmlSyntax matroska_chapter_display
[] = {
347 { MATROSKA_ID_CHAPSTRING
, EBML_UTF8
, 0, offsetof(MatroskaChapter
,title
) },
348 { MATROSKA_ID_CHAPLANG
, EBML_NONE
},
352 static EbmlSyntax matroska_chapter_entry
[] = {
353 { MATROSKA_ID_CHAPTERTIMESTART
, EBML_UINT
, 0, offsetof(MatroskaChapter
,start
), {.u
=AV_NOPTS_VALUE
} },
354 { MATROSKA_ID_CHAPTERTIMEEND
, EBML_UINT
, 0, offsetof(MatroskaChapter
,end
), {.u
=AV_NOPTS_VALUE
} },
355 { MATROSKA_ID_CHAPTERUID
, EBML_UINT
, 0, offsetof(MatroskaChapter
,uid
) },
356 { MATROSKA_ID_CHAPTERDISPLAY
, EBML_NEST
, 0, 0, {.n
=matroska_chapter_display
} },
357 { MATROSKA_ID_CHAPTERFLAGHIDDEN
, EBML_NONE
},
358 { MATROSKA_ID_CHAPTERFLAGENABLED
, EBML_NONE
},
359 { MATROSKA_ID_CHAPTERPHYSEQUIV
, EBML_NONE
},
360 { MATROSKA_ID_CHAPTERATOM
, EBML_NONE
},
364 static EbmlSyntax matroska_chapter
[] = {
365 { MATROSKA_ID_CHAPTERATOM
, EBML_NEST
, sizeof(MatroskaChapter
), offsetof(MatroskaDemuxContext
,chapters
), {.n
=matroska_chapter_entry
} },
366 { MATROSKA_ID_EDITIONUID
, EBML_NONE
},
367 { MATROSKA_ID_EDITIONFLAGHIDDEN
, EBML_NONE
},
368 { MATROSKA_ID_EDITIONFLAGDEFAULT
, EBML_NONE
},
369 { MATROSKA_ID_EDITIONFLAGORDERED
, EBML_NONE
},
373 static EbmlSyntax matroska_chapters
[] = {
374 { MATROSKA_ID_EDITIONENTRY
, EBML_NEST
, 0, 0, {.n
=matroska_chapter
} },
378 static EbmlSyntax matroska_index_pos
[] = {
379 { MATROSKA_ID_CUETRACK
, EBML_UINT
, 0, offsetof(MatroskaIndexPos
,track
) },
380 { MATROSKA_ID_CUECLUSTERPOSITION
, EBML_UINT
, 0, offsetof(MatroskaIndexPos
,pos
) },
381 { MATROSKA_ID_CUEBLOCKNUMBER
, EBML_NONE
},
385 static EbmlSyntax matroska_index_entry
[] = {
386 { MATROSKA_ID_CUETIME
, EBML_UINT
, 0, offsetof(MatroskaIndex
,time
) },
387 { MATROSKA_ID_CUETRACKPOSITION
, EBML_NEST
, sizeof(MatroskaIndexPos
), offsetof(MatroskaIndex
,pos
), {.n
=matroska_index_pos
} },
391 static EbmlSyntax matroska_index
[] = {
392 { MATROSKA_ID_POINTENTRY
, EBML_NEST
, sizeof(MatroskaIndex
), offsetof(MatroskaDemuxContext
,index
), {.n
=matroska_index_entry
} },
396 static EbmlSyntax matroska_simpletag
[] = {
397 { MATROSKA_ID_TAGNAME
, EBML_UTF8
, 0, offsetof(MatroskaTag
,name
) },
398 { MATROSKA_ID_TAGSTRING
, EBML_UTF8
, 0, offsetof(MatroskaTag
,string
) },
399 { MATROSKA_ID_SIMPLETAG
, EBML_NEST
, sizeof(MatroskaTag
), offsetof(MatroskaTag
,sub
), {.n
=matroska_simpletag
} },
400 { MATROSKA_ID_TAGLANG
, EBML_NONE
},
401 { MATROSKA_ID_TAGDEFAULT
, EBML_NONE
},
405 static EbmlSyntax matroska_tag
[] = {
406 { MATROSKA_ID_SIMPLETAG
, EBML_NEST
, sizeof(MatroskaTag
), 0, {.n
=matroska_simpletag
} },
407 { MATROSKA_ID_TAGTARGETS
, EBML_NONE
},
411 static EbmlSyntax matroska_tags
[] = {
412 { MATROSKA_ID_TAG
, EBML_NEST
, 0, offsetof(MatroskaDemuxContext
,tags
), {.n
=matroska_tag
} },
416 static EbmlSyntax matroska_seekhead_entry
[] = {
417 { MATROSKA_ID_SEEKID
, EBML_UINT
, 0, offsetof(MatroskaSeekhead
,id
) },
418 { MATROSKA_ID_SEEKPOSITION
, EBML_UINT
, 0, offsetof(MatroskaSeekhead
,pos
), {.u
=-1} },
422 static EbmlSyntax matroska_seekhead
[] = {
423 { MATROSKA_ID_SEEKENTRY
, EBML_NEST
, sizeof(MatroskaSeekhead
), offsetof(MatroskaDemuxContext
,seekhead
), {.n
=matroska_seekhead_entry
} },
427 static EbmlSyntax matroska_segment
[] = {
428 { MATROSKA_ID_INFO
, EBML_NEST
, 0, 0, {.n
=matroska_info
} },
429 { MATROSKA_ID_TRACKS
, EBML_NEST
, 0, 0, {.n
=matroska_tracks
} },
430 { MATROSKA_ID_ATTACHMENTS
, EBML_NEST
, 0, 0, {.n
=matroska_attachments
} },
431 { MATROSKA_ID_CHAPTERS
, EBML_NEST
, 0, 0, {.n
=matroska_chapters
} },
432 { MATROSKA_ID_CUES
, EBML_NEST
, 0, 0, {.n
=matroska_index
} },
433 { MATROSKA_ID_TAGS
, EBML_NEST
, 0, 0, {.n
=matroska_tags
} },
434 { MATROSKA_ID_SEEKHEAD
, EBML_NEST
, 0, 0, {.n
=matroska_seekhead
} },
435 { MATROSKA_ID_CLUSTER
, EBML_STOP
, 0, offsetof(MatroskaDemuxContext
,has_cluster_id
) },
439 static EbmlSyntax matroska_segments
[] = {
440 { MATROSKA_ID_SEGMENT
, EBML_NEST
, 0, 0, {.n
=matroska_segment
} },
444 static EbmlSyntax matroska_blockgroup
[] = {
445 { MATROSKA_ID_BLOCK
, EBML_BIN
, 0, offsetof(MatroskaBlock
,bin
) },
446 { MATROSKA_ID_SIMPLEBLOCK
, EBML_BIN
, 0, offsetof(MatroskaBlock
,bin
) },
447 { MATROSKA_ID_BLOCKDURATION
, EBML_UINT
, 0, offsetof(MatroskaBlock
,duration
), {.u
=AV_NOPTS_VALUE
} },
448 { MATROSKA_ID_BLOCKREFERENCE
, EBML_UINT
, 0, offsetof(MatroskaBlock
,reference
) },
452 static EbmlSyntax matroska_cluster
[] = {
453 { MATROSKA_ID_CLUSTERTIMECODE
,EBML_UINT
,0, offsetof(MatroskaCluster
,timecode
) },
454 { MATROSKA_ID_BLOCKGROUP
, EBML_NEST
, sizeof(MatroskaBlock
), offsetof(MatroskaCluster
,blocks
), {.n
=matroska_blockgroup
} },
455 { MATROSKA_ID_SIMPLEBLOCK
, EBML_PASS
, sizeof(MatroskaBlock
), offsetof(MatroskaCluster
,blocks
), {.n
=matroska_blockgroup
} },
456 { MATROSKA_ID_CLUSTERPOSITION
,EBML_NONE
},
457 { MATROSKA_ID_CLUSTERPREVSIZE
,EBML_NONE
},
461 static EbmlSyntax matroska_clusters
[] = {
462 { MATROSKA_ID_CLUSTER
, EBML_NEST
, 0, 0, {.n
=matroska_cluster
} },
463 { MATROSKA_ID_INFO
, EBML_NONE
},
464 { MATROSKA_ID_CUES
, EBML_NONE
},
465 { MATROSKA_ID_TAGS
, EBML_NONE
},
466 { MATROSKA_ID_SEEKHEAD
, EBML_NONE
},
470 #define SIZE_OFF(x) sizeof(((AVFormatContext*)0)->x),offsetof(AVFormatContext,x)
476 { "TITLE", SIZE_OFF(title
) },
477 { "ARTIST", SIZE_OFF(author
) },
478 { "WRITTEN_BY", SIZE_OFF(author
) },
479 { "LEAD_PERFORMER", SIZE_OFF(author
) },
480 { "COPYRIGHT", SIZE_OFF(copyright
) },
481 { "COMMENT", SIZE_OFF(comment
) },
482 { "ALBUM", SIZE_OFF(album
) },
483 { "DATE_WRITTEN", SIZE_OFF(year
) },
484 { "DATE_RELEASED", SIZE_OFF(year
) },
485 { "PART_NUMBER", SIZE_OFF(track
) },
486 { "GENRE", SIZE_OFF(genre
) },
490 * Return: Whether we reached the end of a level in the hierarchy or not.
492 static int ebml_level_end(MatroskaDemuxContext
*matroska
)
494 ByteIOContext
*pb
= matroska
->ctx
->pb
;
495 offset_t pos
= url_ftell(pb
);
497 if (matroska
->num_levels
> 0) {
498 MatroskaLevel
*level
= &matroska
->levels
[matroska
->num_levels
- 1];
499 if (pos
- level
->start
>= level
->length
) {
500 matroska
->num_levels
--;
508 * Read: an "EBML number", which is defined as a variable-length
509 * array of bytes. The first byte indicates the length by giving a
510 * number of 0-bits followed by a one. The position of the first
511 * "one" bit inside the first byte indicates the length of this
513 * Returns: number of bytes read, < 0 on error
515 static int ebml_read_num(MatroskaDemuxContext
*matroska
, ByteIOContext
*pb
,
516 int max_size
, uint64_t *number
)
518 int len_mask
= 0x80, read
= 1, n
= 1;
521 /* The first byte tells us the length in bytes - get_byte() can normally
522 * return 0, but since that's not a valid first ebmlID byte, we can
523 * use it safely here to catch EOS. */
524 if (!(total
= get_byte(pb
))) {
525 /* we might encounter EOS here */
527 offset_t pos
= url_ftell(pb
);
528 av_log(matroska
->ctx
, AV_LOG_ERROR
,
529 "Read error at pos. %"PRIu64
" (0x%"PRIx64
")\n",
532 return AVERROR(EIO
); /* EOS or actual I/O error */
535 /* get the length of the EBML number */
536 while (read
<= max_size
&& !(total
& len_mask
)) {
540 if (read
> max_size
) {
541 offset_t pos
= url_ftell(pb
) - 1;
542 av_log(matroska
->ctx
, AV_LOG_ERROR
,
543 "Invalid EBML number size tag 0x%02x at pos %"PRIu64
" (0x%"PRIx64
")\n",
544 (uint8_t) total
, pos
, pos
);
545 return AVERROR_INVALIDDATA
;
548 /* read out length */
551 total
= (total
<< 8) | get_byte(pb
);
559 * Read the next element as an unsigned int.
560 * 0 is success, < 0 is failure.
562 static int ebml_read_uint(ByteIOContext
*pb
, int size
, uint64_t *num
)
566 if (size
< 1 || size
> 8)
567 return AVERROR_INVALIDDATA
;
569 /* big-endian ordering; build up number */
572 *num
= (*num
<< 8) | get_byte(pb
);
578 * Read the next element as a float.
579 * 0 is success, < 0 is failure.
581 static int ebml_read_float(ByteIOContext
*pb
, int size
, double *num
)
584 *num
= av_int2flt(get_be32(pb
));
586 *num
= av_int2dbl(get_be64(pb
));
588 return AVERROR_INVALIDDATA
;
594 * Read the next element as an ASCII string.
595 * 0 is success, < 0 is failure.
597 static int ebml_read_ascii(ByteIOContext
*pb
, int size
, char **str
)
600 /* EBML strings are usually not 0-terminated, so we allocate one
601 * byte more, read the string and NULL-terminate it ourselves. */
602 if (!(*str
= av_malloc(size
+ 1)))
603 return AVERROR(ENOMEM
);
604 if (get_buffer(pb
, (uint8_t *) *str
, size
) != size
) {
614 * Read the next element as binary data.
615 * 0 is success, < 0 is failure.
617 static int ebml_read_binary(ByteIOContext
*pb
, int length
, EbmlBin
*bin
)
620 if (!(bin
->data
= av_malloc(length
)))
621 return AVERROR(ENOMEM
);
624 bin
->pos
= url_ftell(pb
);
625 if (get_buffer(pb
, bin
->data
, length
) != length
)
632 * Read the next element, but only the header. The contents
633 * are supposed to be sub-elements which can be read separately.
634 * 0 is success, < 0 is failure.
636 static int ebml_read_master(MatroskaDemuxContext
*matroska
, int length
)
638 ByteIOContext
*pb
= matroska
->ctx
->pb
;
639 MatroskaLevel
*level
;
641 if (matroska
->num_levels
>= EBML_MAX_DEPTH
) {
642 av_log(matroska
->ctx
, AV_LOG_ERROR
,
643 "File moves beyond max. allowed depth (%d)\n", EBML_MAX_DEPTH
);
644 return AVERROR(ENOSYS
);
647 level
= &matroska
->levels
[matroska
->num_levels
++];
648 level
->start
= url_ftell(pb
);
649 level
->length
= length
;
655 * Read signed/unsigned "EBML" numbers.
656 * Return: number of bytes processed, < 0 on error
658 static int matroska_ebmlnum_uint(MatroskaDemuxContext
*matroska
,
659 uint8_t *data
, uint32_t size
, uint64_t *num
)
662 init_put_byte(&pb
, data
, size
, 0, NULL
, NULL
, NULL
, NULL
);
663 return ebml_read_num(matroska
, &pb
, 8, num
);
667 * Same as above, but signed.
669 static int matroska_ebmlnum_sint(MatroskaDemuxContext
*matroska
,
670 uint8_t *data
, uint32_t size
, int64_t *num
)
675 /* read as unsigned number first */
676 if ((res
= matroska_ebmlnum_uint(matroska
, data
, size
, &unum
)) < 0)
679 /* make signed (weird way) */
680 *num
= unum
- ((1LL << (7*res
- 1)) - 1);
685 static int ebml_parse_elem(MatroskaDemuxContext
*matroska
,
686 EbmlSyntax
*syntax
, void *data
);
688 static int ebml_parse_id(MatroskaDemuxContext
*matroska
, EbmlSyntax
*syntax
,
689 uint32_t id
, void *data
)
692 for (i
=0; syntax
[i
].id
; i
++)
693 if (id
== syntax
[i
].id
)
695 if (!syntax
[i
].id
&& id
!= EBML_ID_VOID
&& id
!= EBML_ID_CRC32
)
696 av_log(matroska
->ctx
, AV_LOG_INFO
, "Unknown entry 0x%X\n", id
);
697 return ebml_parse_elem(matroska
, &syntax
[i
], data
);
700 static int ebml_parse(MatroskaDemuxContext
*matroska
, EbmlSyntax
*syntax
,
704 int res
= ebml_read_num(matroska
, matroska
->ctx
->pb
, 4, &id
);
706 return res
< 0 ? res
: ebml_parse_id(matroska
, syntax
, id
, data
);
709 static int ebml_parse_nest(MatroskaDemuxContext
*matroska
, EbmlSyntax
*syntax
,
714 for (i
=0; syntax
[i
].id
; i
++)
715 switch (syntax
[i
].type
) {
717 *(uint64_t *)((char *)data
+syntax
[i
].data_offset
) = syntax
[i
].def
.u
;
720 *(double *)((char *)data
+syntax
[i
].data_offset
) = syntax
[i
].def
.f
;
724 *(char **)((char *)data
+syntax
[i
].data_offset
) = av_strdup(syntax
[i
].def
.s
);
728 while (!res
&& !ebml_level_end(matroska
))
729 res
= ebml_parse(matroska
, syntax
, data
);
734 static int ebml_parse_elem(MatroskaDemuxContext
*matroska
,
735 EbmlSyntax
*syntax
, void *data
)
737 ByteIOContext
*pb
= matroska
->ctx
->pb
;
738 uint32_t id
= syntax
->id
;
742 data
= (char *)data
+ syntax
->data_offset
;
743 if (syntax
->list_elem_size
) {
744 EbmlList
*list
= data
;
745 list
->elem
= av_realloc(list
->elem
, (list
->nb_elem
+1)*syntax
->list_elem_size
);
746 data
= (char*)list
->elem
+ list
->nb_elem
*syntax
->list_elem_size
;
747 memset(data
, 0, syntax
->list_elem_size
);
751 if (syntax
->type
!= EBML_PASS
&& syntax
->type
!= EBML_STOP
)
752 if ((res
= ebml_read_num(matroska
, pb
, 8, &length
)) < 0)
755 switch (syntax
->type
) {
756 case EBML_UINT
: res
= ebml_read_uint (pb
, length
, data
); break;
757 case EBML_FLOAT
: res
= ebml_read_float (pb
, length
, data
); break;
759 case EBML_UTF8
: res
= ebml_read_ascii (pb
, length
, data
); break;
760 case EBML_BIN
: res
= ebml_read_binary(pb
, length
, data
); break;
761 case EBML_NEST
: if ((res
=ebml_read_master(matroska
, length
)) < 0)
763 if (id
== MATROSKA_ID_SEGMENT
)
764 matroska
->segment_start
= url_ftell(matroska
->ctx
->pb
);
765 return ebml_parse_nest(matroska
, syntax
->def
.n
, data
);
766 case EBML_PASS
: return ebml_parse_id(matroska
, syntax
->def
.n
, id
, data
);
767 case EBML_STOP
: *(int *)data
= 1; return 1;
768 default: return url_fseek(pb
,length
,SEEK_CUR
)<0 ?
AVERROR(EIO
) : 0;
770 if (res
== AVERROR_INVALIDDATA
)
771 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Invalid element\n");
772 else if (res
== AVERROR(EIO
))
773 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Read error\n");
777 static void ebml_free(EbmlSyntax
*syntax
, void *data
)
780 for (i
=0; syntax
[i
].id
; i
++) {
781 void *data_off
= (char *)data
+ syntax
[i
].data_offset
;
782 switch (syntax
[i
].type
) {
784 case EBML_UTF8
: av_freep(data_off
); break;
785 case EBML_BIN
: av_freep(&((EbmlBin
*)data_off
)->data
); break;
787 if (syntax
[i
].list_elem_size
) {
788 EbmlList
*list
= data_off
;
789 char *ptr
= list
->elem
;
790 for (j
=0; j
<list
->nb_elem
; j
++, ptr
+=syntax
[i
].list_elem_size
)
791 ebml_free(syntax
[i
].def
.n
, ptr
);
794 ebml_free(syntax
[i
].def
.n
, data_off
);
804 static int matroska_probe(AVProbeData
*p
)
807 int len_mask
= 0x80, size
= 1, n
= 1;
808 static const char probe_data
[] = "matroska";
811 if (AV_RB32(p
->buf
) != EBML_ID_HEADER
)
814 /* length of header */
816 while (size
<= 8 && !(total
& len_mask
)) {
822 total
&= (len_mask
- 1);
824 total
= (total
<< 8) | p
->buf
[4 + n
++];
826 /* Does the probe data contain the whole header? */
827 if (p
->buf_size
< 4 + size
+ total
)
830 /* The header must contain the document type 'matroska'. For now,
831 * we don't parse the whole header but simply check for the
832 * availability of that array of characters inside the header.
833 * Not fully fool-proof, but good enough. */
834 for (n
= 4+size
; n
<= 4+size
+total
-(sizeof(probe_data
)-1); n
++)
835 if (!memcmp(p
->buf
+n
, probe_data
, sizeof(probe_data
)-1))
836 return AVPROBE_SCORE_MAX
;
841 static MatroskaTrack
*matroska_find_track_by_num(MatroskaDemuxContext
*matroska
,
844 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
847 for (i
=0; i
< matroska
->tracks
.nb_elem
; i
++)
848 if (tracks
[i
].num
== num
)
851 av_log(matroska
->ctx
, AV_LOG_ERROR
, "Invalid track number %d\n", num
);
855 static int matroska_decode_buffer(uint8_t** buf
, int* buf_size
,
856 MatroskaTrack
*track
)
858 MatroskaTrackEncoding
*encodings
= track
->encodings
.elem
;
859 uint8_t* data
= *buf
;
860 int isize
= *buf_size
;
861 uint8_t* pkt_data
= NULL
;
862 int pkt_size
= isize
;
866 switch (encodings
[0].compression
.algo
) {
867 case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
:
868 return encodings
[0].compression
.settings
.size
;
869 case MATROSKA_TRACK_ENCODING_COMP_LZO
:
871 olen
= pkt_size
*= 3;
872 pkt_data
= av_realloc(pkt_data
,
873 pkt_size
+LZO_OUTPUT_PADDING
);
874 result
= lzo1x_decode(pkt_data
, &olen
, data
, &isize
);
875 } while (result
==LZO_OUTPUT_FULL
&& pkt_size
<10000000);
881 case MATROSKA_TRACK_ENCODING_COMP_ZLIB
: {
882 z_stream zstream
= {0};
883 if (inflateInit(&zstream
) != Z_OK
)
885 zstream
.next_in
= data
;
886 zstream
.avail_in
= isize
;
889 pkt_data
= av_realloc(pkt_data
, pkt_size
);
890 zstream
.avail_out
= pkt_size
- zstream
.total_out
;
891 zstream
.next_out
= pkt_data
+ zstream
.total_out
;
892 result
= inflate(&zstream
, Z_NO_FLUSH
);
893 } while (result
==Z_OK
&& pkt_size
<10000000);
894 pkt_size
= zstream
.total_out
;
895 inflateEnd(&zstream
);
896 if (result
!= Z_STREAM_END
)
902 case MATROSKA_TRACK_ENCODING_COMP_BZLIB
: {
903 bz_stream bzstream
= {0};
904 if (BZ2_bzDecompressInit(&bzstream
, 0, 0) != BZ_OK
)
906 bzstream
.next_in
= data
;
907 bzstream
.avail_in
= isize
;
910 pkt_data
= av_realloc(pkt_data
, pkt_size
);
911 bzstream
.avail_out
= pkt_size
- bzstream
.total_out_lo32
;
912 bzstream
.next_out
= pkt_data
+ bzstream
.total_out_lo32
;
913 result
= BZ2_bzDecompress(&bzstream
);
914 } while (result
==BZ_OK
&& pkt_size
<10000000);
915 pkt_size
= bzstream
.total_out_lo32
;
916 BZ2_bzDecompressEnd(&bzstream
);
917 if (result
!= BZ_STREAM_END
)
927 *buf_size
= pkt_size
;
934 static void matroska_convert_tags(AVFormatContext
*s
, EbmlList
*list
)
936 MatroskaTag
*tags
= list
->elem
;
939 for (i
=0; i
< list
->nb_elem
; i
++) {
940 for (j
=0; j
< ARRAY_SIZE(metadata
); j
++){
941 if (!strcmp(tags
[i
].name
, metadata
[j
].name
)) {
942 int *ptr
= (int *)((char *)s
+ metadata
[j
].offset
);
944 if (metadata
[j
].size
> sizeof(int))
945 av_strlcpy((char *)ptr
, tags
[i
].string
, metadata
[j
].size
);
947 *ptr
= atoi(tags
[i
].string
);
950 if (tags
[i
].sub
.nb_elem
)
951 matroska_convert_tags(s
, &tags
[i
].sub
);
955 static void matroska_execute_seekhead(MatroskaDemuxContext
*matroska
)
957 EbmlList
*seekhead_list
= &matroska
->seekhead
;
958 MatroskaSeekhead
*seekhead
= seekhead_list
->elem
;
959 uint32_t level_up
= matroska
->level_up
;
960 offset_t before_pos
= url_ftell(matroska
->ctx
->pb
);
964 for (i
=0; i
<seekhead_list
->nb_elem
; i
++) {
965 offset_t offset
= seekhead
[i
].pos
+ matroska
->segment_start
;
967 if (seekhead
[i
].pos
<= before_pos
968 || seekhead
[i
].id
== MATROSKA_ID_SEEKHEAD
969 || seekhead
[i
].id
== MATROSKA_ID_CLUSTER
)
973 if (url_fseek(matroska
->ctx
->pb
, offset
, SEEK_SET
) != offset
)
976 /* We don't want to lose our seekhead level, so we add
977 * a dummy. This is a crude hack. */
978 if (matroska
->num_levels
== EBML_MAX_DEPTH
) {
979 av_log(matroska
->ctx
, AV_LOG_INFO
,
980 "Max EBML element depth (%d) reached, "
981 "cannot parse further.\n", EBML_MAX_DEPTH
);
986 level
.length
= (uint64_t)-1;
987 matroska
->levels
[matroska
->num_levels
] = level
;
988 matroska
->num_levels
++;
990 ebml_parse(matroska
, matroska_segment
, matroska
);
992 /* remove dummy level */
993 while (matroska
->num_levels
) {
994 uint64_t length
= matroska
->levels
[--matroska
->num_levels
].length
;
995 if (length
== (uint64_t)-1)
1001 url_fseek(matroska
->ctx
->pb
, before_pos
, SEEK_SET
);
1002 matroska
->level_up
= level_up
;
1005 static int matroska_aac_profile(char *codec_id
)
1007 static const char * const aac_profiles
[] = { "MAIN", "LC", "SSR" };
1010 for (profile
=0; profile
<ARRAY_SIZE(aac_profiles
); profile
++)
1011 if (strstr(codec_id
, aac_profiles
[profile
]))
1016 static int matroska_aac_sri(int samplerate
)
1020 for (sri
=0; sri
<ARRAY_SIZE(ff_mpeg4audio_sample_rates
); sri
++)
1021 if (ff_mpeg4audio_sample_rates
[sri
] == samplerate
)
1026 static int matroska_read_header(AVFormatContext
*s
, AVFormatParameters
*ap
)
1028 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1029 EbmlList
*attachements_list
= &matroska
->attachments
;
1030 MatroskaAttachement
*attachements
;
1031 EbmlList
*chapters_list
= &matroska
->chapters
;
1032 MatroskaChapter
*chapters
;
1033 MatroskaTrack
*tracks
;
1034 EbmlList
*index_list
;
1035 MatroskaIndex
*index
;
1042 /* First read the EBML header. */
1043 if (ebml_parse(matroska
, ebml_syntax
, &ebml
)
1044 || ebml
.version
> EBML_VERSION
|| ebml
.max_size
> sizeof(uint64_t)
1045 || ebml
.id_length
> sizeof(uint32_t) || strcmp(ebml
.doctype
, "matroska")
1046 || ebml
.doctype_version
> 2) {
1047 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1048 "EBML header using unsupported features\n"
1049 "(EBML version %"PRIu64
", doctype %s, doc version %"PRIu64
")\n",
1050 ebml
.version
, ebml
.doctype
, ebml
.doctype_version
);
1051 return AVERROR_NOFMT
;
1053 ebml_free(ebml_syntax
, &ebml
);
1055 /* The next thing is a segment. */
1056 if (ebml_parse(matroska
, matroska_segments
, matroska
) < 0)
1058 matroska_execute_seekhead(matroska
);
1060 if (matroska
->duration
)
1061 matroska
->ctx
->duration
= matroska
->duration
* matroska
->time_scale
1062 * 1000 / AV_TIME_BASE
;
1063 if (matroska
->title
)
1064 strncpy(matroska
->ctx
->title
, matroska
->title
,
1065 sizeof(matroska
->ctx
->title
)-1);
1066 matroska_convert_tags(s
, &matroska
->tags
);
1068 tracks
= matroska
->tracks
.elem
;
1069 for (i
=0; i
< matroska
->tracks
.nb_elem
; i
++) {
1070 MatroskaTrack
*track
= &tracks
[i
];
1071 enum CodecID codec_id
= CODEC_ID_NONE
;
1072 EbmlList
*encodings_list
= &tracks
->encodings
;
1073 MatroskaTrackEncoding
*encodings
= encodings_list
->elem
;
1074 uint8_t *extradata
= NULL
;
1075 int extradata_size
= 0;
1076 int extradata_offset
= 0;
1078 /* Apply some sanity checks. */
1079 if (track
->type
!= MATROSKA_TRACK_TYPE_VIDEO
&&
1080 track
->type
!= MATROSKA_TRACK_TYPE_AUDIO
&&
1081 track
->type
!= MATROSKA_TRACK_TYPE_SUBTITLE
) {
1082 av_log(matroska
->ctx
, AV_LOG_INFO
,
1083 "Unknown or unsupported track type %"PRIu64
"\n",
1087 if (track
->codec_id
== NULL
)
1090 if (track
->type
== MATROSKA_TRACK_TYPE_VIDEO
) {
1091 if (!track
->default_duration
)
1092 track
->default_duration
= 1000000000/track
->video
.frame_rate
;
1093 if (!track
->video
.display_width
)
1094 track
->video
.display_width
= track
->video
.pixel_width
;
1095 if (!track
->video
.display_height
)
1096 track
->video
.display_height
= track
->video
.pixel_height
;
1097 } else if (track
->type
== MATROSKA_TRACK_TYPE_AUDIO
) {
1098 if (!track
->audio
.out_samplerate
)
1099 track
->audio
.out_samplerate
= track
->audio
.samplerate
;
1101 if (encodings_list
->nb_elem
> 1) {
1102 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1103 "Multiple combined encodings no supported");
1104 } else if (encodings_list
->nb_elem
== 1) {
1105 if (encodings
[0].type
||
1106 (encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
&&
1108 encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_ZLIB
&&
1111 encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_BZLIB
&&
1113 encodings
[0].compression
.algo
!= MATROSKA_TRACK_ENCODING_COMP_LZO
)) {
1114 encodings
[0].scope
= 0;
1115 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1116 "Unsupported encoding type");
1117 } else if (track
->codec_priv
.size
&& encodings
[0].scope
&2) {
1118 uint8_t *codec_priv
= track
->codec_priv
.data
;
1119 int offset
= matroska_decode_buffer(&track
->codec_priv
.data
,
1120 &track
->codec_priv
.size
,
1123 track
->codec_priv
.data
= NULL
;
1124 track
->codec_priv
.size
= 0;
1125 av_log(matroska
->ctx
, AV_LOG_ERROR
,
1126 "Failed to decode codec private data\n");
1127 } else if (offset
> 0) {
1128 track
->codec_priv
.data
= av_malloc(track
->codec_priv
.size
+ offset
);
1129 memcpy(track
->codec_priv
.data
,
1130 encodings
[0].compression
.settings
.data
, offset
);
1131 memcpy(track
->codec_priv
.data
+offset
, codec_priv
,
1132 track
->codec_priv
.size
);
1133 track
->codec_priv
.size
+= offset
;
1135 if (codec_priv
!= track
->codec_priv
.data
)
1136 av_free(codec_priv
);
1140 for(j
=0; ff_mkv_codec_tags
[j
].id
!= CODEC_ID_NONE
; j
++){
1141 if(!strncmp(ff_mkv_codec_tags
[j
].str
, track
->codec_id
,
1142 strlen(ff_mkv_codec_tags
[j
].str
))){
1143 codec_id
= ff_mkv_codec_tags
[j
].id
;
1148 st
= track
->stream
= av_new_stream(s
, 0);
1150 return AVERROR(ENOMEM
);
1152 if (!strcmp(track
->codec_id
, "V_MS/VFW/FOURCC")
1153 && track
->codec_priv
.size
>= 40
1154 && track
->codec_priv
.data
!= NULL
) {
1155 track
->video
.fourcc
= AV_RL32(track
->codec_priv
.data
+ 16);
1156 codec_id
= codec_get_id(codec_bmp_tags
, track
->video
.fourcc
);
1157 } else if (!strcmp(track
->codec_id
, "A_MS/ACM")
1158 && track
->codec_priv
.size
>= 18
1159 && track
->codec_priv
.data
!= NULL
) {
1160 uint16_t tag
= AV_RL16(track
->codec_priv
.data
);
1161 codec_id
= codec_get_id(codec_wav_tags
, tag
);
1162 } else if (!strcmp(track
->codec_id
, "V_QUICKTIME")
1163 && (track
->codec_priv
.size
>= 86)
1164 && (track
->codec_priv
.data
!= NULL
)) {
1165 track
->video
.fourcc
= AV_RL32(track
->codec_priv
.data
);
1166 codec_id
=codec_get_id(codec_movvideo_tags
, track
->video
.fourcc
);
1167 } else if (codec_id
== CODEC_ID_PCM_S16BE
) {
1168 switch (track
->audio
.bitdepth
) {
1169 case 8: codec_id
= CODEC_ID_PCM_U8
; break;
1170 case 24: codec_id
= CODEC_ID_PCM_S24BE
; break;
1171 case 32: codec_id
= CODEC_ID_PCM_S32BE
; break;
1173 } else if (codec_id
== CODEC_ID_PCM_S16LE
) {
1174 switch (track
->audio
.bitdepth
) {
1175 case 8: codec_id
= CODEC_ID_PCM_U8
; break;
1176 case 24: codec_id
= CODEC_ID_PCM_S24LE
; break;
1177 case 32: codec_id
= CODEC_ID_PCM_S32LE
; break;
1179 } else if (codec_id
==CODEC_ID_PCM_F32LE
&& track
->audio
.bitdepth
==64) {
1180 codec_id
= CODEC_ID_PCM_F64LE
;
1181 } else if (codec_id
== CODEC_ID_AAC
&& !track
->codec_priv
.size
) {
1182 int profile
= matroska_aac_profile(track
->codec_id
);
1183 int sri
= matroska_aac_sri(track
->audio
.samplerate
);
1184 extradata
= av_malloc(5);
1185 if (extradata
== NULL
)
1186 return AVERROR(ENOMEM
);
1187 extradata
[0] = (profile
<< 3) | ((sri
&0x0E) >> 1);
1188 extradata
[1] = ((sri
&0x01) << 7) | (track
->audio
.channels
<<3);
1189 if (strstr(track
->codec_id
, "SBR")) {
1190 sri
= matroska_aac_sri(track
->audio
.out_samplerate
);
1191 extradata
[2] = 0x56;
1192 extradata
[3] = 0xE5;
1193 extradata
[4] = 0x80 | (sri
<<3);
1197 } else if (codec_id
== CODEC_ID_TTA
) {
1199 extradata_size
= 30;
1200 extradata
= av_mallocz(extradata_size
);
1201 if (extradata
== NULL
)
1202 return AVERROR(ENOMEM
);
1203 init_put_byte(&b
, extradata
, extradata_size
, 1,
1204 NULL
, NULL
, NULL
, NULL
);
1205 put_buffer(&b
, "TTA1", 4);
1207 put_le16(&b
, track
->audio
.channels
);
1208 put_le16(&b
, track
->audio
.bitdepth
);
1209 put_le32(&b
, track
->audio
.out_samplerate
);
1210 put_le32(&b
, matroska
->ctx
->duration
* track
->audio
.out_samplerate
);
1211 } else if (codec_id
== CODEC_ID_RV10
|| codec_id
== CODEC_ID_RV20
||
1212 codec_id
== CODEC_ID_RV30
|| codec_id
== CODEC_ID_RV40
) {
1213 extradata_offset
= 26;
1214 track
->codec_priv
.size
-= extradata_offset
;
1215 } else if (codec_id
== CODEC_ID_RA_144
) {
1216 track
->audio
.out_samplerate
= 8000;
1217 track
->audio
.channels
= 1;
1218 } else if (codec_id
== CODEC_ID_RA_288
|| codec_id
== CODEC_ID_COOK
||
1219 codec_id
== CODEC_ID_ATRAC3
) {
1222 init_put_byte(&b
, track
->codec_priv
.data
,track
->codec_priv
.size
,
1223 0, NULL
, NULL
, NULL
, NULL
);
1225 track
->audio
.coded_framesize
= get_be32(&b
);
1227 track
->audio
.sub_packet_h
= get_be16(&b
);
1228 track
->audio
.frame_size
= get_be16(&b
);
1229 track
->audio
.sub_packet_size
= get_be16(&b
);
1230 track
->audio
.buf
= av_malloc(track
->audio
.frame_size
* track
->audio
.sub_packet_h
);
1231 if (codec_id
== CODEC_ID_RA_288
) {
1232 st
->codec
->block_align
= track
->audio
.coded_framesize
;
1233 track
->codec_priv
.size
= 0;
1235 st
->codec
->block_align
= track
->audio
.sub_packet_size
;
1236 extradata_offset
= 78;
1237 track
->codec_priv
.size
-= extradata_offset
;
1241 if (codec_id
== CODEC_ID_NONE
)
1242 av_log(matroska
->ctx
, AV_LOG_INFO
,
1243 "Unknown/unsupported CodecID %s.\n", track
->codec_id
);
1245 av_set_pts_info(st
, 64, matroska
->time_scale
*track
->time_scale
, 1000*1000*1000); /* 64 bit pts in ns */
1247 st
->codec
->codec_id
= codec_id
;
1249 if (strcmp(track
->language
, "und"))
1250 av_strlcpy(st
->language
, track
->language
, 4);
1252 if (track
->flag_default
)
1253 st
->disposition
|= AV_DISPOSITION_DEFAULT
;
1255 if (track
->default_duration
)
1256 av_reduce(&st
->codec
->time_base
.num
, &st
->codec
->time_base
.den
,
1257 track
->default_duration
, 1000000000, 30000);
1260 st
->codec
->extradata
= extradata
;
1261 st
->codec
->extradata_size
= extradata_size
;
1262 } else if(track
->codec_priv
.data
&& track
->codec_priv
.size
> 0){
1263 st
->codec
->extradata
= av_malloc(track
->codec_priv
.size
);
1264 if(st
->codec
->extradata
== NULL
)
1265 return AVERROR(ENOMEM
);
1266 st
->codec
->extradata_size
= track
->codec_priv
.size
;
1267 memcpy(st
->codec
->extradata
,
1268 track
->codec_priv
.data
+ extradata_offset
,
1269 track
->codec_priv
.size
);
1272 if (track
->type
== MATROSKA_TRACK_TYPE_VIDEO
) {
1273 st
->codec
->codec_type
= CODEC_TYPE_VIDEO
;
1274 st
->codec
->codec_tag
= track
->video
.fourcc
;
1275 st
->codec
->width
= track
->video
.pixel_width
;
1276 st
->codec
->height
= track
->video
.pixel_height
;
1277 av_reduce(&st
->sample_aspect_ratio
.num
,
1278 &st
->sample_aspect_ratio
.den
,
1279 st
->codec
->height
* track
->video
.display_width
,
1280 st
->codec
-> width
* track
->video
.display_height
,
1282 st
->need_parsing
= AVSTREAM_PARSE_HEADERS
;
1283 } else if (track
->type
== MATROSKA_TRACK_TYPE_AUDIO
) {
1284 st
->codec
->codec_type
= CODEC_TYPE_AUDIO
;
1285 st
->codec
->sample_rate
= track
->audio
.out_samplerate
;
1286 st
->codec
->channels
= track
->audio
.channels
;
1287 } else if (track
->type
== MATROSKA_TRACK_TYPE_SUBTITLE
) {
1288 st
->codec
->codec_type
= CODEC_TYPE_SUBTITLE
;
1292 attachements
= attachements_list
->elem
;
1293 for (j
=0; j
<attachements_list
->nb_elem
; j
++) {
1294 if (!(attachements
[j
].filename
&& attachements
[j
].mime
&&
1295 attachements
[j
].bin
.data
&& attachements
[j
].bin
.size
> 0)) {
1296 av_log(matroska
->ctx
, AV_LOG_ERROR
, "incomplete attachment\n");
1298 AVStream
*st
= av_new_stream(s
, 0);
1301 st
->filename
= av_strdup(attachements
[j
].filename
);
1302 st
->codec
->codec_id
= CODEC_ID_NONE
;
1303 st
->codec
->codec_type
= CODEC_TYPE_ATTACHMENT
;
1304 st
->codec
->extradata
= av_malloc(attachements
[j
].bin
.size
);
1305 if(st
->codec
->extradata
== NULL
)
1307 st
->codec
->extradata_size
= attachements
[j
].bin
.size
;
1308 memcpy(st
->codec
->extradata
, attachements
[j
].bin
.data
, attachements
[j
].bin
.size
);
1310 for (i
=0; ff_mkv_mime_tags
[i
].id
!= CODEC_ID_NONE
; i
++) {
1311 if (!strncmp(ff_mkv_mime_tags
[i
].str
, attachements
[j
].mime
,
1312 strlen(ff_mkv_mime_tags
[i
].str
))) {
1313 st
->codec
->codec_id
= ff_mkv_mime_tags
[i
].id
;
1320 chapters
= chapters_list
->elem
;
1321 for (i
=0; i
<chapters_list
->nb_elem
; i
++)
1322 if (chapters
[i
].start
!= AV_NOPTS_VALUE
&& chapters
[i
].uid
)
1323 ff_new_chapter(s
, chapters
[i
].uid
, (AVRational
){1, 1000000000},
1324 chapters
[i
].start
, chapters
[i
].end
,
1327 index_list
= &matroska
->index
;
1328 index
= index_list
->elem
;
1329 for (i
=0; i
<index_list
->nb_elem
; i
++) {
1330 EbmlList
*pos_list
= &index
[i
].pos
;
1331 MatroskaIndexPos
*pos
= pos_list
->elem
;
1332 for (j
=0; j
<pos_list
->nb_elem
; j
++) {
1333 MatroskaTrack
*track
= matroska_find_track_by_num(matroska
,
1335 if (track
&& track
->stream
)
1336 av_add_index_entry(track
->stream
,
1337 pos
[j
].pos
+ matroska
->segment_start
,
1338 index
[i
].time
*matroska
->time_scale
/AV_TIME_BASE
,
1339 0, 0, AVINDEX_KEYFRAME
);
1347 * Put one packet in an application-supplied AVPacket struct.
1348 * Returns 0 on success or -1 on failure.
1350 static int matroska_deliver_packet(MatroskaDemuxContext
*matroska
,
1353 if (matroska
->num_packets
> 0) {
1354 memcpy(pkt
, matroska
->packets
[0], sizeof(AVPacket
));
1355 av_free(matroska
->packets
[0]);
1356 if (matroska
->num_packets
> 1) {
1357 memmove(&matroska
->packets
[0], &matroska
->packets
[1],
1358 (matroska
->num_packets
- 1) * sizeof(AVPacket
*));
1360 av_realloc(matroska
->packets
, (matroska
->num_packets
- 1) *
1361 sizeof(AVPacket
*));
1363 av_freep(&matroska
->packets
);
1365 matroska
->num_packets
--;
1373 * Free all packets in our internal queue.
1375 static void matroska_clear_queue(MatroskaDemuxContext
*matroska
)
1377 if (matroska
->packets
) {
1379 for (n
= 0; n
< matroska
->num_packets
; n
++) {
1380 av_free_packet(matroska
->packets
[n
]);
1381 av_free(matroska
->packets
[n
]);
1383 av_freep(&matroska
->packets
);
1384 matroska
->num_packets
= 0;
1388 static int matroska_parse_block(MatroskaDemuxContext
*matroska
, uint8_t *data
,
1389 int size
, int64_t pos
, uint64_t cluster_time
,
1390 uint64_t duration
, int is_keyframe
)
1392 MatroskaTrack
*track
;
1397 uint32_t *lace_size
= NULL
;
1398 int n
, flags
, laces
= 0;
1401 if ((n
= matroska_ebmlnum_uint(matroska
, data
, size
, &num
)) < 0) {
1402 av_log(matroska
->ctx
, AV_LOG_ERROR
, "EBML block data error\n");
1408 track
= matroska_find_track_by_num(matroska
, num
);
1409 if (size
<= 3 || !track
|| !track
->stream
) {
1410 av_log(matroska
->ctx
, AV_LOG_INFO
,
1411 "Invalid stream %"PRIu64
" or size %u\n", num
, size
);
1415 if (st
->discard
>= AVDISCARD_ALL
)
1417 if (duration
== AV_NOPTS_VALUE
)
1418 duration
= track
->default_duration
/ matroska
->time_scale
;
1420 block_time
= AV_RB16(data
);
1424 if (is_keyframe
== -1)
1425 is_keyframe
= flags
& 0x80 ? PKT_FLAG_KEY
: 0;
1427 if (matroska
->skip_to_keyframe
) {
1428 if (!is_keyframe
|| st
!= matroska
->skip_to_stream
)
1430 matroska
->skip_to_keyframe
= 0;
1433 switch ((flags
& 0x06) >> 1) {
1434 case 0x0: /* no lacing */
1436 lace_size
= av_mallocz(sizeof(int));
1437 lace_size
[0] = size
;
1440 case 0x1: /* Xiph lacing */
1441 case 0x2: /* fixed-size lacing */
1442 case 0x3: /* EBML lacing */
1443 assert(size
>0); // size <=3 is checked before size-=3 above
1444 laces
= (*data
) + 1;
1447 lace_size
= av_mallocz(laces
* sizeof(int));
1449 switch ((flags
& 0x06) >> 1) {
1450 case 0x1: /* Xiph lacing */ {
1453 for (n
= 0; res
== 0 && n
< laces
- 1; n
++) {
1460 lace_size
[n
] += temp
;
1466 total
+= lace_size
[n
];
1468 lace_size
[n
] = size
- total
;
1472 case 0x2: /* fixed-size lacing */
1473 for (n
= 0; n
< laces
; n
++)
1474 lace_size
[n
] = size
/ laces
;
1477 case 0x3: /* EBML lacing */ {
1479 n
= matroska_ebmlnum_uint(matroska
, data
, size
, &num
);
1481 av_log(matroska
->ctx
, AV_LOG_INFO
,
1482 "EBML block data error\n");
1487 total
= lace_size
[0] = num
;
1488 for (n
= 1; res
== 0 && n
< laces
- 1; n
++) {
1491 r
= matroska_ebmlnum_sint(matroska
, data
, size
, &snum
);
1493 av_log(matroska
->ctx
, AV_LOG_INFO
,
1494 "EBML block data error\n");
1499 lace_size
[n
] = lace_size
[n
- 1] + snum
;
1500 total
+= lace_size
[n
];
1502 lace_size
[n
] = size
- total
;
1510 uint64_t timecode
= AV_NOPTS_VALUE
;
1512 if (cluster_time
!= (uint64_t)-1
1513 && (block_time
>= 0 || cluster_time
>= -block_time
))
1514 timecode
= cluster_time
+ block_time
;
1516 for (n
= 0; n
< laces
; n
++) {
1517 if (st
->codec
->codec_id
== CODEC_ID_RA_288
||
1518 st
->codec
->codec_id
== CODEC_ID_COOK
||
1519 st
->codec
->codec_id
== CODEC_ID_ATRAC3
) {
1520 int a
= st
->codec
->block_align
;
1521 int sps
= track
->audio
.sub_packet_size
;
1522 int cfs
= track
->audio
.coded_framesize
;
1523 int h
= track
->audio
.sub_packet_h
;
1524 int y
= track
->audio
.sub_packet_cnt
;
1525 int w
= track
->audio
.frame_size
;
1528 if (!track
->audio
.pkt_cnt
) {
1529 if (st
->codec
->codec_id
== CODEC_ID_RA_288
)
1530 for (x
=0; x
<h
/2; x
++)
1531 memcpy(track
->audio
.buf
+x
*2*w
+y
*cfs
,
1534 for (x
=0; x
<w
/sps
; x
++)
1535 memcpy(track
->audio
.buf
+sps
*(h
*x
+((h
+1)/2)*(y
&1)+(y
>>1)), data
+x
*sps
, sps
);
1537 if (++track
->audio
.sub_packet_cnt
>= h
) {
1538 track
->audio
.sub_packet_cnt
= 0;
1539 track
->audio
.pkt_cnt
= h
*w
/ a
;
1542 while (track
->audio
.pkt_cnt
) {
1543 pkt
= av_mallocz(sizeof(AVPacket
));
1544 av_new_packet(pkt
, a
);
1545 memcpy(pkt
->data
, track
->audio
.buf
1546 + a
* (h
*w
/ a
- track
->audio
.pkt_cnt
--), a
);
1548 pkt
->stream_index
= st
->index
;
1549 dynarray_add(&matroska
->packets
,&matroska
->num_packets
,pkt
);
1552 MatroskaTrackEncoding
*encodings
= track
->encodings
.elem
;
1553 int offset
= 0, pkt_size
= lace_size
[n
];
1554 uint8_t *pkt_data
= data
;
1556 if (encodings
&& encodings
->scope
& 1) {
1557 offset
= matroska_decode_buffer(&pkt_data
,&pkt_size
, track
);
1562 pkt
= av_mallocz(sizeof(AVPacket
));
1563 /* XXX: prevent data copy... */
1564 if (av_new_packet(pkt
, pkt_size
+offset
) < 0) {
1566 res
= AVERROR(ENOMEM
);
1571 memcpy (pkt
->data
, encodings
->compression
.settings
.data
, offset
);
1572 memcpy (pkt
->data
+offset
, pkt_data
, pkt_size
);
1574 if (pkt_data
!= data
)
1578 pkt
->flags
= is_keyframe
;
1579 pkt
->stream_index
= st
->index
;
1581 pkt
->pts
= timecode
;
1583 pkt
->duration
= duration
;
1585 dynarray_add(&matroska
->packets
, &matroska
->num_packets
, pkt
);
1588 if (timecode
!= AV_NOPTS_VALUE
)
1589 timecode
= duration ? timecode
+ duration
: AV_NOPTS_VALUE
;
1590 data
+= lace_size
[n
];
1598 static int matroska_parse_cluster(MatroskaDemuxContext
*matroska
)
1600 MatroskaCluster cluster
= { 0 };
1601 EbmlList
*blocks_list
;
1602 MatroskaBlock
*blocks
;
1604 if (matroska
->has_cluster_id
){
1605 /* For the first cluster we parse, its ID was already read as
1606 part of matroska_read_header(), so don't read it again */
1607 res
= ebml_parse_id(matroska
, matroska_clusters
,
1608 MATROSKA_ID_CLUSTER
, &cluster
);
1609 matroska
->has_cluster_id
= 0;
1611 res
= ebml_parse(matroska
, matroska_clusters
, &cluster
);
1612 blocks_list
= &cluster
.blocks
;
1613 blocks
= blocks_list
->elem
;
1614 for (i
=0; i
<blocks_list
->nb_elem
; i
++)
1615 if (blocks
[i
].bin
.size
> 0)
1616 res
=matroska_parse_block(matroska
,
1617 blocks
[i
].bin
.data
, blocks
[i
].bin
.size
,
1618 blocks
[i
].bin
.pos
, cluster
.timecode
,
1619 blocks
[i
].duration
, !blocks
[i
].reference
);
1620 ebml_free(matroska_cluster
, &cluster
);
1624 static int matroska_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
1626 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1628 while (matroska_deliver_packet(matroska
, pkt
)) {
1630 return AVERROR(EIO
);
1631 if (matroska_parse_cluster(matroska
) < 0)
1638 static int matroska_read_seek(AVFormatContext
*s
, int stream_index
,
1639 int64_t timestamp
, int flags
)
1641 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1642 AVStream
*st
= s
->streams
[stream_index
];
1645 index
= av_index_search_timestamp(st
, timestamp
, flags
);
1649 matroska_clear_queue(matroska
);
1651 url_fseek(s
->pb
, st
->index_entries
[index
].pos
, SEEK_SET
);
1652 matroska
->skip_to_keyframe
= !(flags
& AVSEEK_FLAG_ANY
);
1653 matroska
->skip_to_stream
= st
;
1654 av_update_cur_dts(s
, st
, st
->index_entries
[index
].timestamp
);
1658 static int matroska_read_close(AVFormatContext
*s
)
1660 MatroskaDemuxContext
*matroska
= s
->priv_data
;
1661 MatroskaTrack
*tracks
= matroska
->tracks
.elem
;
1664 matroska_clear_queue(matroska
);
1666 for (n
=0; n
< matroska
->tracks
.nb_elem
; n
++)
1667 if (tracks
[n
].type
== MATROSKA_TRACK_TYPE_AUDIO
)
1668 av_free(tracks
[n
].audio
.buf
);
1669 ebml_free(matroska_segment
, matroska
);
1674 AVInputFormat matroska_demuxer
= {
1676 NULL_IF_CONFIG_SMALL("Matroska file format"),
1677 sizeof(MatroskaDemuxContext
),
1679 matroska_read_header
,
1680 matroska_read_packet
,
1681 matroska_read_close
,