FFmpeg
matroskadec.c
Go to the documentation of this file.
1 /*
2  * Matroska file demuxer
3  * Copyright (c) 2003-2008 The FFmpeg Project
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 /**
23  * @file
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/
29  */
30 
31 #include "config.h"
32 
33 #include <inttypes.h>
34 #include <stdio.h>
35 
36 #include "libavutil/avstring.h"
37 #include "libavutil/base64.h"
38 #include "libavutil/bprint.h"
39 #include "libavutil/dict.h"
40 #include "libavutil/intfloat.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/lzo.h"
44 #include "libavutil/mathematics.h"
45 #include "libavutil/opt.h"
47 #include "libavutil/spherical.h"
48 
49 #include "libavcodec/bytestream.h"
50 #include "libavcodec/flac.h"
51 #include "libavcodec/mpeg4audio.h"
53 
54 #include "avformat.h"
55 #include "avio_internal.h"
56 #include "dovi_isom.h"
57 #include "internal.h"
58 #include "isom.h"
59 #include "matroska.h"
60 #include "oggdec.h"
61 /* For ff_codec_get_id(). */
62 #include "riff.h"
63 #include "rmsipr.h"
64 
65 #if CONFIG_BZLIB
66 #include <bzlib.h>
67 #endif
68 #if CONFIG_ZLIB
69 #include <zlib.h>
70 #endif
71 
72 #include "qtpalette.h"
73 
74 #define EBML_UNKNOWN_LENGTH UINT64_MAX /* EBML unknown length, in uint64_t */
75 #define NEEDS_CHECKING 2 /* Indicates that some error checks
76  * still need to be performed */
77 #define LEVEL_ENDED 3 /* return value of ebml_parse when the
78  * syntax level used for parsing ended. */
79 #define SKIP_THRESHOLD 1024 * 1024 /* In non-seekable mode, if more than SKIP_THRESHOLD
80  * of unkown, potentially damaged data is encountered,
81  * it is considered an error. */
82 #define UNKNOWN_EQUIV 50 * 1024 /* An unknown element is considered equivalent
83  * to this many bytes of unknown data for the
84  * SKIP_THRESHOLD check. */
85 
86 typedef enum {
92  EBML_UTF8,
93  EBML_BIN,
99 
100 typedef struct CountedElement {
101  union {
102  uint64_t u;
103  int64_t i;
104  double f;
105  char *s;
106  } el;
107  unsigned count;
109 
110 typedef const struct EbmlSyntax {
111  uint32_t id;
112  uint8_t type;
113  uint8_t is_counted;
115  size_t data_offset;
116  union {
117  int64_t i;
118  uint64_t u;
119  double f;
120  const char *s;
121  const struct EbmlSyntax *n;
122  } def;
123 } EbmlSyntax;
124 
125 typedef struct EbmlList {
126  int nb_elem;
127  unsigned int alloc_elem_size;
128  void *elem;
130 
131 typedef struct EbmlBin {
132  int size;
134  uint8_t *data;
135  int64_t pos;
137 
138 typedef struct Ebml {
139  uint64_t version;
140  uint64_t max_size;
141  uint64_t id_length;
142  char *doctype;
143  uint64_t doctype_version;
144 } Ebml;
145 
146 typedef struct MatroskaTrackCompression {
147  uint64_t algo;
150 
151 typedef struct MatroskaTrackEncryption {
152  uint64_t algo;
155 
156 typedef struct MatroskaTrackEncoding {
157  uint64_t scope;
158  uint64_t type;
162 
163 typedef struct MatroskaMasteringMeta {
164  double r_x;
165  double r_y;
166  double g_x;
167  double g_y;
168  double b_x;
169  double b_y;
170  double white_x;
171  double white_y;
175 
176 typedef struct MatroskaTrackVideoColor {
179  uint64_t chroma_sub_horz;
180  uint64_t chroma_sub_vert;
181  uint64_t cb_sub_horz;
182  uint64_t cb_sub_vert;
185  uint64_t range;
186  uint64_t transfer_characteristics;
187  uint64_t primaries;
188  uint64_t max_cll;
189  uint64_t max_fall;
192 
193 typedef struct MatroskaTrackVideoProjection {
194  uint64_t type;
195  EbmlBin private;
196  double yaw;
197  double pitch;
198  double roll;
200 
201 typedef struct MatroskaTrackVideo {
202  double frame_rate;
203  uint64_t display_width;
204  uint64_t display_height;
205  uint64_t pixel_width;
206  uint64_t pixel_height;
208  uint64_t display_unit;
209  uint64_t interlaced;
210  uint64_t field_order;
211  uint64_t stereo_mode;
212  uint64_t alpha_mode;
216 
217 typedef struct MatroskaTrackAudio {
218  double samplerate;
220  uint64_t bitdepth;
221  uint64_t channels;
222 
223  /* real audio header (extracted from extradata) */
226  int frame_size;
227  int sub_packet_size;
229  int pkt_cnt;
230  uint64_t buf_timecode;
231  uint8_t *buf;
233 
234 typedef struct MatroskaTrackPlane {
235  uint64_t uid;
236  uint64_t type;
238 
239 typedef struct MatroskaTrackOperation {
242 
243 typedef struct MatroskaBlockAdditionMapping {
244  uint64_t value;
245  char *name;
246  uint64_t type;
249 
250 typedef struct MatroskaTrack {
251  uint64_t num;
252  uint64_t uid;
253  uint64_t type;
254  char *name;
255  char *codec_id;
257  char *language;
258  double time_scale;
260  uint64_t flag_default;
261  uint64_t flag_forced;
262  uint64_t flag_comment;
267  uint64_t seek_preroll;
272  uint64_t codec_delay;
274 
275  AVStream *stream;
276  int64_t end_timecode;
278  int needs_decoding;
279  uint64_t max_block_additional_id;
281 
285 
286 typedef struct MatroskaAttachment {
287  uint64_t uid;
288  char *filename;
289  char *description;
290  char *mime;
292 
295 
296 typedef struct MatroskaChapter {
297  uint64_t start;
298  uint64_t end;
299  uint64_t uid;
300  char *title;
301 
304 
305 typedef struct MatroskaIndexPos {
306  uint64_t track;
307  uint64_t pos;
309 
310 typedef struct MatroskaIndex {
311  uint64_t time;
314 
315 typedef struct MatroskaTag {
316  char *name;
317  char *string;
318  char *lang;
319  uint64_t def;
322 
323 typedef struct MatroskaTagTarget {
324  char *type;
325  uint64_t typevalue;
326  uint64_t trackuid;
327  uint64_t chapteruid;
328  uint64_t attachuid;
330 
331 typedef struct MatroskaTags {
333  EbmlList tag;
334 } MatroskaTags;
335 
336 typedef struct MatroskaSeekhead {
337  uint64_t id;
338  uint64_t pos;
340 
341 typedef struct MatroskaLevel {
342  uint64_t start;
343  uint64_t length;
345 
346 typedef struct MatroskaBlock {
347  uint64_t duration;
349  uint64_t non_simple;
351  uint64_t additional_id;
354 } MatroskaBlock;
355 
356 typedef struct MatroskaCluster {
358  uint64_t timecode;
359  int64_t pos;
361 
362 typedef struct MatroskaLevel1Element {
363  int64_t pos;
364  uint32_t id;
365  int parsed;
367 
368 typedef struct MatroskaDemuxContext {
369  const AVClass *class;
371 
372  /* EBML stuff */
375  uint32_t current_id;
376  int64_t resync_pos;
378 
379  uint64_t time_scale;
380  double duration;
381  char *title;
382  char *muxingapp;
387  EbmlList index;
388  EbmlList tags;
390 
391  /* byte position of the segment inside the stream */
392  int64_t segment_start;
393 
394  /* This packet coincides with FFFormatContext.parse_pkt
395  * and is not owned by us. */
396  AVPacket *pkt;
397 
398  /* the packet queue */
400 
401  int done;
402 
403  /* What to skip before effectively reading a packet. */
404  int skip_to_keyframe;
406 
407  /* File has a CUES element, but we defer parsing until it is needed. */
409 
410  /* Level1 elements and whether they were read yet */
412  int num_level1_elems;
413 
415 
416  /* WebM DASH Manifest live flag */
417  int is_live;
418 
419  /* Bandwidth value for WebM DASH Manifest */
420  int bandwidth;
422 
423 #define CHILD_OF(parent) { .def = { .n = parent } }
424 
425 // The following forward declarations need their size because
426 // a tentative definition with internal linkage must not be an
427 // incomplete type (6.7.2 in C90, 6.9.2 in C99).
428 // Removing the sizes breaks MSVC.
435 
436 static EbmlSyntax ebml_header[] = {
437  { EBML_ID_EBMLREADVERSION, EBML_UINT, 0, 0, offsetof(Ebml, version), { .u = EBML_VERSION } },
438  { EBML_ID_EBMLMAXSIZELENGTH, EBML_UINT, 0, 0, offsetof(Ebml, max_size), { .u = 8 } },
439  { EBML_ID_EBMLMAXIDLENGTH, EBML_UINT, 0, 0, offsetof(Ebml, id_length), { .u = 4 } },
440  { EBML_ID_DOCTYPE, EBML_STR, 0, 0, offsetof(Ebml, doctype), { .s = "(none)" } },
441  { EBML_ID_DOCTYPEREADVERSION, EBML_UINT, 0, 0, offsetof(Ebml, doctype_version), { .u = 1 } },
445 };
446 
448  { EBML_ID_HEADER, EBML_NEST, 0, 0, 0, { .n = ebml_header } },
450  { 0 }
451 };
452 
453 static EbmlSyntax matroska_info[] = {
454  { MATROSKA_ID_TIMECODESCALE, EBML_UINT, 0, 0, offsetof(MatroskaDemuxContext, time_scale), { .u = 1000000 } },
456  { MATROSKA_ID_TITLE, EBML_UTF8, 0, 0, offsetof(MatroskaDemuxContext, title) },
458  { MATROSKA_ID_MUXINGAPP, EBML_UTF8, 0, 0, offsetof(MatroskaDemuxContext, muxingapp) },
459  { MATROSKA_ID_DATEUTC, EBML_BIN, 0, 0, offsetof(MatroskaDemuxContext, date_utc) },
462 };
463 
471  { MATROSKA_ID_VIDEOCOLOR_WHITEX, EBML_FLOAT, 0, 0, offsetof(MatroskaMasteringMeta, white_x) },
472  { MATROSKA_ID_VIDEOCOLOR_WHITEY, EBML_FLOAT, 0, 0, offsetof(MatroskaMasteringMeta, white_y) },
473  { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN, EBML_FLOAT, 1, 0, offsetof(MatroskaMasteringMeta, min_luminance) },
474  { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX, EBML_FLOAT, 0, 0, offsetof(MatroskaMasteringMeta, max_luminance) },
476 };
477 
479  { MATROSKA_ID_VIDEOCOLORMATRIXCOEFF, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, matrix_coefficients), { .u = AVCOL_SPC_UNSPECIFIED } },
480  { MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, bits_per_channel), { .u = 0 } },
481  { MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, chroma_sub_horz) },
482  { MATROSKA_ID_VIDEOCOLORCHROMASUBVERT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, chroma_sub_vert) },
483  { MATROSKA_ID_VIDEOCOLORCBSUBHORZ, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, cb_sub_horz) },
484  { MATROSKA_ID_VIDEOCOLORCBSUBVERT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, cb_sub_vert) },
491  { MATROSKA_ID_VIDEOCOLORMAXFALL, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, max_fall) },
494 };
495 
499  { MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideoProjection, yaw), { .f = 0.0 } },
500  { MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideoProjection, pitch), { .f = 0.0 } },
501  { MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideoProjection, roll), { .f = 0.0 } },
503 };
504 
505 static EbmlSyntax matroska_track_video[] = {
506  { MATROSKA_ID_VIDEOFRAMERATE, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideo, frame_rate) },
507  { MATROSKA_ID_VIDEODISPLAYWIDTH, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, display_width), { .u=-1 } },
508  { MATROSKA_ID_VIDEODISPLAYHEIGHT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, display_height), { .u=-1 } },
509  { MATROSKA_ID_VIDEOPIXELWIDTH, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_width) },
510  { MATROSKA_ID_VIDEOPIXELHEIGHT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_height) },
511  { MATROSKA_ID_VIDEOCOLORSPACE, EBML_BIN, 0, 0, offsetof(MatroskaTrackVideo, color_space) },
512  { MATROSKA_ID_VIDEOALPHAMODE, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, alpha_mode), { .u = 0 } },
525 };
526 
527 static EbmlSyntax matroska_track_audio[] = {
528  { MATROSKA_ID_AUDIOSAMPLINGFREQ, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackAudio, samplerate), { .f = 8000.0 } },
529  { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackAudio, out_samplerate) },
530  { MATROSKA_ID_AUDIOBITDEPTH, EBML_UINT, 0, 0, offsetof(MatroskaTrackAudio, bitdepth) },
531  { MATROSKA_ID_AUDIOCHANNELS, EBML_UINT, 0, 0, offsetof(MatroskaTrackAudio, channels), { .u = 1 } },
533 };
534 
539 };
540 
542  { MATROSKA_ID_ENCODINGENCALGO, EBML_UINT, 0, 0, offsetof(MatroskaTrackEncryption,algo), {.u = 0} },
550 };
552  { MATROSKA_ID_ENCODINGSCOPE, EBML_UINT, 0, 0, offsetof(MatroskaTrackEncoding, scope), { .u = 1 } },
553  { MATROSKA_ID_ENCODINGTYPE, EBML_UINT, 0, 0, offsetof(MatroskaTrackEncoding, type), { .u = 0 } },
558 };
559 
563 };
564 
565 static EbmlSyntax matroska_track_plane[] = {
569 };
570 
572  { MATROSKA_ID_TRACKPLANE, EBML_NEST, 0, sizeof(MatroskaTrackPlane), offsetof(MatroskaTrackOperation,combine_planes), {.n = matroska_track_plane} },
574 };
575 
579 };
580 
587 };
588 
589 static EbmlSyntax matroska_track[] = {
590  { MATROSKA_ID_TRACKNUMBER, EBML_UINT, 0, 0, offsetof(MatroskaTrack, num) },
591  { MATROSKA_ID_TRACKNAME, EBML_UTF8, 0, 0, offsetof(MatroskaTrack, name) },
592  { MATROSKA_ID_TRACKUID, EBML_UINT, 0, 0, offsetof(MatroskaTrack, uid) },
593  { MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, 0, offsetof(MatroskaTrack, type) },
594  { MATROSKA_ID_CODECID, EBML_STR, 0, 0, offsetof(MatroskaTrack, codec_id) },
595  { MATROSKA_ID_CODECPRIVATE, EBML_BIN, 0, 0, offsetof(MatroskaTrack, codec_priv) },
596  { MATROSKA_ID_CODECDELAY, EBML_UINT, 0, 0, offsetof(MatroskaTrack, codec_delay), { .u = 0 } },
597  { MATROSKA_ID_TRACKLANGUAGE, EBML_STR, 0, 0, offsetof(MatroskaTrack, language), { .s = "eng" } },
598  { MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, 0, offsetof(MatroskaTrack, default_duration) },
599  { MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT, 0, 0, offsetof(MatroskaTrack, time_scale), { .f = 1.0 } },
600  { MATROSKA_ID_TRACKFLAGCOMMENTARY, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_comment), { .u = 0 } },
601  { MATROSKA_ID_TRACKFLAGDEFAULT, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_default), { .u = 1 } },
602  { MATROSKA_ID_TRACKFLAGFORCED, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_forced), { .u = 0 } },
603  { MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_hearingimpaired), { .u = 0 } },
604  { MATROSKA_ID_TRACKFLAGVISUALIMPAIRED, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_visualimpaired), { .u = 0 } },
605  { MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_textdescriptions), { .u = 0 } },
606  { MATROSKA_ID_TRACKFLAGORIGINAL, EBML_UINT, 1, 0, offsetof(MatroskaTrack, flag_original), {.u = 0 } },
608  { MATROSKA_ID_TRACKAUDIO, EBML_NEST, 0, 0, offsetof(MatroskaTrack, audio), { .n = matroska_track_audio } },
609  { MATROSKA_ID_TRACKOPERATION, EBML_NEST, 0, 0, offsetof(MatroskaTrack, operation), { .n = matroska_track_operation } },
611  { MATROSKA_ID_TRACKMAXBLKADDID, EBML_UINT, 0, 0, offsetof(MatroskaTrack, max_block_additional_id), { .u = 0 } },
612  { MATROSKA_ID_TRACKBLKADDMAPPING, EBML_NEST, 0, sizeof(MatroskaBlockAdditionMapping), offsetof(MatroskaTrack, block_addition_mappings), { .n = matroska_block_addition_mapping } },
613  { MATROSKA_ID_SEEKPREROLL, EBML_UINT, 0, 0, offsetof(MatroskaTrack, seek_preroll), { .u = 0 } },
623 };
624 
625 static EbmlSyntax matroska_tracks[] = {
626  { MATROSKA_ID_TRACKENTRY, EBML_NEST, 0, sizeof(MatroskaTrack), offsetof(MatroskaDemuxContext, tracks), { .n = matroska_track } },
628 };
629 
630 static EbmlSyntax matroska_attachment[] = {
631  { MATROSKA_ID_FILEUID, EBML_UINT, 0, 0, offsetof(MatroskaAttachment, uid) },
632  { MATROSKA_ID_FILENAME, EBML_UTF8, 0, 0, offsetof(MatroskaAttachment, filename) },
633  { MATROSKA_ID_FILEMIMETYPE, EBML_STR, 0, 0, offsetof(MatroskaAttachment, mime) },
634  { MATROSKA_ID_FILEDATA, EBML_BIN, 0, 0, offsetof(MatroskaAttachment, bin) },
637 };
638 
639 static EbmlSyntax matroska_attachments[] = {
640  { MATROSKA_ID_ATTACHEDFILE, EBML_NEST, 0, sizeof(MatroskaAttachment), offsetof(MatroskaDemuxContext, attachments), { .n = matroska_attachment } },
642 };
643 
645  { MATROSKA_ID_CHAPSTRING, EBML_UTF8, 0, 0, offsetof(MatroskaChapter, title) },
649 };
650 
652  { MATROSKA_ID_CHAPTERTIMESTART, EBML_UINT, 0, 0, offsetof(MatroskaChapter, start), { .u = AV_NOPTS_VALUE } },
653  { MATROSKA_ID_CHAPTERTIMEEND, EBML_UINT, 0, 0, offsetof(MatroskaChapter, end), { .u = AV_NOPTS_VALUE } },
654  { MATROSKA_ID_CHAPTERUID, EBML_UINT, 0, 0, offsetof(MatroskaChapter, uid) },
661 };
662 
663 static EbmlSyntax matroska_chapter[] = {
664  { MATROSKA_ID_CHAPTERATOM, EBML_NEST, 0, sizeof(MatroskaChapter), offsetof(MatroskaDemuxContext, chapters), { .n = matroska_chapter_entry } },
670 };
671 
672 static EbmlSyntax matroska_chapters[] = {
673  { MATROSKA_ID_EDITIONENTRY, EBML_NEST, 0, 0, 0, { .n = matroska_chapter } },
675 };
676 
677 static EbmlSyntax matroska_index_pos[] = {
678  { MATROSKA_ID_CUETRACK, EBML_UINT, 0, 0, offsetof(MatroskaIndexPos, track) },
684 };
685 
686 static EbmlSyntax matroska_index_entry[] = {
687  { MATROSKA_ID_CUETIME, EBML_UINT, 0, 0, offsetof(MatroskaIndex, time) },
690 };
691 
692 static EbmlSyntax matroska_index[] = {
695 };
696 
697 static EbmlSyntax matroska_simpletag[] = {
698  { MATROSKA_ID_TAGNAME, EBML_UTF8, 0, 0, offsetof(MatroskaTag, name) },
699  { MATROSKA_ID_TAGSTRING, EBML_UTF8, 0, 0, offsetof(MatroskaTag, string) },
700  { MATROSKA_ID_TAGLANG, EBML_STR, 0, 0, offsetof(MatroskaTag, lang), { .s = "und" } },
701  { MATROSKA_ID_TAGDEFAULT, EBML_UINT, 0, 0, offsetof(MatroskaTag, def) },
702  { MATROSKA_ID_TAGDEFAULT_BUG, EBML_UINT, 0, 0, offsetof(MatroskaTag, def) },
703  { MATROSKA_ID_SIMPLETAG, EBML_NEST, 0, sizeof(MatroskaTag), offsetof(MatroskaTag, sub), { .n = matroska_simpletag } },
705 };
706 
707 static EbmlSyntax matroska_tagtargets[] = {
709  { MATROSKA_ID_TAGTARGETS_TYPEVALUE, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, typevalue), { .u = 50 } },
710  { MATROSKA_ID_TAGTARGETS_TRACKUID, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, trackuid), { .u = 0 } },
711  { MATROSKA_ID_TAGTARGETS_CHAPTERUID, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, chapteruid), { .u = 0 } },
712  { MATROSKA_ID_TAGTARGETS_ATTACHUID, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, attachuid), { .u = 0 } },
714 };
715 
716 static EbmlSyntax matroska_tag[] = {
717  { MATROSKA_ID_SIMPLETAG, EBML_NEST, 0, sizeof(MatroskaTag), offsetof(MatroskaTags, tag), { .n = matroska_simpletag } },
718  { MATROSKA_ID_TAGTARGETS, EBML_NEST, 0, 0, offsetof(MatroskaTags, target), { .n = matroska_tagtargets } },
720 };
721 
722 static EbmlSyntax matroska_tags[] = {
723  { MATROSKA_ID_TAG, EBML_NEST, 0, sizeof(MatroskaTags), offsetof(MatroskaDemuxContext, tags), { .n = matroska_tag } },
725 };
726 
728  { MATROSKA_ID_SEEKID, EBML_UINT, 0, 0, offsetof(MatroskaSeekhead, id) },
729  { MATROSKA_ID_SEEKPOSITION, EBML_UINT, 0, 0, offsetof(MatroskaSeekhead, pos), { .u = -1 } },
731 };
732 
733 static EbmlSyntax matroska_seekhead[] = {
734  { MATROSKA_ID_SEEKENTRY, EBML_NEST, 0, sizeof(MatroskaSeekhead), offsetof(MatroskaDemuxContext, seekhead), { .n = matroska_seekhead_entry } },
736 };
737 
738 static EbmlSyntax matroska_segment[] = {
740  { MATROSKA_ID_INFO, EBML_LEVEL1, 0, 0, 0, { .n = matroska_info } },
741  { MATROSKA_ID_TRACKS, EBML_LEVEL1, 0, 0, 0, { .n = matroska_tracks } },
743  { MATROSKA_ID_CHAPTERS, EBML_LEVEL1, 0, 0, 0, { .n = matroska_chapters } },
744  { MATROSKA_ID_CUES, EBML_LEVEL1, 0, 0, 0, { .n = matroska_index } },
745  { MATROSKA_ID_TAGS, EBML_LEVEL1, 0, 0, 0, { .n = matroska_tags } },
746  { MATROSKA_ID_SEEKHEAD, EBML_LEVEL1, 0, 0, 0, { .n = matroska_seekhead } },
747  { 0 } /* We don't want to go back to level 0, so don't add the parent. */
748 };
749 
750 static EbmlSyntax matroska_segments[] = {
751  { MATROSKA_ID_SEGMENT, EBML_NEST, 0, 0, 0, { .n = matroska_segment } },
752  { 0 }
753 };
754 
755 static EbmlSyntax matroska_blockmore[] = {
756  { MATROSKA_ID_BLOCKADDID, EBML_UINT, 0, 0, offsetof(MatroskaBlock,additional_id), { .u = 1 } },
757  { MATROSKA_ID_BLOCKADDITIONAL, EBML_BIN, 0, 0, offsetof(MatroskaBlock,additional) },
759 };
760 
762  { MATROSKA_ID_BLOCKMORE, EBML_NEST, 0, 0, 0, {.n = matroska_blockmore} },
764 };
765 
766 static EbmlSyntax matroska_blockgroup[] = {
767  { MATROSKA_ID_BLOCK, EBML_BIN, 0, 0, offsetof(MatroskaBlock, bin) },
770  { MATROSKA_ID_DISCARDPADDING, EBML_SINT, 0, 0, offsetof(MatroskaBlock, discard_padding) },
771  { MATROSKA_ID_BLOCKREFERENCE, EBML_SINT, 1, 0, offsetof(MatroskaBlock, reference) },
773  { 1, EBML_UINT, 0, 0, offsetof(MatroskaBlock, non_simple), { .u = 1 } },
775 };
776 
777 // The following array contains SimpleBlock and BlockGroup twice
778 // in order to reuse the other values for matroska_cluster_enter.
780  { MATROSKA_ID_SIMPLEBLOCK, EBML_BIN, 0, 0, offsetof(MatroskaBlock, bin) },
781  { MATROSKA_ID_BLOCKGROUP, EBML_NEST, 0, 0, 0, { .n = matroska_blockgroup } },
782  { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, 0, offsetof(MatroskaCluster, timecode) },
788 };
789 
791  { MATROSKA_ID_CLUSTER, EBML_NEST, 0, 0, 0, { .n = &matroska_cluster_parsing[2] } },
792  { 0 }
793 };
794 #undef CHILD_OF
795 
796 static const CodecMime mkv_image_mime_tags[] = {
797  {"image/gif" , AV_CODEC_ID_GIF},
798  {"image/jpeg" , AV_CODEC_ID_MJPEG},
799  {"image/png" , AV_CODEC_ID_PNG},
800  {"image/tiff" , AV_CODEC_ID_TIFF},
801 
802  {"" , AV_CODEC_ID_NONE}
803 };
804 
805 static const CodecMime mkv_mime_tags[] = {
806  {"text/plain" , AV_CODEC_ID_TEXT},
807  {"application/x-truetype-font", AV_CODEC_ID_TTF},
808  {"application/x-font" , AV_CODEC_ID_TTF},
809  {"application/vnd.ms-opentype", AV_CODEC_ID_OTF},
810  {"binary" , AV_CODEC_ID_BIN_DATA},
811 
812  {"" , AV_CODEC_ID_NONE}
813 };
814 
815 static const char *const matroska_doctypes[] = { "matroska", "webm" };
816 
817 /*
818  * This function prepares the status for parsing of level 1 elements.
819  */
820 static int matroska_reset_status(MatroskaDemuxContext *matroska,
821  uint32_t id, int64_t position)
822 {
823  int64_t err = 0;
824  if (position >= 0) {
825  err = avio_seek(matroska->ctx->pb, position, SEEK_SET);
826  if (err > 0)
827  err = 0;
828  } else
829  position = avio_tell(matroska->ctx->pb);
830 
831  matroska->current_id = id;
832  matroska->num_levels = 1;
833  matroska->unknown_count = 0;
834  matroska->resync_pos = position;
835  if (id)
836  matroska->resync_pos -= (av_log2(id) + 7) / 8;
837 
838  return err;
839 }
840 
841 static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
842 {
843  AVIOContext *pb = matroska->ctx->pb;
844  uint32_t id;
845 
846  /* Try to seek to the last position to resync from. If this doesn't work,
847  * we resync from the earliest position available: The start of the buffer. */
848  if (last_pos < avio_tell(pb) && avio_seek(pb, last_pos + 1, SEEK_SET) < 0) {
849  av_log(matroska->ctx, AV_LOG_WARNING,
850  "Seek to desired resync point failed. Seeking to "
851  "earliest point available instead.\n");
852  avio_seek(pb, FFMAX(avio_tell(pb) + (pb->buffer - pb->buf_ptr),
853  last_pos + 1), SEEK_SET);
854  }
855 
856  id = avio_rb32(pb);
857 
858  // try to find a toplevel element
859  while (!avio_feof(pb)) {
860  if (id == MATROSKA_ID_INFO || id == MATROSKA_ID_TRACKS ||
861  id == MATROSKA_ID_CUES || id == MATROSKA_ID_TAGS ||
863  id == MATROSKA_ID_CLUSTER || id == MATROSKA_ID_CHAPTERS) {
864  /* Prepare the context for parsing of a level 1 element. */
865  matroska_reset_status(matroska, id, -1);
866  /* Given that we are here means that an error has occurred,
867  * so treat the segment as unknown length in order not to
868  * discard valid data that happens to be beyond the designated
869  * end of the segment. */
870  matroska->levels[0].length = EBML_UNKNOWN_LENGTH;
871  return 0;
872  }
873  id = (id << 8) | avio_r8(pb);
874  }
875 
876  matroska->done = 1;
877  return pb->error ? pb->error : AVERROR_EOF;
878 }
879 
880 /*
881  * Read: an "EBML number", which is defined as a variable-length
882  * array of bytes. The first byte indicates the length by giving a
883  * number of 0-bits followed by a one. The position of the first
884  * "one" bit inside the first byte indicates the length of this
885  * number.
886  * Returns: number of bytes read, < 0 on error
887  */
888 static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb,
889  int max_size, uint64_t *number, int eof_forbidden)
890 {
891  int read, n = 1;
892  uint64_t total;
893  int64_t pos;
894 
895  /* The first byte tells us the length in bytes - except when it is zero. */
896  total = avio_r8(pb);
897  if (pb->eof_reached)
898  goto err;
899 
900  /* get the length of the EBML number */
901  read = 8 - ff_log2_tab[total];
902 
903  if (!total || read > max_size) {
904  pos = avio_tell(pb) - 1;
905  if (!total) {
906  av_log(matroska->ctx, AV_LOG_ERROR,
907  "0x00 at pos %"PRId64" (0x%"PRIx64") invalid as first byte "
908  "of an EBML number\n", pos, pos);
909  } else {
910  av_log(matroska->ctx, AV_LOG_ERROR,
911  "Length %d indicated by an EBML number's first byte 0x%02x "
912  "at pos %"PRId64" (0x%"PRIx64") exceeds max length %d.\n",
913  read, (uint8_t) total, pos, pos, max_size);
914  }
915  return AVERROR_INVALIDDATA;
916  }
917 
918  /* read out length */
919  total ^= 1 << ff_log2_tab[total];
920  while (n++ < read)
921  total = (total << 8) | avio_r8(pb);
922 
923  if (pb->eof_reached) {
924  eof_forbidden = 1;
925  goto err;
926  }
927 
928  *number = total;
929 
930  return read;
931 
932 err:
933  pos = avio_tell(pb);
934  if (pb->error) {
935  av_log(matroska->ctx, AV_LOG_ERROR,
936  "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
937  pos, pos);
938  return pb->error;
939  }
940  if (eof_forbidden) {
941  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
942  "at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
943  return AVERROR(EIO);
944  }
945  return AVERROR_EOF;
946 }
947 
948 /**
949  * Read a EBML length value.
950  * This needs special handling for the "unknown length" case which has multiple
951  * encodings.
952  */
953 static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb,
954  uint64_t *number)
955 {
956  int res = ebml_read_num(matroska, pb, 8, number, 1);
957  if (res > 0 && *number + 1 == 1ULL << (7 * res))
958  *number = EBML_UNKNOWN_LENGTH;
959  return res;
960 }
961 
962 /*
963  * Read the next element as an unsigned int.
964  * Returns NEEDS_CHECKING unless size == 0.
965  */
966 static int ebml_read_uint(AVIOContext *pb, int size,
967  uint64_t default_value, uint64_t *num)
968 {
969  int n = 0;
970 
971  if (size == 0) {
972  *num = default_value;
973  return 0;
974  }
975  /* big-endian ordering; build up number */
976  *num = 0;
977  while (n++ < size)
978  *num = (*num << 8) | avio_r8(pb);
979 
980  return NEEDS_CHECKING;
981 }
982 
983 /*
984  * Read the next element as a signed int.
985  * Returns NEEDS_CHECKING unless size == 0.
986  */
987 static int ebml_read_sint(AVIOContext *pb, int size,
988  int64_t default_value, int64_t *num)
989 {
990  int n = 1;
991 
992  if (size == 0) {
993  *num = default_value;
994  return 0;
995  } else {
996  *num = sign_extend(avio_r8(pb), 8);
997 
998  /* big-endian ordering; build up number */
999  while (n++ < size)
1000  *num = ((uint64_t)*num << 8) | avio_r8(pb);
1001  }
1002 
1003  return NEEDS_CHECKING;
1005 
1006 /*
1007  * Read the next element as a float.
1008  * Returns 0 if size == 0, NEEDS_CHECKING or < 0 on obvious failure.
1009  */
1010 static int ebml_read_float(AVIOContext *pb, int size,
1011  double default_value, double *num)
1012 {
1013  if (size == 0) {
1014  *num = default_value;
1015  return 0;
1016  } else if (size == 4) {
1017  *num = av_int2float(avio_rb32(pb));
1018  } else if (size == 8) {
1019  *num = av_int2double(avio_rb64(pb));
1020  } else
1021  return AVERROR_INVALIDDATA;
1022 
1023  return NEEDS_CHECKING;
1025 
1026 /*
1027  * Read the next element as an ASCII string.
1028  * 0 is success, < 0 or NEEDS_CHECKING is failure.
1029  */
1030 static int ebml_read_ascii(AVIOContext *pb, int size,
1031  const char *default_value, char **str)
1032 {
1033  char *res;
1034  int ret;
1035 
1036  if (size == 0 && default_value) {
1037  res = av_strdup(default_value);
1038  if (!res)
1039  return AVERROR(ENOMEM);
1040  } else {
1041  /* EBML strings are usually not 0-terminated, so we allocate one
1042  * byte more, read the string and NUL-terminate it ourselves. */
1043  if (!(res = av_malloc(size + 1)))
1044  return AVERROR(ENOMEM);
1045  if ((ret = avio_read(pb, (uint8_t *) res, size)) != size) {
1046  av_free(res);
1047  return ret < 0 ? ret : NEEDS_CHECKING;
1048  }
1049  (res)[size] = '\0';
1050  }
1051  av_free(*str);
1052  *str = res;
1053 
1054  return 0;
1056 
1057 /*
1058  * Read the next element as binary data.
1059  * 0 is success, < 0 or NEEDS_CHECKING is failure.
1060  */
1061 static int ebml_read_binary(AVIOContext *pb, int length,
1062  int64_t pos, EbmlBin *bin)
1063 {
1064  int ret;
1065 
1067  if (ret < 0)
1068  return ret;
1069  memset(bin->buf->data + length, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1070 
1071  bin->data = bin->buf->data;
1072  bin->size = length;
1073  bin->pos = pos;
1074  if ((ret = avio_read(pb, bin->data, length)) != length) {
1075  av_buffer_unref(&bin->buf);
1076  bin->data = NULL;
1077  bin->size = 0;
1078  return ret < 0 ? ret : NEEDS_CHECKING;
1079  }
1080 
1081  return 0;
1082 }
1084 /*
1085  * Read the next element, but only the header. The contents
1086  * are supposed to be sub-elements which can be read separately.
1087  * 0 is success, < 0 is failure.
1088  */
1089 static int ebml_read_master(MatroskaDemuxContext *matroska,
1090  uint64_t length, int64_t pos)
1091 {
1093 
1094  if (matroska->num_levels >= EBML_MAX_DEPTH) {
1095  av_log(matroska->ctx, AV_LOG_ERROR,
1096  "File moves beyond max. allowed depth (%d)\n", EBML_MAX_DEPTH);
1097  return AVERROR(ENOSYS);
1098  }
1099 
1100  level = &matroska->levels[matroska->num_levels++];
1101  level->start = pos;
1102  level->length = length;
1103 
1104  return 0;
1106 
1107 /*
1108  * Read a signed "EBML number"
1109  * Return: number of bytes processed, < 0 on error
1110  */
1111 static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska,
1112  AVIOContext *pb, int64_t *num)
1113 {
1114  uint64_t unum;
1115  int res;
1116 
1117  /* read as unsigned number first */
1118  if ((res = ebml_read_num(matroska, pb, 8, &unum, 1)) < 0)
1119  return res;
1120 
1121  /* make signed (weird way) */
1122  *num = unum - ((1LL << (7 * res - 1)) - 1);
1123 
1124  return res;
1125 }
1126 
1127 static int ebml_parse(MatroskaDemuxContext *matroska,
1128  EbmlSyntax *syntax, void *data);
1129 
1130 static EbmlSyntax *ebml_parse_id(EbmlSyntax *syntax, uint32_t id)
1131 {
1132  int i;
1133 
1134  // Whoever touches this should be aware of the duplication
1135  // existing in matroska_cluster_parsing.
1136  for (i = 0; syntax[i].id; i++)
1137  if (id == syntax[i].id)
1138  break;
1139 
1140  return &syntax[i];
1141 }
1142 
1143 static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
1144  void *data)
1145 {
1146  int res;
1147 
1148  if (data) {
1149  for (int i = 0; syntax[i].id; i++) {
1150  void *dst = (char *)data + syntax[i].data_offset;
1151  switch (syntax[i].type) {
1152  case EBML_UINT:
1153  *(uint64_t *)dst = syntax[i].def.u;
1154  break;
1155  case EBML_SINT:
1156  *(int64_t *) dst = syntax[i].def.i;
1157  break;
1158  case EBML_FLOAT:
1159  *(double *) dst = syntax[i].def.f;
1160  break;
1161  case EBML_STR:
1162  case EBML_UTF8:
1163  // the default may be NULL
1164  if (syntax[i].def.s) {
1165  *(char**)dst = av_strdup(syntax[i].def.s);
1166  if (!*(char**)dst)
1167  return AVERROR(ENOMEM);
1168  }
1169  break;
1170  }
1171  }
1172 
1173  if (!matroska->levels[matroska->num_levels - 1].length) {
1174  matroska->num_levels--;
1175  return 0;
1176  }
1177  }
1178 
1179  do {
1180  res = ebml_parse(matroska, syntax, data);
1181  } while (!res);
1182 
1183  return res == LEVEL_ENDED ? 0 : res;
1184 }
1185 
1186 static int is_ebml_id_valid(uint32_t id)
1187 {
1188  // Due to endian nonsense in Matroska, the highest byte with any bits set
1189  // will contain the leading length bit. This bit in turn identifies the
1190  // total byte length of the element by its position within the byte.
1191  unsigned int bits = av_log2(id);
1192  return id && (bits + 7) / 8 == (8 - bits % 8);
1194 
1195 /*
1196  * Allocate and return the entry for the level1 element with the given ID. If
1197  * an entry already exists, return the existing entry.
1198  */
1200  uint32_t id, int64_t pos)
1201 {
1202  int i;
1203  MatroskaLevel1Element *elem;
1204 
1205  if (!is_ebml_id_valid(id))
1206  return NULL;
1207 
1208  // Some files link to all clusters; useless.
1209  if (id == MATROSKA_ID_CLUSTER)
1210  return NULL;
1211 
1212  // There can be multiple SeekHeads and Tags.
1213  for (i = 0; i < matroska->num_level1_elems; i++) {
1214  if (matroska->level1_elems[i].id == id) {
1215  if (matroska->level1_elems[i].pos == pos ||
1216  id != MATROSKA_ID_SEEKHEAD && id != MATROSKA_ID_TAGS)
1217  return &matroska->level1_elems[i];
1218  }
1219  }
1220 
1221  // Only a completely broken file would have more elements.
1222  if (matroska->num_level1_elems >= FF_ARRAY_ELEMS(matroska->level1_elems)) {
1223  av_log(matroska->ctx, AV_LOG_ERROR, "Too many level1 elements.\n");
1224  return NULL;
1225  }
1226 
1227  elem = &matroska->level1_elems[matroska->num_level1_elems++];
1228  *elem = (MatroskaLevel1Element){.id = id};
1229 
1230  return elem;
1231 }
1232 
1233 static int ebml_parse(MatroskaDemuxContext *matroska,
1234  EbmlSyntax *syntax, void *data)
1235 {
1236  static const uint64_t max_lengths[EBML_TYPE_COUNT] = {
1237  // Forbid unknown-length EBML_NONE elements.
1239  [EBML_UINT] = 8,
1240  [EBML_SINT] = 8,
1241  [EBML_FLOAT] = 8,
1242  // max. 16 MB for strings
1243  [EBML_STR] = 0x1000000,
1244  [EBML_UTF8] = 0x1000000,
1245  // max. 256 MB for binary data
1246  [EBML_BIN] = 0x10000000,
1247  // no limits for anything else
1248  };
1249  AVIOContext *pb = matroska->ctx->pb;
1250  uint32_t id;
1251  uint64_t length;
1252  int64_t pos = avio_tell(pb), pos_alt;
1253  int res, update_pos = 1, level_check;
1254  MatroskaLevel1Element *level1_elem;
1255  MatroskaLevel *level = matroska->num_levels ? &matroska->levels[matroska->num_levels - 1] : NULL;
1256 
1257  if (!matroska->current_id) {
1258  uint64_t id;
1259  res = ebml_read_num(matroska, pb, 4, &id, 0);
1260  if (res < 0) {
1261  if (pb->eof_reached && res == AVERROR_EOF) {
1262  if (matroska->is_live)
1263  // in live mode, finish parsing if EOF is reached.
1264  return 1;
1265  if (level && pos == avio_tell(pb)) {
1266  if (level->length == EBML_UNKNOWN_LENGTH) {
1267  // Unknown-length levels automatically end at EOF.
1268  matroska->num_levels--;
1269  return LEVEL_ENDED;
1270  } else {
1271  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
1272  "at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
1273  }
1274  }
1275  }
1276  return res;
1277  }
1278  matroska->current_id = id | 1 << 7 * res;
1279  pos_alt = pos + res;
1280  } else {
1281  pos_alt = pos;
1282  pos -= (av_log2(matroska->current_id) + 7) / 8;
1283  }
1284 
1285  id = matroska->current_id;
1286 
1287  syntax = ebml_parse_id(syntax, id);
1288  if (!syntax->id && id != EBML_ID_VOID && id != EBML_ID_CRC32) {
1289  if (level && level->length == EBML_UNKNOWN_LENGTH) {
1290  // Unknown-length levels end when an element from an upper level
1291  // in the hierarchy is encountered.
1292  while (syntax->def.n) {
1293  syntax = ebml_parse_id(syntax->def.n, id);
1294  if (syntax->id) {
1295  matroska->num_levels--;
1296  return LEVEL_ENDED;
1297  }
1298  };
1299  }
1300 
1301  av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32" at pos. "
1302  "%"PRId64"\n", id, pos);
1303  update_pos = 0; /* Don't update resync_pos as an error might have happened. */
1304  }
1305 
1306  if (data) {
1307  data = (char *) data + syntax->data_offset;
1308  if (syntax->list_elem_size) {
1309  EbmlList *list = data;
1310  void *newelem;
1311 
1312  if ((unsigned)list->nb_elem + 1 >= UINT_MAX / syntax->list_elem_size)
1313  return AVERROR(ENOMEM);
1314  newelem = av_fast_realloc(list->elem,
1315  &list->alloc_elem_size,
1316  (list->nb_elem + 1) * syntax->list_elem_size);
1317  if (!newelem)
1318  return AVERROR(ENOMEM);
1319  list->elem = newelem;
1320  data = (char *) list->elem + list->nb_elem * syntax->list_elem_size;
1321  memset(data, 0, syntax->list_elem_size);
1322  list->nb_elem++;
1323  }
1324  }
1325 
1326  if (syntax->type != EBML_STOP) {
1327  matroska->current_id = 0;
1328  if ((res = ebml_read_length(matroska, pb, &length)) < 0)
1329  return res;
1330 
1331  pos_alt += res;
1332 
1333  if (matroska->num_levels > 0) {
1334  if (length != EBML_UNKNOWN_LENGTH &&
1335  level->length != EBML_UNKNOWN_LENGTH) {
1336  uint64_t elem_end = pos_alt + length,
1337  level_end = level->start + level->length;
1338 
1339  if (elem_end < level_end) {
1340  level_check = 0;
1341  } else if (elem_end == level_end) {
1342  level_check = LEVEL_ENDED;
1343  } else {
1344  av_log(matroska->ctx, AV_LOG_ERROR,
1345  "Element at 0x%"PRIx64" ending at 0x%"PRIx64" exceeds "
1346  "containing master element ending at 0x%"PRIx64"\n",
1347  pos, elem_end, level_end);
1348  return AVERROR_INVALIDDATA;
1349  }
1350  } else if (length != EBML_UNKNOWN_LENGTH) {
1351  level_check = 0;
1352  } else if (level->length != EBML_UNKNOWN_LENGTH) {
1353  av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element "
1354  "at 0x%"PRIx64" inside parent with finite size\n", pos);
1355  return AVERROR_INVALIDDATA;
1356  } else {
1357  level_check = 0;
1358  if (id != MATROSKA_ID_CLUSTER && (syntax->type == EBML_LEVEL1
1359  || syntax->type == EBML_NEST)) {
1360  // According to the current specifications only clusters and
1361  // segments are allowed to be unknown-length. We also accept
1362  // other unknown-length master elements.
1363  av_log(matroska->ctx, AV_LOG_WARNING,
1364  "Found unknown-length element 0x%"PRIX32" other than "
1365  "a cluster at 0x%"PRIx64". Spec-incompliant, but "
1366  "parsing will nevertheless be attempted.\n", id, pos);
1367  update_pos = -1;
1368  }
1369  }
1370  } else
1371  level_check = 0;
1372 
1373  if (max_lengths[syntax->type] && length > max_lengths[syntax->type]) {
1374  if (length != EBML_UNKNOWN_LENGTH) {
1375  av_log(matroska->ctx, AV_LOG_ERROR,
1376  "Invalid length 0x%"PRIx64" > 0x%"PRIx64" for element "
1377  "with ID 0x%"PRIX32" at 0x%"PRIx64"\n",
1378  length, max_lengths[syntax->type], id, pos);
1379  } else if (syntax->type != EBML_NONE) {
1380  av_log(matroska->ctx, AV_LOG_ERROR,
1381  "Element with ID 0x%"PRIX32" at pos. 0x%"PRIx64" has "
1382  "unknown length, yet the length of an element of its "
1383  "type must be known.\n", id, pos);
1384  } else {
1385  av_log(matroska->ctx, AV_LOG_ERROR,
1386  "Found unknown-length element with ID 0x%"PRIX32" at "
1387  "pos. 0x%"PRIx64" for which no syntax for parsing is "
1388  "available.\n", id, pos);
1389  }
1390  return AVERROR_INVALIDDATA;
1391  }
1392 
1393  if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
1394  // Loosing sync will likely manifest itself as encountering unknown
1395  // elements which are not reliably distinguishable from elements
1396  // belonging to future extensions of the format.
1397  // We use a heuristic to detect such situations: If the current
1398  // element is not expected at the current syntax level and there
1399  // were only a few unknown elements in a row, then the element is
1400  // skipped or considered defective based upon the length of the
1401  // current element (i.e. how much would be skipped); if there were
1402  // more than a few skipped elements in a row and skipping the current
1403  // element would lead us more than SKIP_THRESHOLD away from the last
1404  // known good position, then it is inferred that an error occurred.
1405  // The dependency on the number of unknown elements in a row exists
1406  // because the distance to the last known good position is
1407  // automatically big if the last parsed element was big.
1408  // In both cases, each unknown element is considered equivalent to
1409  // UNKNOWN_EQUIV of skipped bytes for the check.
1410  // The whole check is only done for non-seekable output, because
1411  // in this situation skipped data can't simply be rechecked later.
1412  // This is especially important when using unkown length elements
1413  // as the check for whether a child exceeds its containing master
1414  // element is not effective in this situation.
1415  if (update_pos) {
1416  matroska->unknown_count = 0;
1417  } else {
1418  int64_t dist = length + UNKNOWN_EQUIV * matroska->unknown_count++;
1419 
1420  if (matroska->unknown_count > 3)
1421  dist += pos_alt - matroska->resync_pos;
1422 
1423  if (dist > SKIP_THRESHOLD) {
1424  av_log(matroska->ctx, AV_LOG_ERROR,
1425  "Unknown element %"PRIX32" at pos. 0x%"PRIx64" with "
1426  "length 0x%"PRIx64" considered as invalid data. Last "
1427  "known good position 0x%"PRIx64", %d unknown elements"
1428  " in a row\n", id, pos, length, matroska->resync_pos,
1429  matroska->unknown_count);
1430  return AVERROR_INVALIDDATA;
1431  }
1432  }
1433  }
1434 
1435  if (update_pos > 0) {
1436  // We have found an element that is allowed at this place
1437  // in the hierarchy and it passed all checks, so treat the beginning
1438  // of the element as the "last known good" position.
1439  matroska->resync_pos = pos;
1440  }
1441 
1442  if (!data && length != EBML_UNKNOWN_LENGTH)
1443  goto skip;
1444  }
1445 
1446  switch (syntax->type) {
1447  case EBML_UINT:
1448  res = ebml_read_uint(pb, length, syntax->def.u, data);
1449  break;
1450  case EBML_SINT:
1451  res = ebml_read_sint(pb, length, syntax->def.i, data);
1452  break;
1453  case EBML_FLOAT:
1454  res = ebml_read_float(pb, length, syntax->def.f, data);
1455  break;
1456  case EBML_STR:
1457  case EBML_UTF8:
1458  res = ebml_read_ascii(pb, length, syntax->def.s, data);
1459  break;
1460  case EBML_BIN:
1461  res = ebml_read_binary(pb, length, pos_alt, data);
1462  break;
1463  case EBML_LEVEL1:
1464  case EBML_NEST:
1465  if ((res = ebml_read_master(matroska, length, pos_alt)) < 0)
1466  return res;
1467  if (id == MATROSKA_ID_SEGMENT)
1468  matroska->segment_start = pos_alt;
1469  if (id == MATROSKA_ID_CUES)
1470  matroska->cues_parsing_deferred = 0;
1471  if (syntax->type == EBML_LEVEL1 &&
1472  (level1_elem = matroska_find_level1_elem(matroska, syntax->id, pos))) {
1473  if (!level1_elem->pos) {
1474  // Zero is not a valid position for a level 1 element.
1475  level1_elem->pos = pos;
1476  } else if (level1_elem->pos != pos)
1477  av_log(matroska->ctx, AV_LOG_ERROR, "Duplicate element\n");
1478  level1_elem->parsed = 1;
1479  }
1480  if (res = ebml_parse_nest(matroska, syntax->def.n, data))
1481  return res;
1482  break;
1483  case EBML_STOP:
1484  return 1;
1485  skip:
1486  default:
1487  if (length) {
1488  int64_t res2;
1489  if (ffio_limit(pb, length) != length) {
1490  // ffio_limit emits its own error message,
1491  // so we don't have to.
1492  return AVERROR(EIO);
1493  }
1494  if ((res2 = avio_skip(pb, length - 1)) >= 0) {
1495  // avio_skip might take us past EOF. We check for this
1496  // by skipping only length - 1 bytes, reading a byte and
1497  // checking the error flags. This is done in order to check
1498  // that the element has been properly skipped even when
1499  // no filesize (that ffio_limit relies on) is available.
1500  avio_r8(pb);
1501  res = NEEDS_CHECKING;
1502  } else
1503  res = res2;
1504  } else
1505  res = 0;
1506  }
1507  if (res) {
1508  if (res == NEEDS_CHECKING) {
1509  if (pb->eof_reached) {
1510  if (pb->error)
1511  res = pb->error;
1512  else
1513  res = AVERROR_EOF;
1514  } else
1515  goto level_check;
1516  }
1517 
1518  if (res == AVERROR_INVALIDDATA)
1519  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
1520  else if (res == AVERROR(EIO))
1521  av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
1522  else if (res == AVERROR_EOF) {
1523  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely\n");
1524  res = AVERROR(EIO);
1525  }
1526 
1527  return res;
1528  }
1529 
1530 level_check:
1531  if (syntax->is_counted && data) {
1532  CountedElement *elem = data;
1533  if (elem->count != UINT_MAX)
1534  elem->count++;
1535  }
1536 
1537  if (level_check == LEVEL_ENDED && matroska->num_levels) {
1538  level = &matroska->levels[matroska->num_levels - 1];
1539  pos = avio_tell(pb);
1540 
1541  // Given that pos >= level->start no check for
1542  // level->length != EBML_UNKNOWN_LENGTH is necessary.
1543  while (matroska->num_levels && pos == level->start + level->length) {
1544  matroska->num_levels--;
1545  level--;
1546  }
1547  }
1548 
1549  return level_check;
1550 }
1551 
1552 static void ebml_free(EbmlSyntax *syntax, void *data)
1553 {
1554  int i, j;
1555  for (i = 0; syntax[i].id; i++) {
1556  void *data_off = (char *) data + syntax[i].data_offset;
1557  switch (syntax[i].type) {
1558  case EBML_STR:
1559  case EBML_UTF8:
1560  av_freep(data_off);
1561  break;
1562  case EBML_BIN:
1563  av_buffer_unref(&((EbmlBin *) data_off)->buf);
1564  break;
1565  case EBML_LEVEL1:
1566  case EBML_NEST:
1567  if (syntax[i].list_elem_size) {
1568  EbmlList *list = data_off;
1569  char *ptr = list->elem;
1570  for (j = 0; j < list->nb_elem;
1571  j++, ptr += syntax[i].list_elem_size)
1572  ebml_free(syntax[i].def.n, ptr);
1573  av_freep(&list->elem);
1574  list->nb_elem = 0;
1575  list->alloc_elem_size = 0;
1576  } else
1577  ebml_free(syntax[i].def.n, data_off);
1578  default:
1579  break;
1580  }
1581  }
1582 }
1583 
1584 /*
1585  * Autodetecting...
1586  */
1587 static int matroska_probe(const AVProbeData *p)
1588 {
1589  uint64_t total = 0;
1590  int len_mask = 0x80, size = 1, n = 1, i;
1591 
1592  /* EBML header? */
1593  if (AV_RB32(p->buf) != EBML_ID_HEADER)
1594  return 0;
1595 
1596  /* length of header */
1597  total = p->buf[4];
1598  while (size <= 8 && !(total & len_mask)) {
1599  size++;
1600  len_mask >>= 1;
1601  }
1602  if (size > 8)
1603  return 0;
1604  total &= (len_mask - 1);
1605  while (n < size)
1606  total = (total << 8) | p->buf[4 + n++];
1607 
1608  if (total + 1 == 1ULL << (7 * size)){
1609  /* Unknown-length header - simply parse the whole buffer. */
1610  total = p->buf_size - 4 - size;
1611  } else {
1612  /* Does the probe data contain the whole header? */
1613  if (p->buf_size < 4 + size + total)
1614  return 0;
1615  }
1616 
1617  /* The header should contain a known document type. For now,
1618  * we don't parse the whole header but simply check for the
1619  * availability of that array of characters inside the header.
1620  * Not fully fool-proof, but good enough. */
1621  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++) {
1622  size_t probelen = strlen(matroska_doctypes[i]);
1623  if (total < probelen)
1624  continue;
1625  for (n = 4 + size; n <= 4 + size + total - probelen; n++)
1626  if (!memcmp(p->buf + n, matroska_doctypes[i], probelen))
1627  return AVPROBE_SCORE_MAX;
1628  }
1629 
1630  // probably valid EBML header but no recognized doctype
1631  return AVPROBE_SCORE_EXTENSION;
1632 }
1633 
1635  uint64_t num)
1636 {
1637  MatroskaTrack *tracks = matroska->tracks.elem;
1638  int i;
1639 
1640  for (i = 0; i < matroska->tracks.nb_elem; i++)
1641  if (tracks[i].num == num)
1642  return &tracks[i];
1643 
1644  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %"PRIu64"\n", num);
1645  return NULL;
1646 }
1647 
1648 static int matroska_decode_buffer(uint8_t **buf, int *buf_size,
1649  MatroskaTrack *track)
1650 {
1651  MatroskaTrackEncoding *encodings = track->encodings.elem;
1652  uint8_t *data = *buf;
1653  int isize = *buf_size;
1654  uint8_t *pkt_data = NULL;
1655  uint8_t av_unused *newpktdata;
1656  int pkt_size = isize;
1657  int result = 0;
1658  int olen;
1659 
1660  if (pkt_size >= 10000000U)
1661  return AVERROR_INVALIDDATA;
1662 
1663  switch (encodings[0].compression.algo) {
1665  {
1666  int header_size = encodings[0].compression.settings.size;
1667  uint8_t *header = encodings[0].compression.settings.data;
1668 
1669  if (header_size && !header) {
1670  av_log(NULL, AV_LOG_ERROR, "Compression size but no data in headerstrip\n");
1671  return -1;
1672  }
1673 
1674  if (!header_size)
1675  return 0;
1676 
1677  pkt_size = isize + header_size;
1678  pkt_data = av_malloc(pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1679  if (!pkt_data)
1680  return AVERROR(ENOMEM);
1681 
1682  memcpy(pkt_data, header, header_size);
1683  memcpy(pkt_data + header_size, data, isize);
1684  break;
1685  }
1686 #if CONFIG_LZO
1688  do {
1689  int insize = isize;
1690  olen = pkt_size *= 3;
1691  newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING
1693  if (!newpktdata) {
1694  result = AVERROR(ENOMEM);
1695  goto failed;
1696  }
1697  pkt_data = newpktdata;
1698  result = av_lzo1x_decode(pkt_data, &olen, data, &insize);
1699  } while (result == AV_LZO_OUTPUT_FULL && pkt_size < 10000000);
1700  if (result) {
1702  goto failed;
1703  }
1704  pkt_size -= olen;
1705  break;
1706 #endif
1707 #if CONFIG_ZLIB
1709  {
1710  z_stream zstream = { 0 };
1711  if (!pkt_size || inflateInit(&zstream) != Z_OK)
1712  return -1;
1713  zstream.next_in = data;
1714  zstream.avail_in = isize;
1715  do {
1716  pkt_size *= 3;
1717  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1718  if (!newpktdata) {
1719  inflateEnd(&zstream);
1720  result = AVERROR(ENOMEM);
1721  goto failed;
1722  }
1723  pkt_data = newpktdata;
1724  zstream.avail_out = pkt_size - zstream.total_out;
1725  zstream.next_out = pkt_data + zstream.total_out;
1726  result = inflate(&zstream, Z_NO_FLUSH);
1727  } while (result == Z_OK && pkt_size < 10000000);
1728  pkt_size = zstream.total_out;
1729  inflateEnd(&zstream);
1730  if (result != Z_STREAM_END) {
1731  if (result == Z_MEM_ERROR)
1732  result = AVERROR(ENOMEM);
1733  else
1735  goto failed;
1736  }
1737  break;
1738  }
1739 #endif
1740 #if CONFIG_BZLIB
1742  {
1743  bz_stream bzstream = { 0 };
1744  if (!pkt_size || BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
1745  return -1;
1746  bzstream.next_in = data;
1747  bzstream.avail_in = isize;
1748  do {
1749  pkt_size *= 3;
1750  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1751  if (!newpktdata) {
1752  BZ2_bzDecompressEnd(&bzstream);
1753  result = AVERROR(ENOMEM);
1754  goto failed;
1755  }
1756  pkt_data = newpktdata;
1757  bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
1758  bzstream.next_out = pkt_data + bzstream.total_out_lo32;
1759  result = BZ2_bzDecompress(&bzstream);
1760  } while (result == BZ_OK && pkt_size < 10000000);
1761  pkt_size = bzstream.total_out_lo32;
1762  BZ2_bzDecompressEnd(&bzstream);
1763  if (result != BZ_STREAM_END) {
1764  if (result == BZ_MEM_ERROR)
1765  result = AVERROR(ENOMEM);
1766  else
1768  goto failed;
1769  }
1770  break;
1771  }
1772 #endif
1773  default:
1774  return AVERROR_INVALIDDATA;
1775  }
1776 
1777  memset(pkt_data + pkt_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1778 
1779  *buf = pkt_data;
1780  *buf_size = pkt_size;
1781  return 0;
1783 failed:
1784  av_free(pkt_data);
1785  return result;
1786 }
1787 
1789  AVDictionary **metadata, char *prefix)
1790 {
1791  MatroskaTag *tags = list->elem;
1792  char key[1024];
1793  int i;
1794 
1795  for (i = 0; i < list->nb_elem; i++) {
1796  const char *lang = tags[i].lang &&
1797  strcmp(tags[i].lang, "und") ? tags[i].lang : NULL;
1798 
1799  if (!tags[i].name) {
1800  av_log(s, AV_LOG_WARNING, "Skipping invalid tag with no TagName.\n");
1801  continue;
1802  }
1803  if (prefix)
1804  snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name);
1805  else
1806  av_strlcpy(key, tags[i].name, sizeof(key));
1807  if (tags[i].def || !lang) {
1808  av_dict_set(metadata, key, tags[i].string, 0);
1809  if (tags[i].sub.nb_elem)
1810  matroska_convert_tag(s, &tags[i].sub, metadata, key);
1811  }
1812  if (lang) {
1813  av_strlcat(key, "-", sizeof(key));
1814  av_strlcat(key, lang, sizeof(key));
1815  av_dict_set(metadata, key, tags[i].string, 0);
1816  if (tags[i].sub.nb_elem)
1817  matroska_convert_tag(s, &tags[i].sub, metadata, key);
1818  }
1819  }
1821 }
1822 
1824 {
1825  MatroskaDemuxContext *matroska = s->priv_data;
1826  MatroskaTags *tags = matroska->tags.elem;
1827  int i, j;
1828 
1829  for (i = 0; i < matroska->tags.nb_elem; i++) {
1830  if (tags[i].target.attachuid) {
1831  MatroskaAttachment *attachment = matroska->attachments.elem;
1832  int found = 0;
1833  for (j = 0; j < matroska->attachments.nb_elem; j++) {
1834  if (attachment[j].uid == tags[i].target.attachuid &&
1835  attachment[j].stream) {
1836  matroska_convert_tag(s, &tags[i].tag,
1837  &attachment[j].stream->metadata, NULL);
1838  found = 1;
1839  }
1840  }
1841  if (!found) {
1843  "The tags at index %d refer to a "
1844  "non-existent attachment %"PRId64".\n",
1845  i, tags[i].target.attachuid);
1846  }
1847  } else if (tags[i].target.chapteruid) {
1848  MatroskaChapter *chapter = matroska->chapters.elem;
1849  int found = 0;
1850  for (j = 0; j < matroska->chapters.nb_elem; j++) {
1851  if (chapter[j].uid == tags[i].target.chapteruid &&
1852  chapter[j].chapter) {
1853  matroska_convert_tag(s, &tags[i].tag,
1854  &chapter[j].chapter->metadata, NULL);
1855  found = 1;
1856  }
1857  }
1858  if (!found) {
1860  "The tags at index %d refer to a non-existent chapter "
1861  "%"PRId64".\n",
1862  i, tags[i].target.chapteruid);
1863  }
1864  } else if (tags[i].target.trackuid) {
1865  MatroskaTrack *track = matroska->tracks.elem;
1866  int found = 0;
1867  for (j = 0; j < matroska->tracks.nb_elem; j++) {
1868  if (track[j].uid == tags[i].target.trackuid &&
1869  track[j].stream) {
1870  matroska_convert_tag(s, &tags[i].tag,
1871  &track[j].stream->metadata, NULL);
1872  found = 1;
1873  }
1874  }
1875  if (!found) {
1877  "The tags at index %d refer to a non-existent track "
1878  "%"PRId64".\n",
1879  i, tags[i].target.trackuid);
1880  }
1881  } else {
1882  matroska_convert_tag(s, &tags[i].tag, &s->metadata,
1883  tags[i].target.type);
1884  }
1885  }
1886 }
1887 
1889  int64_t pos)
1890 {
1891  uint32_t saved_id = matroska->current_id;
1892  int64_t before_pos = avio_tell(matroska->ctx->pb);
1893  int ret = 0;
1894  int ret2;
1895 
1896  /* seek */
1897  if (avio_seek(matroska->ctx->pb, pos, SEEK_SET) == pos) {
1898  /* We don't want to lose our seekhead level, so we add
1899  * a dummy. This is a crude hack. */
1900  if (matroska->num_levels == EBML_MAX_DEPTH) {
1901  av_log(matroska->ctx, AV_LOG_INFO,
1902  "Max EBML element depth (%d) reached, "
1903  "cannot parse further.\n", EBML_MAX_DEPTH);
1905  } else {
1906  matroska->levels[matroska->num_levels] = (MatroskaLevel) { 0, EBML_UNKNOWN_LENGTH };
1907  matroska->num_levels++;
1908  matroska->current_id = 0;
1909 
1910  ret = ebml_parse(matroska, matroska_segment, matroska);
1911  if (ret == LEVEL_ENDED) {
1912  /* This can only happen if the seek brought us beyond EOF. */
1913  ret = AVERROR_EOF;
1914  }
1915  }
1916  }
1917  /* Seek back - notice that in all instances where this is used
1918  * it is safe to set the level to 1. */
1919  ret2 = matroska_reset_status(matroska, saved_id, before_pos);
1920  if (ret >= 0)
1921  ret = ret2;
1922 
1923  return ret;
1924 }
1925 
1926 static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
1927 {
1928  EbmlList *seekhead_list = &matroska->seekhead;
1929  int i;
1930 
1931  // we should not do any seeking in the streaming case
1932  if (!(matroska->ctx->pb->seekable & AVIO_SEEKABLE_NORMAL))
1933  return;
1934 
1935  for (i = 0; i < seekhead_list->nb_elem; i++) {
1936  MatroskaSeekhead *seekheads = seekhead_list->elem;
1937  uint32_t id = seekheads[i].id;
1938  int64_t pos = seekheads[i].pos + matroska->segment_start;
1939  MatroskaLevel1Element *elem;
1940 
1941  if (id != seekheads[i].id || pos < matroska->segment_start)
1942  continue;
1943 
1944  elem = matroska_find_level1_elem(matroska, id, pos);
1945  if (!elem || elem->parsed)
1946  continue;
1947 
1948  elem->pos = pos;
1949 
1950  // defer cues parsing until we actually need cue data.
1951  if (id == MATROSKA_ID_CUES)
1952  continue;
1953 
1954  if (matroska_parse_seekhead_entry(matroska, pos) < 0) {
1955  // mark index as broken
1956  matroska->cues_parsing_deferred = -1;
1957  break;
1958  }
1959 
1960  elem->parsed = 1;
1961  }
1962 }
1963 
1964 static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
1965 {
1966  EbmlList *index_list;
1968  uint64_t index_scale = 1;
1969  int i, j;
1970 
1971  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
1972  return;
1973 
1974  index_list = &matroska->index;
1975  index = index_list->elem;
1976  if (index_list->nb_elem < 2)
1977  return;
1978  if (index[1].time > 1E14 / matroska->time_scale) {
1979  av_log(matroska->ctx, AV_LOG_WARNING, "Dropping apparently-broken index.\n");
1980  return;
1981  }
1982  for (i = 0; i < index_list->nb_elem; i++) {
1983  EbmlList *pos_list = &index[i].pos;
1984  MatroskaIndexPos *pos = pos_list->elem;
1985  for (j = 0; j < pos_list->nb_elem; j++) {
1986  MatroskaTrack *track = matroska_find_track_by_num(matroska,
1987  pos[j].track);
1988  if (track && track->stream)
1989  av_add_index_entry(track->stream,
1990  pos[j].pos + matroska->segment_start,
1991  index[i].time / index_scale, 0, 0,
1993  }
1994  }
1995 }
1996 
1997 static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
1998  int i;
1999 
2000  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
2001  return;
2002 
2003  for (i = 0; i < matroska->num_level1_elems; i++) {
2004  MatroskaLevel1Element *elem = &matroska->level1_elems[i];
2005  if (elem->id == MATROSKA_ID_CUES && !elem->parsed) {
2006  if (matroska_parse_seekhead_entry(matroska, elem->pos) < 0)
2007  matroska->cues_parsing_deferred = -1;
2008  elem->parsed = 1;
2009  break;
2010  }
2011  }
2012 
2013  matroska_add_index_entries(matroska);
2014 }
2015 
2016 static int matroska_aac_profile(char *codec_id)
2017 {
2018  static const char *const aac_profiles[] = { "MAIN", "LC", "SSR" };
2019  int profile;
2020 
2022  if (strstr(codec_id, aac_profiles[profile]))
2023  break;
2024  return profile + 1;
2025 }
2026 
2027 static int matroska_aac_sri(int samplerate)
2028 {
2029  int sri;
2030 
2031  for (sri = 0; sri < FF_ARRAY_ELEMS(ff_mpeg4audio_sample_rates); sri++)
2032  if (ff_mpeg4audio_sample_rates[sri] == samplerate)
2033  break;
2034  return sri;
2035 }
2036 
2037 static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
2038 {
2039  /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */
2040  avpriv_dict_set_timestamp(metadata, "creation_time", date_utc / 1000 + 978307200000000LL);
2041 }
2042 
2044  MatroskaTrack *track,
2045  int *offset)
2046 {
2047  AVStream *st = track->stream;
2048  uint8_t *p = track->codec_priv.data;
2049  int size = track->codec_priv.size;
2050 
2051  if (size < 8 + FLAC_STREAMINFO_SIZE || p[4] & 0x7f) {
2052  av_log(s, AV_LOG_WARNING, "Invalid FLAC private data\n");
2053  track->codec_priv.size = 0;
2054  return 0;
2055  }
2056  *offset = 8;
2057  track->codec_priv.size = 8 + FLAC_STREAMINFO_SIZE;
2058 
2059  p += track->codec_priv.size;
2060  size -= track->codec_priv.size;
2061 
2062  /* parse the remaining metadata blocks if present */
2063  while (size >= 4) {
2064  int block_last, block_type, block_size;
2065 
2066  flac_parse_block_header(p, &block_last, &block_type, &block_size);
2067 
2068  p += 4;
2069  size -= 4;
2070  if (block_size > size)
2071  return 0;
2072 
2073  /* check for the channel mask */
2074  if (block_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
2075  AVDictionary *dict = NULL;
2076  AVDictionaryEntry *chmask;
2077 
2078  ff_vorbis_comment(s, &dict, p, block_size, 0);
2079  chmask = av_dict_get(dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL, 0);
2080  if (chmask) {
2081  uint64_t mask = strtol(chmask->value, NULL, 0);
2082  if (!mask || mask & ~0x3ffffULL) {
2084  "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
2085  } else
2086  st->codecpar->channel_layout = mask;
2087  }
2088  av_dict_free(&dict);
2089  }
2090 
2091  p += block_size;
2092  size -= block_size;
2093  }
2094 
2095  return 0;
2096 }
2097 
2098 static int mkv_field_order(MatroskaDemuxContext *matroska, int64_t field_order)
2099 {
2100  int minor, micro, bttb = 0;
2101 
2102  /* workaround a bug in our Matroska muxer, introduced in version 57.36 alongside
2103  * this function, and fixed in 57.52 */
2104  if (matroska->muxingapp && sscanf(matroska->muxingapp, "Lavf57.%d.%d", &minor, &micro) == 2)
2105  bttb = (minor >= 36 && minor <= 51 && micro >= 100);
2106 
2107  switch (field_order) {
2109  return AV_FIELD_PROGRESSIVE;
2111  return AV_FIELD_UNKNOWN;
2113  return AV_FIELD_TT;
2115  return AV_FIELD_BB;
2117  return bttb ? AV_FIELD_TB : AV_FIELD_BT;
2119  return bttb ? AV_FIELD_BT : AV_FIELD_TB;
2120  default:
2121  return AV_FIELD_UNKNOWN;
2122  }
2123 }
2124 
2125 static void mkv_stereo_mode_display_mul(int stereo_mode,
2126  int *h_width, int *h_height)
2127 {
2128  switch (stereo_mode) {
2134  break;
2139  *h_width = 2;
2140  break;
2145  *h_height = 2;
2146  break;
2147  }
2148 }
2149 
2150 static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) {
2151  const MatroskaTrackVideoColor *color = track->video.color.elem;
2152  const MatroskaMasteringMeta *mastering_meta;
2153  int has_mastering_primaries, has_mastering_luminance;
2154 
2155  if (!track->video.color.nb_elem)
2156  return 0;
2157 
2158  mastering_meta = &color->mastering_meta;
2159  // Mastering primaries are CIE 1931 coords, and must be > 0.
2160  has_mastering_primaries =
2161  mastering_meta->r_x > 0 && mastering_meta->r_y > 0 &&
2162  mastering_meta->g_x > 0 && mastering_meta->g_y > 0 &&
2163  mastering_meta->b_x > 0 && mastering_meta->b_y > 0 &&
2164  mastering_meta->white_x > 0 && mastering_meta->white_y > 0;
2165  has_mastering_luminance = mastering_meta->max_luminance >
2166  mastering_meta->min_luminance.el.f &&
2167  mastering_meta->min_luminance.el.f >= 0 &&
2168  mastering_meta->min_luminance.count;
2169 
2170  if (color->matrix_coefficients != AVCOL_SPC_RESERVED)
2171  st->codecpar->color_space = color->matrix_coefficients;
2172  if (color->primaries != AVCOL_PRI_RESERVED &&
2173  color->primaries != AVCOL_PRI_RESERVED0)
2174  st->codecpar->color_primaries = color->primaries;
2175  if (color->transfer_characteristics != AVCOL_TRC_RESERVED &&
2176  color->transfer_characteristics != AVCOL_TRC_RESERVED0)
2177  st->codecpar->color_trc = color->transfer_characteristics;
2178  if (color->range != AVCOL_RANGE_UNSPECIFIED &&
2179  color->range <= AVCOL_RANGE_JPEG)
2180  st->codecpar->color_range = color->range;
2181  if (color->chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED &&
2182  color->chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED &&
2183  color->chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB &&
2184  color->chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) {
2185  st->codecpar->chroma_location =
2186  avcodec_chroma_pos_to_enum((color->chroma_siting_horz - 1) << 7,
2187  (color->chroma_siting_vert - 1) << 7);
2188  }
2189  if (color->max_cll && color->max_fall) {
2190  size_t size = 0;
2191  int ret;
2193  if (!metadata)
2194  return AVERROR(ENOMEM);
2196  (uint8_t *)metadata, size);
2197  if (ret < 0) {
2198  av_freep(&metadata);
2199  return ret;
2200  }
2201  metadata->MaxCLL = color->max_cll;
2202  metadata->MaxFALL = color->max_fall;
2203  }
2204 
2205  if (has_mastering_primaries || has_mastering_luminance) {
2206  AVMasteringDisplayMetadata *metadata =
2209  sizeof(AVMasteringDisplayMetadata));
2210  if (!metadata) {
2211  return AVERROR(ENOMEM);
2212  }
2213  memset(metadata, 0, sizeof(AVMasteringDisplayMetadata));
2214  if (has_mastering_primaries) {
2215  metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX);
2216  metadata->display_primaries[0][1] = av_d2q(mastering_meta->r_y, INT_MAX);
2217  metadata->display_primaries[1][0] = av_d2q(mastering_meta->g_x, INT_MAX);
2218  metadata->display_primaries[1][1] = av_d2q(mastering_meta->g_y, INT_MAX);
2219  metadata->display_primaries[2][0] = av_d2q(mastering_meta->b_x, INT_MAX);
2220  metadata->display_primaries[2][1] = av_d2q(mastering_meta->b_y, INT_MAX);
2221  metadata->white_point[0] = av_d2q(mastering_meta->white_x, INT_MAX);
2222  metadata->white_point[1] = av_d2q(mastering_meta->white_y, INT_MAX);
2223  metadata->has_primaries = 1;
2224  }
2225  if (has_mastering_luminance) {
2226  metadata->max_luminance = av_d2q(mastering_meta->max_luminance, INT_MAX);
2227  metadata->min_luminance = av_d2q(mastering_meta->min_luminance.el.f, INT_MAX);
2228  metadata->has_luminance = 1;
2229  }
2230  }
2231  return 0;
2232 }
2233 
2234 static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track,
2235  void *logctx)
2236 {
2237  AVSphericalMapping *spherical;
2238  const MatroskaTrackVideoProjection *mkv_projection = &track->video.projection;
2239  const uint8_t *priv_data = mkv_projection->private.data;
2240  enum AVSphericalProjection projection;
2241  size_t spherical_size;
2242  uint32_t l = 0, t = 0, r = 0, b = 0;
2243  uint32_t padding = 0;
2244  int ret;
2245 
2246  if (mkv_projection->private.size && priv_data[0] != 0) {
2247  av_log(logctx, AV_LOG_WARNING, "Unknown spherical metadata\n");
2248  return 0;
2249  }
2250 
2251  switch (track->video.projection.type) {
2253  if (track->video.projection.private.size == 20) {
2254  t = AV_RB32(priv_data + 4);
2255  b = AV_RB32(priv_data + 8);
2256  l = AV_RB32(priv_data + 12);
2257  r = AV_RB32(priv_data + 16);
2258 
2259  if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
2260  av_log(logctx, AV_LOG_ERROR,
2261  "Invalid bounding rectangle coordinates "
2262  "%"PRIu32",%"PRIu32",%"PRIu32",%"PRIu32"\n",
2263  l, t, r, b);
2264  return AVERROR_INVALIDDATA;
2265  }
2266  } else if (track->video.projection.private.size != 0) {
2267  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2268  return AVERROR_INVALIDDATA;
2269  }
2270 
2271  if (l || t || r || b)
2272  projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
2273  else
2274  projection = AV_SPHERICAL_EQUIRECTANGULAR;
2275  break;
2277  if (track->video.projection.private.size < 4) {
2278  av_log(logctx, AV_LOG_ERROR, "Missing projection private properties\n");
2279  return AVERROR_INVALIDDATA;
2280  } else if (track->video.projection.private.size == 12) {
2281  uint32_t layout = AV_RB32(priv_data + 4);
2282  if (layout) {
2283  av_log(logctx, AV_LOG_WARNING,
2284  "Unknown spherical cubemap layout %"PRIu32"\n", layout);
2285  return 0;
2286  }
2287  projection = AV_SPHERICAL_CUBEMAP;
2288  padding = AV_RB32(priv_data + 8);
2289  } else {
2290  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2291  return AVERROR_INVALIDDATA;
2292  }
2293  break;
2295  /* No Spherical metadata */
2296  return 0;
2297  default:
2298  av_log(logctx, AV_LOG_WARNING,
2299  "Unknown spherical metadata type %"PRIu64"\n",
2300  track->video.projection.type);
2301  return 0;
2302  }
2303 
2304  spherical = av_spherical_alloc(&spherical_size);
2305  if (!spherical)
2306  return AVERROR(ENOMEM);
2307 
2308  spherical->projection = projection;
2309 
2310  spherical->yaw = (int32_t) (track->video.projection.yaw * (1 << 16));
2311  spherical->pitch = (int32_t) (track->video.projection.pitch * (1 << 16));
2312  spherical->roll = (int32_t) (track->video.projection.roll * (1 << 16));
2313 
2314  spherical->padding = padding;
2315 
2316  spherical->bound_left = l;
2317  spherical->bound_top = t;
2318  spherical->bound_right = r;
2319  spherical->bound_bottom = b;
2320 
2321  ret = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, (uint8_t *)spherical,
2322  spherical_size);
2323  if (ret < 0) {
2324  av_freep(&spherical);
2325  return ret;
2326  }
2327 
2328  return 0;
2329 }
2330 
2332  EbmlBin *bin)
2333 {
2334  return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size);
2335 }
2336 
2338 {
2339  const EbmlList *mappings_list = &track->block_addition_mappings;
2340  MatroskaBlockAdditionMapping *mappings = mappings_list->elem;
2341  int ret;
2342 
2343  for (int i = 0; i < mappings_list->nb_elem; i++) {
2344  MatroskaBlockAdditionMapping *mapping = &mappings[i];
2345 
2346  switch (mapping->type) {
2347  case MKBETAG('d','v','c','C'):
2348  case MKBETAG('d','v','v','C'):
2349  if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0)
2350  return ret;
2351 
2352  break;
2353  default:
2355  "Unknown block additional mapping type 0x%"PRIx64", value %"PRIu64", name \"%s\"\n",
2356  mapping->type, mapping->value, mapping->name ? mapping->name : "");
2357  }
2358  }
2359 
2360  return 0;
2361 }
2362 
2363 static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id)
2364 {
2365  const AVCodecTag *codec_tags;
2366 
2367  codec_tags = track->type == MATROSKA_TRACK_TYPE_VIDEO ?
2369 
2370  /* Normalize noncompliant private data that starts with the fourcc
2371  * by expanding/shifting the data by 4 bytes and storing the data
2372  * size at the start. */
2373  if (ff_codec_get_id(codec_tags, AV_RL32(track->codec_priv.data))) {
2374  int ret = av_buffer_realloc(&track->codec_priv.buf,
2376  if (ret < 0)
2377  return ret;
2378 
2379  track->codec_priv.data = track->codec_priv.buf->data;
2380  memmove(track->codec_priv.data + 4, track->codec_priv.data, track->codec_priv.size);
2381  track->codec_priv.size += 4;
2382  AV_WB32(track->codec_priv.data, track->codec_priv.size);
2383  }
2384 
2385  *fourcc = AV_RL32(track->codec_priv.data + 4);
2386  *codec_id = ff_codec_get_id(codec_tags, *fourcc);
2387 
2388  return 0;
2389 }
2390 
2392 {
2393  MatroskaDemuxContext *matroska = s->priv_data;
2394  MatroskaTrack *tracks = matroska->tracks.elem;
2395  int i, j, ret;
2396  int k;
2397 
2398  for (i = 0; i < matroska->tracks.nb_elem; i++) {
2399  MatroskaTrack *track = &tracks[i];
2401  EbmlList *encodings_list = &track->encodings;
2402  MatroskaTrackEncoding *encodings = encodings_list->elem;
2403  uint8_t *extradata = NULL;
2404  int extradata_size = 0;
2405  int extradata_offset = 0;
2406  uint32_t fourcc = 0;
2407  FFIOContext b;
2408  AVStream *st;
2409  FFStream *sti;
2410  char* key_id_base64 = NULL;
2411  int bit_depth = -1;
2412 
2413  /* Apply some sanity checks. */
2414  if (track->type != MATROSKA_TRACK_TYPE_VIDEO &&
2415  track->type != MATROSKA_TRACK_TYPE_AUDIO &&
2416  track->type != MATROSKA_TRACK_TYPE_SUBTITLE &&
2417  track->type != MATROSKA_TRACK_TYPE_METADATA) {
2418  av_log(matroska->ctx, AV_LOG_INFO,
2419  "Unknown or unsupported track type %"PRIu64"\n",
2420  track->type);
2421  continue;
2422  }
2423  if (!track->codec_id)
2424  continue;
2425 
2426  if ( track->type == MATROSKA_TRACK_TYPE_AUDIO && track->codec_id[0] != 'A'
2427  || track->type == MATROSKA_TRACK_TYPE_VIDEO && track->codec_id[0] != 'V'
2428  || track->type == MATROSKA_TRACK_TYPE_SUBTITLE && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
2429  || track->type == MATROSKA_TRACK_TYPE_METADATA && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
2430  ) {
2431  av_log(matroska->ctx, AV_LOG_INFO, "Inconsistent track type\n");
2432  continue;
2433  }
2434 
2435  if (track->audio.samplerate < 0 || track->audio.samplerate > INT_MAX ||
2436  isnan(track->audio.samplerate)) {
2437  av_log(matroska->ctx, AV_LOG_WARNING,
2438  "Invalid sample rate %f, defaulting to 8000 instead.\n",
2439  track->audio.samplerate);
2440  track->audio.samplerate = 8000;
2441  }
2442 
2443  if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
2444  if (!track->default_duration && track->video.frame_rate > 0) {
2445  double default_duration = 1000000000 / track->video.frame_rate;
2446  if (default_duration > UINT64_MAX || default_duration < 0) {
2447  av_log(matroska->ctx, AV_LOG_WARNING,
2448  "Invalid frame rate %e. Cannot calculate default duration.\n",
2449  track->video.frame_rate);
2450  } else {
2451  track->default_duration = default_duration;
2452  }
2453  }
2454  if (track->video.display_width == -1)
2455  track->video.display_width = track->video.pixel_width;
2456  if (track->video.display_height == -1)
2457  track->video.display_height = track->video.pixel_height;
2458  if (track->video.color_space.size == 4)
2459  fourcc = AV_RL32(track->video.color_space.data);
2460  } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
2461  if (!track->audio.out_samplerate)
2462  track->audio.out_samplerate = track->audio.samplerate;
2463  }
2464  if (encodings_list->nb_elem > 1) {
2465  av_log(matroska->ctx, AV_LOG_ERROR,
2466  "Multiple combined encodings not supported");
2467  } else if (encodings_list->nb_elem == 1) {
2468  if (encodings[0].type) {
2469  if (encodings[0].encryption.key_id.size > 0) {
2470  /* Save the encryption key id to be stored later as a
2471  metadata tag. */
2472  const int b64_size = AV_BASE64_SIZE(encodings[0].encryption.key_id.size);
2473  key_id_base64 = av_malloc(b64_size);
2474  if (key_id_base64 == NULL)
2475  return AVERROR(ENOMEM);
2476 
2477  av_base64_encode(key_id_base64, b64_size,
2478  encodings[0].encryption.key_id.data,
2479  encodings[0].encryption.key_id.size);
2480  } else {
2481  encodings[0].scope = 0;
2482  av_log(matroska->ctx, AV_LOG_ERROR,
2483  "Unsupported encoding type");
2484  }
2485  } else if (
2486 #if CONFIG_ZLIB
2487  encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_ZLIB &&
2488 #endif
2489 #if CONFIG_BZLIB
2490  encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_BZLIB &&
2491 #endif
2492 #if CONFIG_LZO
2493  encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO &&
2494 #endif
2495  encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP) {
2496  encodings[0].scope = 0;
2497  av_log(matroska->ctx, AV_LOG_ERROR,
2498  "Unsupported encoding type");
2499  } else if (track->codec_priv.size && encodings[0].scope & 2) {
2500  uint8_t *codec_priv = track->codec_priv.data;
2501  int ret = matroska_decode_buffer(&track->codec_priv.data,
2502  &track->codec_priv.size,
2503  track);
2504  if (ret < 0) {
2505  track->codec_priv.data = NULL;
2506  track->codec_priv.size = 0;
2507  av_log(matroska->ctx, AV_LOG_ERROR,
2508  "Failed to decode codec private data\n");
2509  }
2510 
2511  if (codec_priv != track->codec_priv.data) {
2512  av_buffer_unref(&track->codec_priv.buf);
2513  if (track->codec_priv.data) {
2514  track->codec_priv.buf = av_buffer_create(track->codec_priv.data,
2516  NULL, NULL, 0);
2517  if (!track->codec_priv.buf) {
2518  av_freep(&track->codec_priv.data);
2519  track->codec_priv.size = 0;
2520  return AVERROR(ENOMEM);
2521  }
2522  }
2523  }
2524  }
2525  }
2526  track->needs_decoding = encodings && !encodings[0].type &&
2527  encodings[0].scope & 1 &&
2528  (encodings[0].compression.algo !=
2530  encodings[0].compression.settings.size);
2531 
2532  for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
2533  if (av_strstart(track->codec_id, ff_mkv_codec_tags[j].str, NULL)) {
2535  break;
2536  }
2537  }
2538 
2539  st = track->stream = avformat_new_stream(s, NULL);
2540  if (!st) {
2541  av_free(key_id_base64);
2542  return AVERROR(ENOMEM);
2543  }
2544  sti = ffstream(st);
2545 
2546  if (key_id_base64) {
2547  /* export encryption key id as base64 metadata tag */
2548  av_dict_set(&st->metadata, "enc_key_id", key_id_base64,
2550  }
2551 
2552  if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
2553  track->codec_priv.size >= 40 &&
2554  track->codec_priv.data) {
2555  track->ms_compat = 1;
2556  bit_depth = AV_RL16(track->codec_priv.data + 14);
2557  fourcc = AV_RL32(track->codec_priv.data + 16);
2559  fourcc);
2560  if (!codec_id)
2562  fourcc);
2563  extradata_offset = 40;
2564  } else if (!strcmp(track->codec_id, "A_MS/ACM") &&
2565  track->codec_priv.size >= 14 &&
2566  track->codec_priv.data) {
2567  int ret;
2569  track->codec_priv.size,
2570  0, NULL, NULL, NULL, NULL);
2571  ret = ff_get_wav_header(s, &b.pub, st->codecpar,
2572  track->codec_priv.size, 0);
2573  if (ret < 0)
2574  return ret;
2575  codec_id = st->codecpar->codec_id;
2576  fourcc = st->codecpar->codec_tag;
2577  extradata_offset = FFMIN(track->codec_priv.size, 18);
2578  } else if (!strcmp(track->codec_id, "A_QUICKTIME")
2579  /* Normally 36, but allow noncompliant private data */
2580  && (track->codec_priv.size >= 32)
2581  && (track->codec_priv.data)) {
2582  uint16_t sample_size;
2583  int ret = get_qt_codec(track, &fourcc, &codec_id);
2584  if (ret < 0)
2585  return ret;
2586  sample_size = AV_RB16(track->codec_priv.data + 26);
2587  if (fourcc == 0) {
2588  if (sample_size == 8) {
2589  fourcc = MKTAG('r','a','w',' ');
2591  } else if (sample_size == 16) {
2592  fourcc = MKTAG('t','w','o','s');
2594  }
2595  }
2596  if ((fourcc == MKTAG('t','w','o','s') ||
2597  fourcc == MKTAG('s','o','w','t')) &&
2598  sample_size == 8)
2600  } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
2601  (track->codec_priv.size >= 21) &&
2602  (track->codec_priv.data)) {
2603  int ret = get_qt_codec(track, &fourcc, &codec_id);
2604  if (ret < 0)
2605  return ret;
2606  if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
2607  fourcc = MKTAG('S','V','Q','3');
2609  }
2610  if (codec_id == AV_CODEC_ID_NONE)
2611  av_log(matroska->ctx, AV_LOG_ERROR,
2612  "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
2613  if (track->codec_priv.size >= 86) {
2614  bit_depth = AV_RB16(track->codec_priv.data + 82);
2616  track->codec_priv.size,
2617  0, NULL, NULL, NULL, NULL);
2618  if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
2619  bit_depth &= 0x1F;
2620  track->has_palette = 1;
2621  }
2622  }
2623  } else if (codec_id == AV_CODEC_ID_PCM_S16BE) {
2624  switch (track->audio.bitdepth) {
2625  case 8:
2627  break;
2628  case 24:
2630  break;
2631  case 32:
2633  break;
2634  }
2635  } else if (codec_id == AV_CODEC_ID_PCM_S16LE) {
2636  switch (track->audio.bitdepth) {
2637  case 8:
2639  break;
2640  case 24:
2642  break;
2643  case 32:
2645  break;
2646  }
2647  } else if (codec_id == AV_CODEC_ID_PCM_F32LE &&
2648  track->audio.bitdepth == 64) {
2650  } else if (codec_id == AV_CODEC_ID_AAC && !track->codec_priv.size) {
2651  int profile = matroska_aac_profile(track->codec_id);
2652  int sri = matroska_aac_sri(track->audio.samplerate);
2653  extradata = av_mallocz(5 + AV_INPUT_BUFFER_PADDING_SIZE);
2654  if (!extradata)
2655  return AVERROR(ENOMEM);
2656  extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
2657  extradata[1] = ((sri & 0x01) << 7) | (track->audio.channels << 3);
2658  if (strstr(track->codec_id, "SBR")) {
2659  sri = matroska_aac_sri(track->audio.out_samplerate);
2660  extradata[2] = 0x56;
2661  extradata[3] = 0xE5;
2662  extradata[4] = 0x80 | (sri << 3);
2663  extradata_size = 5;
2664  } else
2665  extradata_size = 2;
2666  } else if (codec_id == AV_CODEC_ID_ALAC && track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - AV_INPUT_BUFFER_PADDING_SIZE) {
2667  /* Only ALAC's magic cookie is stored in Matroska's track headers.
2668  * Create the "atom size", "tag", and "tag version" fields the
2669  * decoder expects manually. */
2670  extradata_size = 12 + track->codec_priv.size;
2671  extradata = av_mallocz(extradata_size +
2673  if (!extradata)
2674  return AVERROR(ENOMEM);
2675  AV_WB32(extradata, extradata_size);
2676  memcpy(&extradata[4], "alac", 4);
2677  AV_WB32(&extradata[8], 0);
2678  memcpy(&extradata[12], track->codec_priv.data,
2679  track->codec_priv.size);
2680  } else if (codec_id == AV_CODEC_ID_TTA) {
2681  uint8_t *ptr;
2682  if (track->audio.channels > UINT16_MAX ||
2683  track->audio.bitdepth > UINT16_MAX) {
2684  av_log(matroska->ctx, AV_LOG_WARNING,
2685  "Too large audio channel number %"PRIu64
2686  " or bitdepth %"PRIu64". Skipping track.\n",
2687  track->audio.channels, track->audio.bitdepth);
2688  if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
2689  return AVERROR_INVALIDDATA;
2690  else
2691  continue;
2692  }
2693  if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
2694  return AVERROR_INVALIDDATA;
2695  extradata_size = 22;
2696  extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
2697  if (!extradata)
2698  return AVERROR(ENOMEM);
2699  ptr = extradata;
2700  bytestream_put_be32(&ptr, AV_RB32("TTA1"));
2701  bytestream_put_le16(&ptr, 1);
2702  bytestream_put_le16(&ptr, track->audio.channels);
2703  bytestream_put_le16(&ptr, track->audio.bitdepth);
2704  bytestream_put_le32(&ptr, track->audio.out_samplerate);
2705  bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
2706  track->audio.out_samplerate,
2707  AV_TIME_BASE * 1000));
2708  } else if (codec_id == AV_CODEC_ID_RV10 ||
2712  extradata_offset = 26;
2713  } else if (codec_id == AV_CODEC_ID_RA_144) {
2714  track->audio.out_samplerate = 8000;
2715  track->audio.channels = 1;
2716  } else if ((codec_id == AV_CODEC_ID_RA_288 ||
2720  && track->codec_priv.data) {
2721  const uint8_t *ptr = track->codec_priv.data;
2722  int flavor;
2723 
2724  if (track->codec_priv.size < 46)
2725  return AVERROR_INVALIDDATA;
2726  ptr += 22;
2727  flavor = bytestream_get_be16(&ptr);
2728  track->audio.coded_framesize = bytestream_get_be32(&ptr);
2729  ptr += 12;
2730  track->audio.sub_packet_h = bytestream_get_be16(&ptr);
2731  track->audio.frame_size = bytestream_get_be16(&ptr);
2732  track->audio.sub_packet_size = bytestream_get_be16(&ptr);
2733  if (track->audio.coded_framesize <= 0 ||
2734  track->audio.sub_packet_h <= 0 ||
2735  track->audio.frame_size <= 0)
2736  return AVERROR_INVALIDDATA;
2737 
2738  if (codec_id == AV_CODEC_ID_RA_288) {
2739  if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
2740  != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
2741  return AVERROR_INVALIDDATA;
2742  st->codecpar->block_align = track->audio.coded_framesize;
2743  track->codec_priv.size = 0;
2744  } else {
2745  if (codec_id == AV_CODEC_ID_SIPR) {
2746  static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
2747  if (flavor > 3)
2748  return AVERROR_INVALIDDATA;
2749  track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
2750  st->codecpar->bit_rate = sipr_bit_rate[flavor];
2751  } else if (track->audio.sub_packet_size <= 0 ||
2752  track->audio.frame_size % track->audio.sub_packet_size)
2753  return AVERROR_INVALIDDATA;
2754  st->codecpar->block_align = track->audio.sub_packet_size;
2755  extradata_offset = 78;
2756  }
2757  track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
2758  track->audio.frame_size);
2759  if (!track->audio.buf)
2760  return AVERROR(ENOMEM);
2761  } else if (codec_id == AV_CODEC_ID_FLAC && track->codec_priv.size) {
2762  ret = matroska_parse_flac(s, track, &extradata_offset);
2763  if (ret < 0)
2764  return ret;
2765  } else if (codec_id == AV_CODEC_ID_WAVPACK && track->codec_priv.size < 2) {
2766  av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
2767  "in absence of valid CodecPrivate.\n");
2768  extradata_size = 2;
2769  extradata = av_mallocz(2 + AV_INPUT_BUFFER_PADDING_SIZE);
2770  if (!extradata)
2771  return AVERROR(ENOMEM);
2772  AV_WL16(extradata, 0x410);
2773  } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) {
2774  fourcc = AV_RL32(track->codec_priv.data);
2775  } else if (codec_id == AV_CODEC_ID_VP9 && track->codec_priv.size) {
2776  /* we don't need any value stored in CodecPrivate.
2777  make sure that it's not exported as extradata. */
2778  track->codec_priv.size = 0;
2779  }
2780  track->codec_priv.size -= extradata_offset;
2781 
2782  if (codec_id == AV_CODEC_ID_NONE)
2783  av_log(matroska->ctx, AV_LOG_INFO,
2784  "Unknown/unsupported AVCodecID %s.\n", track->codec_id);
2785 
2786  if (track->time_scale < 0.01) {
2787  av_log(matroska->ctx, AV_LOG_WARNING,
2788  "Track TimestampScale too small %f, assuming 1.0.\n",
2789  track->time_scale);
2790  track->time_scale = 1.0;
2791  }
2792  avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale,
2793  1000 * 1000 * 1000); /* 64 bit pts in ns */
2794 
2795  /* convert the delay from ns to the track timebase */
2797  (AVRational){ 1, 1000000000 },
2798  st->time_base);
2799 
2800  st->codecpar->codec_id = codec_id;
2801 
2802  if (strcmp(track->language, "und"))
2803  av_dict_set(&st->metadata, "language", track->language, 0);
2804  av_dict_set(&st->metadata, "title", track->name, 0);
2805 
2806  if (track->flag_default)
2808  if (track->flag_forced)
2810  if (track->flag_comment)
2812  if (track->flag_hearingimpaired)
2814  if (track->flag_visualimpaired)
2816  if (track->flag_original.count > 0)
2819 
2820  if (!st->codecpar->extradata) {
2821  if (extradata) {
2822  st->codecpar->extradata = extradata;
2823  st->codecpar->extradata_size = extradata_size;
2824  } else if (track->codec_priv.data && track->codec_priv.size > 0) {
2825  if (ff_alloc_extradata(st->codecpar, track->codec_priv.size))
2826  return AVERROR(ENOMEM);
2827  memcpy(st->codecpar->extradata,
2828  track->codec_priv.data + extradata_offset,
2829  track->codec_priv.size);
2830  }
2831  }
2832 
2833  if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
2835  int display_width_mul = 1;
2836  int display_height_mul = 1;
2837 
2839  st->codecpar->codec_tag = fourcc;
2840  if (bit_depth >= 0)
2842  st->codecpar->width = track->video.pixel_width;
2843  st->codecpar->height = track->video.pixel_height;
2844 
2846  st->codecpar->field_order = mkv_field_order(matroska, track->video.field_order);
2849 
2851  mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
2852 
2855  &st->sample_aspect_ratio.den,
2856  st->codecpar->height * track->video.display_width * display_width_mul,
2857  st->codecpar->width * track->video.display_height * display_height_mul,
2858  INT_MAX);
2859  }
2860  if (st->codecpar->codec_id != AV_CODEC_ID_HEVC)
2862 
2863  if (track->default_duration) {
2864  int div = track->default_duration <= INT64_MAX ? 1 : 2;
2866  1000000000 / div, track->default_duration / div, 30000);
2867 #if FF_API_R_FRAME_RATE
2868  if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
2869  && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
2870  st->r_frame_rate = st->avg_frame_rate;
2871 #endif
2872  }
2873 
2874  /* export stereo mode flag as metadata tag */
2876  av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
2877 
2878  /* export alpha mode flag as metadata tag */
2879  if (track->video.alpha_mode)
2880  av_dict_set(&st->metadata, "alpha_mode", "1", 0);
2881 
2882  /* if we have virtual track, mark the real tracks */
2883  for (j=0; j < track->operation.combine_planes.nb_elem; j++) {
2884  char buf[32];
2886  continue;
2887  snprintf(buf, sizeof(buf), "%s_%d",
2889  for (k=0; k < matroska->tracks.nb_elem; k++)
2890  if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
2891  av_dict_set(&tracks[k].stream->metadata,
2892  "stereo_mode", buf, 0);
2893  break;
2894  }
2895  }
2896  // add stream level stereo3d side data if it is a supported format
2898  track->video.stereo_mode != 10 && track->video.stereo_mode != 12) {
2899  int ret = ff_mkv_stereo3d_conv(st, track->video.stereo_mode);
2900  if (ret < 0)
2901  return ret;
2902  }
2903 
2904  ret = mkv_parse_video_color(st, track);
2905  if (ret < 0)
2906  return ret;
2907  ret = mkv_parse_video_projection(st, track, matroska->ctx);
2908  if (ret < 0)
2909  return ret;
2910  } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
2912  st->codecpar->codec_tag = fourcc;
2913  st->codecpar->sample_rate = track->audio.out_samplerate;
2914  st->codecpar->channels = track->audio.channels;
2915  if (!st->codecpar->bits_per_coded_sample)
2917  if (st->codecpar->codec_id == AV_CODEC_ID_MP3 ||
2918  st->codecpar->codec_id == AV_CODEC_ID_MLP ||
2921  else if (st->codecpar->codec_id != AV_CODEC_ID_AAC)
2923  if (track->codec_delay > 0) {
2925  (AVRational){1, 1000000000},
2926  (AVRational){1, st->codecpar->codec_id == AV_CODEC_ID_OPUS ?
2927  48000 : st->codecpar->sample_rate});
2928  }
2929  if (track->seek_preroll > 0) {
2931  (AVRational){1, 1000000000},
2932  (AVRational){1, st->codecpar->sample_rate});
2933  }
2934  } else if (codec_id == AV_CODEC_ID_WEBVTT) {
2936 
2937  if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
2939  } else if (!strcmp(track->codec_id, "D_WEBVTT/DESCRIPTIONS")) {
2941  } else if (!strcmp(track->codec_id, "D_WEBVTT/METADATA")) {
2943  }
2944  } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
2946 
2947  if (track->flag_textdescriptions)
2949  }
2950 
2951  ret = mkv_parse_block_addition_mappings(s, st, track);
2952  if (ret < 0)
2953  return ret;
2954  }
2955 
2956  return 0;
2957 }
2958 
2960 {
2961  FFFormatContext *const si = ffformatcontext(s);
2962  MatroskaDemuxContext *matroska = s->priv_data;
2963  EbmlList *attachments_list = &matroska->attachments;
2964  EbmlList *chapters_list = &matroska->chapters;
2965  MatroskaAttachment *attachments;
2966  MatroskaChapter *chapters;
2967  uint64_t max_start = 0;
2968  int64_t pos;
2969  Ebml ebml = { 0 };
2970  int i, j, res;
2971 
2972  matroska->ctx = s;
2973  matroska->cues_parsing_deferred = 1;
2974 
2975  /* First read the EBML header. */
2976  if (ebml_parse(matroska, ebml_syntax, &ebml) || !ebml.doctype) {
2977  av_log(matroska->ctx, AV_LOG_ERROR, "EBML header parsing failed\n");
2978  ebml_free(ebml_syntax, &ebml);
2979  return AVERROR_INVALIDDATA;
2980  }
2981  if (ebml.version > EBML_VERSION ||
2982  ebml.max_size > sizeof(uint64_t) ||
2983  ebml.id_length > sizeof(uint32_t) ||
2984  ebml.doctype_version > 3) {
2986  "EBML version %"PRIu64", doctype %s, doc version %"PRIu64,
2987  ebml.version, ebml.doctype, ebml.doctype_version);
2988  ebml_free(ebml_syntax, &ebml);
2989  return AVERROR_PATCHWELCOME;
2990  } else if (ebml.doctype_version == 3) {
2991  av_log(matroska->ctx, AV_LOG_WARNING,
2992  "EBML header using unsupported features\n"
2993  "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
2994  ebml.version, ebml.doctype, ebml.doctype_version);
2995  }
2996  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++)
2997  if (!strcmp(ebml.doctype, matroska_doctypes[i]))
2998  break;
3000  av_log(s, AV_LOG_WARNING, "Unknown EBML doctype '%s'\n", ebml.doctype);
3001  if (matroska->ctx->error_recognition & AV_EF_EXPLODE) {
3002  ebml_free(ebml_syntax, &ebml);
3003  return AVERROR_INVALIDDATA;
3004  }
3005  }
3006  ebml_free(ebml_syntax, &ebml);
3007 
3008  matroska->pkt = si->parse_pkt;
3009 
3010  /* The next thing is a segment. */
3011  pos = avio_tell(matroska->ctx->pb);
3012  res = ebml_parse(matroska, matroska_segments, matroska);
3013  // Try resyncing until we find an EBML_STOP type element.
3014  while (res != 1) {
3015  res = matroska_resync(matroska, pos);
3016  if (res < 0)
3017  return res;
3018  pos = avio_tell(matroska->ctx->pb);
3019  res = ebml_parse(matroska, matroska_segment, matroska);
3020  if (res == AVERROR(EIO)) // EOF is translated to EIO, this exists the loop on EOF
3021  return res;
3022  }
3023  /* Set data_offset as it might be needed later by seek_frame_generic. */
3024  if (matroska->current_id == MATROSKA_ID_CLUSTER)
3025  si->data_offset = avio_tell(matroska->ctx->pb) - 4;
3026  matroska_execute_seekhead(matroska);
3027 
3028  if (!matroska->time_scale)
3029  matroska->time_scale = 1000000;
3030  if (isnan(matroska->duration))
3031  matroska->duration = 0;
3032  if (matroska->duration)
3033  matroska->ctx->duration = matroska->duration * matroska->time_scale *
3034  1000 / AV_TIME_BASE;
3035  av_dict_set(&s->metadata, "title", matroska->title, 0);
3036  av_dict_set(&s->metadata, "encoder", matroska->muxingapp, 0);
3037 
3038  if (matroska->date_utc.size == 8)
3039  matroska_metadata_creation_time(&s->metadata, AV_RB64(matroska->date_utc.data));
3040 
3041  res = matroska_parse_tracks(s);
3042  if (res < 0)
3043  return res;
3044 
3045  attachments = attachments_list->elem;
3046  for (j = 0; j < attachments_list->nb_elem; j++) {
3047  if (!(attachments[j].filename && attachments[j].mime &&
3048  attachments[j].bin.data && attachments[j].bin.size > 0)) {
3049  av_log(matroska->ctx, AV_LOG_ERROR, "incomplete attachment\n");
3050  } else {
3052  if (!st)
3053  break;
3054  av_dict_set(&st->metadata, "filename", attachments[j].filename, 0);
3055  av_dict_set(&st->metadata, "mimetype", attachments[j].mime, 0);
3056  if (attachments[j].description)
3057  av_dict_set(&st->metadata, "title", attachments[j].description, 0);
3059 
3060  for (i = 0; mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3061  if (av_strstart(attachments[j].mime, mkv_image_mime_tags[i].str, NULL)) {
3063  break;
3064  }
3065  }
3066 
3067  attachments[j].stream = st;
3068 
3069  if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
3070  res = ff_add_attached_pic(s, st, NULL, &attachments[j].bin.buf, 0);
3071  if (res < 0)
3072  return res;
3073  } else {
3075  if (ff_alloc_extradata(st->codecpar, attachments[j].bin.size))
3076  break;
3077  memcpy(st->codecpar->extradata, attachments[j].bin.data,
3078  attachments[j].bin.size);
3079 
3080  for (i = 0; mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3081  if (av_strstart(attachments[j].mime, mkv_mime_tags[i].str, NULL)) {
3083  break;
3084  }
3085  }
3086  }
3087  }
3088  }
3089 
3090  chapters = chapters_list->elem;
3091  for (i = 0; i < chapters_list->nb_elem; i++)
3092  if (chapters[i].start != AV_NOPTS_VALUE && chapters[i].uid &&
3093  (max_start == 0 || chapters[i].start > max_start)) {
3094  chapters[i].chapter =
3095  avpriv_new_chapter(s, chapters[i].uid,
3096  (AVRational) { 1, 1000000000 },
3097  chapters[i].start, chapters[i].end,
3098  chapters[i].title);
3099  max_start = chapters[i].start;
3100  }
3101 
3102  matroska_add_index_entries(matroska);
3103 
3105 
3106  return 0;
3108 
3109 /*
3110  * Put one packet in an application-supplied AVPacket struct.
3111  * Returns 0 on success or -1 on failure.
3112  */
3113 static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
3114  AVPacket *pkt)
3115 {
3116  if (matroska->queue.head) {
3117  MatroskaTrack *tracks = matroska->tracks.elem;
3118  MatroskaTrack *track;
3119 
3120  avpriv_packet_list_get(&matroska->queue, pkt);
3121  track = &tracks[pkt->stream_index];
3122  if (track->has_palette) {
3124  if (!pal) {
3125  av_log(matroska->ctx, AV_LOG_ERROR, "Cannot append palette to packet\n");
3126  } else {
3127  memcpy(pal, track->palette, AVPALETTE_SIZE);
3128  }
3129  track->has_palette = 0;
3130  }
3131  return 0;
3132  }
3133 
3134  return -1;
3135 }
3136 
3137 /*
3138  * Free all packets in our internal queue.
3139  */
3140 static void matroska_clear_queue(MatroskaDemuxContext *matroska)
3141 {
3142  avpriv_packet_list_free(&matroska->queue);
3143 }
3144 
3145 static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf,
3146  int size, int type, AVIOContext *pb,
3147  uint32_t lace_size[256], int *laces)
3148 {
3149  int n;
3150  uint8_t *data = *buf;
3151 
3152  if (!type) {
3153  *laces = 1;
3154  lace_size[0] = size;
3155  return 0;
3156  }
3157 
3158  if (size <= 0)
3159  return AVERROR_INVALIDDATA;
3160 
3161  *laces = *data + 1;
3162  data += 1;
3163  size -= 1;
3164 
3165  switch (type) {
3166  case 0x1: /* Xiph lacing */
3167  {
3168  uint8_t temp;
3169  uint32_t total = 0;
3170  for (n = 0; n < *laces - 1; n++) {
3171  lace_size[n] = 0;
3172 
3173  do {
3174  if (size <= total)
3175  return AVERROR_INVALIDDATA;
3176  temp = *data;
3177  total += temp;
3178  lace_size[n] += temp;
3179  data += 1;
3180  size -= 1;
3181  } while (temp == 0xff);
3182  }
3183  if (size < total)
3184  return AVERROR_INVALIDDATA;
3185 
3186  lace_size[n] = size - total;
3187  break;
3188  }
3189 
3190  case 0x2: /* fixed-size lacing */
3191  if (size % (*laces))
3192  return AVERROR_INVALIDDATA;
3193  for (n = 0; n < *laces; n++)
3194  lace_size[n] = size / *laces;
3195  break;
3196 
3197  case 0x3: /* EBML lacing */
3198  {
3199  uint64_t num;
3200  uint64_t total;
3201  int offset;
3202 
3203  avio_skip(pb, 4);
3204 
3205  n = ebml_read_num(matroska, pb, 8, &num, 1);
3206  if (n < 0)
3207  return n;
3208  if (num > INT_MAX)
3209  return AVERROR_INVALIDDATA;
3210 
3211  total = lace_size[0] = num;
3212  offset = n;
3213  for (n = 1; n < *laces - 1; n++) {
3214  int64_t snum;
3215  int r;
3216  r = matroska_ebmlnum_sint(matroska, pb, &snum);
3217  if (r < 0)
3218  return r;
3219  if (lace_size[n - 1] + snum > (uint64_t)INT_MAX)
3220  return AVERROR_INVALIDDATA;
3221 
3222  lace_size[n] = lace_size[n - 1] + snum;
3223  total += lace_size[n];
3224  offset += r;
3225  }
3226  data += offset;
3227  size -= offset;
3228  if (size < total)
3229  return AVERROR_INVALIDDATA;
3230 
3231  lace_size[*laces - 1] = size - total;
3232  break;
3233  }
3234  }
3236  *buf = data;
3237 
3238  return 0;
3239 }
3240 
3241 static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
3242  MatroskaTrack *track, AVStream *st,
3243  uint8_t *data, int size, uint64_t timecode,
3244  int64_t pos)
3245 {
3246  const int a = st->codecpar->block_align;
3247  const int sps = track->audio.sub_packet_size;
3248  const int cfs = track->audio.coded_framesize;
3249  const int h = track->audio.sub_packet_h;
3250  const int w = track->audio.frame_size;
3251  int y = track->audio.sub_packet_cnt;
3252  int x;
3253 
3254  if (!track->audio.pkt_cnt) {
3255  if (track->audio.sub_packet_cnt == 0)
3256  track->audio.buf_timecode = timecode;
3257  if (st->codecpar->codec_id == AV_CODEC_ID_RA_288) {
3258  if (size < cfs * h / 2) {
3259  av_log(matroska->ctx, AV_LOG_ERROR,
3260  "Corrupt int4 RM-style audio packet size\n");
3261  return AVERROR_INVALIDDATA;
3262  }
3263  for (x = 0; x < h / 2; x++)
3264  memcpy(track->audio.buf + x * 2 * w + y * cfs,
3265  data + x * cfs, cfs);
3266  } else if (st->codecpar->codec_id == AV_CODEC_ID_SIPR) {
3267  if (size < w) {
3268  av_log(matroska->ctx, AV_LOG_ERROR,
3269  "Corrupt sipr RM-style audio packet size\n");
3270  return AVERROR_INVALIDDATA;
3271  }
3272  memcpy(track->audio.buf + y * w, data, w);
3273  } else {
3274  if (size < w) {
3275  av_log(matroska->ctx, AV_LOG_ERROR,
3276  "Corrupt generic RM-style audio packet size\n");
3277  return AVERROR_INVALIDDATA;
3278  }
3279  for (x = 0; x < w / sps; x++)
3280  memcpy(track->audio.buf +
3281  sps * (h * x + ((h + 1) / 2) * (y & 1) + (y >> 1)),
3282  data + x * sps, sps);
3283  }
3284 
3285  if (++track->audio.sub_packet_cnt >= h) {
3286  if (st->codecpar->codec_id == AV_CODEC_ID_SIPR)
3287  ff_rm_reorder_sipr_data(track->audio.buf, h, w);
3288  track->audio.sub_packet_cnt = 0;
3289  track->audio.pkt_cnt = h * w / a;
3290  }
3291  }
3292 
3293  while (track->audio.pkt_cnt) {
3294  int ret;
3295  AVPacket *pkt = matroska->pkt;
3296 
3297  ret = av_new_packet(pkt, a);
3298  if (ret < 0) {
3299  return ret;
3300  }
3301  memcpy(pkt->data,
3302  track->audio.buf + a * (h * w / a - track->audio.pkt_cnt--),
3303  a);
3304  pkt->pts = track->audio.buf_timecode;
3306  pkt->pos = pos;
3307  pkt->stream_index = st->index;
3308  ret = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3309  if (ret < 0) {
3311  return AVERROR(ENOMEM);
3312  }
3313  }
3314 
3315  return 0;
3316 }
3317 
3318 /* reconstruct full wavpack blocks from mangled matroska ones */
3319 static int matroska_parse_wavpack(MatroskaTrack *track,
3320  uint8_t **data, int *size)
3321 {
3322  uint8_t *dst = NULL;
3323  uint8_t *src = *data;
3324  int dstlen = 0;
3325  int srclen = *size;
3326  uint32_t samples;
3327  uint16_t ver;
3328  int ret, offset = 0;
3329 
3330  if (srclen < 12)
3331  return AVERROR_INVALIDDATA;
3332 
3333  av_assert1(track->stream->codecpar->extradata_size >= 2);
3334  ver = AV_RL16(track->stream->codecpar->extradata);
3335 
3336  samples = AV_RL32(src);
3337  src += 4;
3338  srclen -= 4;
3339 
3340  while (srclen >= 8) {
3341  int multiblock;
3342  uint32_t blocksize;
3343  uint8_t *tmp;
3344 
3345  uint32_t flags = AV_RL32(src);
3346  uint32_t crc = AV_RL32(src + 4);
3347  src += 8;
3348  srclen -= 8;
3349 
3350  multiblock = (flags & 0x1800) != 0x1800;
3351  if (multiblock) {
3352  if (srclen < 4) {
3354  goto fail;
3355  }
3356  blocksize = AV_RL32(src);
3357  src += 4;
3358  srclen -= 4;
3359  } else
3360  blocksize = srclen;
3361 
3362  if (blocksize > srclen) {
3364  goto fail;
3365  }
3366 
3367  tmp = av_realloc(dst, dstlen + blocksize + 32 + AV_INPUT_BUFFER_PADDING_SIZE);
3368  if (!tmp) {
3369  ret = AVERROR(ENOMEM);
3370  goto fail;
3371  }
3372  dst = tmp;
3373  dstlen += blocksize + 32;
3374 
3375  AV_WL32(dst + offset, MKTAG('w', 'v', 'p', 'k')); // tag
3376  AV_WL32(dst + offset + 4, blocksize + 24); // blocksize - 8
3377  AV_WL16(dst + offset + 8, ver); // version
3378  AV_WL16(dst + offset + 10, 0); // track/index_no
3379  AV_WL32(dst + offset + 12, 0); // total samples
3380  AV_WL32(dst + offset + 16, 0); // block index
3381  AV_WL32(dst + offset + 20, samples); // number of samples
3382  AV_WL32(dst + offset + 24, flags); // flags
3383  AV_WL32(dst + offset + 28, crc); // crc
3384  memcpy(dst + offset + 32, src, blocksize); // block data
3385 
3386  src += blocksize;
3387  srclen -= blocksize;
3388  offset += blocksize + 32;
3389  }
3390 
3391  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3392 
3393  *data = dst;
3394  *size = dstlen;
3395 
3396  return 0;
3398 fail:
3399  av_freep(&dst);
3400  return ret;
3401 }
3402 
3403 static int matroska_parse_prores(MatroskaTrack *track,
3404  uint8_t **data, int *size)
3405 {
3406  uint8_t *dst;
3407  int dstlen = *size + 8;
3408 
3409  dst = av_malloc(dstlen + AV_INPUT_BUFFER_PADDING_SIZE);
3410  if (!dst)
3411  return AVERROR(ENOMEM);
3412 
3413  AV_WB32(dst, dstlen);
3414  AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f'));
3415  memcpy(dst + 8, *data, dstlen - 8);
3416  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3417 
3418  *data = dst;
3419  *size = dstlen;
3420 
3421  return 0;
3422 }
3423 
3424 static int matroska_parse_webvtt(MatroskaDemuxContext *matroska,
3425  MatroskaTrack *track,
3426  AVStream *st,
3427  uint8_t *data, int data_len,
3428  uint64_t timecode,
3429  uint64_t duration,
3430  int64_t pos)
3431 {
3432  AVPacket *pkt = matroska->pkt;
3433  uint8_t *id, *settings, *text, *buf;
3434  int id_len, settings_len, text_len;
3435  uint8_t *p, *q;
3436  int err;
3437 
3438  if (data_len <= 0)
3439  return AVERROR_INVALIDDATA;
3440 
3441  p = data;
3442  q = data + data_len;
3443 
3444  id = p;
3445  id_len = -1;
3446  while (p < q) {
3447  if (*p == '\r' || *p == '\n') {
3448  id_len = p - id;
3449  if (*p == '\r')
3450  p++;
3451  break;
3452  }
3453  p++;
3454  }
3455 
3456  if (p >= q || *p != '\n')
3457  return AVERROR_INVALIDDATA;
3458  p++;
3459 
3460  settings = p;
3461  settings_len = -1;
3462  while (p < q) {
3463  if (*p == '\r' || *p == '\n') {
3464  settings_len = p - settings;
3465  if (*p == '\r')
3466  p++;
3467  break;
3468  }
3469  p++;
3470  }
3471 
3472  if (p >= q || *p != '\n')
3473  return AVERROR_INVALIDDATA;
3474  p++;
3475 
3476  text = p;
3477  text_len = q - p;
3478  while (text_len > 0) {
3479  const int len = text_len - 1;
3480  const uint8_t c = p[len];
3481  if (c != '\r' && c != '\n')
3482  break;
3483  text_len = len;
3484  }
3485 
3486  if (text_len <= 0)
3487  return AVERROR_INVALIDDATA;
3488 
3489  err = av_new_packet(pkt, text_len);
3490  if (err < 0) {
3491  return err;
3492  }
3493 
3494  memcpy(pkt->data, text, text_len);
3495 
3496  if (id_len > 0) {
3499  id_len);
3500  if (!buf) {
3502  return AVERROR(ENOMEM);
3503  }
3504  memcpy(buf, id, id_len);
3505  }
3506 
3507  if (settings_len > 0) {
3510  settings_len);
3511  if (!buf) {
3513  return AVERROR(ENOMEM);
3514  }
3515  memcpy(buf, settings, settings_len);
3516  }
3517 
3518  // Do we need this for subtitles?
3519  // pkt->flags = AV_PKT_FLAG_KEY;
3520 
3521  pkt->stream_index = st->index;
3522  pkt->pts = timecode;
3523 
3524  // Do we need this for subtitles?
3525  // pkt->dts = timecode;
3526 
3527  pkt->duration = duration;
3528  pkt->pos = pos;
3529 
3530  err = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3531  if (err < 0) {
3533  return AVERROR(ENOMEM);
3534  }
3535 
3536  return 0;
3537 }
3538 
3539 static int matroska_parse_frame(MatroskaDemuxContext *matroska,
3540  MatroskaTrack *track, AVStream *st,
3541  AVBufferRef *buf, uint8_t *data, int pkt_size,
3542  uint64_t timecode, uint64_t lace_duration,
3543  int64_t pos, int is_keyframe,
3544  uint8_t *additional, uint64_t additional_id, int additional_size,
3545  int64_t discard_padding)
3546 {
3547  uint8_t *pkt_data = data;
3548  int res = 0;
3549  AVPacket *pkt = matroska->pkt;
3550 
3551  if (st->codecpar->codec_id == AV_CODEC_ID_WAVPACK) {
3552  res = matroska_parse_wavpack(track, &pkt_data, &pkt_size);
3553  if (res < 0) {
3554  av_log(matroska->ctx, AV_LOG_ERROR,
3555  "Error parsing a wavpack block.\n");
3556  goto fail;
3557  }
3558  if (!buf)
3559  av_freep(&data);
3560  buf = NULL;
3561  }
3562 
3563  if (st->codecpar->codec_id == AV_CODEC_ID_PRORES &&
3564  AV_RB32(pkt_data + 4) != MKBETAG('i', 'c', 'p', 'f')) {
3565  res = matroska_parse_prores(track, &pkt_data, &pkt_size);
3566  if (res < 0) {
3567  av_log(matroska->ctx, AV_LOG_ERROR,
3568  "Error parsing a prores block.\n");
3569  goto fail;
3570  }
3571  if (!buf)
3572  av_freep(&data);
3573  buf = NULL;
3574  }
3575 
3576  if (!pkt_size && !additional_size)
3577  goto no_output;
3578 
3579  if (!buf)
3580  pkt->buf = av_buffer_create(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE,
3581  NULL, NULL, 0);
3582  else
3583  pkt->buf = av_buffer_ref(buf);
3584 
3585  if (!pkt->buf) {
3586  res = AVERROR(ENOMEM);
3587  goto fail;
3588  }
3589 
3590  pkt->data = pkt_data;
3591  pkt->size = pkt_size;
3592  pkt->flags = is_keyframe;
3593  pkt->stream_index = st->index;
3594 
3595  if (additional_size > 0) {
3596  uint8_t *side_data = av_packet_new_side_data(pkt,
3598  additional_size + 8);
3599  if (!side_data) {
3601  return AVERROR(ENOMEM);
3602  }
3603  AV_WB64(side_data, additional_id);
3604  memcpy(side_data + 8, additional, additional_size);
3605  }
3606 
3607  if (discard_padding) {
3608  uint8_t *side_data = av_packet_new_side_data(pkt,
3610  10);
3611  if (!side_data) {
3613  return AVERROR(ENOMEM);
3614  }
3615  discard_padding = av_rescale_q(discard_padding,
3616  (AVRational){1, 1000000000},
3617  (AVRational){1, st->codecpar->sample_rate});
3618  if (discard_padding > 0) {
3619  AV_WL32(side_data + 4, discard_padding);
3620  } else {
3621  AV_WL32(side_data, -discard_padding);
3622  }
3623  }
3624 
3625  if (track->ms_compat)
3626  pkt->dts = timecode;
3627  else
3628  pkt->pts = timecode;
3629  pkt->pos = pos;
3630  pkt->duration = lace_duration;
3631 
3632  res = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3633  if (res < 0) {
3635  return AVERROR(ENOMEM);
3636  }
3637 
3638  return 0;
3639 
3640 no_output:
3642  if (!buf)
3643  av_free(pkt_data);
3644  return res;
3645 }
3646 
3647 static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf, uint8_t *data,
3648  int size, int64_t pos, uint64_t cluster_time,
3649  uint64_t block_duration, int is_keyframe,
3650  uint8_t *additional, uint64_t additional_id, int additional_size,
3651  int64_t cluster_pos, int64_t discard_padding)
3652 {
3653  uint64_t timecode = AV_NOPTS_VALUE;
3654  MatroskaTrack *track;
3655  FFIOContext pb;
3656  int res = 0;
3657  AVStream *st;
3658  int16_t block_time;
3659  uint32_t lace_size[256];
3660  int n, flags, laces = 0;
3661  uint64_t num;
3662  int trust_default_duration;
3663 
3664  ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL);
3665 
3666  if ((n = ebml_read_num(matroska, &pb.pub, 8, &num, 1)) < 0)
3667  return n;
3668  data += n;
3669  size -= n;
3670 
3671  track = matroska_find_track_by_num(matroska, num);
3672  if (!track || size < 3)
3673  return AVERROR_INVALIDDATA;
3674 
3675  if (!(st = track->stream)) {
3676  av_log(matroska->ctx, AV_LOG_VERBOSE,
3677  "No stream associated to TrackNumber %"PRIu64". "
3678  "Ignoring Block with this TrackNumber.\n", num);
3679  return 0;
3680  }
3681 
3682  if (st->discard >= AVDISCARD_ALL)
3683  return res;
3684  if (block_duration > INT64_MAX)
3685  block_duration = INT64_MAX;
3686 
3687  block_time = sign_extend(AV_RB16(data), 16);
3688  data += 2;
3689  flags = *data++;
3690  size -= 3;
3691  if (is_keyframe == -1)
3692  is_keyframe = flags & 0x80 ? AV_PKT_FLAG_KEY : 0;
3693 
3694  if (cluster_time != (uint64_t) -1 &&
3695  (block_time >= 0 || cluster_time >= -block_time)) {
3696  uint64_t timecode_cluster_in_track_tb = (double) cluster_time / track->time_scale;
3697  timecode = timecode_cluster_in_track_tb + block_time - track->codec_delay_in_track_tb;
3698  if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE &&
3699  timecode < track->end_timecode)
3700  is_keyframe = 0; /* overlapping subtitles are not key frame */
3701  if (is_keyframe) {
3702  ff_reduce_index(matroska->ctx, st->index);
3703  av_add_index_entry(st, cluster_pos, timecode, 0, 0,
3705  }
3706  }
3707 
3708  if (matroska->skip_to_keyframe &&
3709  track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
3710  // Compare signed timecodes. Timecode may be negative due to codec delay
3711  // offset. We don't support timestamps greater than int64_t anyway - see
3712  // AVPacket's pts.
3713  if ((int64_t)timecode < (int64_t)matroska->skip_to_timecode)
3714  return res;
3715  if (is_keyframe)
3716  matroska->skip_to_keyframe = 0;
3717  else if (!ffstream(st)->skip_to_keyframe) {
3718  av_log(matroska->ctx, AV_LOG_ERROR, "File is broken, keyframes not correctly marked!\n");
3719  matroska->skip_to_keyframe = 0;
3720  }
3721  }
3722 
3723  res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1,
3724  &pb.pub, lace_size, &laces);
3725  if (res < 0) {
3726  av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n");
3727  return res;
3728  }
3729 
3730  trust_default_duration = track->default_duration != 0;
3731  if (track->audio.samplerate == 8000 && trust_default_duration) {
3732  // If this is needed for more codecs, then add them here
3733  if (st->codecpar->codec_id == AV_CODEC_ID_AC3) {
3734  if (track->audio.samplerate != st->codecpar->sample_rate || !st->codecpar->frame_size)
3735  trust_default_duration = 0;
3736  }
3737  }
3738 
3739  if (!block_duration && trust_default_duration)
3740  block_duration = track->default_duration * laces / matroska->time_scale;
3741 
3742  if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time))
3743  track->end_timecode =
3744  FFMAX(track->end_timecode, timecode + block_duration);
3745 
3746  for (n = 0; n < laces; n++) {
3747  int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
3748  uint8_t *out_data = data;
3749  int out_size = lace_size[n];
3750 
3751  if (track->needs_decoding) {
3752  res = matroska_decode_buffer(&out_data, &out_size, track);
3753  if (res < 0)
3754  return res;
3755  /* Given that we are here means that out_data is no longer
3756  * owned by buf, so set it to NULL. This depends upon
3757  * zero-length header removal compression being ignored. */
3758  av_assert1(out_data != data);
3759  buf = NULL;
3760  }
3761 
3762  if (track->audio.buf) {
3763  res = matroska_parse_rm_audio(matroska, track, st,
3764  out_data, out_size,
3765  timecode, pos);
3766  if (!buf)
3767  av_free(out_data);
3768  if (res)
3769  return res;
3770  } else if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) {
3771  res = matroska_parse_webvtt(matroska, track, st,
3772  out_data, out_size,
3773  timecode, lace_duration,
3774  pos);
3775  if (!buf)
3776  av_free(out_data);
3777  if (res)
3778  return res;
3779  } else {
3780  res = matroska_parse_frame(matroska, track, st, buf, out_data,
3781  out_size, timecode, lace_duration,
3782  pos, !n ? is_keyframe : 0,
3783  additional, additional_id, additional_size,
3784  discard_padding);
3785  if (res)
3786  return res;
3787  }
3788 
3789  if (timecode != AV_NOPTS_VALUE)
3790  timecode = lace_duration ? timecode + lace_duration : AV_NOPTS_VALUE;
3791  data += lace_size[n];
3792  }
3793 
3794  return 0;
3795 }
3796 
3797 static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
3798 {
3799  MatroskaCluster *cluster = &matroska->current_cluster;
3800  MatroskaBlock *block = &cluster->block;
3801  int res;
3802 
3803  av_assert0(matroska->num_levels <= 2);
3804 
3805  if (matroska->num_levels == 1) {
3806  res = ebml_parse(matroska, matroska_segment, NULL);
3807 
3808  if (res == 1) {
3809  /* Found a cluster: subtract the size of the ID already read. */
3810  cluster->pos = avio_tell(matroska->ctx->pb) - 4;
3811 
3812  res = ebml_parse(matroska, matroska_cluster_enter, cluster);
3813  if (res < 0)
3814  return res;
3815  }
3816  }
3817 
3818  if (matroska->num_levels == 2) {
3819  /* We are inside a cluster. */
3820  res = ebml_parse(matroska, matroska_cluster_parsing, cluster);
3821 
3822  if (res >= 0 && block->bin.size > 0) {
3823  int is_keyframe = block->non_simple ? block->reference.count == 0 : -1;
3824  uint8_t* additional = block->additional.size > 0 ?
3825  block->additional.data : NULL;
3826 
3827  res = matroska_parse_block(matroska, block->bin.buf, block->bin.data,
3828  block->bin.size, block->bin.pos,
3829  cluster->timecode, block->duration,
3830  is_keyframe, additional, block->additional_id,
3831  block->additional.size, cluster->pos,
3832  block->discard_padding);
3833  }
3834 
3836  memset(block, 0, sizeof(*block));
3837  } else if (!matroska->num_levels) {
3838  if (!avio_feof(matroska->ctx->pb)) {
3839  avio_r8(matroska->ctx->pb);
3840  if (!avio_feof(matroska->ctx->pb)) {
3841  av_log(matroska->ctx, AV_LOG_WARNING, "File extends beyond "
3842  "end of segment.\n");
3843  return AVERROR_INVALIDDATA;
3844  }
3845  }
3846  matroska->done = 1;
3847  return AVERROR_EOF;
3848  }
3849 
3850  return res;
3851 }
3852 
3854 {
3855  MatroskaDemuxContext *matroska = s->priv_data;
3856  int ret = 0;
3857 
3858  if (matroska->resync_pos == -1) {
3859  // This can only happen if generic seeking has been used.
3860  matroska->resync_pos = avio_tell(s->pb);
3861  }
3862 
3863  while (matroska_deliver_packet(matroska, pkt)) {
3864  if (matroska->done)
3865  return (ret < 0) ? ret : AVERROR_EOF;
3866  if (matroska_parse_cluster(matroska) < 0 && !matroska->done)
3867  ret = matroska_resync(matroska, matroska->resync_pos);
3868  }
3869 
3870  return 0;
3871 }
3872 
3873 static int matroska_read_seek(AVFormatContext *s, int stream_index,
3874  int64_t timestamp, int flags)
3875 {
3876  MatroskaDemuxContext *matroska = s->priv_data;
3877  MatroskaTrack *tracks = NULL;
3878  AVStream *st = s->streams[stream_index];
3879  FFStream *const sti = ffstream(st);
3880  int i, index;
3881 
3882  /* Parse the CUES now since we need the index data to seek. */
3883  if (matroska->cues_parsing_deferred > 0) {
3884  matroska->cues_parsing_deferred = 0;
3885  matroska_parse_cues(matroska);
3886  }
3887 
3888  if (!sti->nb_index_entries)
3889  goto err;
3890  timestamp = FFMAX(timestamp, sti->index_entries[0].timestamp);
3891 
3892  if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
3893  index == sti->nb_index_entries - 1) {
3894  matroska_reset_status(matroska, 0, sti->index_entries[sti->nb_index_entries - 1].pos);
3895  while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
3896  index == sti->nb_index_entries - 1) {
3897  matroska_clear_queue(matroska);
3898  if (matroska_parse_cluster(matroska) < 0)
3899  break;
3900  }
3901  }
3902 
3903  matroska_clear_queue(matroska);
3904  if (index < 0 || (matroska->cues_parsing_deferred < 0 &&
3905  index == sti->nb_index_entries - 1))
3906  goto err;
3907 
3908  tracks = matroska->tracks.elem;
3909  for (i = 0; i < matroska->tracks.nb_elem; i++) {
3910  tracks[i].audio.pkt_cnt = 0;
3911  tracks[i].audio.sub_packet_cnt = 0;
3912  tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
3913  tracks[i].end_timecode = 0;
3914  }
3915 
3916  /* We seek to a level 1 element, so set the appropriate status. */
3917  matroska_reset_status(matroska, 0, sti->index_entries[index].pos);
3918  if (flags & AVSEEK_FLAG_ANY) {
3919  sti->skip_to_keyframe = 0;
3920  matroska->skip_to_timecode = timestamp;
3921  } else {
3922  sti->skip_to_keyframe = 1;
3923  matroska->skip_to_timecode = sti->index_entries[index].timestamp;
3924  }
3925  matroska->skip_to_keyframe = 1;
3926  matroska->done = 0;
3928  return 0;
3929 err:
3930  // slightly hackish but allows proper fallback to
3931  // the generic seeking code.
3932  matroska_reset_status(matroska, 0, -1);
3933  matroska->resync_pos = -1;
3934  matroska_clear_queue(matroska);
3936  matroska->skip_to_keyframe = 0;
3937  matroska->done = 0;
3938  return -1;
3939 }
3940 
3942 {
3943  MatroskaDemuxContext *matroska = s->priv_data;
3944  MatroskaTrack *tracks = matroska->tracks.elem;
3945  int n;
3946 
3947  matroska_clear_queue(matroska);
3948 
3949  for (n = 0; n < matroska->tracks.nb_elem; n++)
3950  if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
3951  av_freep(&tracks[n].audio.buf);
3952  ebml_free(matroska_segment, matroska);
3953 
3954  return 0;
3955 }
3956 
3957 #if CONFIG_WEBM_DASH_MANIFEST_DEMUXER
3958 typedef struct {
3959  int64_t start_time_ns;
3960  int64_t end_time_ns;
3961  int64_t start_offset;
3962  int64_t end_offset;
3963 } CueDesc;
3964 
3965 /* This function searches all the Cues and returns the CueDesc corresponding to
3966  * the timestamp ts. Returned CueDesc will be such that start_time_ns <= ts <
3967  * end_time_ns. All 4 fields will be set to -1 if ts >= file's duration.
3968  */
3969 static CueDesc get_cue_desc(AVFormatContext *s, int64_t ts, int64_t cues_start) {
3970  MatroskaDemuxContext *matroska = s->priv_data;
3971  FFStream *const sti = ffstream(s->streams[0]);
3972  AVIndexEntry *const index_entries = sti->index_entries;
3973  int nb_index_entries = sti->nb_index_entries;
3974  CueDesc cue_desc;
3975  int i;
3976 
3977  if (ts >= (int64_t)(matroska->duration * matroska->time_scale))
3978  return (CueDesc) {-1, -1, -1, -1};
3979  for (i = 1; i < nb_index_entries; i++) {
3980  if (index_entries[i - 1].timestamp * matroska->time_scale <= ts &&
3981  index_entries[i].timestamp * matroska->time_scale > ts) {
3982  break;
3983  }
3984  }
3985  --i;
3986  cue_desc.start_time_ns = index_entries[i].timestamp * matroska->time_scale;
3987  cue_desc.start_offset = index_entries[i].pos - matroska->segment_start;
3988  if (i != nb_index_entries - 1) {
3989  cue_desc.end_time_ns = index_entries[i + 1].timestamp * matroska->time_scale;
3990  cue_desc.end_offset = index_entries[i + 1].pos - matroska->segment_start;
3991  } else {
3992  cue_desc.end_time_ns = matroska->duration * matroska->time_scale;
3993  // FIXME: this needs special handling for files where Cues appear
3994  // before Clusters. the current logic assumes Cues appear after
3995  // Clusters.
3996  cue_desc.end_offset = cues_start - matroska->segment_start;
3997  }
3998  return cue_desc;
3999 }
4000 
4001 static int webm_clusters_start_with_keyframe(AVFormatContext *s)
4002 {
4003  MatroskaDemuxContext *matroska = s->priv_data;
4004  AVStream *const st = s->streams[0];
4005  FFStream *const sti = ffstream(st);
4006  uint32_t id = matroska->current_id;
4007  int64_t cluster_pos, before_pos;
4008  int index, rv = 1;
4009 
4010  if (sti->nb_index_entries <= 0)
4011  return 0;
4012 
4013  // seek to the first cluster using cues.
4014  index = av_index_search_timestamp(st, 0, 0);
4015  if (index < 0)
4016  return 0;
4017  cluster_pos = sti->index_entries[index].pos;
4018  before_pos = avio_tell(s->pb);
4019  while (1) {
4020  uint64_t cluster_id, cluster_length;
4021  int read;
4022  AVPacket *pkt;
4023  avio_seek(s->pb, cluster_pos, SEEK_SET);
4024  // read cluster id and length
4025  read = ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id, 1);
4026  if (read < 0 || cluster_id != 0xF43B675) // done with all clusters
4027  break;
4028  read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length);
4029  if (read < 0)
4030  break;
4031 
4032  matroska_reset_status(matroska, 0, cluster_pos);
4033  matroska_clear_queue(matroska);
4034  if (matroska_parse_cluster(matroska) < 0 ||
4035  !matroska->queue.head) {
4036  break;
4037  }
4038  pkt = &matroska->queue.head->pkt;
4039  // 4 + read is the length of the cluster id and the cluster length field.
4040  cluster_pos += 4 + read + cluster_length;
4041  if (!(pkt->flags & AV_PKT_FLAG_KEY)) {
4042  rv = 0;
4043  break;
4044  }
4045  }
4046 
4047  /* Restore the status after matroska_read_header: */
4048  matroska_reset_status(matroska, id, before_pos);
4049 
4050  return rv;
4051 }
4052 
4053 static int buffer_size_after_time_downloaded(int64_t time_ns, double search_sec, int64_t bps,
4054  double min_buffer, double* buffer,
4055  double* sec_to_download, AVFormatContext *s,
4056  int64_t cues_start)
4057 {
4058  double nano_seconds_per_second = 1000000000.0;
4059  double time_sec = time_ns / nano_seconds_per_second;
4060  int rv = 0;
4061  int64_t time_to_search_ns = (int64_t)(search_sec * nano_seconds_per_second);
4062  int64_t end_time_ns = time_ns + time_to_search_ns;
4063  double sec_downloaded = 0.0;
4064  CueDesc desc_curr = get_cue_desc(s, time_ns, cues_start);
4065  if (desc_curr.start_time_ns == -1)
4066  return -1;
4067  *sec_to_download = 0.0;
4068 
4069  // Check for non cue start time.
4070  if (time_ns > desc_curr.start_time_ns) {
4071  int64_t cue_nano = desc_curr.end_time_ns - time_ns;
4072  double percent = (double)(cue_nano) / (desc_curr.end_time_ns - desc_curr.start_time_ns);
4073  double cueBytes = (desc_curr.end_offset - desc_curr.start_offset) * percent;
4074  double timeToDownload = (cueBytes * 8.0) / bps;
4075 
4076  sec_downloaded += (cue_nano / nano_seconds_per_second) - timeToDownload;
4077  *sec_to_download += timeToDownload;
4078 
4079  // Check if the search ends within the first cue.
4080  if (desc_curr.end_time_ns >= end_time_ns) {
4081  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4082  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4083  sec_downloaded = percent_to_sub * sec_downloaded;
4084  *sec_to_download = percent_to_sub * *sec_to_download;
4085  }
4086 
4087  if ((sec_downloaded + *buffer) <= min_buffer) {
4088  return 1;
4089  }
4090 
4091  // Get the next Cue.
4092  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4093  }
4094 
4095  while (desc_curr.start_time_ns != -1) {
4096  int64_t desc_bytes = desc_curr.end_offset - desc_curr.start_offset;
4097  int64_t desc_ns = desc_curr.end_time_ns - desc_curr.start_time_ns;
4098  double desc_sec = desc_ns / nano_seconds_per_second;
4099  double bits = (desc_bytes * 8.0);
4100  double time_to_download = bits / bps;
4101 
4102  sec_downloaded += desc_sec - time_to_download;
4103  *sec_to_download += time_to_download;
4104 
4105  if (desc_curr.end_time_ns >= end_time_ns) {
4106  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4107  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4108  sec_downloaded = percent_to_sub * sec_downloaded;
4109  *sec_to_download = percent_to_sub * *sec_to_download;
4110 
4111  if ((sec_downloaded + *buffer) <= min_buffer)
4112  rv = 1;
4113  break;
4114  }
4115 
4116  if ((sec_downloaded + *buffer) <= min_buffer) {
4117  rv = 1;
4118  break;
4119  }
4120 
4121  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4122  }
4123  *buffer = *buffer + sec_downloaded;
4124  return rv;
4125 }
4126 
4127 /* This function computes the bandwidth of the WebM file with the help of
4128  * buffer_size_after_time_downloaded() function. Both of these functions are
4129  * adapted from WebM Tools project and are adapted to work with FFmpeg's
4130  * Matroska parsing mechanism.
4131  *
4132  * Returns the bandwidth of the file on success; -1 on error.
4133  * */
4134 static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t cues_start)
4135 {
4136  MatroskaDemuxContext *matroska = s->priv_data;
4137  AVStream *st = s->streams[0];
4138  FFStream *const sti = ffstream(st);
4139  double bandwidth = 0.0;
4140 
4141  for (int i = 0; i < sti->nb_index_entries; i++) {
4142  int64_t prebuffer_ns = 1000000000;
4143  int64_t time_ns = sti->index_entries[i].timestamp * matroska->time_scale;
4144  double nano_seconds_per_second = 1000000000.0;
4145  int64_t prebuffered_ns = time_ns + prebuffer_ns;
4146  double prebuffer_bytes = 0.0;
4147  int64_t temp_prebuffer_ns = prebuffer_ns;
4148  int64_t pre_bytes, pre_ns;
4149  double pre_sec, prebuffer, bits_per_second;
4150  CueDesc desc_beg = get_cue_desc(s, time_ns, cues_start);
4151 
4152  // Start with the first Cue.
4153  CueDesc desc_end = desc_beg;
4154 
4155  // Figure out how much data we have downloaded for the prebuffer. This will
4156  // be used later to adjust the bits per sample to try.
4157  while (desc_end.start_time_ns != -1 && desc_end.end_time_ns < prebuffered_ns) {
4158  // Prebuffered the entire Cue.
4159  prebuffer_bytes += desc_end.end_offset - desc_end.start_offset;
4160  temp_prebuffer_ns -= desc_end.end_time_ns - desc_end.start_time_ns;
4161  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4162  }
4163  if (desc_end.start_time_ns == -1) {
4164  // The prebuffer is larger than the duration.
4165  if (matroska->duration * matroska->time_scale >= prebuffered_ns)
4166  return -1;
4167  bits_per_second = 0.0;
4168  } else {
4169  // The prebuffer ends in the last Cue. Estimate how much data was
4170  // prebuffered.
4171  pre_bytes = desc_end.end_offset - desc_end.start_offset;
4172  pre_ns = desc_end.end_time_ns - desc_end.start_time_ns;
4173  if (pre_ns <= 0)
4174  return -1;
4175  pre_sec = pre_ns / nano_seconds_per_second;
4176  prebuffer_bytes +=
4177  pre_bytes * ((temp_prebuffer_ns / nano_seconds_per_second) / pre_sec);
4178 
4179  prebuffer = prebuffer_ns / nano_seconds_per_second;
4180 
4181  // Set this to 0.0 in case our prebuffer buffers the entire video.
4182  bits_per_second = 0.0;
4183  do {
4184  int64_t desc_bytes = desc_end.end_offset - desc_beg.start_offset;
4185  int64_t desc_ns = desc_end.end_time_ns - desc_beg.start_time_ns;
4186  double desc_sec, calc_bits_per_second, percent, mod_bits_per_second;
4187  if (desc_bytes <= 0)
4188  return -1;
4189 
4190  desc_sec = desc_ns / nano_seconds_per_second;
4191  calc_bits_per_second = (desc_bytes * 8) / desc_sec;
4192 
4193  // Drop the bps by the percentage of bytes buffered.
4194  percent = (desc_bytes - prebuffer_bytes) / desc_bytes;
4195  mod_bits_per_second = calc_bits_per_second * percent;
4196 
4197  if (prebuffer < desc_sec) {
4198  double search_sec =
4199  (double)(matroska->duration * matroska->time_scale) / nano_seconds_per_second;
4200 
4201  // Add 1 so the bits per second should be a little bit greater than file
4202  // datarate.
4203  int64_t bps = (int64_t)(mod_bits_per_second) + 1;
4204  const double min_buffer = 0.0;
4205  double buffer = prebuffer;
4206  double sec_to_download = 0.0;
4207 
4208  int rv = buffer_size_after_time_downloaded(prebuffered_ns, search_sec, bps,
4209  min_buffer, &buffer, &sec_to_download,
4210  s, cues_start);
4211  if (rv < 0) {
4212  return -1;
4213  } else if (rv == 0) {
4214  bits_per_second = (double)(bps);
4215  break;
4216  }
4217  }
4218 
4219  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4220  } while (desc_end.start_time_ns != -1);
4221  }
4222  if (bandwidth < bits_per_second) bandwidth = bits_per_second;
4223  }
4224  return (int64_t)bandwidth;
4225 }
4226 
4227 static int webm_dash_manifest_cues(AVFormatContext *s, int64_t init_range)
4228 {
4229  MatroskaDemuxContext *matroska = s->priv_data;
4230  EbmlList *seekhead_list = &matroska->seekhead;
4231  MatroskaSeekhead *seekhead = seekhead_list->elem;
4232  AVStream *const st = s->streams[0];
4233  FFStream *const sti = ffstream(st);
4234  AVBPrint bprint;
4235  char *buf;
4236  int64_t cues_start = -1, cues_end = -1, before_pos, bandwidth;
4237  int i;
4238  int ret;
4239 
4240  // determine cues start and end positions
4241  for (i = 0; i < seekhead_list->nb_elem; i++)
4242  if (seekhead[i].id == MATROSKA_ID_CUES)
4243  break;
4244 
4245  if (i >= seekhead_list->nb_elem) return -1;
4246 
4247  before_pos = avio_tell(matroska->ctx->pb);
4248  cues_start = seekhead[i].pos + matroska->segment_start;
4249  if (avio_seek(matroska->ctx->pb, cues_start, SEEK_SET) == cues_start) {
4250  // cues_end is computed as cues_start + cues_length + length of the
4251  // Cues element ID (i.e. 4) + EBML length of the Cues element.
4252  // cues_end is inclusive and the above sum is reduced by 1.
4253  uint64_t cues_length, cues_id;
4254  int bytes_read;
4255  bytes_read = ebml_read_num (matroska, matroska->ctx->pb, 4, &cues_id, 1);
4256  if (bytes_read < 0 || cues_id != (MATROSKA_ID_CUES & 0xfffffff))
4257  return bytes_read < 0 ? bytes_read : AVERROR_INVALIDDATA;
4258  bytes_read = ebml_read_length(matroska, matroska->ctx->pb, &cues_length);
4259  if (bytes_read < 0)
4260  return bytes_read;
4261  cues_end = cues_start + 4 + bytes_read + cues_length - 1;
4262  }
4263  avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
4264  if (cues_start == -1 || cues_end == -1) return -1;
4265 
4266  // parse the cues
4267  matroska_parse_cues(matroska);
4268 
4269  if (!sti->nb_index_entries)
4270  return AVERROR_INVALIDDATA;
4271 
4272  // cues start
4273  av_dict_set_int(&s->streams[0]->metadata, CUES_START, cues_start, 0);
4274 
4275  // cues end
4276  av_dict_set_int(&s->streams[0]->metadata, CUES_END, cues_end, 0);
4277 
4278  // if the file has cues at the start, fix up the init range so that
4279  // it does not include it
4280  if (cues_start <= init_range)
4281  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, cues_start - 1, 0);
4282 
4283  // bandwidth
4284  bandwidth = webm_dash_manifest_compute_bandwidth(s, cues_start);
4285  if (bandwidth < 0) return -1;
4286  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH, bandwidth, 0);
4287 
4288  // check if all clusters start with key frames
4289  av_dict_set_int(&s->streams[0]->metadata, CLUSTER_KEYFRAME, webm_clusters_start_with_keyframe(s), 0);
4290 
4291  // Store cue point timestamps as a comma separated list
4292  // for checking subsegment alignment in the muxer.
4294  for (int i = 0; i < sti->nb_index_entries; i++)
4295  av_bprintf(&bprint, "%" PRId64",", sti->index_entries[i].timestamp);
4296  if (!av_bprint_is_complete(&bprint)) {
4297  av_bprint_finalize(&bprint, NULL);
4298  return AVERROR(ENOMEM);
4299  }
4300  // Remove the trailing ','
4301  bprint.str[--bprint.len] = '\0';
4302  if ((ret = av_bprint_finalize(&bprint, &buf)) < 0)
4303  return ret;
4304  av_dict_set(&s->streams[0]->metadata, CUE_TIMESTAMPS,
4306 
4307  return 0;
4308 }
4309 
4310 static int webm_dash_manifest_read_header(AVFormatContext *s)
4311 {
4312  char *buf;
4313  int ret = matroska_read_header(s);
4314  int64_t init_range;
4315  MatroskaTrack *tracks;
4316  MatroskaDemuxContext *matroska = s->priv_data;
4317  if (ret) {
4318  av_log(s, AV_LOG_ERROR, "Failed to read file headers\n");
4319  return -1;
4320  }
4321  if (!matroska->tracks.nb_elem || !s->nb_streams) {
4322  av_log(s, AV_LOG_ERROR, "No track found\n");
4323  return AVERROR_INVALIDDATA;
4324  }
4325 
4326  if (!matroska->is_live) {
4327  buf = av_asprintf("%g", matroska->duration);
4328  if (!buf)
4329  return AVERROR(ENOMEM);
4330  av_dict_set(&s->streams[0]->metadata, DURATION,
4332 
4333  // initialization range
4334  // 5 is the offset of Cluster ID.
4335  init_range = avio_tell(s->pb) - 5;
4336  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, init_range, 0);
4337  }
4338 
4339  // basename of the file
4340  buf = strrchr(s->url, '/');
4341  av_dict_set(&s->streams[0]->metadata, FILENAME, buf ? ++buf : s->url, 0);
4342 
4343  // track number
4344  tracks = matroska->tracks.elem;
4345  av_dict_set_int(&s->streams[0]->metadata, TRACK_NUMBER, tracks[0].num, 0);
4346 
4347  // parse the cues and populate Cue related fields
4348  if (!matroska->is_live) {
4349  ret = webm_dash_manifest_cues(s, init_range);
4350  if (ret < 0) {
4351  av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
4352  return ret;
4353  }
4354  }
4355 
4356  // use the bandwidth from the command line if it was provided
4357  if (matroska->bandwidth > 0) {
4358  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH,
4359  matroska->bandwidth, 0);
4360  }
4361  return 0;
4362 }
4363 
4364 static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt)
4365 {
4366  return AVERROR_EOF;
4367 }
4368 
4369 #define OFFSET(x) offsetof(MatroskaDemuxContext, x)
4370 static const AVOption options[] = {
4371  { "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 },
4372  { "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 },
4373  { NULL },
4374 };
4375 
4376 static const AVClass webm_dash_class = {
4377  .class_name = "WebM DASH Manifest demuxer",
4378  .item_name = av_default_item_name,
4379  .option = options,
4380  .version = LIBAVUTIL_VERSION_INT,
4381 };
4382 
4384  .name = "webm_dash_manifest",
4385  .long_name = NULL_IF_CONFIG_SMALL("WebM DASH Manifest"),
4386  .priv_class = &webm_dash_class,
4387  .priv_data_size = sizeof(MatroskaDemuxContext),
4388  .flags_internal = FF_FMT_INIT_CLEANUP,
4389  .read_header = webm_dash_manifest_read_header,
4390  .read_packet = webm_dash_manifest_read_packet,
4392 };
4393 #endif
4394 
4396  .name = "matroska,webm",
4397  .long_name = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
4398  .extensions = "mkv,mk3d,mka,mks,webm",
4399  .priv_data_size = sizeof(MatroskaDemuxContext),
4400  .flags_internal = FF_FMT_INIT_CLEANUP,
4406  .mime_type = "audio/webm,audio/x-matroska,video/webm,video/x-matroska"
4407 };
AVCOL_PRI_RESERVED
@ AVCOL_PRI_RESERVED
Definition: pixfmt.h:473
MatroskaCluster::timecode
uint64_t timecode
Definition: matroskadec.c:352
MATROSKA_ID_ENCODINGENCRYPTION
#define MATROSKA_ID_ENCODINGENCRYPTION
Definition: matroska.h:184
MatroskaBlockAdditionMapping::type
uint64_t type
Definition: matroskadec.c:240
MatroskaDemuxContext::segment_start
int64_t segment_start
Definition: matroskadec.c:386
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:314
MATROSKA_ID_TAGTARGETS_ATTACHUID
#define MATROSKA_ID_TAGTARGETS_ATTACHUID
Definition: matroska.h:226
MatroskaDemuxContext::pkt
AVPacket * pkt
Definition: matroskadec.c:390
MATROSKA_ID_CHAPCOUNTRY
#define MATROSKA_ID_CHAPCOUNTRY
Definition: matroska.h:269
matroska_block_addition_mapping
static EbmlSyntax matroska_block_addition_mapping[5]
Definition: matroskadec.c:425
AVMasteringDisplayMetadata::has_primaries
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
Definition: mastering_display_metadata.h:62
ebml_read_master
static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length, int64_t pos)
Definition: matroskadec.c:1083
ebml_read_binary
static int ebml_read_binary(AVIOContext *pb, int length, int64_t pos, EbmlBin *bin)
Definition: matroskadec.c:1055
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:424
MATROSKA_ID_VIDEODISPLAYUNIT
#define MATROSKA_ID_VIDEODISPLAYUNIT
Definition: matroska.h:126
mkv_image_mime_tags
static const CodecMime mkv_image_mime_tags[]
Definition: matroskadec.c:790
matroska_parse_laces
static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, int size, int type, AVIOContext *pb, uint32_t lace_size[256], int *laces)
Definition: matroskadec.c:3139
MATROSKA_ID_CODECPRIVATE
#define MATROSKA_ID_CODECPRIVATE
Definition: matroska.h:89
MATROSKA_ID_TRACKNUMBER
#define MATROSKA_ID_TRACKNUMBER
Definition: matroska.h:78
MatroskaTag
Definition: matroskadec.c:309
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
#define MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
Definition: matroska.h:102
bit_depth
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
Definition: af_astats.c:226
MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
Definition: matroska.h:320
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
MATROSKA_ID_CHAPSTRING
#define MATROSKA_ID_CHAPSTRING
Definition: matroska.h:267
MATROSKA_ID_ENCODINGSIGHASHALGO
#define MATROSKA_ID_ENCODINGSIGHASHALGO
Definition: matroska.h:189
MatroskaTrack::codec_priv
EbmlBin codec_priv
Definition: matroskadec.c:250
avpriv_packet_list_put
int avpriv_packet_list_put(PacketList *packet_buffer, AVPacket *pkt, int(*copy)(AVPacket *dst, const AVPacket *src), int flags)
Append an AVPacket to the list.
Definition: avpacket.c:538
MATROSKA_ID_TAGTARGETS
#define MATROSKA_ID_TAGTARGETS
Definition: matroska.h:221
AVMasteringDisplayMetadata::max_luminance
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:57
AVSphericalProjection
AVSphericalProjection
Projection of the video surface(s) on a sphere.
Definition: spherical.h:51
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:74
EbmlSyntax::id
uint32_t id
Definition: matroskadec.c:105
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
MATROSKA_ID_CLUSTERTIMECODE
#define MATROSKA_ID_CLUSTERTIMECODE
Definition: matroska.h:236
PacketList::head
PacketListEntry * head
Definition: packet_internal.h:32
avpriv_packet_list_get
int avpriv_packet_list_get(PacketList *pkt_buffer, AVPacket *pkt)
Remove the oldest AVPacket in the list and return it.
Definition: avpacket.c:577
level
uint8_t level
Definition: svq3.c:204
matroska_attachment
static EbmlSyntax matroska_attachment[]
Definition: matroskadec.c:624
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:426
ebml_header
static EbmlSyntax ebml_header[]
Definition: matroskadec.c:430
FF_FMT_INIT_CLEANUP
#define FF_FMT_INIT_CLEANUP
For an AVInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
Definition: internal.h:49
MatroskaDemuxContext::current_id
uint32_t current_id
Definition: matroskadec.c:369
MatroskaDemuxContext::bandwidth
int bandwidth
Definition: matroskadec.c:414
MATROSKA_ID_TITLE
#define MATROSKA_ID_TITLE
Definition: matroska.h:68
r
const char * r
Definition: vf_curves.c:116
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
uid
UID uid
Definition: mxfenc.c:2198
opt.h
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:768
MatroskaBlock::additional
EbmlBin additional
Definition: matroskadec.c:346
matroska_parse_tracks
static int matroska_parse_tracks(AVFormatContext *s)
Definition: matroskadec.c:2385
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:56
AVSphericalMapping::projection
enum AVSphericalProjection projection
Projection type.
Definition: spherical.h:86
MatroskaTrack::operation
MatroskaTrackOperation operation
Definition: matroskadec.c:264
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:426
AVSphericalMapping::bound_bottom
uint32_t bound_bottom
Distance from the bottom edge.
Definition: spherical.h:170
MATROSKA_ID_CODECDECODEALL
#define MATROSKA_ID_CODECDECODEALL
Definition: matroska.h:93
ff_rm_reorder_sipr_data
void ff_rm_reorder_sipr_data(uint8_t *buf, int sub_packet_h, int framesize)
Perform 4-bit block reordering for SIPR data.
Definition: rmsipr.c:41
MATROSKA_ID_VIDEOCOLORMASTERINGMETA
#define MATROSKA_ID_VIDEOCOLORMASTERINGMETA
Definition: matroska.h:150
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:234
ebml_read_ascii
static int ebml_read_ascii(AVIOContext *pb, int size, const char *default_value, char **str)
Definition: matroskadec.c:1024
Ebml
Definition: matroskadec.c:132
EBML_BIN
@ EBML_BIN
Definition: matroskadec.c:87
MATROSKA_ID_CHAPTERFLAGENABLED
#define MATROSKA_ID_CHAPTERFLAGENABLED
Definition: matroska.h:276
MatroskaTrackPlane
Definition: matroskadec.c:228
color
Definition: vf_paletteuse.c:599
EBML_MAX_DEPTH
#define EBML_MAX_DEPTH
Definition: matroska.h:371
matroska_parse_prores
static int matroska_parse_prores(MatroskaTrack *track, uint8_t **data, int *size)
Definition: matroskadec.c:3397
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:68
AVFMT_FLAG_IGNIDX
#define AVFMT_FLAG_IGNIDX
Ignore index.
Definition: avformat.h:1320
segment_start
static int segment_start(AVFormatContext *s, int write_header)
Definition: segment.c:231
EBML_ID_EBMLMAXSIZELENGTH
#define EBML_ID_EBMLMAXSIZELENGTH
Definition: matroska.h:39
MatroskaTrack::audio
MatroskaTrackAudio audio
Definition: matroskadec.c:263
MatroskaAttachment::description
char * description
Definition: matroskadec.c:283
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:189
MatroskaTags
Definition: matroskadec.c:325
MatroskaAttachment::bin
EbmlBin bin
Definition: matroskadec.c:285
sub
static float sub(float src0, float src1)
Definition: dnn_backend_native_layer_mathbinary.c:31
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:149
MATROSKA_ID_TRACKOPERATION
#define MATROSKA_ID_TRACKOPERATION
Definition: matroska.h:83
ebml_read_num
static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb, int max_size, uint64_t *number, int eof_forbidden)
Definition: matroskadec.c:882
MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE
@ MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE
Definition: matroska.h:305
MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS
#define MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS
Definition: matroska.h:103
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
EBML_STOP
@ EBML_STOP
Definition: matroskadec.c:90
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:997
MATROSKA_ID_VIDEOPIXELWIDTH
#define MATROSKA_ID_VIDEOPIXELWIDTH
Definition: matroska.h:120
MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR
Definition: matroska.h:319
MATROSKA_ID_AUDIOSAMPLINGFREQ
#define MATROSKA_ID_AUDIOSAMPLINGFREQ
Definition: matroska.h:170
EbmlList
Definition: matroskadec.c:119
av_int2double
static av_always_inline double av_int2double(uint64_t i)
Reinterpret a 64-bit integer as a double.
Definition: intfloat.h:60
AVMasteringDisplayMetadata::display_primaries
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
Definition: mastering_display_metadata.h:42
matroska_resync
static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
Definition: matroskadec.c:835
MatroskaSeekhead::pos
uint64_t pos
Definition: matroskadec.c:332
MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR
@ MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR
Definition: matroska.h:355
MatroskaTrack::name
char * name
Definition: matroskadec.c:248
AVMasteringDisplayMetadata::has_luminance
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
Definition: mastering_display_metadata.h:67
Ebml::version
uint64_t version
Definition: matroskadec.c:133
matroska_track_combine_planes
static EbmlSyntax matroska_track_combine_planes[2]
Definition: matroskadec.c:425
Ebml::max_size
uint64_t max_size
Definition: matroskadec.c:134
MATROSKA_ID_DISCARDPADDING
#define MATROSKA_ID_DISCARDPADDING
Definition: matroska.h:251
MATROSKA_VIDEO_FIELDORDER_BB
@ MATROSKA_VIDEO_FIELDORDER_BB
Definition: matroska.h:308
matroska_cluster_parsing
static EbmlSyntax matroska_cluster_parsing[8]
Definition: matroskadec.c:428
MatroskaTrackAudio::sub_packet_cnt
int sub_packet_cnt
Definition: matroskadec.c:222
EbmlSyntax::n
const struct EbmlSyntax * n
Definition: matroskadec.c:115
MATROSKA_ID_EDITIONFLAGORDERED
#define MATROSKA_ID_EDITIONFLAGORDERED
Definition: matroska.h:273
MATROSKA_ID_DURATION
#define MATROSKA_ID_DURATION
Definition: matroska.h:67
av_asprintf
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:113
MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT
Definition: matroska.h:142
MatroskaTrackEncoding::scope
uint64_t scope
Definition: matroskadec.c:151
matroska_read_header
static int matroska_read_header(AVFormatContext *s)
Definition: matroskadec.c:2953
matroska_find_track_by_num
static MatroskaTrack * matroska_find_track_by_num(MatroskaDemuxContext *matroska, uint64_t num)
Definition: matroskadec.c:1628
MATROSKA_ID_VIDEOCOLORPRIMARIES
#define MATROSKA_ID_VIDEOCOLORPRIMARIES
Definition: matroska.h:146
matroska_chapters
static EbmlSyntax matroska_chapters[2]
Definition: matroskadec.c:426
MATROSKA_VIDEO_DISPLAYUNIT_PIXELS
@ MATROSKA_VIDEO_DISPLAYUNIT_PIXELS
Definition: matroska.h:333
av_unused
#define av_unused
Definition: attributes.h:131
MATROSKA_ID_ENCODINGSIGNATURE
#define MATROSKA_ID_ENCODINGSIGNATURE
Definition: matroska.h:191
MATROSKA_ID_SEGMENT
#define MATROSKA_ID_SEGMENT
Definition: matroska.h:53
AV_DISPOSITION_DEFAULT
#define AV_DISPOSITION_DEFAULT
The stream should be chosen by default among other streams of the same type, unless the user has expl...
Definition: avformat.h:820
CUES_START
#define CUES_START
Definition: matroska.h:383
out_size
int out_size
Definition: movenc.c:55
MATROSKA_ID_BLKADDIDTYPE
#define MATROSKA_ID_BLKADDIDTYPE
Definition: matroska.h:196
AVContentLightMetadata::MaxCLL
unsigned MaxCLL
Max content light level (cd/m^2).
Definition: mastering_display_metadata.h:102
MatroskaMasteringMeta::white_y
double white_y
Definition: matroskadec.c:165
MatroskaTagTarget::trackuid
uint64_t trackuid
Definition: matroskadec.c:320
MatroskaBlock::discard_padding
int64_t discard_padding
Definition: matroskadec.c:347
AV_CODEC_ID_RA_144
@ AV_CODEC_ID_RA_144
Definition: codec_id.h:410
MATROSKA_ID_CHAPTERS
#define MATROSKA_ID_CHAPTERS
Definition: matroska.h:63
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
MATROSKA_ID_VIDEOCOLOR_BY
#define MATROSKA_ID_VIDEOCOLOR_BY
Definition: matroska.h:156
rmsipr.h
index
fg index
Definition: ffmpeg_filter.c:167
MATROSKA_ID_BLOCKDURATION
#define MATROSKA_ID_BLOCKDURATION
Definition: matroska.h:248
w
uint8_t w
Definition: llviddspenc.c:38
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:597
MATROSKA_ID_VIDEOCOLORRANGE
#define MATROSKA_ID_VIDEOCOLORRANGE
Definition: matroska.h:143
MATROSKA_ID_BLOCK
#define MATROSKA_ID_BLOCK
Definition: matroska.h:247
MatroskaDemuxContext::unknown_count
int unknown_count
Definition: matroskadec.c:371
AVPacket::data
uint8_t * data
Definition: packet.h:373
MatroskaTag::string
char * string
Definition: matroskadec.c:311
MATROSKA_ID_TRACKDEFAULTDURATION
#define MATROSKA_ID_TRACKDEFAULTDURATION
Definition: matroska.h:109
MatroskaDemuxContext::num_levels
int num_levels
Definition: matroskadec.c:368
matroska_track_encodings
static EbmlSyntax matroska_track_encodings[2]
Definition: matroskadec.c:424
matroska_tags
static EbmlSyntax matroska_tags[2]
Definition: matroskadec.c:427
MATROSKA_ID_TAGTARGETS_TYPE
#define MATROSKA_ID_TAGTARGETS_TYPE
Definition: matroska.h:222
MatroskaTrackAudio::coded_framesize
int coded_framesize
Definition: matroskadec.c:218
MatroskaSeekhead
Definition: matroskadec.c:330
AVCodecParameters::seek_preroll
int seek_preroll
Audio only.
Definition: codec_par.h:200
AVOption
AVOption.
Definition: opt.h:247
b
#define b
Definition: input.c:40
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:497
matroska_read_seek
static int matroska_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: matroskadec.c:3867
CountedElement::u
uint64_t u
Definition: matroskadec.c:96
AV_PKT_DATA_PALETTE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
Definition: packet.h:46
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:1015
matroska_read_close
static int matroska_read_close(AVFormatContext *s)
Definition: matroskadec.c:3935
PacketList
Definition: packet_internal.h:31
spherical.h
MATROSKA_ID_ENCODINGSCOPE
#define MATROSKA_ID_ENCODINGSCOPE
Definition: matroska.h:178
data
const char data[16]
Definition: mxf.c:143
MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
@ MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
Definition: matroska.h:300
MatroskaTrack::end_timecode
int64_t end_timecode
Definition: matroskadec.c:270
AV_CODEC_ID_ALAC
@ AV_CODEC_ID_ALAC
Definition: codec_id.h:439
MATROSKA_ID_DATEUTC
#define MATROSKA_ID_DATEUTC
Definition: matroska.h:71
MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ
#define MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ
Definition: matroska.h:137
MatroskaTag::sub
EbmlList sub
Definition: matroskadec.c:314
MatroskaTrack::video
MatroskaTrackVideo video
Definition: matroskadec.c:262
AVIOContext::error
int error
contains the error code or 0 if no error happened
Definition: avio.h:240
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR
Definition: matroska.h:327
matroska.h
MatroskaTrackEncoding
Definition: matroskadec.c:150
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
MATROSKA_ID_VIDEOPIXELCROPT
#define MATROSKA_ID_VIDEOPIXELCROPT
Definition: matroska.h:123
aac_profiles
static const AVProfile aac_profiles[]
Definition: audiotoolboxenc.c:588
matroska_parse_block
static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf, uint8_t *data, int size, int64_t pos, uint64_t cluster_time, uint64_t block_duration, int is_keyframe, uint8_t *additional, uint64_t additional_id, int additional_size, int64_t cluster_pos, int64_t discard_padding)
Definition: matroskadec.c:3641
MATROSKA_ID_VIDEOPIXELCROPB
#define MATROSKA_ID_VIDEOPIXELCROPB
Definition: matroska.h:122
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:391
MATROSKA_ID_VIDEOCOLORCBSUBVERT
#define MATROSKA_ID_VIDEOCOLORCBSUBVERT
Definition: matroska.h:140
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:64
AV_SPHERICAL_EQUIRECTANGULAR_TILE
@ AV_SPHERICAL_EQUIRECTANGULAR_TILE
Video represents a portion of a sphere mapped on a flat surface using equirectangular projection.
Definition: spherical.h:72
MatroskaTrackVideoColor
Definition: matroskadec.c:170
mkv_parse_video_projection
static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, void *logctx)
Definition: matroskadec.c:2228
mathematics.h
MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
@ MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
Definition: matroska.h:341
MATROSKA_ID_CUES
#define MATROSKA_ID_CUES
Definition: matroska.h:58
AVDictionary
Definition: dict.c:30
AV_CODEC_ID_FLAC
@ AV_CODEC_ID_FLAC
Definition: codec_id.h:435
MatroskaTrackEncoding::type
uint64_t type
Definition: matroskadec.c:152
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:450
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
matroska_blockadditions
static EbmlSyntax matroska_blockadditions[2]
Definition: matroskadec.c:428
MATROSKA_ID_CUETIME
#define MATROSKA_ID_CUETIME
Definition: matroska.h:203
MatroskaTrackVideoProjection
Definition: matroskadec.c:187
AV_PKT_DATA_SPHERICAL
@ AV_PKT_DATA_SPHERICAL
This side data should be associated with a video stream and corresponds to the AVSphericalMapping str...
Definition: packet.h:228
MatroskaMasteringMeta::b_y
double b_y
Definition: matroskadec.c:163
matroska_read_packet
static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: matroskadec.c:3847
MATROSKA_ID_CUERELATIVEPOSITION
#define MATROSKA_ID_CUERELATIVEPOSITION
Definition: matroska.h:209
AV_SPHERICAL_EQUIRECTANGULAR
@ AV_SPHERICAL_EQUIRECTANGULAR
Video represents a sphere mapped on a flat surface using equirectangular projection.
Definition: spherical.h:56
intfloat.h
MatroskaDemuxContext::title
char * title
Definition: matroskadec.c:375
MatroskaTrackVideoColor::primaries
uint64_t primaries
Definition: matroskadec.c:181
MATROSKA_ID_CHAPLANG
#define MATROSKA_ID_CHAPLANG
Definition: matroska.h:268
MatroskaTrackVideoProjection::yaw
double yaw
Definition: matroskadec.c:190
ebml_parse
static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
Definition: matroskadec.c:1227
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:467
MATROSKA_ID_CUEDURATION
#define MATROSKA_ID_CUEDURATION
Definition: matroska.h:210
FFIOContext
Definition: avio_internal.h:29
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:428
MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
Definition: matroska.h:321
MatroskaTrack::stream
AVStream * stream
Definition: matroskadec.c:269
AVIndexEntry
Definition: avformat.h:801
AV_WB64
#define AV_WB64(p, v)
Definition: intreadwrite.h:433
MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL
#define MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL
Definition: matroska.h:136
matroska_segment
static EbmlSyntax matroska_segment[9]
Definition: matroskadec.c:423
AV_CODEC_ID_BIN_DATA
@ AV_CODEC_ID_BIN_DATA
Definition: codec_id.h:562
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
matroska_metadata_creation_time
static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
Definition: matroskadec.c:2031
MatroskaBlock::duration
uint64_t duration
Definition: matroskadec.c:341
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:809
MatroskaDemuxContext
Definition: matroskadec.c:362
MatroskaTrackVideo::alpha_mode
uint64_t alpha_mode
Definition: matroskadec.c:206
MatroskaTrackVideo::display_unit
uint64_t display_unit
Definition: matroskadec.c:202
MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN
@ MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN
Definition: matroska.h:337
AVContentLightMetadata
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
Definition: mastering_display_metadata.h:98
MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX
Definition: matroska.h:159
update_pos
#define update_pos(td, mb_y, mb_x)
Definition: vp8.c:2362
MatroskaTrack::flag_default
uint64_t flag_default
Definition: matroskadec.c:254
matroska_track_encoding_compression
static EbmlSyntax matroska_track_encoding_compression[]
Definition: matroskadec.c:529
AVCodecParameters::color_primaries
enum AVColorPrimaries color_primaries
Definition: codec_par.h:147
MATROSKA_ID_VIDEOCOLOR_WHITEY
#define MATROSKA_ID_VIDEOCOLOR_WHITEY
Definition: matroska.h:158
MatroskaTrack::block_addition_mappings
EbmlList block_addition_mappings
Definition: matroskadec.c:274
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:459
CodecMime
Definition: internal.h:56
return
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a it should return
Definition: filter_design.txt:264
EbmlSyntax::def
union EbmlSyntax::@264 def
AVCOL_SPC_RESERVED
@ AVCOL_SPC_RESERVED
reserved for future use by ITU-T and ISO/IEC just like 15-255 are
Definition: pixfmt.h:527
ebml_read_sint
static int ebml_read_sint(AVIOContext *pb, int size, int64_t default_value, int64_t *num)
Definition: matroskadec.c:981
ebml_syntax
static EbmlSyntax ebml_syntax[3]
Definition: matroskadec.c:423
AVCodecParameters::channels
int channels
Audio only.
Definition: codec_par.h:166
MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
#define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
Definition: matroska.h:171
AV_FIELD_TT
@ AV_FIELD_TT
Definition: codec_par.h:39
mpeg4audio.h
MATROSKA_ID_VIDEOPROJECTIONPRIVATE
#define MATROSKA_ID_VIDEOPROJECTIONPRIVATE
Definition: matroska.h:164
MatroskaTrack::ms_compat
int ms_compat
Definition: matroskadec.c:271
MatroskaTag::def
uint64_t def
Definition: matroskadec.c:313
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:432
MatroskaTrackPlane::uid
uint64_t uid
Definition: matroskadec.c:229
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:315
U
#define U(x)
Definition: vp56_arith.h:37
MatroskaDemuxContext::current_cluster
MatroskaCluster current_cluster
Definition: matroskadec.c:408
MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
@ MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
Definition: matroska.h:314
MATROSKA_ID_ENCODINGSIGALGO
#define MATROSKA_ID_ENCODINGSIGALGO
Definition: matroska.h:188
MATROSKA_ID_VIDEOASPECTRATIO
#define MATROSKA_ID_VIDEOASPECTRATIO
Definition: matroska.h:131
fail
#define fail()
Definition: checkasm.h:127
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2277
av_int2float
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
Definition: intfloat.h:40
MatroskaMasteringMeta
Definition: matroskadec.c:157
MatroskaDemuxContext::level1_elems
MatroskaLevel1Element level1_elems[64]
Definition: matroskadec.c:405
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:149
MATROSKA_ID_CHAPTERDISPLAY
#define MATROSKA_ID_CHAPTERDISPLAY
Definition: matroska.h:266
inflate
static void inflate(uint8_t *dst, const uint8_t *p1, int width, int threshold, const uint8_t *coordinates[], int coord, int maxc)
Definition: vf_neighbor.c:193
av_add_index_entry
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition: seek.c:117
MATROSKA_ID_TRACKUID
#define MATROSKA_ID_TRACKUID
Definition: matroska.h:79
MATROSKA_ID_ENCODINGSIGKEYID
#define MATROSKA_ID_ENCODINGSIGKEYID
Definition: matroska.h:190
EBML_ID_DOCTYPEVERSION
#define EBML_ID_DOCTYPEVERSION
Definition: matroska.h:41
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:141
MATROSKA_COLOUR_CHROMASITINGVERT_NB
@ MATROSKA_COLOUR_CHROMASITINGVERT_NB
Definition: matroska.h:351
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:504
MatroskaCluster::pos
int64_t pos
Definition: matroskadec.c:353
MatroskaTrack
Definition: matroskadec.c:244
EbmlBin::buf
AVBufferRef * buf
Definition: matroskadec.c:127
ff_matroska_video_stereo_mode
const char *const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB]
Definition: matroska.c:128
AVChapter
Definition: avformat.h:1159
MatroskaBlock
Definition: matroskadec.c:340
matroska_probe
static int matroska_probe(const AVProbeData *p)
Definition: matroskadec.c:1581
AV_DISPOSITION_FORCED
#define AV_DISPOSITION_FORCED
Track should be used during playback by default.
Definition: avformat.h:853
MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL
Definition: matroska.h:318
matroska_segments
static EbmlSyntax matroska_segments[]
Definition: matroskadec.c:744
matroska_doctypes
static const char *const matroska_doctypes[]
Definition: matroskadec.c:809
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
MatroskaTag::lang
char * lang
Definition: matroskadec.c:312
MATROSKA_ID_VIDEOALPHAMODE
#define MATROSKA_ID_VIDEOALPHAMODE
Definition: matroska.h:130
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:424
mkv_parse_video_color
static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track)
Definition: matroskadec.c:2144
EBML_ID_DOCTYPE
#define EBML_ID_DOCTYPE
Definition: matroska.h:40
AV_FIELD_TB
@ AV_FIELD_TB
Definition: codec_par.h:41
MatroskaTrackVideoColor::mastering_meta
MatroskaMasteringMeta mastering_meta
Definition: matroskadec.c:184
MatroskaTrackOperation
Definition: matroskadec.c:233
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
EbmlList::elem
void * elem
Definition: matroskadec.c:122
MATROSKA_ID_VIDEOCOLOR_WHITEX
#define MATROSKA_ID_VIDEOCOLOR_WHITEX
Definition: matroska.h:157
AVRational::num
int num
Numerator.
Definition: rational.h:59
EbmlSyntax::type
uint8_t type
Definition: matroskadec.c:106
MatroskaSeekhead::id
uint64_t id
Definition: matroskadec.c:331
MATROSKA_TRACK_TYPE_METADATA
@ MATROSKA_TRACK_TYPE_METADATA
Definition: matroska.h:288
AV_CODEC_ID_ATRAC3
@ AV_CODEC_ID_ATRAC3
Definition: codec_id.h:454
matroska_tag
static EbmlSyntax matroska_tag[3]
Definition: matroskadec.c:427
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:72
MatroskaTrackOperation::combine_planes
EbmlList combine_planes
Definition: matroskadec.c:234
MATROSKA_VIDEO_FIELDORDER_TT
@ MATROSKA_VIDEO_FIELDORDER_TT
Definition: matroska.h:306
MatroskaDemuxContext::skip_to_keyframe
int skip_to_keyframe
Definition: matroskadec.c:398
MatroskaDemuxContext::levels
MatroskaLevel levels[EBML_MAX_DEPTH]
Definition: matroskadec.c:367
AV_CODEC_ID_SIPR
@ AV_CODEC_ID_SIPR
Definition: codec_id.h:464
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:148
CountedElement::f
double f
Definition: matroskadec.c:98
MATROSKA_ID_BLKADDIDNAME
#define MATROSKA_ID_BLKADDIDNAME
Definition: matroska.h:195
AV_CODEC_ID_PCM_S8
@ AV_CODEC_ID_PCM_S8
Definition: codec_id.h:318
description
Tag description
Definition: snow.txt:206
MATROSKA_ID_BLOCKADDITIONAL
#define MATROSKA_ID_BLOCKADDITIONAL
Definition: matroska.h:243
SKIP_THRESHOLD
#define SKIP_THRESHOLD
Definition: matroskadec.c:77
ebml_parse_nest
static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
Definition: matroskadec.c:1137
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:790
AV_PKT_DATA_WEBVTT_SETTINGS
@ AV_PKT_DATA_WEBVTT_SETTINGS
The optional settings (rendering instructions) that immediately follow the timestamp specifier of a W...
Definition: packet.h:202
pkt
AVPacket * pkt
Definition: movenc.c:59
matroska_parse_seekhead_entry
static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int64_t pos)
Definition: matroskadec.c:1882
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
MatroskaTrackAudio::buf_timecode
uint64_t buf_timecode
Definition: matroskadec.c:224
MATROSKA_ID_TRACKCONTENTENCODING
#define MATROSKA_ID_TRACKCONTENTENCODING
Definition: matroska.h:111
AVInputFormat
Definition: avformat.h:650
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
MatroskaTrackVideoColor::bits_per_channel
uint64_t bits_per_channel
Definition: matroskadec.c:172
EBML_ID_VOID
#define EBML_ID_VOID
Definition: matroska.h:45
MATROSKA_ID_TAGDEFAULT_BUG
#define MATROSKA_ID_TAGDEFAULT_BUG
Definition: matroska.h:220
MATROSKA_ID_CODECDOWNLOADURL
#define MATROSKA_ID_CODECDOWNLOADURL
Definition: matroska.h:92
MATROSKA_ID_VIDEOFIELDORDER
#define MATROSKA_ID_VIDEOFIELDORDER
Definition: matroska.h:128
AVCodecTag
Definition: internal.h:51
matroska_info
static EbmlSyntax matroska_info[]
Definition: matroskadec.c:447
MATROSKA_ID_VIDEOPIXELCROPR
#define MATROSKA_ID_VIDEOPIXELCROPR
Definition: matroska.h:125
MATROSKA_COLOUR_CHROMASITINGHORZ_NB
@ MATROSKA_COLOUR_CHROMASITINGHORZ_NB
Definition: matroska.h:344
MATROSKA_ID_TAGS
#define MATROSKA_ID_TAGS
Definition: matroska.h:59
AV_CODEC_ID_TTA
@ AV_CODEC_ID_TTA
Definition: codec_id.h:445
matroska_index_entry
static EbmlSyntax matroska_index_entry[3]
Definition: matroskadec.c:427
AV_CODEC_ID_TTF
@ AV_CODEC_ID_TTF
Definition: codec_id.h:551
MatroskaDemuxContext::muxingapp
char * muxingapp
Definition: matroskadec.c:376
AVCOL_PRI_RESERVED0
@ AVCOL_PRI_RESERVED0
Definition: pixfmt.h:470
duration
int64_t duration
Definition: movenc.c:64
EBML_ID_EBMLMAXIDLENGTH
#define EBML_ID_EBMLMAXIDLENGTH
Definition: matroska.h:38
mask
static const uint16_t mask[17]
Definition: lzw.c:38
AVCodecParameters::frame_size
int frame_size
Audio only.
Definition: codec_par.h:181
MatroskaTrackVideoColor::max_cll
uint64_t max_cll
Definition: matroskadec.c:182
matroska_parse_cluster
static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:3791
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:40
EbmlSyntax::list_elem_size
size_t list_elem_size
Definition: matroskadec.c:108
ebml_read_float
static int ebml_read_float(AVIOContext *pb, int size, double default_value, double *num)
Definition: matroskadec.c:1004
av_fast_realloc
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
Definition: mem.c:504
matroska_find_level1_elem
static MatroskaLevel1Element * matroska_find_level1_elem(MatroskaDemuxContext *matroska, uint32_t id, int64_t pos)
Definition: matroskadec.c:1193
MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED
@ MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED
Definition: matroska.h:348
AVMasteringDisplayMetadata::white_point
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
Definition: mastering_display_metadata.h:47
intreadwrite.h
MATROSKA_ID_FILEUID
#define MATROSKA_ID_FILEUID
Definition: matroska.h:259
MatroskaMasteringMeta::b_x
double b_x
Definition: matroskadec.c:162
s
#define s(width, name)
Definition: cbs_vp9.c:257
MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE
@ MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE
Definition: matroska.h:301
Ebml::id_length
uint64_t id_length
Definition: matroskadec.c:135
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:99
MatroskaTag::name
char * name
Definition: matroskadec.c:310
MatroskaLevel1Element::pos
int64_t pos
Definition: matroskadec.c:357
MatroskaDemuxContext::num_level1_elems
int num_level1_elems
Definition: matroskadec.c:406
MatroskaTagTarget::attachuid
uint64_t attachuid
Definition: matroskadec.c:322
CodecTags::str
char str[22]
Definition: matroska.h:366
MatroskaTrackVideo::field_order
uint64_t field_order
Definition: matroskadec.c:204
MATROSKA_ID_VIDEODISPLAYWIDTH
#define MATROSKA_ID_VIDEODISPLAYWIDTH
Definition: matroska.h:118
AV_PKT_DATA_MASTERING_DISPLAY_METADATA
@ AV_PKT_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata (based on SMPTE-2086:2014).
Definition: packet.h:222
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1318
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:655
MATROSKA_VIDEO_FIELDORDER_BT
@ MATROSKA_VIDEO_FIELDORDER_BT
Definition: matroska.h:310
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:449
MatroskaDemuxContext::duration
double duration
Definition: matroskadec.c:374
MatroskaTrackVideo::pixel_width
uint64_t pixel_width
Definition: matroskadec.c:199
AVSphericalMapping::bound_top
uint32_t bound_top
Distance from the top edge.
Definition: spherical.h:168
MATROSKA_ID_TAGNAME
#define MATROSKA_ID_TAGNAME
Definition: matroska.h:216
MatroskaChapter
Definition: matroskadec.c:290
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:218
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:126
EbmlBin::size
int size
Definition: matroskadec.c:126
MATROSKA_ID_TAG
#define MATROSKA_ID_TAG
Definition: matroska.h:214
MatroskaTrackAudio::sub_packet_size
int sub_packet_size
Definition: matroskadec.c:221
TRACK_NUMBER
#define TRACK_NUMBER
Definition: matroska.h:390
MATROSKA_ID_TIMECODESCALE
#define MATROSKA_ID_TIMECODESCALE
Definition: matroska.h:66
matroska_cluster_enter
static EbmlSyntax matroska_cluster_enter[]
Definition: matroskadec.c:784
MATROSKA_ID_CLUSTERPOSITION
#define MATROSKA_ID_CLUSTERPOSITION
Definition: matroska.h:237
bits
uint8_t bits
Definition: vp3data.h:141
matroska_parse_frame
static int matroska_parse_frame(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, AVBufferRef *buf, uint8_t *data, int pkt_size, uint64_t timecode, uint64_t lace_duration, int64_t pos, int is_keyframe, uint8_t *additional, uint64_t additional_id, int additional_size, int64_t discard_padding)
Definition: matroskadec.c:3533
AVIndexEntry::timestamp
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
Definition: avformat.h:803
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
MATROSKA_ID_CUETRACKPOSITION
#define MATROSKA_ID_CUETRACKPOSITION
Definition: matroska.h:204
MATROSKA_ID_SEEKENTRY
#define MATROSKA_ID_SEEKENTRY
Definition: matroska.h:229
matroska_decode_buffer
static int matroska_decode_buffer(uint8_t **buf, int *buf_size, MatroskaTrack *track)
Definition: matroskadec.c:1642
MatroskaDemuxContext::attachments
EbmlList attachments
Definition: matroskadec.c:379
AV_FIELD_UNKNOWN
@ AV_FIELD_UNKNOWN
Definition: codec_par.h:37
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
MATROSKA_ID_TRACKTYPE
#define MATROSKA_ID_TRACKTYPE
Definition: matroska.h:80
CLUSTER_KEYFRAME
#define CLUSTER_KEYFRAME
Definition: matroska.h:388
FFFormatContext::data_offset
int64_t data_offset
offset of the first packet
Definition: internal.h:99
MatroskaTrack::encodings
EbmlList encodings
Definition: matroskadec.c:265
MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR
Definition: matroska.h:323
MATROSKA_ID_SEGMENTUID
#define MATROSKA_ID_SEGMENTUID
Definition: matroska.h:72
channels
channels
Definition: aptx.h:33
EbmlType
EbmlType
Definition: matroskadec.c:80
matroska_track
static EbmlSyntax matroska_track[33]
Definition: matroskadec.c:424
MATROSKA_ID_TRACKBLKADDMAPPING
#define MATROSKA_ID_TRACKBLKADDMAPPING
Definition: matroska.h:114
AV_RL16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
Definition: bytestream.h:94
MatroskaTrackVideo::interlaced
uint64_t interlaced
Definition: matroskadec.c:203
matroska_track_video_projection
static EbmlSyntax matroska_track_video_projection[]
Definition: matroskadec.c:490
MatroskaTrackAudio::sub_packet_h
int sub_packet_h
Definition: matroskadec.c:219
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:141
MATROSKA_ID_INFO
#define MATROSKA_ID_INFO
Definition: matroska.h:56
Ebml::doctype_version
uint64_t doctype_version
Definition: matroskadec.c:137
MatroskaTrackEncryption::algo
uint64_t algo
Definition: matroskadec.c:146
MatroskaTrackVideo::color
EbmlList color
Definition: matroskadec.c:207
MATROSKA_ID_AUDIOCHANNELS
#define MATROSKA_ID_AUDIOCHANNELS
Definition: matroska.h:174
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:369
MATROSKA_ID_BLKADDIDVALUE
#define MATROSKA_ID_BLKADDIDVALUE
Definition: matroska.h:194
MatroskaTrackVideoColor::chroma_siting_vert
uint64_t chroma_siting_vert
Definition: matroskadec.c:178
key
const char * key
Definition: hwcontext_opencl.c:168
MatroskaAttachment::stream
AVStream * stream
Definition: matroskadec.c:287
MatroskaTagTarget::type
char * type
Definition: matroskadec.c:318
MatroskaDemuxContext::seekhead
EbmlList seekhead
Definition: matroskadec.c:383
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:472
AV_FIELD_BT
@ AV_FIELD_BT
Definition: codec_par.h:42
av_content_light_metadata_alloc
AVContentLightMetadata * av_content_light_metadata_alloc(size_t *size)
Allocate an AVContentLightMetadata structure and set its fields to default values.
Definition: mastering_display_metadata.c:45
MATROSKA_ID_VIDEOSTEREOMODE
#define MATROSKA_ID_VIDEOSTEREOMODE
Definition: matroska.h:129
MatroskaDemuxContext::queue
PacketList queue
Definition: matroskadec.c:393
MatroskaTrack::type
uint64_t type
Definition: matroskadec.c:247
matroska_clear_queue
static void matroska_clear_queue(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:3134
planes
static const struct @321 planes[]
MATROSKA_ID_VIDEOCOLORSPACE
#define MATROSKA_ID_VIDEOCOLORSPACE
Definition: matroska.h:132
AV_CODEC_ID_PNG
@ AV_CODEC_ID_PNG
Definition: codec_id.h:111
time_internal.h
if
if(ret)
Definition: filter_design.txt:179
MATROSKA_ID_TRACKNAME
#define MATROSKA_ID_TRACKNAME
Definition: matroska.h:96
FFFormatContext
Definition: internal.h:73
MatroskaTrackCompression::algo
uint64_t algo
Definition: matroskadec.c:141
FFStream::need_parsing
enum AVStreamParseType need_parsing
Definition: internal.h:405
AV_CODEC_ID_WEBVTT
@ AV_CODEC_ID_WEBVTT
Definition: codec_id.h:540
matroska_convert_tag
static void matroska_convert_tag(AVFormatContext *s, EbmlList *list, AVDictionary **metadata, char *prefix)
Definition: matroskadec.c:1782
EBML_ID_DOCTYPEREADVERSION
#define EBML_ID_DOCTYPEREADVERSION
Definition: matroska.h:42
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:54
AVFormatContext
Format I/O context.
Definition: avformat.h:1200
avpriv_update_cur_dts
void avpriv_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
Update cur_dts of all streams based on the given timestamp and AVStream.
Definition: seek.c:32
MATROSKA_ID_CODECSTATE
#define MATROSKA_ID_CODECSTATE
Definition: matroska.h:250
internal.h
MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
#define MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
Definition: matroska.h:101
AVCOL_TRC_RESERVED0
@ AVCOL_TRC_RESERVED0
Definition: pixfmt.h:495
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:356
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1095
MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
@ MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
Definition: matroska.h:317
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
MatroskaAttachment::filename
char * filename
Definition: matroskadec.c:282
MATROSKA_ID_ENCODINGENCALGO
#define MATROSKA_ID_ENCODINGENCALGO
Definition: matroska.h:186
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:527
MATROSKA_ID_BLOCKGROUP
#define MATROSKA_ID_BLOCKGROUP
Definition: matroska.h:239
MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN
Definition: matroska.h:160
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:965
NULL
#define NULL
Definition: coverity.c:32
MATROSKA_ID_ATTACHMENTS
#define MATROSKA_ID_ATTACHMENTS
Definition: matroska.h:61
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
MATROSKA_ID_CHAPTERATOM
#define MATROSKA_ID_CHAPTERATOM
Definition: matroska.h:263
ebml_parse_id
static EbmlSyntax * ebml_parse_id(EbmlSyntax *syntax, uint32_t id)
Definition: matroskadec.c:1124
MATROSKA_ID_TRACKCONTENTENCODINGS
#define MATROSKA_ID_TRACKCONTENTENCODINGS
Definition: matroska.h:110
av_realloc
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
Definition: mem.c:152
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
read_probe
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
MatroskaDemuxContext::index
EbmlList index
Definition: matroskadec.c:381
matroska_parse_cues
static void matroska_parse_cues(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:1991
MATROSKA_TRACK_TYPE_AUDIO
@ MATROSKA_TRACK_TYPE_AUDIO
Definition: matroska.h:282
ff_matroska_demuxer
const AVInputFormat ff_matroska_demuxer
Definition: matroskadec.c:4389
MATROSKA_ID_EDITIONUID
#define MATROSKA_ID_EDITIONUID
Definition: matroska.h:270
isom.h
MATROSKA_ID_TRACKFLAGORIGINAL
#define MATROSKA_ID_TRACKFLAGORIGINAL
Definition: matroska.h:104
matroska_reset_status
static int matroska_reset_status(MatroskaDemuxContext *matroska, uint32_t id, int64_t position)
Definition: matroskadec.c:814
matroska_execute_seekhead
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:1920
MatroskaTrackVideo::pixel_height
uint64_t pixel_height
Definition: matroskadec.c:200
matroska_ebmlnum_sint
static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska, AVIOContext *pb, int64_t *num)
Definition: matroskadec.c:1105
MATROSKA_ID_ENCODINGORDER
#define MATROSKA_ID_ENCODINGORDER
Definition: matroska.h:177
flac_parse_block_header
static av_always_inline void flac_parse_block_header(const uint8_t *block_header, int *last, int *type, int *size)
Parse the metadata block parameters from the header.
Definition: flac.h:145
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
matroska_parse_webvtt
static int matroska_parse_webvtt(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, uint8_t *data, int data_len, uint64_t timecode, uint64_t duration, int64_t pos)
Definition: matroskadec.c:3418
MATROSKA_ID_WRITINGAPP
#define MATROSKA_ID_WRITINGAPP
Definition: matroska.h:69
isnan
#define isnan(x)
Definition: libm.h:340
AV_DISPOSITION_COMMENT
#define AV_DISPOSITION_COMMENT
The stream is a commentary track.
Definition: avformat.h:838
av_stream_add_side_data
int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as stream side data.
Definition: utils.c:1737
MATROSKA_ID_VIDEOCOLOR_GY
#define MATROSKA_ID_VIDEOCOLOR_GY
Definition: matroska.h:154
AVPALETTE_SIZE
#define AVPALETTE_SIZE
Definition: pixfmt.h:32
matroska_track_operation
static EbmlSyntax matroska_track_operation[2]
Definition: matroskadec.c:425
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP
@ MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP
Definition: matroska.h:316
MatroskaBlockAdditionMapping::extradata
EbmlBin extradata
Definition: matroskadec.c:241
MatroskaTrackVideo
Definition: matroskadec.c:195
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:937
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1242
src
#define src
Definition: vp8dsp.c:255
MatroskaTrackVideoColor::cb_sub_horz
uint64_t cb_sub_horz
Definition: matroskadec.c:175
MATROSKA_ID_SIMPLETAG
#define MATROSKA_ID_SIMPLETAG
Definition: matroska.h:215
MATROSKA_ID_TRACKPLANEUID
#define MATROSKA_ID_TRACKPLANEUID
Definition: matroska.h:86
FFStream::nb_index_entries
int nb_index_entries
Definition: internal.h:279
MATROSKA_ID_VIDEOPROJECTION
#define MATROSKA_ID_VIDEOPROJECTION
Definition: matroska.h:162
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:447
list
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
Definition: filter_design.txt:25
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:1006
MATROSKA_ID_SEEKID
#define MATROSKA_ID_SEEKID
Definition: matroska.h:232
FLAC_STREAMINFO_SIZE
#define FLAC_STREAMINFO_SIZE
Definition: flac.h:34
AV_DISPOSITION_METADATA
#define AV_DISPOSITION_METADATA
The subtitle stream contains time-aligned metadata that is not intended to be directly presented to t...
Definition: avformat.h:895
MatroskaTrackAudio::buf
uint8_t * buf
Definition: matroskadec.c:225
CountedElement::el
union CountedElement::@263 el
MatroskaTrack::codec_delay
uint64_t codec_delay
Definition: matroskadec.c:266
LEVEL_ENDED
#define LEVEL_ENDED
Definition: matroskadec.c:76
MATROSKA_ID_CHAPTERTIMESTART
#define MATROSKA_ID_CHAPTERTIMESTART
Definition: matroska.h:264
MatroskaTagTarget::typevalue
uint64_t typevalue
Definition: matroskadec.c:319
ff_matroska_video_stereo_plane
const char *const ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT]
Definition: matroska.c:146
ff_codec_movvideo_tags
const AVCodecTag ff_codec_movvideo_tags[]
Definition: isom_tags.c:29
MatroskaMasteringMeta::min_luminance
CountedElement min_luminance
Definition: matroskadec.c:167
MATROSKA_ID_CUEBLOCKNUMBER
#define MATROSKA_ID_CUEBLOCKNUMBER
Definition: matroska.h:211
AV_DISPOSITION_ORIGINAL
#define AV_DISPOSITION_ORIGINAL
The stream is in original language.
Definition: avformat.h:834
MatroskaLevel1Element::parsed
int parsed
Definition: matroskadec.c:359
MatroskaTrack::flag_hearingimpaired
uint64_t flag_hearingimpaired
Definition: matroskadec.c:257
MATROSKA_TRACK_TYPE_VIDEO
@ MATROSKA_TRACK_TYPE_VIDEO
Definition: matroska.h:281
CountedElement::s
char * s
Definition: matroskadec.c:99
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: avcodec.h:1335
MATROSKA_ID_FILEMIMETYPE
#define MATROSKA_ID_FILEMIMETYPE
Definition: matroska.h:257
MATROSKA_ID_VIDEODISPLAYHEIGHT
#define MATROSKA_ID_VIDEODISPLAYHEIGHT
Definition: matroska.h:119
base64.h
MatroskaTrackPlane::type
uint64_t type
Definition: matroskadec.c:230
MatroskaLevel1Element
Definition: matroskadec.c:356
MATROSKA_ID_TRACKAUDIO
#define MATROSKA_ID_TRACKAUDIO
Definition: matroska.h:82
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:563
matroska_index_pos
static EbmlSyntax matroska_index_pos[]
Definition: matroskadec.c:671
CUES_END
#define CUES_END
Definition: matroska.h:384
ff_codec_movaudio_tags
const AVCodecTag ff_codec_movaudio_tags[]
Definition: isom_tags.c:278
MatroskaTrackEncoding::compression
MatroskaTrackCompression compression
Definition: matroskadec.c:153
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AVPALETTE_COUNT
#define AVPALETTE_COUNT
Definition: pixfmt.h:33
AVPROBE_SCORE_EXTENSION
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition: avformat.h:457
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:170
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
ff_log2_tab
const uint8_t ff_log2_tab[256]
Definition: log2_tab.c:23
av_bprint_is_complete
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition: bprint.h:185
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:47
MatroskaChapter::start
uint64_t start
Definition: matroskadec.c:291
EBML_STR
@ EBML_STR
Definition: matroskadec.c:85
MATROSKA_ID_VIDEOCOLORMAXCLL
#define MATROSKA_ID_VIDEOCOLORMAXCLL
Definition: matroska.h:147
MATROSKA_ID_TRACKENTRY
#define MATROSKA_ID_TRACKENTRY
Definition: matroska.h:75
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:78
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:419
matroska_track_encoding_encryption
static EbmlSyntax matroska_track_encoding_encryption[]
Definition: matroskadec.c:535
EBML_FLOAT
@ EBML_FLOAT
Definition: matroskadec.c:84
MatroskaTrack::default_duration
uint64_t default_duration
Definition: matroskadec.c:253
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:425
ebml_read_uint
static int ebml_read_uint(AVIOContext *pb, int size, uint64_t default_value, uint64_t *num)
Definition: matroskadec.c:960
MATROSKA_ID_TAGDEFAULT
#define MATROSKA_ID_TAGDEFAULT
Definition: matroska.h:219
MatroskaTrackVideoProjection::type
uint64_t type
Definition: matroskadec.c:188
MATROSKA_TRACK_ENCODING_COMP_BZLIB
@ MATROSKA_TRACK_ENCODING_COMP_BZLIB
Definition: matroska.h:293
options
const OptionDef options[]
AV_DISPOSITION_CAPTIONS
#define AV_DISPOSITION_CAPTIONS
The subtitle stream contains captions, providing a transcription and possibly a translation of audio.
Definition: avformat.h:884
MATROSKA_ID_AUDIOBITDEPTH
#define MATROSKA_ID_AUDIOBITDEPTH
Definition: matroska.h:173
MatroskaDemuxContext::tracks
EbmlList tracks
Definition: matroskadec.c:378
MatroskaTrackVideoColor::cb_sub_vert
uint64_t cb_sub_vert
Definition: matroskadec.c:176
MatroskaTrack::flag_visualimpaired
uint64_t flag_visualimpaired
Definition: matroskadec.c:258
MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
@ MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
Definition: matroska.h:315
MATROSKA_ID_TRACKFLAGDEFAULT
#define MATROSKA_ID_TRACKFLAGDEFAULT
Definition: matroska.h:99
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
AV_CODEC_ID_PCM_S24LE
@ AV_CODEC_ID_PCM_S24LE
Definition: codec_id.h:326
MatroskaCluster::block
MatroskaBlock block
Definition: matroskadec.c:351
av_lzo1x_decode
int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen)
Decodes LZO 1x compressed data.
Definition: lzo.c:134
AV_SPHERICAL_CUBEMAP
@ AV_SPHERICAL_CUBEMAP
Video frame is split into 6 faces of a cube, and arranged on a 3x2 layout.
Definition: spherical.h:65
MATROSKA_ID_ENCODINGCOMPALGO
#define MATROSKA_ID_ENCODINGCOMPALGO
Definition: matroska.h:181
AV_CODEC_ID_OTF
@ AV_CODEC_ID_OTF
Definition: codec_id.h:558
MATROSKA_ID_TRACKFLAGCOMMENTARY
#define MATROSKA_ID_TRACKFLAGCOMMENTARY
Definition: matroska.h:105
MatroskaTrack::flag_textdescriptions
uint64_t flag_textdescriptions
Definition: matroskadec.c:259
MatroskaDemuxContext::is_live
int is_live
Definition: matroskadec.c:411
EbmlSyntax
Definition: matroskadec.c:104
MATROSKA_ID_TRACKFLAGLACING
#define MATROSKA_ID_TRACKFLAGLACING
Definition: matroska.h:106
AVPacket::size
int size
Definition: packet.h:374
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
id
enum AVCodecID id
Definition: extract_extradata_bsf.c:325
FFFormatContext::parse_pkt
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition: internal.h:125
MatroskaTrackVideoColor::matrix_coefficients
uint64_t matrix_coefficients
Definition: matroskadec.c:171
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:357
MATROSKA_ID_VIDEOCOLOR_GX
#define MATROSKA_ID_VIDEOCOLOR_GX
Definition: matroska.h:153
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:262
avpriv_packet_list_free
void avpriv_packet_list_free(PacketList *pkt_buf)
Wipe the list and unref all the packets in it.
Definition: avpacket.c:591
qtpalette.h
FFStream
Definition: internal.h:194
matroska_convert_tags
static void matroska_convert_tags(AVFormatContext *s)
Definition: matroskadec.c:1817
AVSphericalMapping::bound_right
uint32_t bound_right
Distance from the right edge.
Definition: spherical.h:169
MatroskaTrackEncoding::encryption
MatroskaTrackEncryption encryption
Definition: matroskadec.c:154
MATROSKA_ID_TRACKFLAGENABLED
#define MATROSKA_ID_TRACKFLAGENABLED
Definition: matroska.h:98
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:30
MatroskaTrackAudio::frame_size
int frame_size
Definition: matroskadec.c:220
EBML_NONE
@ EBML_NONE
Definition: matroskadec.c:81
MATROSKA_ID_FILEDATA
#define MATROSKA_ID_FILEDATA
Definition: matroska.h:258
bps
unsigned bps
Definition: movenc.c:1597
MatroskaTrack::max_block_additional_id
uint64_t max_block_additional_id
Definition: matroskadec.c:273
MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH
#define MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH
Definition: matroska.h:166
MatroskaTrack::uid
uint64_t uid
Definition: matroskadec.c:246
size
int size
Definition: twinvq_data.h:10344
MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
@ MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
Definition: matroska.h:307
MATROSKA_ID_BLOCKMORE
#define MATROSKA_ID_BLOCKMORE
Definition: matroska.h:241
ff_get_qtpalette
int ff_get_qtpalette(int codec_id, AVIOContext *pb, uint32_t *palette)
Retrieve the palette (or "color table" in QuickTime terms), either from the video sample description,...
Definition: qtpalette.c:323
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
MKBETAG
#define MKBETAG(a, b, c, d)
Definition: macros.h:56
mkv_stereo_mode_display_mul
static void mkv_stereo_mode_display_mul(int stereo_mode, int *h_width, int *h_height)
Definition: matroskadec.c:2119
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
MATROSKA_ID_VIDEOCOLORMAXFALL
#define MATROSKA_ID_VIDEOCOLORMAXFALL
Definition: matroska.h:148
ff_isom_parse_dvcc_dvvc
int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf_ptr, uint64_t size)
Definition: dovi_isom.c:31
PacketListEntry::pkt
AVPacket pkt
Definition: packet_internal.h:28
matroska_attachments
static EbmlSyntax matroska_attachments[2]
Definition: matroskadec.c:426
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[AVCOL_TRC_NB]
Definition: vf_colorspace.c:177
EbmlBin
Definition: matroskadec.c:125
NEEDS_CHECKING
#define NEEDS_CHECKING
Definition: matroskadec.c:75
AV_DISPOSITION_DUB
#define AV_DISPOSITION_DUB
The stream is not in original language.
Definition: avformat.h:828
EBML_UNKNOWN_LENGTH
#define EBML_UNKNOWN_LENGTH
Definition: matroskadec.c:74
MATROSKA_ID_VIDEOCOLORCBSUBHORZ
#define MATROSKA_ID_VIDEOCOLORCBSUBHORZ
Definition: matroska.h:139
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:1004
INITIALIZATION_RANGE
#define INITIALIZATION_RANGE
Definition: matroska.h:382
EBML_NEST
@ EBML_NEST
Definition: matroskadec.c:88
MATROSKA_ID_POINTENTRY
#define MATROSKA_ID_POINTENTRY
Definition: matroska.h:200
dovi_isom.h
header
static const uint8_t header[24]
Definition: sdr2.c:67
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:857
MATROSKA_ID_BLKADDIDEXTRADATA
#define MATROSKA_ID_BLKADDIDEXTRADATA
Definition: matroska.h:197
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:372
AV_WL16
#define AV_WL16(p, v)
Definition: intreadwrite.h:412
MatroskaTrack::codec_id
char * codec_id
Definition: matroskadec.c:249
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:632
ff_webm_dash_manifest_demuxer
const AVInputFormat ff_webm_dash_manifest_demuxer
matroska_simpletag
static EbmlSyntax matroska_simpletag[]
Definition: matroskadec.c:691
AVSphericalMapping::padding
uint32_t padding
Number of pixels to pad from the edge of each cube face.
Definition: spherical.h:182
MatroskaTrack::num
uint64_t num
Definition: matroskadec.c:245
EbmlList::nb_elem
int nb_elem
Definition: matroskadec.c:120
mkv_field_order
static int mkv_field_order(MatroskaDemuxContext *matroska, int64_t field_order)
Definition: matroskadec.c:2092
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
MATROSKA_ID_ENCODINGTYPE
#define MATROSKA_ID_ENCODINGTYPE
Definition: matroska.h:179
EBML_SINT
@ EBML_SINT
Definition: matroskadec.c:83
AV_CODEC_ID_RV30
@ AV_CODEC_ID_RV30
Definition: codec_id.h:118
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
MatroskaIndexPos::track
uint64_t track
Definition: matroskadec.c:300
AV_PKT_DATA_CONTENT_LIGHT_LEVEL
@ AV_PKT_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
Definition: packet.h:235
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:379
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:203
MatroskaTrack::codec_delay_in_track_tb
uint64_t codec_delay_in_track_tb
Definition: matroskadec.c:267
av_strstart
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:34
version
version
Definition: libkvazaar.c:313
MATROSKA_ID_VIDEOPIXELHEIGHT
#define MATROSKA_ID_VIDEOPIXELHEIGHT
Definition: matroska.h:121
MatroskaTrackVideoColor::chroma_siting_horz
uint64_t chroma_siting_horz
Definition: matroskadec.c:177
MatroskaTagTarget
Definition: matroskadec.c:317
MATROSKA_ID_VIDEOFRAMERATE
#define MATROSKA_ID_VIDEOFRAMERATE
Definition: matroska.h:117
MatroskaBlock::non_simple
uint64_t non_simple
Definition: matroskadec.c:343
MatroskaBlockAdditionMapping
Definition: matroskadec.c:237
EBML_UTF8
@ EBML_UTF8
Definition: matroskadec.c:86
MatroskaIndex::pos
EbmlList pos
Definition: matroskadec.c:306
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
CountedElement::count
unsigned count
Definition: matroskadec.c:101
matroska_aac_sri
static int matroska_aac_sri(int samplerate)
Definition: matroskadec.c:2021
MatroskaChapter::chapter
AVChapter * chapter
Definition: matroskadec.c:296
MATROSKA_ID_MUXINGAPP
#define MATROSKA_ID_MUXINGAPP
Definition: matroska.h:70
MatroskaDemuxContext::resync_pos
int64_t resync_pos
Definition: matroskadec.c:370
MATROSKA_ID_EDITIONFLAGDEFAULT
#define MATROSKA_ID_EDITIONFLAGDEFAULT
Definition: matroska.h:272
AVFormatContext::error_recognition
int error_recognition
Error recognition; higher values will detect more errors but may misdetect some more or less valid pa...
Definition: avformat.h:1456
MATROSKA_ID_TRACKPLANETYPE
#define MATROSKA_ID_TRACKPLANETYPE
Definition: matroska.h:87
FFStream::skip_to_keyframe
int skip_to_keyframe
Indicates that everything up to the next keyframe should be discarded.
Definition: internal.h:296
ffio_limit
int ffio_limit(AVIOContext *s, int size)
Definition: aviobuf.c:1090
layout
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout
Definition: filter_design.txt:18
MATROSKA_ID_CODECINFOURL
#define MATROSKA_ID_CODECINFOURL
Definition: matroska.h:91
MatroskaTrackVideo::display_height
uint64_t display_height
Definition: matroskadec.c:198
EBML_TYPE_COUNT
@ EBML_TYPE_COUNT
Definition: matroskadec.c:91
MATROSKA_ID_FILEDESC
#define MATROSKA_ID_FILEDESC
Definition: matroska.h:255
AV_CODEC_ID_GIF
@ AV_CODEC_ID_GIF
Definition: codec_id.h:147
AV_FIELD_BB
@ AV_FIELD_BB
Definition: codec_par.h:40
convert_header.minor
int minor
Definition: convert_header.py:26
MATROSKA_ID_VIDEOPROJECTIONTYPE
#define MATROSKA_ID_VIDEOPROJECTIONTYPE
Definition: matroska.h:163
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:57
MatroskaLevel::length
uint64_t length
Definition: matroskadec.c:337
EbmlSyntax::i
int64_t i
Definition: matroskadec.c:111
MATROSKA_ID_FILENAME
#define MATROSKA_ID_FILENAME
Definition: matroska.h:256
interlaced
uint8_t interlaced
Definition: mxfenc.c:2040
FLAC_METADATA_TYPE_VORBIS_COMMENT
@ FLAC_METADATA_TYPE_VORBIS_COMMENT
Definition: flac.h:52
MatroskaDemuxContext::chapters
EbmlList chapters
Definition: matroskadec.c:380
AV_CODEC_ID_RA_288
@ AV_CODEC_ID_RA_288
Definition: codec_id.h:411
FILENAME
#define FILENAME
Definition: matroska.h:385
bprint.h
AV_CODEC_ID_RV40
@ AV_CODEC_ID_RV40
Definition: codec_id.h:119
MatroskaTrackAudio::pkt_cnt
int pkt_cnt
Definition: matroskadec.c:223
AV_BASE64_SIZE
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
Definition: base64.h:66
AVSphericalMapping::roll
int32_t roll
Rotation around the forward vector [-180, 180].
Definition: spherical.h:128
MatroskaChapter::uid
uint64_t uid
Definition: matroskadec.c:293
MATROSKA_ID_CODECID
#define MATROSKA_ID_CODECID
Definition: matroska.h:88
MatroskaTrackVideoColor::range
uint64_t range
Definition: matroskadec.c:179
AV_CODEC_ID_RV10
@ AV_CODEC_ID_RV10
Definition: codec_id.h:55
MatroskaTrackVideo::color_space
EbmlBin color_space
Definition: matroskadec.c:201
MatroskaLevel::start
uint64_t start
Definition: matroskadec.c:336
matroska_track_video
static EbmlSyntax matroska_track_video[19]
Definition: matroskadec.c:423
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:48
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:366
avio_internal.h
AV_LZO_OUTPUT_PADDING
#define AV_LZO_OUTPUT_PADDING
Definition: lzo.h:47
MatroskaIndex::time
uint64_t time
Definition: matroskadec.c:305
matroska_track_audio
static EbmlSyntax matroska_track_audio[]
Definition: matroskadec.c:521
MatroskaIndexPos
Definition: matroskadec.c:299
matroska_tagtargets
static EbmlSyntax matroska_tagtargets[]
Definition: matroskadec.c:701
MatroskaTags::target
MatroskaTagTarget target
Definition: matroskadec.c:326
BANDWIDTH
#define BANDWIDTH
Definition: matroska.h:386
MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
@ MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
Definition: matroska.h:295
algo
Definition: dct.c:53
AVCodecParameters::height
int height
Definition: codec_par.h:127
CountedElement::i
int64_t i
Definition: matroskadec.c:97
DURATION
#define DURATION
Definition: matroska.h:387
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
MATROSKA_ID_CUECLUSTERPOSITION
#define MATROSKA_ID_CUECLUSTERPOSITION
Definition: matroska.h:208
MATROSKA_TRACK_ENCODING_COMP_ZLIB
@ MATROSKA_TRACK_ENCODING_COMP_ZLIB
Definition: matroska.h:292
AVCodecParameters::block_align
int block_align
Audio only.
Definition: codec_par.h:177
MatroskaMasteringMeta::r_x
double r_x
Definition: matroskadec.c:158
MATROSKA_ID_CHAPTERPHYSEQUIV
#define MATROSKA_ID_CHAPTERPHYSEQUIV
Definition: matroska.h:277
MatroskaTrackVideo::projection
MatroskaTrackVideoProjection projection
Definition: matroskadec.c:208
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
ffio_init_context
void ffio_init_context(FFIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Definition: aviobuf.c:81
MATROSKA_ID_CUETRACK
#define MATROSKA_ID_CUETRACK
Definition: matroska.h:207
Ebml::doctype
char * doctype
Definition: matroskadec.c:136
MATROSKA_ID_SEEKPOSITION
#define MATROSKA_ID_SEEKPOSITION
Definition: matroska.h:233
ff_metadata_conv
void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:26
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
MATROSKA_ID_CLUSTER
#define MATROSKA_ID_CLUSTER
Definition: matroska.h:62
MATROSKA_ID_TRACKLANGUAGE
#define MATROSKA_ID_TRACKLANGUAGE
Definition: matroska.h:97
AV_CODEC_ID_RV20
@ AV_CODEC_ID_RV20
Definition: codec_id.h:56
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:224
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:205
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
Definition: opt.h:278
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_d2q
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
Definition: rational.c:106
MATROSKA_ID_VIDEOFLAGINTERLACED
#define MATROSKA_ID_VIDEOFLAGINTERLACED
Definition: matroska.h:127
matroska_chapter
static EbmlSyntax matroska_chapter[6]
Definition: matroskadec.c:426
CUE_TIMESTAMPS
#define CUE_TIMESTAMPS
Definition: matroska.h:389
AV_CODEC_ID_PCM_S32BE
@ AV_CODEC_ID_PCM_S32BE
Definition: codec_id.h:323
MatroskaTrackAudio
Definition: matroskadec.c:211
EBML_ID_CRC32
#define EBML_ID_CRC32
Definition: matroska.h:46
EbmlSyntax::data_offset
size_t data_offset
Definition: matroskadec.c:109
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:263
MatroskaDemuxContext::tags
EbmlList tags
Definition: matroskadec.c:382
MatroskaLevel1Element::id
uint32_t id
Definition: matroskadec.c:358
EbmlSyntax::f
double f
Definition: matroskadec.c:113
ff_mkv_metadata_conv
const AVMetadataConv ff_mkv_metadata_conv[]
Definition: matroska.c:122
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
Definition: packet.h:156
AVCodecParameters::color_range
enum AVColorRange color_range
Video only.
Definition: codec_par.h:146
MatroskaTrack::flag_forced
uint64_t flag_forced
Definition: matroskadec.c:255
AVMasteringDisplayMetadata
Mastering display metadata capable of representing the color volume of the display used to master the...
Definition: mastering_display_metadata.h:38
len
int len
Definition: vorbis_enc_data.h:426
MatroskaTrack::flag_comment
uint64_t flag_comment
Definition: matroskadec.c:256
get_qt_codec
static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id)
Definition: matroskadec.c:2357
profile
int profile
Definition: mxfenc.c:2003
ff_get_wav_header
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
Definition: riffdec.c:90
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:526
avpriv_new_chapter
AVChapter * avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, int64_t start, int64_t end, const char *title)
Add a new chapter.
Definition: utils.c:883
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:128
MATROSKA_ID_EDITIONFLAGHIDDEN
#define MATROSKA_ID_EDITIONFLAGHIDDEN
Definition: matroska.h:271
MATROSKA_ID_CHAPTERUID
#define MATROSKA_ID_CHAPTERUID
Definition: matroska.h:274
EbmlList::alloc_elem_size
unsigned int alloc_elem_size
Definition: matroskadec.c:121
matroska_index
static EbmlSyntax matroska_index[2]
Definition: matroskadec.c:427
MatroskaTrackCompression::settings
EbmlBin settings
Definition: matroskadec.c:142
AVCodecParameters::field_order
enum AVFieldOrder field_order
Video only.
Definition: codec_par.h:141
MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
@ MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
Definition: matroska.h:325
MatroskaAttachment::uid
uint64_t uid
Definition: matroskadec.c:281
MatroskaTrackAudio::bitdepth
uint64_t bitdepth
Definition: matroskadec.c:214
matroska_mastering_meta
static EbmlSyntax matroska_mastering_meta[]
Definition: matroskadec.c:458
MATROSKA_ID_VIDEOPROJECTIONPOSEYAW
#define MATROSKA_ID_VIDEOPROJECTIONPOSEYAW
Definition: matroska.h:165
language
Undefined Behavior In the C language
Definition: undefined.txt:3
matroska_track_video_color
static EbmlSyntax matroska_track_video_color[15]
Definition: matroskadec.c:423
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:995
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:861
MatroskaMasteringMeta::g_x
double g_x
Definition: matroskadec.c:160
MatroskaTags::tag
EbmlList tag
Definition: matroskadec.c:327
tag
uint32_t tag
Definition: movenc.c:1596
MatroskaBlock::additional_id
uint64_t additional_id
Definition: matroskadec.c:345
MatroskaTagTarget::chapteruid
uint64_t chapteruid
Definition: matroskadec.c:321
ret
ret
Definition: filter_design.txt:187
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_reading.c:42
AVStream
Stream structure.
Definition: avformat.h:935
mkv_mime_tags
static const CodecMime mkv_mime_tags[]
Definition: matroskadec.c:799
EbmlBin::pos
int64_t pos
Definition: matroskadec.c:129
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:260
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
av_strlcat
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
Definition: avstring.c:93
AVSphericalMapping::pitch
int32_t pitch
Rotation around the right vector [-90, 90].
Definition: spherical.h:127
MATROSKA_ID_TRACKCOMBINEPLANES
#define MATROSKA_ID_TRACKCOMBINEPLANES
Definition: matroska.h:84
MatroskaTrackCompression
Definition: matroskadec.c:140
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
EbmlSyntax::u
uint64_t u
Definition: matroskadec.c:112
matroska_blockmore
static EbmlSyntax matroska_blockmore[]
Definition: matroskadec.c:749
MATROSKA_ID_VIDEOCOLOR_BX
#define MATROSKA_ID_VIDEOCOLOR_BX
Definition: matroska.h:155
MATROSKA_ID_TAGSTRING
#define MATROSKA_ID_TAGSTRING
Definition: matroska.h:217
MatroskaDemuxContext::ctx
AVFormatContext * ctx
Definition: matroskadec.c:364
AVSTREAM_PARSE_HEADERS
@ AVSTREAM_PARSE_HEADERS
Only parse headers, do not repack.
Definition: avformat.h:793
pos
unsigned int pos
Definition: spdifenc.c:412
MATROSKA_ID_VIDEOCOLORMATRIXCOEFF
#define MATROSKA_ID_VIDEOCOLORMATRIXCOEFF
Definition: matroska.h:135
avformat.h
MatroskaDemuxContext::time_scale
uint64_t time_scale
Definition: matroskadec.c:373
MatroskaAttachment
Definition: matroskadec.c:280
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:93
dict.h
lzo.h
AV_CODEC_ID_TEXT
@ AV_CODEC_ID_TEXT
raw UTF-8 text
Definition: codec_id.h:524
MATROSKA_ID_SIMPLEBLOCK
#define MATROSKA_ID_SIMPLEBLOCK
Definition: matroska.h:244
MATROSKA_ID_TRACKPLANE
#define MATROSKA_ID_TRACKPLANE
Definition: matroska.h:85
AV_DISPOSITION_DESCRIPTIONS
#define AV_DISPOSITION_DESCRIPTIONS
The subtitle stream contains a textual description of the video content.
Definition: avformat.h:890
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
MATROSKA_ID_VIDEOPIXELCROPL
#define MATROSKA_ID_VIDEOPIXELCROPL
Definition: matroska.h:124
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
MatroskaIndex
Definition: matroskadec.c:304
AVCodecParameters::chroma_location
enum AVChromaLocation chroma_location
Definition: codec_par.h:150
MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL
Definition: matroska.h:322
MATROSKA_ID_CODECNAME
#define MATROSKA_ID_CODECNAME
Definition: matroska.h:90
webm_dash_class
static const AVClass webm_dash_class
Definition: webmdashenc.c:534
MatroskaTrackVideo::frame_rate
double frame_rate
Definition: matroskadec.c:196
oggdec.h
MATROSKA_ID_EDITIONENTRY
#define MATROSKA_ID_EDITIONENTRY
Definition: matroska.h:262
MatroskaChapter::title
char * title
Definition: matroskadec.c:294
OFFSET
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your see the OFFSET() macro
syntax
static const ParseSyntax syntax[]
Definition: concatdec.c:440
matroska_seekhead_entry
static EbmlSyntax matroska_seekhead_entry[]
Definition: matroskadec.c:721
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:943
MATROSKA_ID_TRACKMAXCACHE
#define MATROSKA_ID_TRACKMAXCACHE
Definition: matroska.h:108
matroska_seekhead
static EbmlSyntax matroska_seekhead[2]
Definition: matroskadec.c:427
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:34
matroska_add_index_entries
static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:1958
MATROSKA_ID_TRACKMAXBLKADDID
#define MATROSKA_ID_TRACKMAXBLKADDID
Definition: matroska.h:113
EBML_ID_HEADER
#define EBML_ID_HEADER
Definition: matroska.h:33
MatroskaTrack::needs_decoding
int needs_decoding
Definition: matroskadec.c:272
matroska_blockgroup
static EbmlSyntax matroska_blockgroup[8]
Definition: matroskadec.c:428
MATROSKA_ID_TAGTARGETS_TYPEVALUE
#define MATROSKA_ID_TAGTARGETS_TYPEVALUE
Definition: matroska.h:223
EBML_ID_EBMLVERSION
#define EBML_ID_EBMLVERSION
Definition: matroska.h:36
MatroskaLevel
Definition: matroskadec.c:335
MATROSKA_ID_CLUSTERPREVSIZE
#define MATROSKA_ID_CLUSTERPREVSIZE
Definition: matroska.h:238
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:40
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: avpacket.c:232
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
ff_reduce_index
void ff_reduce_index(AVFormatContext *s, int stream_index)
Ensure the index uses less memory than the maximum specified in AVFormatContext.max_index_size by dis...
Definition: seek.c:45
MatroskaTrackVideo::display_width
uint64_t display_width
Definition: matroskadec.c:197
ff_sipr_subpk_size
const unsigned char ff_sipr_subpk_size[4]
Definition: rmsipr.c:25
MATROSKA_ID_TAGLANG
#define MATROSKA_ID_TAGLANG
Definition: matroska.h:218
MatroskaTrackVideoColor::chroma_sub_horz
uint64_t chroma_sub_horz
Definition: matroskadec.c:173
is_ebml_id_valid
static int is_ebml_id_valid(uint32_t id)
Definition: matroskadec.c:1180
AVRational::den
int den
Denominator.
Definition: rational.h:60
MatroskaTrackAudio::channels
uint64_t channels
Definition: matroskadec.c:215
MATROSKA_VIDEO_STEREO_PLANE_COUNT
#define MATROSKA_VIDEO_STEREO_PLANE_COUNT
Definition: matroska.h:373
mkv_parse_dvcc_dvvc
static int mkv_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const MatroskaTrack *track, EbmlBin *bin)
Definition: matroskadec.c:2325
MATROSKA_ID_VIDEOCOLOR
#define MATROSKA_ID_VIDEOCOLOR
Definition: matroska.h:133
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
MatroskaChapter::end
uint64_t end
Definition: matroskadec.c:292
matroska_tracks
static EbmlSyntax matroska_tracks[2]
Definition: matroskadec.c:425
MatroskaDemuxContext::date_utc
EbmlBin date_utc
Definition: matroskadec.c:377
MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS
#define MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS
Definition: matroska.h:144
video
A Quick Description Of Rate Distortion Theory We want to encode a video
Definition: rate_distortion.txt:3
MATROSKA_ID_VIDEOCOLOR_RX
#define MATROSKA_ID_VIDEOCOLOR_RX
Definition: matroska.h:151
matroska_parse_wavpack
static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t **data, int *size)
Definition: matroskadec.c:3313
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:641
MATROSKA_TRACK_TYPE_SUBTITLE
@ MATROSKA_TRACK_TYPE_SUBTITLE
Definition: matroska.h:285
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:130
MatroskaMasteringMeta::max_luminance
double max_luminance
Definition: matroskadec.c:166
temp
else temp
Definition: vf_mcdeint.c:248
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:1084
AV_LZO_OUTPUT_FULL
#define AV_LZO_OUTPUT_FULL
decoded data did not fit into output buffer
Definition: lzo.h:39
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:802
AVIOContext::eof_reached
int eof_reached
true if was unable to read due to error or eof
Definition: avio.h:239
av_base64_encode
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
Definition: base64.c:143
MatroskaBlockAdditionMapping::name
char * name
Definition: matroskadec.c:239
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
MATROSKA_ID_VIDEOCOLORCHROMASUBVERT
#define MATROSKA_ID_VIDEOCOLORCHROMASUBVERT
Definition: matroska.h:138
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:1196
MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
@ MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
Definition: matroska.h:356
avcodec_chroma_pos_to_enum
enum AVChromaLocation avcodec_chroma_pos_to_enum(int xpos, int ypos)
Converts swscale x/y chroma position to AVChromaLocation.
Definition: utils.c:364
AVMasteringDisplayMetadata::min_luminance
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:52
EBML_UINT
@ EBML_UINT
Definition: matroskadec.c:82
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1302
AVPacket::stream_index
int stream_index
Definition: packet.h:375
matroska_parse_rm_audio
static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, uint8_t *data, int size, uint64_t timecode, int64_t pos)
Definition: matroskadec.c:3235
MatroskaTrackVideoColor::max_fall
uint64_t max_fall
Definition: matroskadec.c:183
av_buffer_realloc
int av_buffer_realloc(AVBufferRef **pbuf, size_t size)
Reallocate a given buffer.
Definition: buffer.c:183
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:347
MatroskaTrackVideoProjection::private
EbmlBin private
Definition: matroskadec.c:189
MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
Definition: matroska.h:141
MATROSKA_TRACK_ENCODING_COMP_LZO
@ MATROSKA_TRACK_ENCODING_COMP_LZO
Definition: matroska.h:294
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:277
ff_mpeg4audio_sample_rates
const int ff_mpeg4audio_sample_rates[16]
Definition: mpeg4audio_sample_rates.h:26
av_dict_set_int
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it.
Definition: dict.c:147
CodecMime::id
enum AVCodecID id
Definition: internal.h:58
av_spherical_alloc
AVSphericalMapping * av_spherical_alloc(size_t *size)
Allocate a AVSphericalVideo structure and initialize its fields to default values.
Definition: spherical.c:25
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:279
MATROSKA_ID_BLOCKREFERENCE
#define MATROSKA_ID_BLOCKREFERENCE
Definition: matroska.h:249
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_CODEC_ID_PCM_S32LE
@ AV_CODEC_ID_PCM_S32LE
Definition: codec_id.h:322
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:102
MatroskaBlock::bin
EbmlBin bin
Definition: matroskadec.c:344
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
CodecTags::id
enum AVCodecID id
Definition: matroska.h:367
packet_internal.h
MATROSKA_ID_VIDEOCOLOR_RY
#define MATROSKA_ID_VIDEOCOLOR_RY
Definition: matroska.h:152
AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
@ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
Data found in BlockAdditional element of matroska container.
Definition: packet.h:191
AV_CODEC_ID_PCM_U8
@ AV_CODEC_ID_PCM_U8
Definition: codec_id.h:319
MATROSKA_VIDEO_FIELDORDER_TB
@ MATROSKA_VIDEO_FIELDORDER_TB
Definition: matroska.h:309
mastering_display_metadata.h
EbmlSyntax::s
const char * s
Definition: matroskadec.c:114
AVSphericalMapping::bound_left
uint32_t bound_left
Distance from the left edge.
Definition: spherical.h:167
MatroskaTrack::has_palette
int has_palette
Definition: matroskadec.c:277
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: codec_par.h:38
ff_mkv_stereo3d_conv
int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
Definition: matroska.c:152
MatroskaTrackVideoProjection::roll
double roll
Definition: matroskadec.c:192
AVCOL_TRC_RESERVED
@ AVCOL_TRC_RESERVED
Definition: pixfmt.h:498
MATROSKA_ID_TRACKVIDEO
#define MATROSKA_ID_TRACKVIDEO
Definition: matroska.h:81
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
Definition: matroska.h:328
AVIOContext::buffer
unsigned char * buffer
Start of the buffer.
Definition: avio.h:226
ff_mkv_codec_tags
const CodecTags ff_mkv_codec_tags[]
Definition: matroska.c:29
AV_CODEC_ID_PCM_F64LE
@ AV_CODEC_ID_PCM_F64LE
Definition: codec_id.h:337
MatroskaAttachment::mime
char * mime
Definition: matroskadec.c:284
MATROSKA_ID_TRACKFLAGFORCED
#define MATROSKA_ID_TRACKFLAGFORCED
Definition: matroska.h:100
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
@ MATROSKA_VIDEO_STEREOMODE_TYPE_NB
Definition: matroska.h:329
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:79
EBML_VERSION
#define EBML_VERSION
Definition: matroska.h:30
EBML_ID_EBMLREADVERSION
#define EBML_ID_EBMLREADVERSION
Definition: matroska.h:37
matroska_deliver_packet
static int matroska_deliver_packet(MatroskaDemuxContext *matroska, AVPacket *pkt)
Definition: matroskadec.c:3107
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:60
MatroskaTrack::palette
uint32_t palette[AVPALETTE_COUNT]
Definition: matroskadec.c:276
AVContentLightMetadata::MaxFALL
unsigned MaxFALL
Max average light level per frame (cd/m^2).
Definition: mastering_display_metadata.h:107
AVPacket
This structure stores compressed data.
Definition: packet.h:350
MatroskaTrackEncryption::key_id
EbmlBin key_id
Definition: matroskadec.c:147
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:241
MATROSKA_ID_ENCODINGENCAESSETTINGS
#define MATROSKA_ID_ENCODINGENCAESSETTINGS
Definition: matroska.h:185
MATROSKA_ID_CHAPTERFLAGHIDDEN
#define MATROSKA_ID_CHAPTERFLAGHIDDEN
Definition: matroska.h:275
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:70
riff.h
MATROSKA_ID_ATTACHEDFILE
#define MATROSKA_ID_ATTACHEDFILE
Definition: matroska.h:254
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:393
MATROSKA_ID_TRACKMINCACHE
#define MATROSKA_ID_TRACKMINCACHE
Definition: matroska.h:107
MATROSKA_ID_CODECDELAY
#define MATROSKA_ID_CODECDELAY
Definition: matroska.h:94
MatroskaMasteringMeta::g_y
double g_y
Definition: matroskadec.c:161
AVCodecParameters::channel_layout
uint64_t channel_layout
Audio only.
Definition: codec_par.h:162
MatroskaTrackVideoColor::transfer_characteristics
uint64_t transfer_characteristics
Definition: matroskadec.c:180
av_stream_new_side_data
uint8_t * av_stream_new_side_data(AVStream *stream, enum AVPacketSideDataType type, size_t size)
Allocate new information from stream.
Definition: utils.c:1772
matroska_track_plane
static EbmlSyntax matroska_track_plane[]
Definition: matroskadec.c:559
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
convert_header.str
string str
Definition: convert_header.py:20
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:792
MATROSKA_ID_ENCODINGCOMPRESSION
#define MATROSKA_ID_ENCODINGCOMPRESSION
Definition: matroska.h:180
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
MATROSKA_ID_TAGTARGETS_TRACKUID
#define MATROSKA_ID_TAGTARGETS_TRACKUID
Definition: matroska.h:224
MatroskaTrackVideoProjection::pitch
double pitch
Definition: matroskadec.c:191
mkv_parse_block_addition_mappings
static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, const MatroskaTrack *track)
Definition: matroskadec.c:2331
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:83
AV_CODEC_ID_PCM_F32LE
@ AV_CODEC_ID_PCM_F32LE
Definition: codec_id.h:335
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:89
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
MatroskaTrack::flag_original
CountedElement flag_original
Definition: matroskadec.c:260
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
MatroskaTrackVideo::stereo_mode
uint64_t stereo_mode
Definition: matroskadec.c:205
AV_CODEC_ID_WAVPACK
@ AV_CODEC_ID_WAVPACK
Definition: codec_id.h:448
UNKNOWN_EQUIV
#define UNKNOWN_EQUIV
Definition: matroskadec.c:78
AV_CODEC_ID_COOK
@ AV_CODEC_ID_COOK
Definition: codec_id.h:443
MATROSKA_ID_CHAPTERTIMEEND
#define MATROSKA_ID_CHAPTERTIMEEND
Definition: matroska.h:265
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
matroska_track_encoding
static EbmlSyntax matroska_track_encoding[6]
Definition: matroskadec.c:424
MatroskaTrack::seek_preroll
uint64_t seek_preroll
Definition: matroskadec.c:261
matroska_chapter_display
static EbmlSyntax matroska_chapter_display[]
Definition: matroskadec.c:638
MatroskaCluster
Definition: matroskadec.c:350
MatroskaTrackVideoColor::chroma_sub_vert
uint64_t chroma_sub_vert
Definition: matroskadec.c:174
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
MATROSKA_ID_TRACKS
#define MATROSKA_ID_TRACKS
Definition: matroska.h:57
MATROSKA_ID_ENCODINGENCKEYID
#define MATROSKA_ID_ENCODINGENCKEYID
Definition: matroska.h:187
h
h
Definition: vp9dsp_template.c:2038
AV_PKT_DATA_WEBVTT_IDENTIFIER
@ AV_PKT_DATA_WEBVTT_IDENTIFIER
The optional first identifier line of a WebVTT cue.
Definition: packet.h:196
MatroskaTrackAudio::samplerate
double samplerate
Definition: matroskadec.c:212
MatroskaMasteringMeta::white_x
double white_x
Definition: matroskadec.c:164
ebml_free
static void ebml_free(EbmlSyntax *syntax, void *data)
Definition: matroskadec.c:1546
AV_CODEC_ID_TIFF
@ AV_CODEC_ID_TIFF
Definition: codec_id.h:146
AVDictionaryEntry::value
char * value
Definition: dict.h:81
EbmlSyntax::is_counted
uint8_t is_counted
Definition: matroskadec.c:107
avstring.h
MATROSKA_ID_ENCODINGCOMPSETTINGS
#define MATROSKA_ID_ENCODINGCOMPSETTINGS
Definition: matroska.h:182
flac.h
MatroskaDemuxContext::cues_parsing_deferred
int cues_parsing_deferred
Definition: matroskadec.c:402
ff_vorbis_comment
int ff_vorbis_comment(AVFormatContext *ms, AVDictionary **m, const uint8_t *buf, int size, int parse_picture)
Parse Vorbis comments.
Definition: oggparsevorbis.c:148
MatroskaIndexPos::pos
uint64_t pos
Definition: matroskadec.c:301
MATROSKA_ID_SEEKPREROLL
#define MATROSKA_ID_SEEKPREROLL
Definition: matroska.h:95
AVIOContext::buf_ptr
unsigned char * buf_ptr
Current position in the buffer.
Definition: avio.h:228
MATROSKA_ID_SEEKHEAD
#define MATROSKA_ID_SEEKHEAD
Definition: matroska.h:60
CHILD_OF
#define CHILD_OF(parent)
Definition: matroskadec.c:417
MatroskaBlock::reference
CountedElement reference
Definition: matroskadec.c:342
EbmlBin::data
uint8_t * data
Definition: matroskadec.c:128
EBML_LEVEL1
@ EBML_LEVEL1
Definition: matroskadec.c:89
fourcc
uint32_t fourcc
Definition: vaapi_decode.c:239
snprintf
#define snprintf
Definition: snprintf.h:34
MatroskaDemuxContext::skip_to_timecode
uint64_t skip_to_timecode
Definition: matroskadec.c:399
AVCodecParameters::initial_padding
int initial_padding
Audio only.
Definition: codec_par.h:189
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
MATROSKA_ID_VIDEOPROJECTIONPOSEROLL
#define MATROSKA_ID_VIDEOPROJECTIONPOSEROLL
Definition: matroska.h:167
AV_CODEC_ID_PCM_S24BE
@ AV_CODEC_ID_PCM_S24BE
Definition: codec_id.h:327
MATROSKA_ID_BLOCKADDID
#define MATROSKA_ID_BLOCKADDID
Definition: matroska.h:242
AVSphericalMapping
This structure describes how to handle spherical videos, outlining information about projection,...
Definition: spherical.h:82
avpriv_dict_set_timestamp
int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp)
Set a dictionary value to an ISO-8601 compliant timestamp string.
Definition: dict.c:258
AV_RB64
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
Definition: bytestream.h:95
MatroskaBlockAdditionMapping::value
uint64_t value
Definition: matroskadec.c:238
MatroskaTrackAudio::out_samplerate
double out_samplerate
Definition: matroskadec.c:213
AVSphericalMapping::yaw
int32_t yaw
Rotation around the up vector [-180, 180].
Definition: spherical.h:126
MATROSKA_ID_TAGTARGETS_CHAPTERUID
#define MATROSKA_ID_TAGTARGETS_CHAPTERUID
Definition: matroska.h:225
MatroskaTrackEncryption
Definition: matroskadec.c:145
ebml_read_length
static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb, uint64_t *number)
Read a EBML length value.
Definition: matroskadec.c:947
MATROSKA_ID_TRACKTIMECODESCALE
#define MATROSKA_ID_TRACKTIMECODESCALE
Definition: matroska.h:112
matroska_chapter_entry
static EbmlSyntax matroska_chapter_entry[9]
Definition: matroskadec.c:426
MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP
@ MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP
Definition: matroska.h:357
matroska_aac_profile
static int matroska_aac_profile(char *codec_id)
Definition: matroskadec.c:2010
AV_CODEC_ID_MLP
@ AV_CODEC_ID_MLP
Definition: codec_id.h:452
is_keyframe
static int is_keyframe(NalUnitType naltype)
Definition: libx265.c:66
MatroskaTrack::time_scale
double time_scale
Definition: matroskadec.c:252
MatroskaTrack::language
char * language
Definition: matroskadec.c:251
ff_add_attached_pic
int ff_add_attached_pic(AVFormatContext *s, AVStream *st, AVIOContext *pb, AVBufferRef **buf, int size)
Add an attached pic to an AVStream.
Definition: utils.c:250
AV_CODEC_ID_PRORES
@ AV_CODEC_ID_PRORES
Definition: codec_id.h:198
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:98
CountedElement
Definition: matroskadec.c:94
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:348
av_index_search_timestamp
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
Definition: seek.c:237
MatroskaMasteringMeta::r_y
double r_y
Definition: matroskadec.c:159
matroska_parse_flac
static int matroska_parse_flac(AVFormatContext *s, MatroskaTrack *track, int *offset)
Definition: matroskadec.c:2037
ff_alloc_extradata
int ff_alloc_extradata(AVCodecParameters *par, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0.
Definition: utils.c:451
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:375
MATROSKA_ID_BLOCKADDITIONS
#define MATROSKA_ID_BLOCKADDITIONS
Definition: matroska.h:240
MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
@ MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
Definition: matroska.h:299
MatroskaDemuxContext::done
int done
Definition: matroskadec.c:395