FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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 #include "config_components.h"
33 
34 #include <inttypes.h>
35 #include <stdio.h>
36 
37 #include "libavutil/avstring.h"
38 #include "libavutil/base64.h"
39 #include "libavutil/bprint.h"
40 #include "libavutil/dict.h"
41 #include "libavutil/display.h"
43 #include "libavutil/intfloat.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/lzo.h"
47 #include "libavutil/mathematics.h"
48 #include "libavutil/mem.h"
49 #include "libavutil/opt.h"
50 #include "libavutil/pixdesc.h"
52 #include "libavutil/spherical.h"
53 
54 #include "libavcodec/bytestream.h"
55 #include "libavcodec/defs.h"
56 #include "libavcodec/flac.h"
57 #include "libavcodec/itut35.h"
58 #include "libavcodec/mpeg4audio.h"
60 
61 #include "avformat.h"
62 #include "avio_internal.h"
63 #include "demux.h"
64 #include "dovi_isom.h"
65 #include "internal.h"
66 #include "isom.h"
67 #include "matroska.h"
68 #include "oggdec.h"
69 /* For ff_codec_get_id(). */
70 #include "riff.h"
71 #include "rmsipr.h"
72 
73 #if CONFIG_BZLIB
74 #include <bzlib.h>
75 #endif
76 #if CONFIG_ZLIB
77 #include <zlib.h>
78 #endif
79 
80 #include "qtpalette.h"
81 
82 #define EBML_UNKNOWN_LENGTH UINT64_MAX /* EBML unknown length, in uint64_t */
83 #define NEEDS_CHECKING 2 /* Indicates that some error checks
84  * still need to be performed */
85 #define LEVEL_ENDED 3 /* return value of ebml_parse when the
86  * syntax level used for parsing ended. */
87 #define SKIP_THRESHOLD 1024 * 1024 /* In non-seekable mode, if more than SKIP_THRESHOLD
88  * of unkown, potentially damaged data is encountered,
89  * it is considered an error. */
90 #define UNKNOWN_EQUIV 50 * 1024 /* An unknown element is considered equivalent
91  * to this many bytes of unknown data for the
92  * SKIP_THRESHOLD check. */
93 
94 typedef enum {
100  EBML_UTF8,
101  EBML_BIN,
103  EBML_LEVEL1,
107 
108 typedef struct CountedElement {
109  union {
110  uint64_t u;
111  int64_t i;
112  double f;
113  char *s;
114  } el;
115  unsigned count;
117 
118 typedef const struct EbmlSyntax {
119  uint32_t id;
120  uint8_t type;
121  uint8_t is_counted;
123  size_t data_offset;
124  union {
125  int64_t i;
126  uint64_t u;
127  double f;
128  const char *s;
129  const struct EbmlSyntax *n;
130  } def;
131 } EbmlSyntax;
132 
133 typedef struct EbmlList {
134  int nb_elem;
135  unsigned int alloc_elem_size;
136  void *elem;
138 
139 typedef struct EbmlBin {
140  int size;
142  uint8_t *data;
145 
146 typedef struct Ebml {
147  uint64_t version;
148  uint64_t max_size;
149  uint64_t id_length;
150  char *doctype;
151  uint64_t doctype_version;
152 } Ebml;
153 
154 typedef struct MatroskaTrackCompression {
155  uint64_t algo;
158 
159 typedef struct MatroskaTrackEncryption {
160  uint64_t algo;
163 
164 typedef struct MatroskaTrackEncoding {
165  uint64_t scope;
166  uint64_t type;
170 
171 typedef struct MatroskaMasteringMeta {
172  double r_x;
173  double r_y;
174  double g_x;
175  double g_y;
176  double b_x;
177  double b_y;
178  double white_x;
179  double white_y;
183 
184 typedef struct MatroskaTrackVideoColor {
187  uint64_t chroma_sub_horz;
188  uint64_t chroma_sub_vert;
189  uint64_t cb_sub_horz;
190  uint64_t cb_sub_vert;
193  uint64_t range;
194  uint64_t transfer_characteristics;
195  uint64_t primaries;
196  uint64_t max_cll;
197  uint64_t max_fall;
200 
201 typedef struct MatroskaTrackVideoProjection {
202  uint64_t type;
203  EbmlBin private;
204  double yaw;
205  double pitch;
206  double roll;
208 
209 typedef struct MatroskaTrackVideo {
210  double frame_rate;
211  uint64_t display_width;
212  uint64_t display_height;
213  uint64_t pixel_width;
214  uint64_t pixel_height;
215  uint64_t cropped_width;
216  uint64_t cropped_height;
218  uint64_t pixel_cropt;
219  uint64_t pixel_cropl;
220  uint64_t pixel_cropb;
221  uint64_t pixel_cropr;
222  uint64_t display_unit;
223  uint64_t interlaced;
224  uint64_t field_order;
225  uint64_t stereo_mode;
226  uint64_t alpha_mode;
230 
231 typedef struct MatroskaTrackAudio {
232  double samplerate;
234  uint64_t bitdepth;
235  uint64_t channels;
236 
237  /* real audio header (extracted from extradata) */
240  int frame_size;
241  int sub_packet_size;
243  int pkt_cnt;
244  uint64_t buf_timecode;
245  uint8_t *buf;
247 
248 typedef struct MatroskaTrackPlane {
249  uint64_t uid;
250  uint64_t type;
252 
253 typedef struct MatroskaTrackOperation {
256 
257 typedef struct MatroskaBlockAdditionMapping {
258  uint64_t value;
259  char *name;
260  uint64_t type;
263 
264 typedef struct MatroskaTrack {
265  uint64_t num;
266  uint64_t uid;
267  uint64_t type;
268  char *name;
269  char *codec_id;
271  char *language;
272  double time_scale;
274  uint64_t flag_default;
275  uint64_t flag_forced;
276  uint64_t flag_comment;
281  uint64_t seek_preroll;
286  uint64_t codec_delay;
288 
289  AVStream *stream;
292  int needs_decoding;
293  uint64_t max_block_additional_id;
295 
299 
300 typedef struct MatroskaAttachment {
301  uint64_t uid;
302  char *filename;
303  char *description;
304  char *mime;
306 
309 
310 typedef struct MatroskaChapter {
311  uint64_t start;
312  uint64_t end;
313  uint64_t uid;
314  char *title;
315 
318 
319 typedef struct MatroskaIndexPos {
320  uint64_t track;
321  uint64_t pos;
323 
324 typedef struct MatroskaIndex {
325  uint64_t time;
328 
329 typedef struct MatroskaTag {
330  char *name;
331  char *string;
332  char *lang;
333  uint64_t def;
336 
337 typedef struct MatroskaTagTarget {
338  char *type;
339  uint64_t typevalue;
340  uint64_t trackuid;
341  uint64_t chapteruid;
342  uint64_t attachuid;
344 
345 typedef struct MatroskaTags {
347  EbmlList tag;
348 } MatroskaTags;
349 
350 typedef struct MatroskaSeekhead {
351  uint64_t id;
352  uint64_t pos;
354 
355 typedef struct MatroskaLevel {
356  uint64_t start;
357  uint64_t length;
358 } MatroskaLevel;
359 
360 typedef struct MatroskaBlockMore {
361  uint64_t additional_id;
364 
365 typedef struct MatroskaBlock {
366  uint64_t duration;
368  uint64_t non_simple;
372 } MatroskaBlock;
373 
374 typedef struct MatroskaCluster {
376  uint64_t timecode;
379 
380 typedef struct MatroskaLevel1Element {
382  uint32_t id;
383  int parsed;
385 
386 typedef struct MatroskaDemuxContext {
387  const AVClass *class;
389 
390  /* EBML stuff */
393  uint32_t current_id;
396 
397  uint64_t time_scale;
398  double duration;
399  char *title;
400  char *muxingapp;
405  EbmlList index;
406  EbmlList tags;
408 
409  /* byte position of the segment inside the stream */
411 
412  /* This packet coincides with FFFormatContext.parse_pkt
413  * and is not owned by us. */
414  AVPacket *pkt;
415 
416  /* the packet queue */
418 
419  int done;
420 
421  /* What to skip before effectively reading a packet. */
422  int skip_to_keyframe;
424 
425  /* File has a CUES element, but we defer parsing until it is needed. */
427 
428  /* Level1 elements and whether they were read yet */
430  int num_level1_elems;
431 
433 
434  int is_webm;
435 
436  /* WebM DASH Manifest live flag */
437  int is_live;
438 
439  /* Bandwidth value for WebM DASH Manifest */
440  int bandwidth;
442 
443 #define CHILD_OF(parent) { .def = { .n = parent } }
444 
445 // The following forward declarations need their size because
446 // a tentative definition with internal linkage must not be an
447 // incomplete type (6.7.2 in C90, 6.9.2 in C99).
448 // Removing the sizes breaks MSVC.
455 
456 static EbmlSyntax ebml_header[] = {
457  { EBML_ID_EBMLREADVERSION, EBML_UINT, 0, 0, offsetof(Ebml, version), { .u = EBML_VERSION } },
458  { EBML_ID_EBMLMAXSIZELENGTH, EBML_UINT, 0, 0, offsetof(Ebml, max_size), { .u = 8 } },
459  { EBML_ID_EBMLMAXIDLENGTH, EBML_UINT, 0, 0, offsetof(Ebml, id_length), { .u = 4 } },
460  { EBML_ID_DOCTYPE, EBML_STR, 0, 0, offsetof(Ebml, doctype), { .s = "(none)" } },
461  { EBML_ID_DOCTYPEREADVERSION, EBML_UINT, 0, 0, offsetof(Ebml, doctype_version), { .u = 1 } },
465 };
466 
468  { EBML_ID_HEADER, EBML_NEST, 0, 0, 0, { .n = ebml_header } },
470  { 0 }
471 };
472 
473 static EbmlSyntax matroska_info[] = {
474  { MATROSKA_ID_TIMECODESCALE, EBML_UINT, 0, 0, offsetof(MatroskaDemuxContext, time_scale), { .u = 1000000 } },
476  { MATROSKA_ID_TITLE, EBML_UTF8, 0, 0, offsetof(MatroskaDemuxContext, title) },
478  { MATROSKA_ID_MUXINGAPP, EBML_UTF8, 0, 0, offsetof(MatroskaDemuxContext, muxingapp) },
479  { MATROSKA_ID_DATEUTC, EBML_BIN, 0, 0, offsetof(MatroskaDemuxContext, date_utc) },
482 };
483 
491  { MATROSKA_ID_VIDEOCOLOR_WHITEX, EBML_FLOAT, 0, 0, offsetof(MatroskaMasteringMeta, white_x) },
492  { MATROSKA_ID_VIDEOCOLOR_WHITEY, EBML_FLOAT, 0, 0, offsetof(MatroskaMasteringMeta, white_y) },
493  { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN, EBML_FLOAT, 1, 0, offsetof(MatroskaMasteringMeta, min_luminance) },
494  { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX, EBML_FLOAT, 0, 0, offsetof(MatroskaMasteringMeta, max_luminance) },
496 };
497 
499  { MATROSKA_ID_VIDEOCOLORMATRIXCOEFF, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, matrix_coefficients), { .u = AVCOL_SPC_UNSPECIFIED } },
500  { MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, bits_per_channel), { .u = 0 } },
501  { MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, chroma_sub_horz) },
502  { MATROSKA_ID_VIDEOCOLORCHROMASUBVERT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, chroma_sub_vert) },
503  { MATROSKA_ID_VIDEOCOLORCBSUBHORZ, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, cb_sub_horz) },
504  { MATROSKA_ID_VIDEOCOLORCBSUBVERT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, cb_sub_vert) },
511  { MATROSKA_ID_VIDEOCOLORMAXFALL, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideoColor, max_fall) },
514 };
515 
519  { MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideoProjection, yaw), { .f = 0.0 } },
520  { MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideoProjection, pitch), { .f = 0.0 } },
521  { MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideoProjection, roll), { .f = 0.0 } },
523 };
524 
525 static EbmlSyntax matroska_track_video[] = {
526  { MATROSKA_ID_VIDEOFRAMERATE, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackVideo, frame_rate) },
527  { MATROSKA_ID_VIDEODISPLAYWIDTH, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, display_width), { .u=-1 } },
528  { MATROSKA_ID_VIDEODISPLAYHEIGHT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, display_height), { .u=-1 } },
529  { MATROSKA_ID_VIDEOPIXELWIDTH, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_width) },
530  { MATROSKA_ID_VIDEOPIXELHEIGHT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_height) },
531  { MATROSKA_ID_VIDEOCOLORSPACE, EBML_BIN, 0, 0, offsetof(MatroskaTrackVideo, color_space) },
532  { MATROSKA_ID_VIDEOALPHAMODE, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, alpha_mode), { .u = 0 } },
535  { MATROSKA_ID_VIDEOPIXELCROPB, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_cropb), {.u = 0 } },
536  { MATROSKA_ID_VIDEOPIXELCROPT, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_cropt), {.u = 0 } },
537  { MATROSKA_ID_VIDEOPIXELCROPL, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_cropl), {.u = 0 } },
538  { MATROSKA_ID_VIDEOPIXELCROPR, EBML_UINT, 0, 0, offsetof(MatroskaTrackVideo, pixel_cropr), {.u = 0 } },
545 };
546 
547 static EbmlSyntax matroska_track_audio[] = {
548  { MATROSKA_ID_AUDIOSAMPLINGFREQ, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackAudio, samplerate), { .f = 8000.0 } },
549  { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, EBML_FLOAT, 0, 0, offsetof(MatroskaTrackAudio, out_samplerate) },
551  { MATROSKA_ID_AUDIOCHANNELS, EBML_UINT, 0, 0, offsetof(MatroskaTrackAudio, channels), { .u = 1 } },
553 };
554 
559 };
560 
562  { MATROSKA_ID_ENCODINGENCALGO, EBML_UINT, 0, 0, offsetof(MatroskaTrackEncryption,algo), {.u = 0} },
570 };
572  { MATROSKA_ID_ENCODINGSCOPE, EBML_UINT, 0, 0, offsetof(MatroskaTrackEncoding, scope), { .u = 1 } },
573  { MATROSKA_ID_ENCODINGTYPE, EBML_UINT, 0, 0, offsetof(MatroskaTrackEncoding, type), { .u = 0 } },
578 };
579 
583 };
584 
585 static EbmlSyntax matroska_track_plane[] = {
589 };
590 
592  { MATROSKA_ID_TRACKPLANE, EBML_NEST, 0, sizeof(MatroskaTrackPlane), offsetof(MatroskaTrackOperation,combine_planes), {.n = matroska_track_plane} },
594 };
595 
599 };
600 
607 };
608 
609 static EbmlSyntax matroska_track[] = {
610  { MATROSKA_ID_TRACKNUMBER, EBML_UINT, 0, 0, offsetof(MatroskaTrack, num) },
611  { MATROSKA_ID_TRACKNAME, EBML_UTF8, 0, 0, offsetof(MatroskaTrack, name) },
612  { MATROSKA_ID_TRACKUID, EBML_UINT, 0, 0, offsetof(MatroskaTrack, uid) },
613  { MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, 0, offsetof(MatroskaTrack, type) },
614  { MATROSKA_ID_CODECID, EBML_STR, 0, 0, offsetof(MatroskaTrack, codec_id) },
615  { MATROSKA_ID_CODECPRIVATE, EBML_BIN, 0, 0, offsetof(MatroskaTrack, codec_priv) },
616  { MATROSKA_ID_CODECDELAY, EBML_UINT, 0, 0, offsetof(MatroskaTrack, codec_delay), { .u = 0 } },
617  { MATROSKA_ID_TRACKLANGUAGE, EBML_STR, 0, 0, offsetof(MatroskaTrack, language), { .s = "eng" } },
618  { MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, 0, offsetof(MatroskaTrack, default_duration) },
619  { MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT, 0, 0, offsetof(MatroskaTrack, time_scale), { .f = 1.0 } },
620  { MATROSKA_ID_TRACKFLAGCOMMENTARY, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_comment), { .u = 0 } },
621  { MATROSKA_ID_TRACKFLAGDEFAULT, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_default), { .u = 1 } },
622  { MATROSKA_ID_TRACKFLAGFORCED, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_forced), { .u = 0 } },
623  { MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_hearingimpaired), { .u = 0 } },
624  { MATROSKA_ID_TRACKFLAGVISUALIMPAIRED, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_visualimpaired), { .u = 0 } },
625  { MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS, EBML_UINT, 0, 0, offsetof(MatroskaTrack, flag_textdescriptions), { .u = 0 } },
626  { MATROSKA_ID_TRACKFLAGORIGINAL, EBML_UINT, 1, 0, offsetof(MatroskaTrack, flag_original), {.u = 0 } },
628  { MATROSKA_ID_TRACKAUDIO, EBML_NEST, 0, 0, offsetof(MatroskaTrack, audio), { .n = matroska_track_audio } },
629  { MATROSKA_ID_TRACKOPERATION, EBML_NEST, 0, 0, offsetof(MatroskaTrack, operation), { .n = matroska_track_operation } },
631  { MATROSKA_ID_TRACKMAXBLKADDID, EBML_UINT, 0, 0, offsetof(MatroskaTrack, max_block_additional_id), { .u = 0 } },
632  { MATROSKA_ID_TRACKBLKADDMAPPING, EBML_NEST, 0, sizeof(MatroskaBlockAdditionMapping), offsetof(MatroskaTrack, block_addition_mappings), { .n = matroska_block_addition_mapping } },
633  { MATROSKA_ID_SEEKPREROLL, EBML_UINT, 0, 0, offsetof(MatroskaTrack, seek_preroll), { .u = 0 } },
643 };
644 
645 static EbmlSyntax matroska_tracks[] = {
646  { MATROSKA_ID_TRACKENTRY, EBML_NEST, 0, sizeof(MatroskaTrack), offsetof(MatroskaDemuxContext, tracks), { .n = matroska_track } },
648 };
649 
650 static EbmlSyntax matroska_attachment[] = {
651  { MATROSKA_ID_FILEUID, EBML_UINT, 0, 0, offsetof(MatroskaAttachment, uid) },
652  { MATROSKA_ID_FILENAME, EBML_UTF8, 0, 0, offsetof(MatroskaAttachment, filename) },
653  { MATROSKA_ID_FILEMIMETYPE, EBML_STR, 0, 0, offsetof(MatroskaAttachment, mime) },
654  { MATROSKA_ID_FILEDATA, EBML_BIN, 0, 0, offsetof(MatroskaAttachment, bin) },
657 };
658 
659 static EbmlSyntax matroska_attachments[] = {
660  { MATROSKA_ID_ATTACHEDFILE, EBML_NEST, 0, sizeof(MatroskaAttachment), offsetof(MatroskaDemuxContext, attachments), { .n = matroska_attachment } },
662 };
663 
665  { MATROSKA_ID_CHAPSTRING, EBML_UTF8, 0, 0, offsetof(MatroskaChapter, title) },
669 };
670 
672  { MATROSKA_ID_CHAPTERTIMESTART, EBML_UINT, 0, 0, offsetof(MatroskaChapter, start), { .u = AV_NOPTS_VALUE } },
673  { MATROSKA_ID_CHAPTERTIMEEND, EBML_UINT, 0, 0, offsetof(MatroskaChapter, end), { .u = AV_NOPTS_VALUE } },
674  { MATROSKA_ID_CHAPTERUID, EBML_UINT, 0, 0, offsetof(MatroskaChapter, uid) },
681 };
682 
683 static EbmlSyntax matroska_chapter[] = {
684  { MATROSKA_ID_CHAPTERATOM, EBML_NEST, 0, sizeof(MatroskaChapter), offsetof(MatroskaDemuxContext, chapters), { .n = matroska_chapter_entry } },
690 };
691 
692 static EbmlSyntax matroska_chapters[] = {
693  { MATROSKA_ID_EDITIONENTRY, EBML_NEST, 0, 0, 0, { .n = matroska_chapter } },
695 };
696 
697 static EbmlSyntax matroska_index_pos[] = {
698  { MATROSKA_ID_CUETRACK, EBML_UINT, 0, 0, offsetof(MatroskaIndexPos, track) },
704 };
705 
706 static EbmlSyntax matroska_index_entry[] = {
707  { MATROSKA_ID_CUETIME, EBML_UINT, 0, 0, offsetof(MatroskaIndex, time) },
710 };
711 
712 static EbmlSyntax matroska_index[] = {
715 };
716 
717 static EbmlSyntax matroska_simpletag[] = {
718  { MATROSKA_ID_TAGNAME, EBML_UTF8, 0, 0, offsetof(MatroskaTag, name) },
719  { MATROSKA_ID_TAGSTRING, EBML_UTF8, 0, 0, offsetof(MatroskaTag, string) },
720  { MATROSKA_ID_TAGLANG, EBML_STR, 0, 0, offsetof(MatroskaTag, lang), { .s = "und" } },
721  { MATROSKA_ID_TAGDEFAULT, EBML_UINT, 0, 0, offsetof(MatroskaTag, def) },
722  { MATROSKA_ID_TAGDEFAULT_BUG, EBML_UINT, 0, 0, offsetof(MatroskaTag, def) },
723  { MATROSKA_ID_SIMPLETAG, EBML_NEST, 0, sizeof(MatroskaTag), offsetof(MatroskaTag, sub), { .n = matroska_simpletag } },
725 };
726 
727 static EbmlSyntax matroska_tagtargets[] = {
729  { MATROSKA_ID_TAGTARGETS_TYPEVALUE, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, typevalue), { .u = 50 } },
730  { MATROSKA_ID_TAGTARGETS_TRACKUID, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, trackuid), { .u = 0 } },
731  { MATROSKA_ID_TAGTARGETS_CHAPTERUID, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, chapteruid), { .u = 0 } },
732  { MATROSKA_ID_TAGTARGETS_ATTACHUID, EBML_UINT, 0, 0, offsetof(MatroskaTagTarget, attachuid), { .u = 0 } },
734 };
735 
736 static EbmlSyntax matroska_tag[] = {
737  { MATROSKA_ID_SIMPLETAG, EBML_NEST, 0, sizeof(MatroskaTag), offsetof(MatroskaTags, tag), { .n = matroska_simpletag } },
738  { MATROSKA_ID_TAGTARGETS, EBML_NEST, 0, 0, offsetof(MatroskaTags, target), { .n = matroska_tagtargets } },
740 };
741 
742 static EbmlSyntax matroska_tags[] = {
743  { MATROSKA_ID_TAG, EBML_NEST, 0, sizeof(MatroskaTags), offsetof(MatroskaDemuxContext, tags), { .n = matroska_tag } },
745 };
746 
748  { MATROSKA_ID_SEEKID, EBML_UINT, 0, 0, offsetof(MatroskaSeekhead, id) },
749  { MATROSKA_ID_SEEKPOSITION, EBML_UINT, 0, 0, offsetof(MatroskaSeekhead, pos), { .u = -1 } },
751 };
752 
753 static EbmlSyntax matroska_seekhead[] = {
754  { MATROSKA_ID_SEEKENTRY, EBML_NEST, 0, sizeof(MatroskaSeekhead), offsetof(MatroskaDemuxContext, seekhead), { .n = matroska_seekhead_entry } },
756 };
757 
758 static EbmlSyntax matroska_segment[] = {
760  { MATROSKA_ID_INFO, EBML_LEVEL1, 0, 0, 0, { .n = matroska_info } },
761  { MATROSKA_ID_TRACKS, EBML_LEVEL1, 0, 0, 0, { .n = matroska_tracks } },
763  { MATROSKA_ID_CHAPTERS, EBML_LEVEL1, 0, 0, 0, { .n = matroska_chapters } },
764  { MATROSKA_ID_CUES, EBML_LEVEL1, 0, 0, 0, { .n = matroska_index } },
765  { MATROSKA_ID_TAGS, EBML_LEVEL1, 0, 0, 0, { .n = matroska_tags } },
766  { MATROSKA_ID_SEEKHEAD, EBML_LEVEL1, 0, 0, 0, { .n = matroska_seekhead } },
767  { 0 } /* We don't want to go back to level 0, so don't add the parent. */
768 };
769 
770 static EbmlSyntax matroska_segments[] = {
771  { MATROSKA_ID_SEGMENT, EBML_NEST, 0, 0, 0, { .n = matroska_segment } },
772  { 0 }
773 };
774 
775 static EbmlSyntax matroska_blockmore[] = {
776  { MATROSKA_ID_BLOCKADDID, EBML_UINT, 0, 0, offsetof(MatroskaBlockMore,additional_id), { .u = MATROSKA_BLOCK_ADD_ID_OPAQUE } },
777  { MATROSKA_ID_BLOCKADDITIONAL, EBML_BIN, 0, 0, offsetof(MatroskaBlockMore,additional) },
779 };
780 
782  { MATROSKA_ID_BLOCKMORE, EBML_NEST, 0, sizeof(MatroskaBlockMore), offsetof(MatroskaBlock, blockmore), { .n = matroska_blockmore } },
784 };
785 
786 static EbmlSyntax matroska_blockgroup[] = {
787  { MATROSKA_ID_BLOCK, EBML_BIN, 0, 0, offsetof(MatroskaBlock, bin) },
790  { MATROSKA_ID_DISCARDPADDING, EBML_SINT, 0, 0, offsetof(MatroskaBlock, discard_padding) },
791  { MATROSKA_ID_BLOCKREFERENCE, EBML_SINT, 1, 0, offsetof(MatroskaBlock, reference) },
793  { 1, EBML_UINT, 0, 0, offsetof(MatroskaBlock, non_simple), { .u = 1 } },
795 };
796 
797 // The following array contains SimpleBlock and BlockGroup twice
798 // in order to reuse the other values for matroska_cluster_enter.
800  { MATROSKA_ID_SIMPLEBLOCK, EBML_BIN, 0, 0, offsetof(MatroskaBlock, bin) },
801  { MATROSKA_ID_BLOCKGROUP, EBML_NEST, 0, 0, 0, { .n = matroska_blockgroup } },
802  { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, 0, offsetof(MatroskaCluster, timecode) },
808 };
809 
811  { MATROSKA_ID_CLUSTER, EBML_NEST, 0, 0, 0, { .n = &matroska_cluster_parsing[2] } },
812  { 0 }
813 };
814 #undef CHILD_OF
815 
816 static const CodecMime mkv_image_mime_tags[] = {
817  {"image/gif" , AV_CODEC_ID_GIF},
818  {"image/jpeg" , AV_CODEC_ID_MJPEG},
819  {"image/png" , AV_CODEC_ID_PNG},
820  {"image/tiff" , AV_CODEC_ID_TIFF},
821 
822  {"" , AV_CODEC_ID_NONE}
823 };
824 
825 static const CodecMime mkv_mime_tags[] = {
826  {"application/x-truetype-font", AV_CODEC_ID_TTF},
827  {"application/x-font" , AV_CODEC_ID_TTF},
828  {"application/vnd.ms-opentype", AV_CODEC_ID_OTF},
829  {"binary" , AV_CODEC_ID_BIN_DATA},
830 
831  {"" , AV_CODEC_ID_NONE}
832 };
833 
835  "left",
836  "right",
837  "background",
838 };
839 
840 static const char *const matroska_doctypes[] = { "matroska", "webm" };
841 
842 /*
843  * This function prepares the status for parsing of level 1 elements.
844  */
845 static int matroska_reset_status(MatroskaDemuxContext *matroska,
846  uint32_t id, int64_t position)
847 {
848  int64_t err = 0;
849  if (position >= 0) {
850  err = avio_seek(matroska->ctx->pb, position, SEEK_SET);
851  if (err > 0)
852  err = 0;
853  } else
854  position = avio_tell(matroska->ctx->pb);
855 
856  matroska->current_id = id;
857  matroska->num_levels = 1;
858  matroska->unknown_count = 0;
859  matroska->resync_pos = position;
860  if (id)
861  matroska->resync_pos -= (av_log2(id) + 7) / 8;
862 
863  return err;
864 }
865 
866 static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
867 {
868  AVIOContext *pb = matroska->ctx->pb;
869  uint32_t id;
870 
871  /* Try to seek to the last position to resync from. If this doesn't work,
872  * we resync from the earliest position available: The start of the buffer. */
873  if (last_pos < avio_tell(pb) && avio_seek(pb, last_pos + 1, SEEK_SET) < 0) {
874  av_log(matroska->ctx, AV_LOG_WARNING,
875  "Seek to desired resync point failed. Seeking to "
876  "earliest point available instead.\n");
877  avio_seek(pb, FFMAX(avio_tell(pb) + (pb->buffer - pb->buf_ptr),
878  last_pos + 1), SEEK_SET);
879  }
880 
881  id = avio_rb32(pb);
882 
883  // try to find a toplevel element
884  while (!avio_feof(pb)) {
885  if (id == MATROSKA_ID_INFO || id == MATROSKA_ID_TRACKS ||
886  id == MATROSKA_ID_CUES || id == MATROSKA_ID_TAGS ||
888  id == MATROSKA_ID_CLUSTER || id == MATROSKA_ID_CHAPTERS) {
889  /* Prepare the context for parsing of a level 1 element. */
890  matroska_reset_status(matroska, id, -1);
891  /* Given that we are here means that an error has occurred,
892  * so treat the segment as unknown length in order not to
893  * discard valid data that happens to be beyond the designated
894  * end of the segment. */
895  matroska->levels[0].length = EBML_UNKNOWN_LENGTH;
896  return 0;
897  }
898  id = (id << 8) | avio_r8(pb);
899  }
900 
901  matroska->done = 1;
902  return pb->error ? pb->error : AVERROR_EOF;
903 }
904 
905 /*
906  * Read: an "EBML number", which is defined as a variable-length
907  * array of bytes. The first byte indicates the length by giving a
908  * number of 0-bits followed by a one. The position of the first
909  * "one" bit inside the first byte indicates the length of this
910  * number.
911  * Returns: number of bytes read, < 0 on error
912  */
913 static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb,
914  int max_size, uint64_t *number, int eof_forbidden)
915 {
916  int read, n = 1;
917  uint64_t total;
918  int64_t pos;
919 
920  /* The first byte tells us the length in bytes - except when it is zero. */
921  total = avio_r8(pb);
922  if (pb->eof_reached)
923  goto err;
924 
925  /* get the length of the EBML number */
926  read = 8 - ff_log2_tab[total];
927 
928  if (!total || read > max_size) {
929  pos = avio_tell(pb) - 1;
930  if (!total) {
931  av_log(matroska->ctx, AV_LOG_ERROR,
932  "0x00 at pos %"PRId64" (0x%"PRIx64") invalid as first byte "
933  "of an EBML number\n", pos, pos);
934  } else {
935  av_log(matroska->ctx, AV_LOG_ERROR,
936  "Length %d indicated by an EBML number's first byte 0x%02x "
937  "at pos %"PRId64" (0x%"PRIx64") exceeds max length %d.\n",
938  read, (uint8_t) total, pos, pos, max_size);
939  }
940  return AVERROR_INVALIDDATA;
941  }
942 
943  /* read out length */
944  total ^= 1 << ff_log2_tab[total];
945  while (n++ < read)
946  total = (total << 8) | avio_r8(pb);
947 
948  if (pb->eof_reached) {
949  eof_forbidden = 1;
950  goto err;
951  }
952 
953  *number = total;
954 
955  return read;
956 
957 err:
958  pos = avio_tell(pb);
959  if (pb->error) {
960  av_log(matroska->ctx, AV_LOG_ERROR,
961  "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
962  pos, pos);
963  return pb->error;
964  }
965  if (eof_forbidden) {
966  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
967  "at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
968  return AVERROR(EIO);
969  }
970  return AVERROR_EOF;
971 }
972 
973 /**
974  * Read a EBML length value.
975  * This needs special handling for the "unknown length" case which has multiple
976  * encodings.
977  */
978 static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb,
979  uint64_t *number)
980 {
981  int res = ebml_read_num(matroska, pb, 8, number, 1);
982  if (res > 0 && *number + 1 == 1ULL << (7 * res))
983  *number = EBML_UNKNOWN_LENGTH;
984  return res;
985 }
986 
987 /*
988  * Read the next element as an unsigned int.
989  * Returns NEEDS_CHECKING unless size == 0.
990  */
991 static int ebml_read_uint(AVIOContext *pb, int size,
992  uint64_t default_value, uint64_t *num)
993 {
994  int n = 0;
995 
996  if (size == 0) {
997  *num = default_value;
998  return 0;
999  }
1000  /* big-endian ordering; build up number */
1001  *num = 0;
1002  while (n++ < size)
1003  *num = (*num << 8) | avio_r8(pb);
1004 
1005  return NEEDS_CHECKING;
1007 
1008 /*
1009  * Read the next element as a signed int.
1010  * Returns NEEDS_CHECKING unless size == 0.
1011  */
1012 static int ebml_read_sint(AVIOContext *pb, int size,
1013  int64_t default_value, int64_t *num)
1014 {
1015  int n = 1;
1016 
1017  if (size == 0) {
1018  *num = default_value;
1019  return 0;
1020  } else {
1021  *num = sign_extend(avio_r8(pb), 8);
1022 
1023  /* big-endian ordering; build up number */
1024  while (n++ < size)
1025  *num = ((uint64_t)*num << 8) | avio_r8(pb);
1026  }
1027 
1028  return NEEDS_CHECKING;
1030 
1031 /*
1032  * Read the next element as a float.
1033  * Returns 0 if size == 0, NEEDS_CHECKING or < 0 on obvious failure.
1034  */
1035 static int ebml_read_float(AVIOContext *pb, int size,
1036  double default_value, double *num)
1037 {
1038  if (size == 0) {
1039  *num = default_value;
1040  return 0;
1041  } else if (size == 4) {
1042  *num = av_int2float(avio_rb32(pb));
1043  } else if (size == 8) {
1044  *num = av_int2double(avio_rb64(pb));
1045  } else
1046  return AVERROR_INVALIDDATA;
1047 
1048  return NEEDS_CHECKING;
1050 
1051 /*
1052  * Read the next element as an ASCII string.
1053  * 0 is success, < 0 or NEEDS_CHECKING is failure.
1054  */
1055 static int ebml_read_ascii(AVIOContext *pb, int size,
1056  const char *default_value, char **str)
1057 {
1058  char *res;
1059  int ret;
1060 
1061  if (size == 0 && default_value) {
1062  res = av_strdup(default_value);
1063  if (!res)
1064  return AVERROR(ENOMEM);
1065  } else {
1066  /* EBML strings are usually not 0-terminated, so we allocate one
1067  * byte more, read the string and NUL-terminate it ourselves. */
1068  if (!(res = av_malloc(size + 1)))
1069  return AVERROR(ENOMEM);
1070  if ((ret = avio_read(pb, (uint8_t *) res, size)) != size) {
1071  av_free(res);
1072  return ret < 0 ? ret : NEEDS_CHECKING;
1073  }
1074  (res)[size] = '\0';
1075  }
1076  av_free(*str);
1077  *str = res;
1078 
1079  return 0;
1081 
1082 /*
1083  * Read the next element as binary data.
1084  * 0 is success, < 0 or NEEDS_CHECKING is failure.
1085  */
1086 static int ebml_read_binary(AVIOContext *pb, int length,
1087  int64_t pos, EbmlBin *bin)
1088 {
1089  int ret;
1090 
1092  if (ret < 0)
1093  return ret;
1094  memset(bin->buf->data + length, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1095 
1096  bin->data = bin->buf->data;
1097  bin->size = length;
1098  bin->pos = pos;
1099  if ((ret = avio_read(pb, bin->data, length)) != length) {
1100  av_buffer_unref(&bin->buf);
1101  bin->data = NULL;
1102  bin->size = 0;
1103  return ret < 0 ? ret : NEEDS_CHECKING;
1104  }
1105 
1106  return 0;
1107 }
1109 /*
1110  * Read the next element, but only the header. The contents
1111  * are supposed to be sub-elements which can be read separately.
1112  * 0 is success, < 0 is failure.
1113  */
1114 static int ebml_read_master(MatroskaDemuxContext *matroska,
1115  uint64_t length, int64_t pos)
1116 {
1118 
1119  if (matroska->num_levels >= EBML_MAX_DEPTH) {
1120  av_log(matroska->ctx, AV_LOG_ERROR,
1121  "File moves beyond max. allowed depth (%d)\n", EBML_MAX_DEPTH);
1122  return AVERROR(ENOSYS);
1123  }
1124 
1125  level = &matroska->levels[matroska->num_levels++];
1126  level->start = pos;
1127  level->length = length;
1128 
1129  return 0;
1131 
1132 /*
1133  * Read a signed "EBML number"
1134  * Return: number of bytes processed, < 0 on error
1135  */
1136 static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska,
1137  AVIOContext *pb, int64_t *num)
1138 {
1139  uint64_t unum;
1140  int res;
1141 
1142  /* read as unsigned number first */
1143  if ((res = ebml_read_num(matroska, pb, 8, &unum, 1)) < 0)
1144  return res;
1145 
1146  /* make signed (weird way) */
1147  *num = unum - ((1LL << (7 * res - 1)) - 1);
1148 
1149  return res;
1150 }
1151 
1152 static int ebml_parse(MatroskaDemuxContext *matroska,
1153  EbmlSyntax *syntax, void *data);
1154 
1155 static EbmlSyntax *ebml_parse_id(EbmlSyntax *syntax, uint32_t id)
1156 {
1157  int i;
1158 
1159  // Whoever touches this should be aware of the duplication
1160  // existing in matroska_cluster_parsing.
1161  for (i = 0; syntax[i].id; i++)
1162  if (id == syntax[i].id)
1163  break;
1164 
1165  return &syntax[i];
1166 }
1167 
1168 static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
1169  void *data)
1170 {
1171  int res;
1172 
1173  if (data) {
1174  for (int i = 0; syntax[i].id; i++) {
1175  void *dst = (char *)data + syntax[i].data_offset;
1176  switch (syntax[i].type) {
1177  case EBML_UINT:
1178  *(uint64_t *)dst = syntax[i].def.u;
1179  break;
1180  case EBML_SINT:
1181  *(int64_t *) dst = syntax[i].def.i;
1182  break;
1183  case EBML_FLOAT:
1184  *(double *) dst = syntax[i].def.f;
1185  break;
1186  case EBML_STR:
1187  case EBML_UTF8:
1188  // the default may be NULL
1189  if (syntax[i].def.s) {
1190  *(char**)dst = av_strdup(syntax[i].def.s);
1191  if (!*(char**)dst)
1192  return AVERROR(ENOMEM);
1193  }
1194  break;
1195  }
1196  }
1197 
1198  if (!matroska->levels[matroska->num_levels - 1].length) {
1199  matroska->num_levels--;
1200  return 0;
1201  }
1202  }
1203 
1204  do {
1205  res = ebml_parse(matroska, syntax, data);
1206  } while (!res);
1207 
1208  return res == LEVEL_ENDED ? 0 : res;
1209 }
1210 
1211 static int is_ebml_id_valid(uint32_t id)
1212 {
1213  // Due to endian nonsense in Matroska, the highest byte with any bits set
1214  // will contain the leading length bit. This bit in turn identifies the
1215  // total byte length of the element by its position within the byte.
1216  unsigned int bits = av_log2(id);
1217  return id && (bits + 7) / 8 == (8 - bits % 8);
1219 
1220 /*
1221  * Allocate and return the entry for the level1 element with the given ID. If
1222  * an entry already exists, return the existing entry.
1223  */
1225  uint32_t id, int64_t pos)
1226 {
1227  int i;
1228  MatroskaLevel1Element *elem;
1229 
1230  if (!is_ebml_id_valid(id))
1231  return NULL;
1232 
1233  // Some files link to all clusters; useless.
1234  if (id == MATROSKA_ID_CLUSTER)
1235  return NULL;
1236 
1237  // There can be multiple SeekHeads and Tags.
1238  for (i = 0; i < matroska->num_level1_elems; i++) {
1239  if (matroska->level1_elems[i].id == id) {
1240  if (matroska->level1_elems[i].pos == pos ||
1241  id != MATROSKA_ID_SEEKHEAD && id != MATROSKA_ID_TAGS)
1242  return &matroska->level1_elems[i];
1243  }
1244  }
1245 
1246  // Only a completely broken file would have more elements.
1247  if (matroska->num_level1_elems >= FF_ARRAY_ELEMS(matroska->level1_elems)) {
1248  av_log(matroska->ctx, AV_LOG_ERROR, "Too many level1 elements.\n");
1249  return NULL;
1250  }
1251 
1252  elem = &matroska->level1_elems[matroska->num_level1_elems++];
1253  *elem = (MatroskaLevel1Element){.id = id};
1254 
1255  return elem;
1256 }
1257 
1258 static int ebml_parse(MatroskaDemuxContext *matroska,
1259  EbmlSyntax *syntax, void *data)
1260 {
1261  static const uint64_t max_lengths[EBML_TYPE_COUNT] = {
1262  // Forbid unknown-length EBML_NONE elements.
1264  [EBML_UINT] = 8,
1265  [EBML_SINT] = 8,
1266  [EBML_FLOAT] = 8,
1267  // max. 16 MB for strings
1268  [EBML_STR] = 0x1000000,
1269  [EBML_UTF8] = 0x1000000,
1270  // max. 256 MB for binary data
1271  [EBML_BIN] = 0x10000000,
1272  // no limits for anything else
1273  };
1274  AVIOContext *pb = matroska->ctx->pb;
1275  uint32_t id;
1276  uint64_t length;
1277  int64_t pos = avio_tell(pb), pos_alt;
1278  int res, update_pos = 1, level_check;
1279  MatroskaLevel1Element *level1_elem;
1280  MatroskaLevel *level = matroska->num_levels ? &matroska->levels[matroska->num_levels - 1] : NULL;
1281 
1282  if (!matroska->current_id) {
1283  uint64_t id;
1284  res = ebml_read_num(matroska, pb, 4, &id, 0);
1285  if (res < 0) {
1286  if (pb->eof_reached && res == AVERROR_EOF) {
1287  if (matroska->is_live)
1288  // in live mode, finish parsing if EOF is reached.
1289  return 1;
1290  if (level && pos == avio_tell(pb)) {
1291  if (level->length == EBML_UNKNOWN_LENGTH) {
1292  // Unknown-length levels automatically end at EOF.
1293  matroska->num_levels--;
1294  return LEVEL_ENDED;
1295  } else {
1296  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
1297  "at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
1298  }
1299  }
1300  }
1301  return res;
1302  }
1303  matroska->current_id = id | 1 << 7 * res;
1304  pos_alt = pos + res;
1305  } else {
1306  pos_alt = pos;
1307  pos -= (av_log2(matroska->current_id) + 7) / 8;
1308  }
1309 
1310  id = matroska->current_id;
1311 
1312  syntax = ebml_parse_id(syntax, id);
1313  if (!syntax->id && id != EBML_ID_VOID && id != EBML_ID_CRC32) {
1314  if (level && level->length == EBML_UNKNOWN_LENGTH) {
1315  // Unknown-length levels end when an element from an upper level
1316  // in the hierarchy is encountered.
1317  while (syntax->def.n) {
1318  syntax = ebml_parse_id(syntax->def.n, id);
1319  if (syntax->id) {
1320  matroska->num_levels--;
1321  return LEVEL_ENDED;
1322  }
1323  // We have not encountered a known element; syntax is a sentinel.
1324  av_assert1(syntax->type == EBML_NONE);
1325  };
1326  }
1327 
1328  av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32" at pos. "
1329  "%"PRId64"\n", id, pos);
1330  update_pos = 0; /* Don't update resync_pos as an error might have happened. */
1331  }
1332 
1333  if (data) {
1334  data = (char *) data + syntax->data_offset;
1335  if (syntax->list_elem_size) {
1336  EbmlList *list = data;
1337  void *newelem;
1338 
1339  if ((unsigned)list->nb_elem + 1 >= UINT_MAX / syntax->list_elem_size)
1340  return AVERROR(ENOMEM);
1341  newelem = av_fast_realloc(list->elem,
1342  &list->alloc_elem_size,
1343  (list->nb_elem + 1) * syntax->list_elem_size);
1344  if (!newelem)
1345  return AVERROR(ENOMEM);
1346  list->elem = newelem;
1347  data = (char *) list->elem + list->nb_elem * syntax->list_elem_size;
1348  memset(data, 0, syntax->list_elem_size);
1349  list->nb_elem++;
1350  }
1351  }
1352 
1353  if (syntax->type != EBML_STOP) {
1354  matroska->current_id = 0;
1355  if ((res = ebml_read_length(matroska, pb, &length)) < 0)
1356  return res;
1357 
1358  pos_alt += res;
1359 
1360  if (matroska->num_levels > 0) {
1361  if (length != EBML_UNKNOWN_LENGTH &&
1362  level->length != EBML_UNKNOWN_LENGTH) {
1363  uint64_t elem_end = pos_alt + length,
1364  level_end = level->start + level->length;
1365 
1366  if (elem_end < level_end) {
1367  level_check = 0;
1368  } else if (elem_end == level_end) {
1369  level_check = LEVEL_ENDED;
1370  } else {
1371  av_log(matroska->ctx, AV_LOG_ERROR,
1372  "Element at 0x%"PRIx64" ending at 0x%"PRIx64" exceeds "
1373  "containing master element ending at 0x%"PRIx64"\n",
1374  pos, elem_end, level_end);
1375  return AVERROR_INVALIDDATA;
1376  }
1377  } else if (length != EBML_UNKNOWN_LENGTH) {
1378  level_check = 0;
1379  } else if (level->length != EBML_UNKNOWN_LENGTH) {
1380  av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element "
1381  "at 0x%"PRIx64" inside parent with finite size\n", pos);
1382  return AVERROR_INVALIDDATA;
1383  } else {
1384  level_check = 0;
1385  if (id != MATROSKA_ID_CLUSTER && (syntax->type == EBML_LEVEL1
1386  || syntax->type == EBML_NEST)) {
1387  // According to the current specifications only clusters and
1388  // segments are allowed to be unknown-length. We also accept
1389  // other unknown-length master elements.
1390  av_log(matroska->ctx, AV_LOG_WARNING,
1391  "Found unknown-length element 0x%"PRIX32" other than "
1392  "a cluster at 0x%"PRIx64". Spec-incompliant, but "
1393  "parsing will nevertheless be attempted.\n", id, pos);
1394  update_pos = -1;
1395  }
1396  }
1397  } else
1398  level_check = 0;
1399 
1400  if (max_lengths[syntax->type] && length > max_lengths[syntax->type]) {
1401  if (length != EBML_UNKNOWN_LENGTH) {
1402  av_log(matroska->ctx, AV_LOG_ERROR,
1403  "Invalid length 0x%"PRIx64" > 0x%"PRIx64" for element "
1404  "with ID 0x%"PRIX32" at 0x%"PRIx64"\n",
1405  length, max_lengths[syntax->type], id, pos);
1406  } else if (syntax->type != EBML_NONE) {
1407  av_log(matroska->ctx, AV_LOG_ERROR,
1408  "Element with ID 0x%"PRIX32" at pos. 0x%"PRIx64" has "
1409  "unknown length, yet the length of an element of its "
1410  "type must be known.\n", id, pos);
1411  } else {
1412  av_log(matroska->ctx, AV_LOG_ERROR,
1413  "Found unknown-length element with ID 0x%"PRIX32" at "
1414  "pos. 0x%"PRIx64" for which no syntax for parsing is "
1415  "available.\n", id, pos);
1416  }
1417  return AVERROR_INVALIDDATA;
1418  }
1419 
1420  if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
1421  // Loosing sync will likely manifest itself as encountering unknown
1422  // elements which are not reliably distinguishable from elements
1423  // belonging to future extensions of the format.
1424  // We use a heuristic to detect such situations: If the current
1425  // element is not expected at the current syntax level and there
1426  // were only a few unknown elements in a row, then the element is
1427  // skipped or considered defective based upon the length of the
1428  // current element (i.e. how much would be skipped); if there were
1429  // more than a few skipped elements in a row and skipping the current
1430  // element would lead us more than SKIP_THRESHOLD away from the last
1431  // known good position, then it is inferred that an error occurred.
1432  // The dependency on the number of unknown elements in a row exists
1433  // because the distance to the last known good position is
1434  // automatically big if the last parsed element was big.
1435  // In both cases, each unknown element is considered equivalent to
1436  // UNKNOWN_EQUIV of skipped bytes for the check.
1437  // The whole check is only done for non-seekable output, because
1438  // in this situation skipped data can't simply be rechecked later.
1439  // This is especially important when using unkown length elements
1440  // as the check for whether a child exceeds its containing master
1441  // element is not effective in this situation.
1442  if (update_pos) {
1443  matroska->unknown_count = 0;
1444  } else {
1445  int64_t dist = length + UNKNOWN_EQUIV * matroska->unknown_count++;
1446 
1447  if (matroska->unknown_count > 3)
1448  dist += pos_alt - matroska->resync_pos;
1449 
1450  if (dist > SKIP_THRESHOLD) {
1451  av_log(matroska->ctx, AV_LOG_ERROR,
1452  "Unknown element %"PRIX32" at pos. 0x%"PRIx64" with "
1453  "length 0x%"PRIx64" considered as invalid data. Last "
1454  "known good position 0x%"PRIx64", %d unknown elements"
1455  " in a row\n", id, pos, length, matroska->resync_pos,
1456  matroska->unknown_count);
1457  return AVERROR_INVALIDDATA;
1458  }
1459  }
1460  }
1461 
1462  if (update_pos > 0) {
1463  // We have found an element that is allowed at this place
1464  // in the hierarchy and it passed all checks, so treat the beginning
1465  // of the element as the "last known good" position.
1466  matroska->resync_pos = pos;
1467  }
1468 
1469  if (!data && length != EBML_UNKNOWN_LENGTH)
1470  goto skip;
1471  }
1472 
1473  switch (syntax->type) {
1474  case EBML_UINT:
1475  res = ebml_read_uint(pb, length, syntax->def.u, data);
1476  break;
1477  case EBML_SINT:
1478  res = ebml_read_sint(pb, length, syntax->def.i, data);
1479  break;
1480  case EBML_FLOAT:
1481  res = ebml_read_float(pb, length, syntax->def.f, data);
1482  break;
1483  case EBML_STR:
1484  case EBML_UTF8:
1485  res = ebml_read_ascii(pb, length, syntax->def.s, data);
1486  break;
1487  case EBML_BIN:
1488  res = ebml_read_binary(pb, length, pos_alt, data);
1489  break;
1490  case EBML_LEVEL1:
1491  case EBML_NEST:
1492  if ((res = ebml_read_master(matroska, length, pos_alt)) < 0)
1493  return res;
1494  if (id == MATROSKA_ID_SEGMENT)
1495  matroska->segment_start = pos_alt;
1496  if (id == MATROSKA_ID_CUES)
1497  matroska->cues_parsing_deferred = 0;
1498  if (syntax->type == EBML_LEVEL1 &&
1499  (level1_elem = matroska_find_level1_elem(matroska, syntax->id, pos))) {
1500  if (!level1_elem->pos) {
1501  // Zero is not a valid position for a level 1 element.
1502  level1_elem->pos = pos;
1503  } else if (level1_elem->pos != pos)
1504  av_log(matroska->ctx, AV_LOG_ERROR, "Duplicate element\n");
1505  level1_elem->parsed = 1;
1506  }
1507  if (res = ebml_parse_nest(matroska, syntax->def.n, data))
1508  return res;
1509  break;
1510  case EBML_STOP:
1511  return 1;
1512  skip:
1513  default:
1514  if (length) {
1515  int64_t res2;
1516  if (ffio_limit(pb, length) != length) {
1517  // ffio_limit emits its own error message,
1518  // so we don't have to.
1519  return AVERROR(EIO);
1520  }
1521  if ((res2 = avio_skip(pb, length - 1)) >= 0) {
1522  // avio_skip might take us past EOF. We check for this
1523  // by skipping only length - 1 bytes, reading a byte and
1524  // checking the error flags. This is done in order to check
1525  // that the element has been properly skipped even when
1526  // no filesize (that ffio_limit relies on) is available.
1527  avio_r8(pb);
1528  res = NEEDS_CHECKING;
1529  } else
1530  res = res2;
1531  } else
1532  res = 0;
1533  }
1534  if (res) {
1535  if (res == NEEDS_CHECKING) {
1536  if (pb->eof_reached) {
1537  if (pb->error)
1538  res = pb->error;
1539  else
1540  res = AVERROR_EOF;
1541  } else
1542  goto level_check;
1543  }
1544 
1545  if (res == AVERROR_INVALIDDATA)
1546  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
1547  else if (res == AVERROR(EIO))
1548  av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
1549  else if (res == AVERROR_EOF) {
1550  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely\n");
1551  res = AVERROR(EIO);
1552  }
1553 
1554  return res;
1555  }
1556 
1557 level_check:
1558  if (syntax->is_counted && data) {
1559  CountedElement *elem = data;
1560  if (elem->count != UINT_MAX)
1561  elem->count++;
1562  }
1563 
1564  if (level_check == LEVEL_ENDED && matroska->num_levels) {
1565  level = &matroska->levels[matroska->num_levels - 1];
1566  pos = avio_tell(pb);
1567 
1568  // Given that pos >= level->start no check for
1569  // level->length != EBML_UNKNOWN_LENGTH is necessary.
1570  while (matroska->num_levels && pos == level->start + level->length) {
1571  matroska->num_levels--;
1572  level--;
1573  }
1574  }
1575 
1576  return level_check;
1577 }
1578 
1579 static void ebml_free(EbmlSyntax *syntax, void *data)
1580 {
1581  int i, j;
1582  for (i = 0; syntax[i].id; i++) {
1583  void *data_off = (char *) data + syntax[i].data_offset;
1584  switch (syntax[i].type) {
1585  case EBML_STR:
1586  case EBML_UTF8:
1587  av_freep(data_off);
1588  break;
1589  case EBML_BIN:
1590  av_buffer_unref(&((EbmlBin *) data_off)->buf);
1591  break;
1592  case EBML_LEVEL1:
1593  case EBML_NEST:
1594  if (syntax[i].list_elem_size) {
1595  EbmlList *list = data_off;
1596  char *ptr = list->elem;
1597  for (j = 0; j < list->nb_elem;
1598  j++, ptr += syntax[i].list_elem_size)
1599  ebml_free(syntax[i].def.n, ptr);
1600  av_freep(&list->elem);
1601  list->nb_elem = 0;
1602  list->alloc_elem_size = 0;
1603  } else
1604  ebml_free(syntax[i].def.n, data_off);
1605  default:
1606  break;
1607  }
1608  }
1609 }
1610 
1611 /*
1612  * Autodetecting...
1613  */
1614 static int matroska_probe(const AVProbeData *p)
1615 {
1616  uint64_t total = 0;
1617  int len_mask = 0x80, size = 1, n = 1, i;
1618 
1619  /* EBML header? */
1620  if (AV_RB32(p->buf) != EBML_ID_HEADER)
1621  return 0;
1622 
1623  /* length of header */
1624  total = p->buf[4];
1625  while (size <= 8 && !(total & len_mask)) {
1626  size++;
1627  len_mask >>= 1;
1628  }
1629  if (size > 8)
1630  return 0;
1631  total &= (len_mask - 1);
1632  while (n < size)
1633  total = (total << 8) | p->buf[4 + n++];
1634 
1635  if (total + 1 == 1ULL << (7 * size)){
1636  /* Unknown-length header - simply parse the whole buffer. */
1637  total = p->buf_size - 4 - size;
1638  } else {
1639  /* Does the probe data contain the whole header? */
1640  if (p->buf_size < 4 + size + total)
1641  return 0;
1642  }
1643 
1644  /* The header should contain a known document type. For now,
1645  * we don't parse the whole header but simply check for the
1646  * availability of that array of characters inside the header.
1647  * Not fully fool-proof, but good enough. */
1648  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++) {
1649  size_t probelen = strlen(matroska_doctypes[i]);
1650  if (total < probelen)
1651  continue;
1652  for (n = 4 + size; n <= 4 + size + total - probelen; n++)
1653  if (!memcmp(p->buf + n, matroska_doctypes[i], probelen))
1654  return AVPROBE_SCORE_MAX;
1655  }
1656 
1657  // probably valid EBML header but no recognized doctype
1658  return AVPROBE_SCORE_EXTENSION;
1659 }
1660 
1662  uint64_t num)
1663 {
1664  MatroskaTrack *tracks = matroska->tracks.elem;
1665  int i;
1666 
1667  for (i = 0; i < matroska->tracks.nb_elem; i++)
1668  if (tracks[i].num == num)
1669  return &tracks[i];
1670 
1671  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %"PRIu64"\n", num);
1672  return NULL;
1673 }
1674 
1675 static int matroska_decode_buffer(uint8_t **buf, int *buf_size,
1676  MatroskaTrack *track)
1677 {
1678  MatroskaTrackEncoding *encodings = track->encodings.elem;
1679  uint8_t *data = *buf;
1680  int isize = *buf_size;
1681  uint8_t *pkt_data = NULL;
1682  uint8_t av_unused *newpktdata;
1683  int pkt_size = isize;
1684  int result = 0;
1685  int olen;
1686 
1687  if (pkt_size >= 10000000U)
1688  return AVERROR_INVALIDDATA;
1689 
1690  switch (encodings[0].compression.algo) {
1692  {
1693  int header_size = encodings[0].compression.settings.size;
1694  uint8_t *header = encodings[0].compression.settings.data;
1695 
1696  if (header_size && !header) {
1697  av_log(NULL, AV_LOG_ERROR, "Compression size but no data in headerstrip\n");
1698  return -1;
1699  }
1700 
1701  if (!header_size)
1702  return 0;
1703 
1704  pkt_size = isize + header_size;
1705  pkt_data = av_malloc(pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1706  if (!pkt_data)
1707  return AVERROR(ENOMEM);
1708 
1709  memcpy(pkt_data, header, header_size);
1710  memcpy(pkt_data + header_size, data, isize);
1711  break;
1712  }
1714  do {
1715  int insize = isize;
1716  olen = pkt_size *= 3;
1717  newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING
1719  if (!newpktdata) {
1720  result = AVERROR(ENOMEM);
1721  goto failed;
1722  }
1723  pkt_data = newpktdata;
1724  result = av_lzo1x_decode(pkt_data, &olen, data, &insize);
1725  } while (result == AV_LZO_OUTPUT_FULL && pkt_size < 10000000);
1726  if (result) {
1728  goto failed;
1729  }
1730  pkt_size -= olen;
1731  break;
1732 #if CONFIG_ZLIB
1734  {
1735  z_stream zstream = { 0 };
1736  if (!pkt_size || inflateInit(&zstream) != Z_OK)
1737  return -1;
1738  zstream.next_in = data;
1739  zstream.avail_in = isize;
1740  do {
1741  pkt_size *= 3;
1742  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1743  if (!newpktdata) {
1744  inflateEnd(&zstream);
1745  result = AVERROR(ENOMEM);
1746  goto failed;
1747  }
1748  pkt_data = newpktdata;
1749  zstream.avail_out = pkt_size - zstream.total_out;
1750  zstream.next_out = pkt_data + zstream.total_out;
1751  result = inflate(&zstream, Z_NO_FLUSH);
1752  } while (result == Z_OK && pkt_size < 10000000);
1753  pkt_size = zstream.total_out;
1754  inflateEnd(&zstream);
1755  if (result != Z_STREAM_END) {
1756  if (result == Z_MEM_ERROR)
1757  result = AVERROR(ENOMEM);
1758  else
1760  goto failed;
1761  }
1762  break;
1763  }
1764 #endif
1765 #if CONFIG_BZLIB
1767  {
1768  bz_stream bzstream = { 0 };
1769  if (!pkt_size || BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
1770  return -1;
1771  bzstream.next_in = data;
1772  bzstream.avail_in = isize;
1773  do {
1774  pkt_size *= 3;
1775  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1776  if (!newpktdata) {
1777  BZ2_bzDecompressEnd(&bzstream);
1778  result = AVERROR(ENOMEM);
1779  goto failed;
1780  }
1781  pkt_data = newpktdata;
1782  bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
1783  bzstream.next_out = pkt_data + bzstream.total_out_lo32;
1784  result = BZ2_bzDecompress(&bzstream);
1785  } while (result == BZ_OK && pkt_size < 10000000);
1786  pkt_size = bzstream.total_out_lo32;
1787  BZ2_bzDecompressEnd(&bzstream);
1788  if (result != BZ_STREAM_END) {
1789  if (result == BZ_MEM_ERROR)
1790  result = AVERROR(ENOMEM);
1791  else
1793  goto failed;
1794  }
1795  break;
1796  }
1797 #endif
1798  default:
1799  return AVERROR_INVALIDDATA;
1800  }
1801 
1802  memset(pkt_data + pkt_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1803 
1804  *buf = pkt_data;
1805  *buf_size = pkt_size;
1806  return 0;
1808 failed:
1809  av_free(pkt_data);
1810  return result;
1811 }
1812 
1814  AVDictionary **metadata, char *prefix)
1815 {
1816  MatroskaTag *tags = list->elem;
1817  char key[1024];
1818  int i;
1819 
1820  for (i = 0; i < list->nb_elem; i++) {
1821  const char *lang = tags[i].lang &&
1822  strcmp(tags[i].lang, "und") ? tags[i].lang : NULL;
1823 
1824  if (!tags[i].name) {
1825  av_log(s, AV_LOG_WARNING, "Skipping invalid tag with no TagName.\n");
1826  continue;
1827  }
1828  if (prefix)
1829  snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name);
1830  else
1831  av_strlcpy(key, tags[i].name, sizeof(key));
1832  if (tags[i].def || !lang) {
1833  av_dict_set(metadata, key, tags[i].string, 0);
1834  if (tags[i].sub.nb_elem)
1835  matroska_convert_tag(s, &tags[i].sub, metadata, key);
1836  }
1837  if (lang) {
1838  av_strlcat(key, "-", sizeof(key));
1839  av_strlcat(key, lang, sizeof(key));
1840  av_dict_set(metadata, key, tags[i].string, 0);
1841  if (tags[i].sub.nb_elem)
1843  }
1844  }
1846 }
1847 
1849 {
1850  MatroskaDemuxContext *matroska = s->priv_data;
1851  MatroskaTags *tags = matroska->tags.elem;
1852  int i, j;
1853 
1854  for (i = 0; i < matroska->tags.nb_elem; i++) {
1855  if (tags[i].target.attachuid) {
1856  MatroskaAttachment *attachment = matroska->attachments.elem;
1857  int found = 0;
1858  for (j = 0; j < matroska->attachments.nb_elem; j++) {
1859  if (attachment[j].uid == tags[i].target.attachuid &&
1860  attachment[j].stream) {
1861  matroska_convert_tag(s, &tags[i].tag,
1862  &attachment[j].stream->metadata, NULL);
1863  found = 1;
1864  }
1865  }
1866  if (!found) {
1868  "The tags at index %d refer to a "
1869  "non-existent attachment %"PRId64".\n",
1870  i, tags[i].target.attachuid);
1871  }
1872  } else if (tags[i].target.chapteruid) {
1873  MatroskaChapter *chapter = matroska->chapters.elem;
1874  int found = 0;
1875  for (j = 0; j < matroska->chapters.nb_elem; j++) {
1876  if (chapter[j].uid == tags[i].target.chapteruid &&
1877  chapter[j].chapter) {
1878  matroska_convert_tag(s, &tags[i].tag,
1879  &chapter[j].chapter->metadata, NULL);
1880  found = 1;
1881  }
1882  }
1883  if (!found) {
1885  "The tags at index %d refer to a non-existent chapter "
1886  "%"PRId64".\n",
1887  i, tags[i].target.chapteruid);
1888  }
1889  } else if (tags[i].target.trackuid) {
1890  MatroskaTrack *track = matroska->tracks.elem;
1891  int found = 0;
1892  for (j = 0; j < matroska->tracks.nb_elem; j++) {
1893  if (track[j].uid == tags[i].target.trackuid &&
1894  track[j].stream) {
1895  matroska_convert_tag(s, &tags[i].tag,
1896  &track[j].stream->metadata, NULL);
1897  found = 1;
1898  }
1899  }
1900  if (!found) {
1902  "The tags at index %d refer to a non-existent track "
1903  "%"PRId64".\n",
1904  i, tags[i].target.trackuid);
1905  }
1906  } else {
1907  matroska_convert_tag(s, &tags[i].tag, &s->metadata,
1908  tags[i].target.type);
1909  }
1910  }
1911 }
1912 
1914  int64_t pos)
1915 {
1916  uint32_t saved_id = matroska->current_id;
1917  int64_t before_pos = avio_tell(matroska->ctx->pb);
1918  int ret = 0;
1919  int ret2;
1920 
1921  /* seek */
1922  if (avio_seek(matroska->ctx->pb, pos, SEEK_SET) == pos) {
1923  /* We don't want to lose our seekhead level, so we add
1924  * a dummy. This is a crude hack. */
1925  if (matroska->num_levels == EBML_MAX_DEPTH) {
1926  av_log(matroska->ctx, AV_LOG_INFO,
1927  "Max EBML element depth (%d) reached, "
1928  "cannot parse further.\n", EBML_MAX_DEPTH);
1930  } else {
1931  matroska->levels[matroska->num_levels] = (MatroskaLevel) { 0, EBML_UNKNOWN_LENGTH };
1932  matroska->num_levels++;
1933  matroska->current_id = 0;
1934 
1935  ret = ebml_parse(matroska, matroska_segment, matroska);
1936  if (ret == LEVEL_ENDED) {
1937  /* This can only happen if the seek brought us beyond EOF. */
1938  ret = AVERROR_EOF;
1939  }
1940  }
1941  }
1942  /* Seek back - notice that in all instances where this is used
1943  * it is safe to set the level to 1. */
1944  ret2 = matroska_reset_status(matroska, saved_id, before_pos);
1945  if (ret >= 0)
1946  ret = ret2;
1947 
1948  return ret;
1949 }
1950 
1951 static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
1952 {
1953  EbmlList *seekhead_list = &matroska->seekhead;
1954  int i;
1955 
1956  // we should not do any seeking in the streaming case
1957  if (!(matroska->ctx->pb->seekable & AVIO_SEEKABLE_NORMAL))
1958  return;
1959 
1960  for (i = 0; i < seekhead_list->nb_elem; i++) {
1961  MatroskaSeekhead *seekheads = seekhead_list->elem;
1962  uint32_t id = seekheads[i].id;
1963  int64_t pos = seekheads[i].pos + matroska->segment_start;
1964  MatroskaLevel1Element *elem;
1965 
1966  if (id != seekheads[i].id || pos < matroska->segment_start)
1967  continue;
1968 
1969  elem = matroska_find_level1_elem(matroska, id, pos);
1970  if (!elem || elem->parsed)
1971  continue;
1972 
1973  elem->pos = pos;
1974 
1975  // defer cues parsing until we actually need cue data.
1976  if (id == MATROSKA_ID_CUES)
1977  continue;
1978 
1979  if (matroska_parse_seekhead_entry(matroska, pos) < 0) {
1980  // mark index as broken
1981  matroska->cues_parsing_deferred = -1;
1982  break;
1983  }
1984 
1985  elem->parsed = 1;
1986  }
1987 }
1988 
1989 static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
1990 {
1991  EbmlList *index_list;
1993  uint64_t index_scale = 1;
1994  int i, j;
1995 
1996  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
1997  return;
1998 
1999  index_list = &matroska->index;
2000  index = index_list->elem;
2001  if (index_list->nb_elem < 2)
2002  return;
2003  if (index[1].time > 1E14 / matroska->time_scale) {
2004  av_log(matroska->ctx, AV_LOG_WARNING, "Dropping apparently-broken index.\n");
2005  return;
2006  }
2007  for (i = 0; i < index_list->nb_elem; i++) {
2008  EbmlList *pos_list = &index[i].pos;
2009  MatroskaIndexPos *pos = pos_list->elem;
2010  for (j = 0; j < pos_list->nb_elem; j++) {
2011  MatroskaTrack *track = matroska_find_track_by_num(matroska,
2012  pos[j].track);
2013  if (track && track->stream)
2014  av_add_index_entry(track->stream,
2015  pos[j].pos + matroska->segment_start,
2016  index[i].time / index_scale, 0, 0,
2018  }
2019  }
2020 }
2021 
2022 static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
2023  int i;
2024 
2025  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
2026  return;
2027 
2028  for (i = 0; i < matroska->num_level1_elems; i++) {
2029  MatroskaLevel1Element *elem = &matroska->level1_elems[i];
2030  if (elem->id == MATROSKA_ID_CUES && !elem->parsed) {
2031  if (matroska_parse_seekhead_entry(matroska, elem->pos) < 0)
2032  matroska->cues_parsing_deferred = -1;
2033  elem->parsed = 1;
2034  break;
2035  }
2036  }
2037 
2038  matroska_add_index_entries(matroska);
2039 }
2040 
2042  unsigned nb_encodings,
2043  MatroskaTrack *track,
2044  char **key_id_base64, void *logctx)
2045 {
2046  if (nb_encodings > 1) {
2047  av_log(logctx, AV_LOG_ERROR,
2048  "Multiple combined encodings not supported\n");
2049  return 0;
2050  }
2051  if (!nb_encodings)
2052  return 0;
2053  if (encodings->type) {
2054  if (encodings->encryption.key_id.size > 0) {
2055  /* Save the encryption key id to be stored later
2056  * as a metadata tag. */
2057  const int b64_size = AV_BASE64_SIZE(encodings->encryption.key_id.size);
2058  *key_id_base64 = av_malloc(b64_size);
2059  if (!*key_id_base64)
2060  return AVERROR(ENOMEM);
2061 
2062  av_base64_encode(*key_id_base64, b64_size,
2063  encodings->encryption.key_id.data,
2064  encodings->encryption.key_id.size);
2065  } else {
2066  encodings->scope = 0;
2067  av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type\n");
2068  }
2069  } else if (
2070 #if CONFIG_ZLIB
2072 #endif
2073 #if CONFIG_BZLIB
2075 #endif
2078  encodings->scope = 0;
2079  av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type\n");
2080  } else if (track->codec_priv.size && encodings[0].scope & 2) {
2081  uint8_t *codec_priv = track->codec_priv.data;
2082  int ret = matroska_decode_buffer(&track->codec_priv.data,
2083  &track->codec_priv.size,
2084  track);
2085  if (ret < 0) {
2086  track->codec_priv.data = NULL;
2087  track->codec_priv.size = 0;
2088  av_log(logctx, AV_LOG_ERROR,
2089  "Failed to decode codec private data\n");
2090  }
2091 
2092  if (codec_priv != track->codec_priv.data) {
2093  av_buffer_unref(&track->codec_priv.buf);
2094  if (track->codec_priv.data) {
2095  track->codec_priv.buf = av_buffer_create(track->codec_priv.data,
2097  NULL, NULL, 0);
2098  if (!track->codec_priv.buf) {
2099  av_freep(&track->codec_priv.data);
2100  track->codec_priv.size = 0;
2101  return AVERROR(ENOMEM);
2102  }
2103  }
2104  }
2105  }
2106  track->needs_decoding = !encodings->type &&
2107  encodings->scope & 1 &&
2108  (encodings->compression.algo !=
2110  encodings->compression.settings.size);
2111 
2112  return 0;
2113 }
2114 
2115 static int matroska_aac_profile(char *codec_id)
2116 {
2117  static const char *const aac_profiles[] = { "MAIN", "LC", "SSR" };
2118  int profile;
2119 
2121  if (strstr(codec_id, aac_profiles[profile]))
2122  break;
2123  return profile + 1;
2124 }
2125 
2126 static int matroska_aac_sri(int samplerate)
2127 {
2128  int sri;
2129 
2130  for (sri = 0; sri < FF_ARRAY_ELEMS(ff_mpeg4audio_sample_rates); sri++)
2131  if (ff_mpeg4audio_sample_rates[sri] == samplerate)
2132  break;
2133  return sri;
2134 }
2135 
2137 {
2138  /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */
2139  ff_dict_set_timestamp(metadata, "creation_time", date_utc / 1000 + 978307200000000LL);
2140 }
2141 
2143  MatroskaTrack *track,
2144  int *offset)
2145 {
2146  AVStream *st = track->stream;
2147  uint8_t *p = track->codec_priv.data;
2148  int size = track->codec_priv.size;
2149 
2150  if (size < 8 + FLAC_STREAMINFO_SIZE || p[4] & 0x7f) {
2151  av_log(s, AV_LOG_WARNING, "Invalid FLAC private data\n");
2152  track->codec_priv.size = 0;
2153  return 0;
2154  }
2155  *offset = 8;
2156  track->codec_priv.size = 8 + FLAC_STREAMINFO_SIZE;
2157 
2158  p += track->codec_priv.size;
2159  size -= track->codec_priv.size;
2160 
2161  /* parse the remaining metadata blocks if present */
2162  while (size >= 4) {
2163  int block_last, block_type, block_size;
2164 
2165  flac_parse_block_header(p, &block_last, &block_type, &block_size);
2166 
2167  p += 4;
2168  size -= 4;
2169  if (block_size > size)
2170  return 0;
2171 
2172  /* check for the channel mask */
2173  if (block_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
2174  AVDictionary *dict = NULL;
2175  AVDictionaryEntry *chmask;
2176 
2177  ff_vorbis_comment(s, &dict, p, block_size, 0);
2178  chmask = av_dict_get(dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL, 0);
2179  if (chmask) {
2180  uint64_t mask = strtol(chmask->value, NULL, 0);
2181  if (!mask || mask & ~0x3ffffULL) {
2183  "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
2184  } else
2186  }
2187  av_dict_free(&dict);
2188  }
2189 
2190  p += block_size;
2191  size -= block_size;
2192  }
2193 
2194  return 0;
2195 }
2196 
2197 static int mkv_field_order(const MatroskaDemuxContext *matroska, uint64_t field_order)
2198 {
2199  int minor, micro, bttb = 0;
2200 
2201  /* workaround a bug in our Matroska muxer, introduced in version 57.36 alongside
2202  * this function, and fixed in 57.52 */
2203  if (matroska->muxingapp && sscanf(matroska->muxingapp, "Lavf57.%d.%d", &minor, &micro) == 2)
2204  bttb = (minor >= 36 && minor <= 51 && micro >= 100);
2205 
2206  switch (field_order) {
2208  return AV_FIELD_PROGRESSIVE;
2210  return AV_FIELD_UNKNOWN;
2212  return AV_FIELD_TT;
2214  return AV_FIELD_BB;
2216  return bttb ? AV_FIELD_TB : AV_FIELD_BT;
2218  return bttb ? AV_FIELD_BT : AV_FIELD_TB;
2219  default:
2220  return AV_FIELD_UNKNOWN;
2221  }
2222 }
2223 
2224 static void mkv_stereo_mode_display_mul(int stereo_mode,
2225  int *h_width, int *h_height)
2226 {
2227  switch (stereo_mode) {
2233  break;
2238  *h_width = 2;
2239  break;
2244  *h_height = 2;
2245  break;
2246  }
2247 }
2248 
2249 static int mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
2250 {
2251  static const struct {
2252  char type;
2253  char flags;
2254  } stereo_mode_conv [] = {
2255 #define STEREO_MODE_CONV(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
2256  [(STEREOMODETYPE)] = { .type = (STEREO3DTYPE), .flags = (FLAGS) },
2257 #define NOTHING(STEREOMODETYPE, WDIV, HDIV, WEBM)
2259  };
2260  AVStereo3D *stereo;
2261  size_t size;
2262 
2263  stereo = av_stereo3d_alloc_size(&size);
2264  if (!stereo)
2265  return AVERROR(ENOMEM);
2266 
2267  stereo->type = stereo_mode_conv[stereo_mode].type;
2268  stereo->flags = stereo_mode_conv[stereo_mode].flags;
2269 
2271  AV_PKT_DATA_STEREO3D, stereo, size, 0)) {
2272  av_freep(&stereo);
2273  return AVERROR(ENOMEM);
2274  }
2275 
2276  return 0;
2277 }
2278 
2279 static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) {
2280  const MatroskaTrackVideoColor *color = track->video.color.elem;
2281  const MatroskaMasteringMeta *mastering_meta;
2282  int has_mastering_primaries, has_mastering_luminance;
2283 
2284  if (!track->video.color.nb_elem)
2285  return 0;
2286 
2287  mastering_meta = &color->mastering_meta;
2288  // Mastering primaries are CIE 1931 coords, and must be > 0.
2289  has_mastering_primaries =
2290  mastering_meta->r_x > 0 && mastering_meta->r_y > 0 &&
2291  mastering_meta->g_x > 0 && mastering_meta->g_y > 0 &&
2292  mastering_meta->b_x > 0 && mastering_meta->b_y > 0 &&
2293  mastering_meta->white_x > 0 && mastering_meta->white_y > 0;
2294  has_mastering_luminance = mastering_meta->max_luminance >
2295  mastering_meta->min_luminance.el.f &&
2296  mastering_meta->min_luminance.el.f >= 0 &&
2297  mastering_meta->min_luminance.count;
2298 
2299  if (color->matrix_coefficients != AVCOL_SPC_RESERVED)
2300  st->codecpar->color_space = color->matrix_coefficients;
2301  if (color->primaries != AVCOL_PRI_RESERVED &&
2302  color->primaries != AVCOL_PRI_RESERVED0)
2303  st->codecpar->color_primaries = color->primaries;
2304  if (color->transfer_characteristics != AVCOL_TRC_RESERVED &&
2305  color->transfer_characteristics != AVCOL_TRC_RESERVED0)
2306  st->codecpar->color_trc = color->transfer_characteristics;
2307  if (color->range != AVCOL_RANGE_UNSPECIFIED &&
2308  color->range <= AVCOL_RANGE_JPEG)
2309  st->codecpar->color_range = color->range;
2310  if (color->chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED &&
2311  color->chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED &&
2312  color->chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB &&
2313  color->chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) {
2314  st->codecpar->chroma_location =
2315  av_chroma_location_pos_to_enum((color->chroma_siting_horz - 1) << 7,
2316  (color->chroma_siting_vert - 1) << 7);
2317  }
2318  if (color->max_cll && color->max_fall) {
2319  size_t size = 0;
2321  if (!metadata)
2322  return AVERROR(ENOMEM);
2325  av_freep(&metadata);
2326  return AVERROR(ENOMEM);
2327  }
2328  metadata->MaxCLL = color->max_cll;
2329  metadata->MaxFALL = color->max_fall;
2330  }
2331 
2332  if (has_mastering_primaries || has_mastering_luminance) {
2333  size_t size = 0;
2335  if (!metadata)
2336  return AVERROR(ENOMEM);
2339  av_freep(&metadata);
2340  return AVERROR(ENOMEM);
2341  }
2342  if (has_mastering_primaries) {
2343  metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX);
2344  metadata->display_primaries[0][1] = av_d2q(mastering_meta->r_y, INT_MAX);
2345  metadata->display_primaries[1][0] = av_d2q(mastering_meta->g_x, INT_MAX);
2346  metadata->display_primaries[1][1] = av_d2q(mastering_meta->g_y, INT_MAX);
2347  metadata->display_primaries[2][0] = av_d2q(mastering_meta->b_x, INT_MAX);
2348  metadata->display_primaries[2][1] = av_d2q(mastering_meta->b_y, INT_MAX);
2349  metadata->white_point[0] = av_d2q(mastering_meta->white_x, INT_MAX);
2350  metadata->white_point[1] = av_d2q(mastering_meta->white_y, INT_MAX);
2351  metadata->has_primaries = 1;
2352  }
2353  if (has_mastering_luminance) {
2354  metadata->max_luminance = av_d2q(mastering_meta->max_luminance, INT_MAX);
2355  metadata->min_luminance = av_d2q(mastering_meta->min_luminance.el.f, INT_MAX);
2356  metadata->has_luminance = 1;
2357  }
2358  }
2359  return 0;
2360 }
2361 
2362 static int mkv_create_display_matrix(AVStream *st,
2363  const MatroskaTrackVideoProjection *proj,
2364  void *logctx)
2365 {
2366  AVPacketSideData *sd;
2367  double pitch = proj->pitch, yaw = proj->yaw, roll = proj->roll;
2368  int32_t *matrix;
2369  int hflip;
2370 
2371  if (pitch == 0.0 && yaw == 0.0 && roll == 0.0)
2372  return 0;
2373 
2374  /* Note: The following constants are exactly representable
2375  * as floating-point numbers. */
2376  if (pitch != 0.0 || (yaw != 0.0 && yaw != 180.0 && yaw != -180.0) ||
2377  isnan(roll)) {
2378  av_log(logctx, AV_LOG_WARNING, "Ignoring non-2D rectangular "
2379  "projection in stream %u (yaw %f, pitch %f, roll %f)\n",
2380  st->index, yaw, pitch, roll);
2381  return 0;
2382  }
2386  9 * sizeof(*matrix), 0);
2387  if (!sd)
2388  return AVERROR(ENOMEM);
2389  matrix = (int32_t*)sd->data;
2390 
2391  hflip = yaw != 0.0;
2392  /* ProjectionPoseRoll is in the counter-clockwise direction
2393  * whereas av_display_rotation_set() expects its argument
2394  * to be oriented clockwise, so we need to negate roll.
2395  * Furthermore, if hflip is set, we need to negate it again
2396  * to account for the fact that the Matroska specifications
2397  * require the yaw rotation to be applied first. */
2398  av_display_rotation_set(matrix, roll * (2 * hflip - 1));
2399  av_display_matrix_flip(matrix, hflip, 0);
2400 
2401  return 0;
2402 }
2403 
2404 static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track,
2405  void *logctx)
2406 {
2407  AVSphericalMapping *spherical;
2408  const MatroskaTrackVideoProjection *mkv_projection = &track->video.projection;
2409  const uint8_t *priv_data = mkv_projection->private.data;
2410  enum AVSphericalProjection projection;
2411  size_t spherical_size;
2412  uint32_t l = 0, t = 0, r = 0, b = 0;
2413  uint32_t padding = 0;
2414 
2415  if (mkv_projection->private.size && priv_data[0] != 0) {
2416  av_log(logctx, AV_LOG_WARNING, "Unknown spherical metadata\n");
2417  return 0;
2418  }
2419 
2420  switch (track->video.projection.type) {
2422  return mkv_create_display_matrix(st, mkv_projection, logctx);
2424  if (track->video.projection.private.size == 20) {
2425  t = AV_RB32(priv_data + 4);
2426  b = AV_RB32(priv_data + 8);
2427  l = AV_RB32(priv_data + 12);
2428  r = AV_RB32(priv_data + 16);
2429 
2430  if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
2431  av_log(logctx, AV_LOG_ERROR,
2432  "Invalid bounding rectangle coordinates "
2433  "%"PRIu32",%"PRIu32",%"PRIu32",%"PRIu32"\n",
2434  l, t, r, b);
2435  return AVERROR_INVALIDDATA;
2436  }
2437  } else if (track->video.projection.private.size != 0) {
2438  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2439  return AVERROR_INVALIDDATA;
2440  }
2441 
2442  if (l || t || r || b)
2443  projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
2444  else
2445  projection = AV_SPHERICAL_EQUIRECTANGULAR;
2446  break;
2448  if (track->video.projection.private.size < 4) {
2449  av_log(logctx, AV_LOG_ERROR, "Missing projection private properties\n");
2450  return AVERROR_INVALIDDATA;
2451  } else if (track->video.projection.private.size == 12) {
2452  uint32_t layout = AV_RB32(priv_data + 4);
2453  if (layout) {
2454  av_log(logctx, AV_LOG_WARNING,
2455  "Unknown spherical cubemap layout %"PRIu32"\n", layout);
2456  return 0;
2457  }
2458  projection = AV_SPHERICAL_CUBEMAP;
2459  padding = AV_RB32(priv_data + 8);
2460  } else {
2461  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2462  return AVERROR_INVALIDDATA;
2463  }
2464  break;
2465  default:
2466  av_log(logctx, AV_LOG_WARNING,
2467  "Unknown spherical metadata type %"PRIu64"\n",
2468  track->video.projection.type);
2469  return 0;
2470  }
2471 
2472  spherical = av_spherical_alloc(&spherical_size);
2473  if (!spherical)
2474  return AVERROR(ENOMEM);
2475 
2476  spherical->projection = projection;
2477 
2478  spherical->yaw = (int32_t) (track->video.projection.yaw * (1 << 16));
2479  spherical->pitch = (int32_t) (track->video.projection.pitch * (1 << 16));
2480  spherical->roll = (int32_t) (track->video.projection.roll * (1 << 16));
2481 
2482  spherical->padding = padding;
2483 
2484  spherical->bound_left = l;
2485  spherical->bound_top = t;
2486  spherical->bound_right = r;
2487  spherical->bound_bottom = b;
2488 
2490  AV_PKT_DATA_SPHERICAL, spherical, spherical_size, 0)) {
2491  av_freep(&spherical);
2492  return AVERROR(ENOMEM);
2493  }
2494 
2495  return 0;
2496 }
2497 
2499  EbmlBin *bin)
2500 {
2501  return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size);
2502 }
2503 
2505 {
2506  const EbmlList *mappings_list = &track->block_addition_mappings;
2507  MatroskaBlockAdditionMapping *mappings = mappings_list->elem;
2508  int ret;
2509 
2510  for (int i = 0; i < mappings_list->nb_elem; i++) {
2511  MatroskaBlockAdditionMapping *mapping = &mappings[i];
2512  uint64_t type = mapping->type;
2513 
2514  switch (mapping->type) {
2517  "Explicit block Addition Mapping type \"Use BlockAddIDValue\", value %"PRIu64","
2518  " name \"%s\" found.\n", mapping->value, mapping->name ? mapping->name : "");
2520  // fall-through
2523  if (mapping->value != type) {
2524  int strict = s->strict_std_compliance >= FF_COMPLIANCE_STRICT;
2525  av_log(s, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
2526  "Invalid Block Addition Value 0x%"PRIx64" for Block Addition Mapping Type "
2527  "0x%"PRIx64", name \"%s\"\n", mapping->value, mapping->type,
2528  mapping->name ? mapping->name : "");
2529  if (strict)
2530  return AVERROR_INVALIDDATA;
2531  }
2532  break;
2535  if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0)
2536  return ret;
2537 
2538  break;
2539  default:
2541  "Unknown Block Addition Mapping type 0x%"PRIx64", value %"PRIu64", name \"%s\"\n",
2542  mapping->type, mapping->value, mapping->name ? mapping->name : "");
2543  if (mapping->value < 2) {
2544  int strict = s->strict_std_compliance >= FF_COMPLIANCE_STRICT;
2545  av_log(s, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
2546  "Invalid Block Addition value 0x%"PRIu64" for unknown Block Addition Mapping "
2547  "type %"PRIx64", name \"%s\"\n", mapping->value, mapping->type,
2548  mapping->name ? mapping->name : "");
2549  if (strict)
2550  return AVERROR_INVALIDDATA;
2551  }
2552  break;
2553  }
2554  }
2555 
2556  return 0;
2557 }
2558 
2559 static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id)
2560 {
2561  const AVCodecTag *codec_tags;
2562 
2563  codec_tags = track->type == MATROSKA_TRACK_TYPE_VIDEO ?
2565 
2566  /* Normalize noncompliant private data that starts with the fourcc
2567  * by expanding/shifting the data by 4 bytes and storing the data
2568  * size at the start. */
2569  if (ff_codec_get_id(codec_tags, AV_RL32(track->codec_priv.data))) {
2570  int ret = av_buffer_realloc(&track->codec_priv.buf,
2572  if (ret < 0)
2573  return ret;
2574 
2575  track->codec_priv.data = track->codec_priv.buf->data;
2576  memmove(track->codec_priv.data + 4, track->codec_priv.data, track->codec_priv.size);
2577  track->codec_priv.size += 4;
2578  AV_WB32(track->codec_priv.data, track->codec_priv.size);
2579  }
2580 
2581  *fourcc = AV_RL32(track->codec_priv.data + 4);
2582  *codec_id = ff_codec_get_id(codec_tags, *fourcc);
2583 
2584  return 0;
2586 
2587 /* An enum with potential return values of the functions for parsing a track.
2588  * Apart from that all these functions can also indicate ordinary errors via
2589  * negative return values. */
2590 enum {
2591  SKIP_TRACK = 1,
2592 };
2593 
2594 #define AAC_MAX_EXTRADATA_SIZE 5
2595 #define TTA_EXTRADATA_SIZE 22
2596 #define WAVPACK_EXTRADATA_SIZE 2
2597 /* Performs the codec-specific part of parsing an audio track. */
2598 static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
2599  const MatroskaDemuxContext *matroska,
2600  AVFormatContext *s, int *extradata_offset)
2601 {
2602  uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
2605  int extradata_size = 0; // > 0 means that the extradata buffer is used
2606  int ret;
2607 
2608  if (!strcmp(track->codec_id, "A_MS/ACM") &&
2609  track->codec_priv.size >= 14) {
2610  FFIOContext b;
2612  track->codec_priv.size);
2613  ret = ff_get_wav_header(s, &b.pub, par,
2614  track->codec_priv.size, 0);
2615  if (ret < 0)
2616  return ret;
2617  *extradata_offset = FFMIN(track->codec_priv.size, 18);
2618  return 0;
2619  } else if (!strcmp(track->codec_id, "A_QUICKTIME") &&
2620  /* Normally 36, but allow noncompliant private data */
2621  track->codec_priv.size >= 32) {
2622  enum AVCodecID codec_id;
2623  uint32_t fourcc;
2624  uint16_t sample_size;
2625 
2626  ret = get_qt_codec(track, &fourcc, &codec_id);
2627  if (ret < 0)
2628  return ret;
2629  sample_size = AV_RB16(track->codec_priv.data + 26);
2630  if (fourcc == 0) {
2631  if (sample_size == 8) {
2632  fourcc = MKTAG('r','a','w',' ');
2634  } else if (sample_size == 16) {
2635  fourcc = MKTAG('t','w','o','s');
2637  }
2638  }
2639  if ((fourcc == MKTAG('t','w','o','s') ||
2640  fourcc == MKTAG('s','o','w','t')) && sample_size == 8)
2642  par->codec_id = codec_id;
2643  par->codec_tag = fourcc;
2644  return 0;
2645  }
2646 
2647  switch (par->codec_id) {
2648  case AV_CODEC_ID_PCM_S16BE:
2649  switch (track->audio.bitdepth) {
2650  case 8:
2652  break;
2653  case 24:
2655  break;
2656  case 32:
2658  break;
2659  }
2660  break;
2661  case AV_CODEC_ID_PCM_S16LE:
2662  switch (track->audio.bitdepth) {
2663  case 8:
2665  break;
2666  case 24:
2668  break;
2669  case 32:
2671  break;
2672  }
2673  break;
2674  case AV_CODEC_ID_PCM_F32LE:
2675  if (track->audio.bitdepth == 64)
2677  break;
2678  case AV_CODEC_ID_AAC:
2679  if (!track->codec_priv.size) {
2680  int profile = matroska_aac_profile(track->codec_id);
2681  int sri = matroska_aac_sri(track->audio.samplerate);
2682 
2683  extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
2684  extradata[1] = ((sri & 0x01) << 7) | (track->audio.channels << 3);
2685  if (strstr(track->codec_id, "SBR")) {
2686  sri = matroska_aac_sri(track->audio.out_samplerate);
2687  extradata[2] = 0x56;
2688  extradata[3] = 0xE5;
2689  extradata[4] = 0x80 | (sri << 3);
2690  extradata_size = 5;
2691  } else
2692  extradata_size = 2;
2693  }
2694  break;
2695  case AV_CODEC_ID_ALAC:
2696  if (track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - AV_INPUT_BUFFER_PADDING_SIZE) {
2697  /* Only ALAC's magic cookie is stored in Matroska's track headers.
2698  * Create the "atom size", "tag", and "tag version" fields the
2699  * decoder expects manually. */
2700  ret = ff_alloc_extradata(par, 12 + track->codec_priv.size);
2701  if (ret < 0)
2702  return ret;
2703  AV_WB32(par->extradata, par->extradata_size);
2704  AV_WB32(&par->extradata[4], MKBETAG('a', 'l', 'a', 'c'));
2705  AV_WB32(&par->extradata[8], 0);
2706  memcpy(&par->extradata[12], track->codec_priv.data,
2707  track->codec_priv.size);
2708  }
2709  break;
2710  case AV_CODEC_ID_TTA:
2711  {
2712  uint8_t *ptr;
2713  if (track->audio.channels > UINT16_MAX ||
2714  track->audio.bitdepth > UINT16_MAX) {
2715  av_log(matroska->ctx, AV_LOG_WARNING,
2716  "Too large audio channel number %"PRIu64
2717  " or bitdepth %"PRIu64". Skipping track.\n",
2718  track->audio.channels, track->audio.bitdepth);
2719  if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
2720  return AVERROR_INVALIDDATA;
2721  else
2722  return SKIP_TRACK;
2723  }
2724  if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
2725  return AVERROR_INVALIDDATA;
2726  extradata_size = TTA_EXTRADATA_SIZE;
2727  ptr = extradata;
2728  bytestream_put_be32(&ptr, AV_RB32("TTA1"));
2729  bytestream_put_le16(&ptr, 1);
2730  bytestream_put_le16(&ptr, track->audio.channels);
2731  bytestream_put_le16(&ptr, track->audio.bitdepth);
2732  bytestream_put_le32(&ptr, track->audio.out_samplerate);
2733  bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
2734  track->audio.out_samplerate,
2735  AV_TIME_BASE * 1000));
2736  break;
2737  }
2738  case AV_CODEC_ID_RA_144:
2739  track->audio.out_samplerate = 8000;
2740  track->audio.channels = 1;
2741  break;
2742  case AV_CODEC_ID_RA_288:
2743  case AV_CODEC_ID_COOK:
2744  case AV_CODEC_ID_ATRAC3:
2745  case AV_CODEC_ID_SIPR:
2746  {
2747  const uint8_t *ptr = track->codec_priv.data;
2748  int flavor;
2749 
2750  if (!track->codec_priv.size)
2751  break;
2752 
2753  if (track->codec_priv.size < 46)
2754  return AVERROR_INVALIDDATA;
2755  ptr += 22;
2756  flavor = bytestream_get_be16(&ptr);
2757  track->audio.coded_framesize = bytestream_get_be32(&ptr);
2758  ptr += 12;
2759  track->audio.sub_packet_h = bytestream_get_be16(&ptr);
2760  track->audio.frame_size = bytestream_get_be16(&ptr);
2761  track->audio.sub_packet_size = bytestream_get_be16(&ptr);
2762  if (track->audio.coded_framesize <= 0 ||
2763  track->audio.sub_packet_h <= 0 ||
2764  track->audio.frame_size <= 0)
2765  return AVERROR_INVALIDDATA;
2766 
2767  if (par->codec_id == AV_CODEC_ID_RA_288) {
2768  if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
2769  != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
2770  return AVERROR_INVALIDDATA;
2771  par->block_align = track->audio.coded_framesize;
2772  track->codec_priv.size = 0;
2773  } else {
2774  if (par->codec_id == AV_CODEC_ID_SIPR) {
2775  static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
2776  if (flavor > 3)
2777  return AVERROR_INVALIDDATA;
2778  track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
2779  par->bit_rate = sipr_bit_rate[flavor];
2780  } else if (track->audio.sub_packet_size <= 0 ||
2781  track->audio.frame_size % track->audio.sub_packet_size)
2782  return AVERROR_INVALIDDATA;
2783  par->block_align = track->audio.sub_packet_size;
2784  *extradata_offset = 78;
2785  }
2786  track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
2787  track->audio.frame_size);
2788  if (!track->audio.buf)
2789  return AVERROR(ENOMEM);
2790  break;
2791  }
2792  case AV_CODEC_ID_ATRAC1:
2793  /* ATRAC1 uses a constant frame size.
2794  * Typical ATRAC1 streams are either mono or stereo.
2795  * At most, ATRAC1 was used to store 8 channels of audio. */
2796  if (track->audio.channels > 8)
2797  return AVERROR_INVALIDDATA;
2798  par->block_align = track->audio.channels * 212;
2799  break;
2800  case AV_CODEC_ID_FLAC:
2801  if (track->codec_priv.size) {
2802  ret = matroska_parse_flac(s, track, extradata_offset);
2803  if (ret < 0)
2804  return ret;
2805  }
2806  break;
2807  case AV_CODEC_ID_WAVPACK:
2808  if (track->codec_priv.size < 2) {
2809  av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
2810  "in absence of valid CodecPrivate.\n");
2811  extradata_size = WAVPACK_EXTRADATA_SIZE;
2812  AV_WL16(extradata, 0x410);
2813  }
2814  break;
2815  }
2816 
2817  if (extradata_size > 0) {
2818  ret = ff_alloc_extradata(par, extradata_size);
2819  if (ret < 0)
2820  return ret;
2821  memcpy(par->extradata, extradata, extradata_size);
2822  }
2823 
2824  return 0;
2825 }
2826 
2827 /* Performs the generic part of parsing an audio track. */
2828 static int mka_parse_audio(MatroskaTrack *track, AVStream *st,
2829  AVCodecParameters *par,
2830  const MatroskaDemuxContext *matroska,
2831  AVFormatContext *s, int *extradata_offset)
2832 {
2833  FFStream *const sti = ffstream(st);
2834  int ret;
2835 
2836  ret = mka_parse_audio_codec(track, par, matroska,
2837  s, extradata_offset);
2838  if (ret)
2839  return ret;
2840 
2842  par->sample_rate = track->audio.out_samplerate;
2843  // channel layout may be already set by codec private checks above
2844  if (!av_channel_layout_check(&par->ch_layout)) {
2845  if (track->audio.channels > INT32_MAX)
2846  return AVERROR_PATCHWELCOME;
2848  par->ch_layout.nb_channels = track->audio.channels;
2849  }
2850  if (!par->bits_per_coded_sample)
2851  par->bits_per_coded_sample = track->audio.bitdepth;
2852  if (par->codec_id == AV_CODEC_ID_MP3 ||
2853  par->codec_id == AV_CODEC_ID_MLP ||
2854  par->codec_id == AV_CODEC_ID_TRUEHD)
2856  else if (par->codec_id != AV_CODEC_ID_AAC)
2858  if (track->codec_delay > 0) {
2860  (AVRational){1, 1000000000},
2861  (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
2862  48000 : par->sample_rate});
2863  }
2864  if (track->seek_preroll > 0) {
2865  par->seek_preroll = av_rescale_q(track->seek_preroll,
2866  (AVRational){1, 1000000000},
2867  (AVRational){1, par->sample_rate});
2868  }
2869 
2870  return 0;
2871 }
2872 
2873 /* Performs the codec-specific part of parsing a video track. */
2874 static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
2875  const MatroskaDemuxContext *matroska,
2876  int *extradata_offset)
2877 {
2878  if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
2879  track->codec_priv.size >= 40) {
2880  uint32_t size = AV_RL32A(track->codec_priv.data);
2881  // VFW extradata is padded to an even length, yet
2882  // the size field contains the real length.
2883  if (size & 1 && size == track->codec_priv.size - 1)
2884  --track->codec_priv.size;
2885  track->ms_compat = 1;
2886  par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
2887  par->codec_tag = AV_RL32(track->codec_priv.data + 16);
2889  par->codec_tag);
2890  if (!par->codec_id)
2892  par->codec_tag);
2893  *extradata_offset = 40;
2894  return 0;
2895  } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
2896  track->codec_priv.size >= 21) {
2897  enum AVCodecID codec_id;
2898  uint32_t fourcc;
2899  int ret = get_qt_codec(track, &fourcc, &codec_id);
2900  if (ret < 0)
2901  return ret;
2902  if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
2903  fourcc = MKTAG('S','V','Q','3');
2905  }
2906  par->codec_id = codec_id;
2907  if (codec_id == AV_CODEC_ID_NONE)
2908  av_log(matroska->ctx, AV_LOG_ERROR,
2909  "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
2910  if (track->codec_priv.size >= 86) {
2911  FFIOContext b;
2912  unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
2914  track->codec_priv.size);
2915  if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
2916  bit_depth &= 0x1F;
2917  track->has_palette = 1;
2918  }
2920  }
2921  par->codec_tag = fourcc;
2922  return 0;
2923  }
2924 
2925  switch (par->codec_id) {
2926  case AV_CODEC_ID_RV10:
2927  case AV_CODEC_ID_RV20:
2928  case AV_CODEC_ID_RV30:
2929  case AV_CODEC_ID_RV40:
2930  *extradata_offset = 26;
2931  break;
2932  case AV_CODEC_ID_PRORES:
2933  if (track->codec_priv.size == 4)
2934  par->codec_tag = AV_RL32(track->codec_priv.data);
2935  break;
2936  case AV_CODEC_ID_VP9:
2937  /* we don't need any value stored in CodecPrivate.
2938  * make sure that it's not exported as extradata. */
2939  track->codec_priv.size = 0;
2940  break;
2941  }
2942 
2943  return 0;
2944 }
2945 
2946 /* Performs the generic part of parsing a video track. */
2947 static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
2948  AVCodecParameters *par,
2949  const MatroskaDemuxContext *matroska,
2950  int *extradata_offset)
2951 {
2952  FFStream *const sti = ffstream(st);
2954  int display_width_mul = 1;
2955  int display_height_mul = 1;
2956  int ret;
2957 
2958  if (track->video.color_space.size == 4)
2959  par->codec_tag = AV_RL32(track->video.color_space.data);
2960 
2961  ret = mkv_parse_video_codec(track, par, matroska,
2962  extradata_offset);
2963  if (ret < 0)
2964  return ret;
2965 
2967  par->width = track->video.pixel_width;
2968  par->height = track->video.pixel_height;
2969 
2971  par->field_order = mkv_field_order(matroska, track->video.field_order);
2974 
2977  &display_width_mul, &display_height_mul);
2978 
2980  if (track->video.display_width && track->video.display_height &&
2981  track->video.display_width != -1 && track->video.display_height != -1 &&
2982  track->video.cropped_height < INT64_MAX / track->video.display_width / display_width_mul &&
2983  track->video.cropped_width < INT64_MAX / track->video.display_height / display_height_mul)
2985  &st->sample_aspect_ratio.den,
2986  track->video.cropped_height * track->video.display_width * display_width_mul,
2987  track->video.cropped_width * track->video.display_height * display_height_mul,
2988  INT_MAX);
2989  }
2990  if (track->video.cropped_width != track->video.pixel_width ||
2991  track->video.cropped_height != track->video.pixel_height) {
2992  uint8_t *cropping;
2996  sizeof(uint32_t) * 4, 0);
2997  if (!sd)
2998  return AVERROR(ENOMEM);
2999 
3000  cropping = sd->data;
3001  bytestream_put_le32(&cropping, track->video.pixel_cropt);
3002  bytestream_put_le32(&cropping, track->video.pixel_cropb);
3003  bytestream_put_le32(&cropping, track->video.pixel_cropl);
3004  bytestream_put_le32(&cropping, track->video.pixel_cropr);
3005  }
3006  if (par->codec_id != AV_CODEC_ID_HEVC)
3008 
3009  if (track->default_duration) {
3010  int div = track->default_duration <= INT64_MAX ? 1 : 2;
3012  1000000000 / div, track->default_duration / div, 30000);
3013 #if FF_API_R_FRAME_RATE
3014  if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
3015  && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
3016  st->r_frame_rate = st->avg_frame_rate;
3017 #endif
3018  }
3019 
3020  /* export stereo mode flag as metadata tag */
3022  av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
3023 
3024  /* export alpha mode flag as metadata tag */
3025  if (track->video.alpha_mode)
3026  av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
3027 
3028  /* if we have virtual track, mark the real tracks */
3030  for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) {
3031  MatroskaTrack *tracks = matroska->tracks.elem;
3032  char buf[32];
3034  continue;
3035  snprintf(buf, sizeof(buf), "%s_%d",
3037  for (int k = 0; k < matroska->tracks.nb_elem; k++)
3038  if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
3039  av_dict_set(&tracks[k].stream->metadata,
3040  "stereo_mode", buf, 0);
3041  break;
3042  }
3043  }
3044  // add stream level stereo3d side data if it is a supported format
3048  int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
3049  if (ret < 0)
3050  return ret;
3051  }
3052 
3053  ret = mkv_parse_video_color(st, track);
3054  if (ret < 0)
3055  return ret;
3056  ret = mkv_parse_video_projection(st, track, matroska->ctx);
3057  if (ret < 0)
3058  return ret;
3059 
3060  return 0;
3061 }
3062 
3063 /* Performs the codec-specific part of parsing a subtitle track. */
3064 static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVStream *st,
3065  AVCodecParameters *par,
3066  const MatroskaDemuxContext *matroska)
3067 {
3068  switch (par->codec_id) {
3070  if (track->codec_priv.size == 3) {
3071  int component_tag = track->codec_priv.data[0];
3072  int data_component_id = AV_RB16(track->codec_priv.data + 1);
3073 
3074  switch (data_component_id) {
3075  case 0x0008:
3076  // [0x30..0x37] are component tags utilized for
3077  // non-mobile captioning service ("profile A").
3078  if (component_tag >= 0x30 && component_tag <= 0x37) {
3080  }
3081  break;
3082  case 0x0012:
3083  // component tag 0x87 signifies a mobile/partial reception
3084  // (1seg) captioning service ("profile C").
3085  if (component_tag == 0x87) {
3087  }
3088  break;
3089  default:
3090  break;
3091  }
3092 
3093  if (par->profile == AV_PROFILE_UNKNOWN)
3094  av_log(matroska->ctx, AV_LOG_WARNING,
3095  "Unknown ARIB caption profile utilized: %02x / %04x\n",
3096  component_tag, data_component_id);
3097 
3098  track->codec_priv.size = 0;
3099  }
3100  break;
3101  case AV_CODEC_ID_WEBVTT:
3102  if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
3104  } else if (!strcmp(track->codec_id, "D_WEBVTT/DESCRIPTIONS")) {
3106  } else if (!strcmp(track->codec_id, "D_WEBVTT/METADATA")) {
3108  }
3109  break;
3110  }
3111 
3112  return 0;
3113 }
3114 
3116 {
3117  MatroskaDemuxContext *matroska = s->priv_data;
3118  MatroskaTrack *tracks = matroska->tracks.elem;
3119  int i, j, ret;
3120 
3121  for (i = 0; i < matroska->tracks.nb_elem; i++) {
3122  MatroskaTrack *track = &tracks[i];
3124  AVCodecParameters *par;
3126  int extradata_offset = 0;
3127  AVStream *st;
3128  char* key_id_base64 = NULL;
3129 
3130  /* Apply some sanity checks. */
3131  if (track->type != MATROSKA_TRACK_TYPE_VIDEO &&
3132  track->type != MATROSKA_TRACK_TYPE_AUDIO &&
3133  track->type != MATROSKA_TRACK_TYPE_SUBTITLE &&
3134  track->type != MATROSKA_TRACK_TYPE_METADATA) {
3135  av_log(matroska->ctx, AV_LOG_INFO,
3136  "Unknown or unsupported track type %"PRIu64"\n",
3137  track->type);
3138  continue;
3139  }
3140  if (!track->codec_id)
3141  continue;
3142 
3143  if ( track->type == MATROSKA_TRACK_TYPE_AUDIO && track->codec_id[0] != 'A'
3144  || track->type == MATROSKA_TRACK_TYPE_VIDEO && track->codec_id[0] != 'V'
3145  || track->type == MATROSKA_TRACK_TYPE_SUBTITLE && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
3146  || track->type == MATROSKA_TRACK_TYPE_METADATA && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
3147  ) {
3148  av_log(matroska->ctx, AV_LOG_INFO, "Inconsistent track type\n");
3149  continue;
3150  }
3151 
3152  if (track->audio.samplerate < 0 || track->audio.samplerate > INT_MAX ||
3153  isnan(track->audio.samplerate)) {
3154  av_log(matroska->ctx, AV_LOG_WARNING,
3155  "Invalid sample rate %f, defaulting to 8000 instead.\n",
3156  track->audio.samplerate);
3157  track->audio.samplerate = 8000;
3158  }
3159 
3160  if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
3161  if (!track->default_duration && track->video.frame_rate > 0) {
3162  double default_duration = 1000000000 / track->video.frame_rate;
3163  if (default_duration > UINT64_MAX || default_duration < 0) {
3164  av_log(matroska->ctx, AV_LOG_WARNING,
3165  "Invalid frame rate %e. Cannot calculate default duration.\n",
3166  track->video.frame_rate);
3167  } else {
3168  track->default_duration = default_duration;
3169  }
3170  }
3171  if (track->video.pixel_cropl >= INT_MAX - track->video.pixel_cropr ||
3172  track->video.pixel_cropt >= INT_MAX - track->video.pixel_cropb ||
3173  (track->video.pixel_cropl + track->video.pixel_cropr) >= track->video.pixel_width ||
3174  (track->video.pixel_cropt + track->video.pixel_cropb) >= track->video.pixel_height)
3175  return AVERROR_INVALIDDATA;
3176  track->video.cropped_width = track->video.pixel_width -
3177  track->video.pixel_cropl - track->video.pixel_cropr;
3178  track->video.cropped_height = track->video.pixel_height -
3179  track->video.pixel_cropt - track->video.pixel_cropb;
3181  if (track->video.display_width == -1)
3182  track->video.display_width = track->video.cropped_width;
3183  if (track->video.display_height == -1)
3184  track->video.display_height = track->video.cropped_height;
3185  }
3186  } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
3187  if (!track->audio.out_samplerate)
3188  track->audio.out_samplerate = track->audio.samplerate;
3189  }
3191  track->encodings.nb_elem,
3192  track, &key_id_base64, matroska->ctx);
3193  if (ret < 0)
3194  return ret;
3195 
3196  for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
3197  if (av_strstart(track->codec_id, ff_mkv_codec_tags[j].str, NULL)) {
3199  break;
3200  }
3201  }
3202 
3203  st = track->stream = avformat_new_stream(s, NULL);
3204  if (!st) {
3205  av_free(key_id_base64);
3206  return AVERROR(ENOMEM);
3207  }
3208  par = st->codecpar;
3209 
3210  par->codec_id = codec_id;
3211 
3212  if (track->flag_default)
3214  if (track->flag_forced)
3216  if (track->flag_comment)
3218  if (track->flag_hearingimpaired)
3220  if (track->flag_visualimpaired)
3222  if (track->flag_original.count > 0)
3225 
3226  if (key_id_base64) {
3227  /* export encryption key id as base64 metadata tag */
3228  av_dict_set(&st->metadata, "enc_key_id", key_id_base64,
3230  }
3231 
3232  if (strcmp(track->language, "und"))
3233  av_dict_set(&st->metadata, "language", track->language, 0);
3234  av_dict_set(&st->metadata, "title", track->name, 0);
3235 
3236  if (track->time_scale < 0.01) {
3237  av_log(matroska->ctx, AV_LOG_WARNING,
3238  "Track TimestampScale too small %f, assuming 1.0.\n",
3239  track->time_scale);
3240  track->time_scale = 1.0;
3241  }
3242 
3243  if (matroska->time_scale * track->time_scale > UINT_MAX)
3244  return AVERROR_INVALIDDATA;
3245 
3246  avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale,
3247  1000 * 1000 * 1000); /* 64 bit pts in ns */
3248 
3249  /* convert the delay from ns to the track timebase */
3251  (AVRational){ 1, 1000000000 },
3252  st->time_base);
3253 
3254  type = track->type;
3255  if (par->codec_id == AV_CODEC_ID_WEBVTT)
3257  switch (type) {
3259  ret = mka_parse_audio(track, st, par, matroska,
3260  s, &extradata_offset);
3261  if (ret < 0)
3262  return ret;
3263  if (ret == SKIP_TRACK)
3264  continue;
3265  break;
3267  ret = mkv_parse_video(track, st, par, matroska, &extradata_offset);
3268  if (ret < 0)
3269  return ret;
3270  break;
3272  ret = mkv_parse_subtitle_codec(track, st, par, matroska);
3273  if (ret < 0)
3274  return ret;
3276 
3277  if (track->flag_textdescriptions)
3279  break;
3280  }
3281 
3282  if (par->codec_id == AV_CODEC_ID_NONE)
3283  av_log(matroska->ctx, AV_LOG_INFO,
3284  "Unknown/unsupported AVCodecID %s.\n", track->codec_id);
3285 
3286  if (!par->extradata && track->codec_priv.size > extradata_offset) {
3287  const uint8_t *src = track->codec_priv.data + extradata_offset;
3288  unsigned extra_size = track->codec_priv.size - extradata_offset;
3289  ret = ff_alloc_extradata(par, extra_size);
3290  if (ret < 0)
3291  return ret;
3292  memcpy(par->extradata, src, extra_size);
3293  }
3294 
3295  ret = mkv_parse_block_addition_mappings(s, st, track);
3296  if (ret < 0)
3297  return ret;
3298  }
3299 
3300  return 0;
3301 }
3302 
3304 {
3305  FFFormatContext *const si = ffformatcontext(s);
3306  MatroskaDemuxContext *matroska = s->priv_data;
3307  EbmlList *attachments_list = &matroska->attachments;
3308  EbmlList *chapters_list = &matroska->chapters;
3309  MatroskaAttachment *attachments;
3310  MatroskaChapter *chapters;
3311  uint64_t max_start = 0;
3312  int64_t pos;
3313  Ebml ebml = { 0 };
3314  int i, j, res;
3315 
3316  matroska->ctx = s;
3317  matroska->cues_parsing_deferred = 1;
3318 
3319  /* First read the EBML header. */
3320  if (ebml_parse(matroska, ebml_syntax, &ebml) || !ebml.doctype) {
3321  av_log(matroska->ctx, AV_LOG_ERROR, "EBML header parsing failed\n");
3322  ebml_free(ebml_syntax, &ebml);
3323  return AVERROR_INVALIDDATA;
3324  }
3325  if (ebml.version > EBML_VERSION ||
3326  ebml.max_size > sizeof(uint64_t) ||
3327  ebml.id_length > sizeof(uint32_t) ||
3328  ebml.doctype_version > 3) {
3330  "EBML version %"PRIu64", doctype %s, doc version %"PRIu64,
3331  ebml.version, ebml.doctype, ebml.doctype_version);
3332  ebml_free(ebml_syntax, &ebml);
3333  return AVERROR_PATCHWELCOME;
3334  } else if (ebml.doctype_version == 3) {
3335  av_log(matroska->ctx, AV_LOG_WARNING,
3336  "EBML header using unsupported features\n"
3337  "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
3338  ebml.version, ebml.doctype, ebml.doctype_version);
3339  }
3340  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++)
3341  if (!strcmp(ebml.doctype, matroska_doctypes[i]))
3342  break;
3344  av_log(s, AV_LOG_WARNING, "Unknown EBML doctype '%s'\n", ebml.doctype);
3345  if (matroska->ctx->error_recognition & AV_EF_EXPLODE) {
3346  ebml_free(ebml_syntax, &ebml);
3347  return AVERROR_INVALIDDATA;
3348  }
3349  }
3350  matroska->is_webm = !strcmp(ebml.doctype, "webm");
3351 
3352  ebml_free(ebml_syntax, &ebml);
3353 
3354  matroska->pkt = si->parse_pkt;
3355 
3356  /* The next thing is a segment. */
3357  pos = avio_tell(matroska->ctx->pb);
3358  res = ebml_parse(matroska, matroska_segments, matroska);
3359  // Try resyncing until we find an EBML_STOP type element.
3360  while (res != 1) {
3361  res = matroska_resync(matroska, pos);
3362  if (res < 0)
3363  return res;
3364  pos = avio_tell(matroska->ctx->pb);
3365  res = ebml_parse(matroska, matroska_segment, matroska);
3366  if (res == AVERROR(EIO)) // EOF is translated to EIO, this exists the loop on EOF
3367  return res;
3368  }
3369  /* Set data_offset as it might be needed later by seek_frame_generic. */
3370  if (matroska->current_id == MATROSKA_ID_CLUSTER)
3371  si->data_offset = avio_tell(matroska->ctx->pb) - 4;
3372  matroska_execute_seekhead(matroska);
3373 
3374  if (!matroska->time_scale)
3375  matroska->time_scale = 1000000;
3376  if (isnan(matroska->duration))
3377  matroska->duration = 0;
3378  if (matroska->duration)
3379  matroska->ctx->duration = matroska->duration * matroska->time_scale *
3380  1000 / AV_TIME_BASE;
3381  av_dict_set(&s->metadata, "title", matroska->title, 0);
3382  av_dict_set(&s->metadata, "encoder", matroska->muxingapp, 0);
3383 
3384  if (matroska->date_utc.size == 8)
3385  matroska_metadata_creation_time(&s->metadata, AV_RB64(matroska->date_utc.data));
3386 
3387  res = matroska_parse_tracks(s);
3388  if (res < 0)
3389  return res;
3390 
3391  attachments = attachments_list->elem;
3392  for (j = 0; j < attachments_list->nb_elem; j++) {
3393  if (!(attachments[j].filename && attachments[j].mime &&
3394  attachments[j].bin.data && attachments[j].bin.size > 0)) {
3395  av_log(matroska->ctx, AV_LOG_ERROR, "incomplete attachment\n");
3396  } else {
3398  if (!st)
3399  break;
3400  av_dict_set(&st->metadata, "filename", attachments[j].filename, 0);
3401  av_dict_set(&st->metadata, "mimetype", attachments[j].mime, 0);
3402  if (attachments[j].description)
3403  av_dict_set(&st->metadata, "title", attachments[j].description, 0);
3405 
3406  for (i = 0; mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3407  if (av_strstart(attachments[j].mime, mkv_image_mime_tags[i].str, NULL)) {
3409  break;
3410  }
3411  }
3412 
3413  attachments[j].stream = st;
3414 
3415  if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
3416  res = ff_add_attached_pic(s, st, NULL, &attachments[j].bin.buf, 0);
3417  if (res < 0)
3418  return res;
3419  } else {
3421  if (ff_alloc_extradata(st->codecpar, attachments[j].bin.size))
3422  break;
3423  memcpy(st->codecpar->extradata, attachments[j].bin.data,
3424  attachments[j].bin.size);
3425 
3426  for (i = 0; mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3427  if (av_strstart(attachments[j].mime, mkv_mime_tags[i].str, NULL)) {
3429  break;
3430  }
3431  }
3432  }
3433  }
3434  }
3435 
3436  chapters = chapters_list->elem;
3437  for (i = 0; i < chapters_list->nb_elem; i++)
3438  if (chapters[i].start != AV_NOPTS_VALUE && chapters[i].uid &&
3439  (max_start == 0 || chapters[i].start > max_start)) {
3440  chapters[i].chapter =
3441  avpriv_new_chapter(s, chapters[i].uid,
3442  (AVRational) { 1, 1000000000 },
3443  chapters[i].start, chapters[i].end,
3444  chapters[i].title);
3445  max_start = chapters[i].start;
3446  }
3447 
3448  matroska_add_index_entries(matroska);
3449 
3451 
3452  return 0;
3454 
3455 /*
3456  * Put one packet in an application-supplied AVPacket struct.
3457  * Returns 0 on success or -1 on failure.
3458  */
3459 static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
3460  AVPacket *pkt)
3461 {
3462  if (matroska->queue.head) {
3463  MatroskaTrack *tracks = matroska->tracks.elem;
3464  MatroskaTrack *track;
3465 
3466  avpriv_packet_list_get(&matroska->queue, pkt);
3467  track = &tracks[pkt->stream_index];
3468  if (track->has_palette) {
3470  if (!pal) {
3471  av_log(matroska->ctx, AV_LOG_ERROR, "Cannot append palette to packet\n");
3472  } else {
3473  memcpy(pal, track->palette, AVPALETTE_SIZE);
3474  }
3475  track->has_palette = 0;
3476  }
3477  return 0;
3478  }
3479 
3480  return -1;
3481 }
3482 
3483 /*
3484  * Free all packets in our internal queue.
3485  */
3486 static void matroska_clear_queue(MatroskaDemuxContext *matroska)
3487 {
3488  avpriv_packet_list_free(&matroska->queue);
3489 }
3490 
3491 static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf,
3492  int size, int type, AVIOContext *pb,
3493  uint32_t lace_size[256], int *laces)
3494 {
3495  int n;
3496  uint8_t *data = *buf;
3497 
3498  if (!type) {
3499  *laces = 1;
3500  lace_size[0] = size;
3501  return 0;
3502  }
3503 
3504  if (size <= 0)
3505  return AVERROR_INVALIDDATA;
3506 
3507  *laces = *data + 1;
3508  data += 1;
3509  size -= 1;
3510 
3511  switch (type) {
3512  case 0x1: /* Xiph lacing */
3513  {
3514  uint8_t temp;
3515  uint32_t total = 0;
3516  for (n = 0; n < *laces - 1; n++) {
3517  lace_size[n] = 0;
3518 
3519  do {
3520  if (size <= total)
3521  return AVERROR_INVALIDDATA;
3522  temp = *data;
3523  total += temp;
3524  lace_size[n] += temp;
3525  data += 1;
3526  size -= 1;
3527  } while (temp == 0xff);
3528  }
3529  if (size < total)
3530  return AVERROR_INVALIDDATA;
3531 
3532  lace_size[n] = size - total;
3533  break;
3534  }
3535 
3536  case 0x2: /* fixed-size lacing */
3537  if (size % (*laces))
3538  return AVERROR_INVALIDDATA;
3539  for (n = 0; n < *laces; n++)
3540  lace_size[n] = size / *laces;
3541  break;
3542 
3543  case 0x3: /* EBML lacing */
3544  {
3545  uint64_t num;
3546  uint64_t total;
3547  int offset;
3548 
3549  avio_skip(pb, 4);
3550 
3551  n = ebml_read_num(matroska, pb, 8, &num, 1);
3552  if (n < 0)
3553  return n;
3554  if (num > INT_MAX)
3555  return AVERROR_INVALIDDATA;
3556 
3557  total = lace_size[0] = num;
3558  offset = n;
3559  for (n = 1; n < *laces - 1; n++) {
3560  int64_t snum;
3561  int r;
3562  r = matroska_ebmlnum_sint(matroska, pb, &snum);
3563  if (r < 0)
3564  return r;
3565  if (lace_size[n - 1] + snum > (uint64_t)INT_MAX)
3566  return AVERROR_INVALIDDATA;
3567 
3568  lace_size[n] = lace_size[n - 1] + snum;
3569  total += lace_size[n];
3570  offset += r;
3571  }
3572  data += offset;
3573  size -= offset;
3574  if (size < total)
3575  return AVERROR_INVALIDDATA;
3576 
3577  lace_size[*laces - 1] = size - total;
3578  break;
3579  }
3580  }
3582  *buf = data;
3583 
3584  return 0;
3585 }
3586 
3587 static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
3588  MatroskaTrack *track, AVStream *st,
3589  uint8_t *data, int size, uint64_t timecode,
3590  int64_t pos)
3591 {
3592  const int a = st->codecpar->block_align;
3593  const int sps = track->audio.sub_packet_size;
3594  const int cfs = track->audio.coded_framesize;
3595  const int h = track->audio.sub_packet_h;
3596  const int w = track->audio.frame_size;
3597  int y = track->audio.sub_packet_cnt;
3598  int x;
3599 
3600  if (!track->audio.pkt_cnt) {
3601  if (track->audio.sub_packet_cnt == 0)
3602  track->audio.buf_timecode = timecode;
3603  if (st->codecpar->codec_id == AV_CODEC_ID_RA_288) {
3604  if (size < cfs * h / 2) {
3605  av_log(matroska->ctx, AV_LOG_ERROR,
3606  "Corrupt int4 RM-style audio packet size\n");
3607  return AVERROR_INVALIDDATA;
3608  }
3609  for (x = 0; x < h / 2; x++)
3610  memcpy(track->audio.buf + x * 2 * w + y * cfs,
3611  data + x * cfs, cfs);
3612  } else if (st->codecpar->codec_id == AV_CODEC_ID_SIPR) {
3613  if (size < w) {
3614  av_log(matroska->ctx, AV_LOG_ERROR,
3615  "Corrupt sipr RM-style audio packet size\n");
3616  return AVERROR_INVALIDDATA;
3617  }
3618  memcpy(track->audio.buf + y * w, data, w);
3619  } else {
3620  if (size < w) {
3621  av_log(matroska->ctx, AV_LOG_ERROR,
3622  "Corrupt generic RM-style audio packet size\n");
3623  return AVERROR_INVALIDDATA;
3624  }
3625  for (x = 0; x < w / sps; x++)
3626  memcpy(track->audio.buf +
3627  sps * (h * x + ((h + 1) / 2) * (y & 1) + (y >> 1)),
3628  data + x * sps, sps);
3629  }
3630 
3631  if (++track->audio.sub_packet_cnt >= h) {
3632  if (st->codecpar->codec_id == AV_CODEC_ID_SIPR)
3633  ff_rm_reorder_sipr_data(track->audio.buf, h, w);
3634  track->audio.sub_packet_cnt = 0;
3635  track->audio.pkt_cnt = h * w / a;
3636  }
3637  }
3638 
3639  while (track->audio.pkt_cnt) {
3640  int ret;
3641  AVPacket *pkt = matroska->pkt;
3642 
3643  ret = av_new_packet(pkt, a);
3644  if (ret < 0) {
3645  return ret;
3646  }
3647  memcpy(pkt->data,
3648  track->audio.buf + a * (h * w / a - track->audio.pkt_cnt--),
3649  a);
3650  pkt->pts = track->audio.buf_timecode;
3652  pkt->pos = pos;
3653  pkt->stream_index = st->index;
3654  ret = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3655  if (ret < 0) {
3657  return AVERROR(ENOMEM);
3658  }
3659  }
3660 
3661  return 0;
3662 }
3663 
3664 /* reconstruct full wavpack blocks from mangled matroska ones */
3665 static int matroska_parse_wavpack(MatroskaTrack *track,
3666  uint8_t **data, int *size)
3667 {
3668  uint8_t *dst = NULL;
3669  uint8_t *src = *data;
3670  int dstlen = 0;
3671  int srclen = *size;
3672  uint32_t samples;
3673  uint16_t ver;
3674  int ret, offset = 0;
3675 
3676  if (srclen < 12)
3677  return AVERROR_INVALIDDATA;
3678 
3679  av_assert1(track->stream->codecpar->extradata_size >= 2);
3680  ver = AV_RL16(track->stream->codecpar->extradata);
3681 
3682  samples = AV_RL32(src);
3683  src += 4;
3684  srclen -= 4;
3685 
3686  while (srclen >= 8) {
3687  int multiblock;
3688  uint32_t blocksize;
3689  uint8_t *tmp;
3690 
3691  uint32_t flags = AV_RL32(src);
3692  uint32_t crc = AV_RL32(src + 4);
3693  src += 8;
3694  srclen -= 8;
3695 
3696  multiblock = (flags & 0x1800) != 0x1800;
3697  if (multiblock) {
3698  if (srclen < 4) {
3700  goto fail;
3701  }
3702  blocksize = AV_RL32(src);
3703  src += 4;
3704  srclen -= 4;
3705  } else
3706  blocksize = srclen;
3707 
3708  if (blocksize > srclen) {
3710  goto fail;
3711  }
3712 
3713  tmp = av_realloc(dst, dstlen + blocksize + 32 + AV_INPUT_BUFFER_PADDING_SIZE);
3714  if (!tmp) {
3715  ret = AVERROR(ENOMEM);
3716  goto fail;
3717  }
3718  dst = tmp;
3719  dstlen += blocksize + 32;
3720 
3721  AV_WL32(dst + offset, MKTAG('w', 'v', 'p', 'k')); // tag
3722  AV_WL32(dst + offset + 4, blocksize + 24); // blocksize - 8
3723  AV_WL16(dst + offset + 8, ver); // version
3724  AV_WL16(dst + offset + 10, 0); // track/index_no
3725  AV_WL32(dst + offset + 12, 0); // total samples
3726  AV_WL32(dst + offset + 16, 0); // block index
3727  AV_WL32(dst + offset + 20, samples); // number of samples
3728  AV_WL32(dst + offset + 24, flags); // flags
3729  AV_WL32(dst + offset + 28, crc); // crc
3730  memcpy(dst + offset + 32, src, blocksize); // block data
3731 
3732  src += blocksize;
3733  srclen -= blocksize;
3734  offset += blocksize + 32;
3735  }
3736 
3737  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3738 
3739  *data = dst;
3740  *size = dstlen;
3741 
3742  return 0;
3744 fail:
3745  av_freep(&dst);
3746  return ret;
3747 }
3748 
3749 static int matroska_parse_prores(MatroskaTrack *track,
3750  uint8_t **data, int *size)
3751 {
3752  uint8_t *dst;
3753  int dstlen = *size + 8;
3754 
3756  if (!dst)
3757  return AVERROR(ENOMEM);
3758 
3759  AV_WB32(dst, dstlen);
3760  AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f'));
3761  memcpy(dst + 8, *data, dstlen - 8);
3762  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3763 
3764  *data = dst;
3765  *size = dstlen;
3766 
3767  return 0;
3768 }
3769 
3770 static int matroska_parse_webvtt(MatroskaDemuxContext *matroska,
3771  MatroskaTrack *track,
3772  AVStream *st,
3773  uint8_t *data, int data_len,
3774  uint64_t timecode,
3775  uint64_t duration,
3776  int64_t pos)
3777 {
3778  AVPacket *pkt = matroska->pkt;
3779  uint8_t *id, *settings, *text, *buf;
3780  int id_len, settings_len, text_len;
3781  uint8_t *p, *q;
3782  int err;
3783 
3784  if (data_len <= 0)
3785  return AVERROR_INVALIDDATA;
3786 
3787  p = data;
3788  q = data + data_len;
3789 
3790  id = p;
3791  id_len = -1;
3792  while (p < q) {
3793  if (*p == '\r' || *p == '\n') {
3794  id_len = p - id;
3795  if (*p == '\r')
3796  p++;
3797  break;
3798  }
3799  p++;
3800  }
3801 
3802  if (p >= q || *p != '\n')
3803  return AVERROR_INVALIDDATA;
3804  p++;
3805 
3806  settings = p;
3807  settings_len = -1;
3808  while (p < q) {
3809  if (*p == '\r' || *p == '\n') {
3810  settings_len = p - settings;
3811  if (*p == '\r')
3812  p++;
3813  break;
3814  }
3815  p++;
3816  }
3817 
3818  if (p >= q || *p != '\n')
3819  return AVERROR_INVALIDDATA;
3820  p++;
3821 
3822  text = p;
3823  text_len = q - p;
3824  while (text_len > 0) {
3825  const int len = text_len - 1;
3826  const uint8_t c = p[len];
3827  if (c != '\r' && c != '\n')
3828  break;
3829  text_len = len;
3830  }
3831 
3832  err = av_new_packet(pkt, text_len);
3833  if (err < 0) {
3834  return err;
3835  }
3836 
3837  memcpy(pkt->data, text, text_len);
3838 
3839  if (id_len > 0) {
3842  id_len);
3843  if (!buf) {
3845  return AVERROR(ENOMEM);
3846  }
3847  memcpy(buf, id, id_len);
3848  }
3849 
3850  if (settings_len > 0) {
3853  settings_len);
3854  if (!buf) {
3856  return AVERROR(ENOMEM);
3857  }
3858  memcpy(buf, settings, settings_len);
3859  }
3860 
3861  // Do we need this for subtitles?
3862  // pkt->flags = AV_PKT_FLAG_KEY;
3863 
3864  pkt->stream_index = st->index;
3865  pkt->pts = timecode;
3866 
3867  // Do we need this for subtitles?
3868  // pkt->dts = timecode;
3869 
3870  pkt->duration = duration;
3871  pkt->pos = pos;
3872 
3873  err = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3874  if (err < 0) {
3876  return AVERROR(ENOMEM);
3877  }
3878 
3879  return 0;
3880 }
3881 
3883  MatroskaTrack *track, AVPacket *pkt,
3884  const uint8_t *data, int size, uint64_t id)
3885 {
3886  const EbmlList *mappings_list = &track->block_addition_mappings;
3887  MatroskaBlockAdditionMapping *mappings = mappings_list->elem, *mapping = NULL;
3888  uint8_t *side_data;
3889  int res;
3890 
3891  if (!matroska->is_webm && track->max_block_additional_id && id > track->max_block_additional_id) {
3892  int strict = matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT;
3893  av_log(matroska->ctx, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
3894  "BlockAddID %"PRIu64" is higher than the reported MaxBlockAdditionID %"PRIu64" "
3895  "for Track with TrackNumber %"PRIu64"\n", id, track->max_block_additional_id,
3896  track->num);
3897  if (strict)
3898  return AVERROR_INVALIDDATA;
3899  }
3900 
3901  for (int i = 0; i < mappings_list->nb_elem; i++) {
3902  if (id != mappings[i].value)
3903  continue;
3904  mapping = &mappings[i];
3905  break;
3906  }
3907 
3908  if (id != 1 && !matroska->is_webm && !mapping) {
3909  av_log(matroska->ctx, AV_LOG_WARNING, "BlockAddID %"PRIu64" has no mapping. Skipping\n", id);
3910  return 0;
3911  }
3912 
3913  if (mapping && mapping->type)
3914  id = mapping->type;
3915 
3916  switch (id) {
3918  GetByteContext bc;
3919  int country_code, provider_code;
3920  int provider_oriented_code, application_identifier;
3921  size_t hdrplus_size;
3922  AVDynamicHDRPlus *hdrplus;
3923 
3924  if (size < 6)
3925  break; //ignore
3926 
3927  bytestream2_init(&bc, data, size);
3928 
3929  /* ITU-T T.35 metadata */
3930  country_code = bytestream2_get_byteu(&bc);
3931  provider_code = bytestream2_get_be16u(&bc);
3932 
3933  if (country_code != ITU_T_T35_COUNTRY_CODE_US ||
3934  provider_code != ITU_T_T35_PROVIDER_CODE_SMTPE)
3935  break; // ignore
3936 
3937  provider_oriented_code = bytestream2_get_be16u(&bc);
3938  application_identifier = bytestream2_get_byteu(&bc);
3939 
3940  if (provider_oriented_code != 1 || application_identifier != 4)
3941  break; // ignore
3942 
3943  hdrplus = av_dynamic_hdr_plus_alloc(&hdrplus_size);
3944  if (!hdrplus)
3945  return AVERROR(ENOMEM);
3946 
3947  if ((res = av_dynamic_hdr_plus_from_t35(hdrplus, bc.buffer,
3948  bytestream2_get_bytes_left(&bc))) < 0 ||
3950  (uint8_t *)hdrplus, hdrplus_size)) < 0) {
3951  av_free(hdrplus);
3952  return res;
3953  }
3954 
3955  return 0;
3956  }
3957  default:
3958  break;
3959  }
3960 
3962  size + (size_t)8);
3963  if (!side_data)
3964  return AVERROR(ENOMEM);
3965 
3966  AV_WB64(side_data, id);
3967  memcpy(side_data + 8, data, size);
3968 
3969  return 0;
3970 }
3971 
3972 static int matroska_parse_frame(MatroskaDemuxContext *matroska,
3973  MatroskaTrack *track, AVStream *st,
3974  AVBufferRef *buf, uint8_t *data, int pkt_size,
3975  uint64_t timecode, uint64_t lace_duration,
3976  int64_t pos, int is_keyframe,
3977  MatroskaBlockMore *blockmore, int nb_blockmore,
3978  int64_t discard_padding)
3979 {
3980  uint8_t *pkt_data = data;
3981  int res = 0;
3982  AVPacket *pkt = matroska->pkt;
3983 
3984  if (st->codecpar->codec_id == AV_CODEC_ID_WAVPACK) {
3985  res = matroska_parse_wavpack(track, &pkt_data, &pkt_size);
3986  if (res < 0) {
3987  av_log(matroska->ctx, AV_LOG_ERROR,
3988  "Error parsing a wavpack block.\n");
3989  goto fail;
3990  }
3991  if (!buf)
3992  av_freep(&data);
3993  buf = NULL;
3994  }
3995 
3996  if (st->codecpar->codec_id == AV_CODEC_ID_PRORES &&
3997  AV_RB32(pkt_data + 4) != MKBETAG('i', 'c', 'p', 'f')) {
3998  res = matroska_parse_prores(track, &pkt_data, &pkt_size);
3999  if (res < 0) {
4000  av_log(matroska->ctx, AV_LOG_ERROR,
4001  "Error parsing a prores block.\n");
4002  goto fail;
4003  }
4004  if (!buf)
4005  av_freep(&data);
4006  buf = NULL;
4007  }
4008 
4009  if (!pkt_size && !nb_blockmore)
4010  goto no_output;
4011 
4012  if (!matroska->is_webm && nb_blockmore && !track->max_block_additional_id) {
4013  int strict = matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT;
4014  av_log(matroska->ctx, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
4015  "Unexpected BlockAdditions found in a Block from Track with TrackNumber %"PRIu64" "
4016  "where MaxBlockAdditionID is 0\n", track->num);
4017  if (strict) {
4018  res = AVERROR_INVALIDDATA;
4019  goto fail;
4020  }
4021  }
4022 
4023  if (!buf)
4024  pkt->buf = av_buffer_create(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE,
4025  NULL, NULL, 0);
4026  else
4027  pkt->buf = av_buffer_ref(buf);
4028 
4029  if (!pkt->buf) {
4030  res = AVERROR(ENOMEM);
4031  goto fail;
4032  }
4033 
4034  pkt->data = pkt_data;
4035  pkt->size = pkt_size;
4036  pkt->flags = is_keyframe;
4037  pkt->stream_index = st->index;
4038 
4039  for (int i = 0; i < nb_blockmore; i++) {
4040  MatroskaBlockMore *more = &blockmore[i];
4041 
4042  if (!more->additional.size)
4043  continue;
4044 
4045  res = matroska_parse_block_additional(matroska, track, pkt, more->additional.data,
4046  more->additional.size, more->additional_id);
4047  if (res < 0) {
4049  return res;
4050  }
4051  }
4052 
4053  if (discard_padding) {
4054  uint8_t *side_data = av_packet_new_side_data(pkt,
4056  10);
4057  if (!side_data) {
4059  return AVERROR(ENOMEM);
4060  }
4061  discard_padding = av_rescale_q(discard_padding,
4062  (AVRational){1, 1000000000},
4063  (AVRational){1, st->codecpar->sample_rate});
4064  if (discard_padding > 0) {
4065  AV_WL32A(side_data + 4, discard_padding);
4066  } else {
4067  AV_WL32A(side_data, -discard_padding);
4068  }
4069  }
4070 
4071  if (track->ms_compat)
4072  pkt->dts = timecode;
4073  else
4074  pkt->pts = timecode;
4075  pkt->pos = pos;
4076  pkt->duration = lace_duration;
4077 
4078  res = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
4079  if (res < 0) {
4081  return AVERROR(ENOMEM);
4082  }
4083 
4084  return 0;
4085 
4086 no_output:
4088  if (!buf)
4089  av_free(pkt_data);
4090  return res;
4091 }
4092 
4093 static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf, uint8_t *data,
4094  int size, int64_t pos, uint64_t cluster_time,
4095  uint64_t block_duration, int is_keyframe,
4096  MatroskaBlockMore *blockmore, int nb_blockmore,
4097  int64_t cluster_pos, int64_t discard_padding)
4098 {
4099  uint64_t timecode = AV_NOPTS_VALUE;
4100  MatroskaTrack *track;
4101  FFIOContext pb;
4102  int res = 0;
4103  AVStream *st;
4104  int16_t block_time;
4105  uint32_t lace_size[256];
4106  int n, flags, laces = 0;
4107  uint64_t num;
4108  int trust_default_duration;
4109 
4110  av_assert1(buf);
4111 
4113 
4114  if ((n = ebml_read_num(matroska, &pb.pub, 8, &num, 1)) < 0)
4115  return n;
4116  data += n;
4117  size -= n;
4118 
4119  track = matroska_find_track_by_num(matroska, num);
4120  if (!track || size < 3)
4121  return AVERROR_INVALIDDATA;
4122 
4123  if (!(st = track->stream)) {
4124  av_log(matroska->ctx, AV_LOG_VERBOSE,
4125  "No stream associated to TrackNumber %"PRIu64". "
4126  "Ignoring Block with this TrackNumber.\n", num);
4127  return 0;
4128  }
4129 
4130  if (st->discard >= AVDISCARD_ALL)
4131  return res;
4132  if (block_duration > INT64_MAX)
4133  block_duration = INT64_MAX;
4134 
4135  block_time = sign_extend(AV_RB16(data), 16);
4136  data += 2;
4137  flags = *data++;
4138  size -= 3;
4139  if (is_keyframe == -1)
4140  is_keyframe = flags & 0x80 ? AV_PKT_FLAG_KEY : 0;
4141 
4142  if (cluster_time != (uint64_t) -1 &&
4143  (block_time >= 0 || cluster_time >= -block_time)) {
4144  uint64_t timecode_cluster_in_track_tb = (double) cluster_time / track->time_scale;
4145  timecode = timecode_cluster_in_track_tb + block_time - track->codec_delay_in_track_tb;
4146  if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE &&
4147  timecode < track->end_timecode)
4148  is_keyframe = 0; /* overlapping subtitles are not key frame */
4149  if (is_keyframe) {
4150  ff_reduce_index(matroska->ctx, st->index);
4151  av_add_index_entry(st, cluster_pos, timecode, 0, 0,
4153  }
4154  }
4155 
4156  if (matroska->skip_to_keyframe &&
4157  track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
4158  // Compare signed timecodes. Timecode may be negative due to codec delay
4159  // offset. We don't support timestamps greater than int64_t anyway - see
4160  // AVPacket's pts.
4161  if ((int64_t)timecode < (int64_t)matroska->skip_to_timecode)
4162  return res;
4163  if (is_keyframe)
4164  matroska->skip_to_keyframe = 0;
4165  else if (!ffstream(st)->skip_to_keyframe) {
4166  av_log(matroska->ctx, AV_LOG_ERROR, "File is broken, keyframes not correctly marked!\n");
4167  matroska->skip_to_keyframe = 0;
4168  }
4169  }
4170 
4171  res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1,
4172  &pb.pub, lace_size, &laces);
4173  if (res < 0) {
4174  av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n");
4175  return res;
4176  }
4177 
4178  trust_default_duration = track->default_duration != 0;
4179  if (track->audio.samplerate == 8000 && trust_default_duration) {
4180  // If this is needed for more codecs, then add them here
4181  if (st->codecpar->codec_id == AV_CODEC_ID_AC3) {
4182  if (track->audio.samplerate != st->codecpar->sample_rate || !st->codecpar->frame_size)
4183  trust_default_duration = 0;
4184  }
4185  }
4186 
4187  if (!block_duration && trust_default_duration)
4188  block_duration = track->default_duration * laces / matroska->time_scale;
4189 
4190  if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time))
4191  track->end_timecode =
4192  FFMAX(track->end_timecode, timecode + block_duration);
4193 
4194  for (n = 0; n < laces; n++) {
4195  int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
4196  uint8_t *out_data = data;
4197  int out_size = lace_size[n];
4198 
4199  if (track->needs_decoding) {
4200  res = matroska_decode_buffer(&out_data, &out_size, track);
4201  if (res < 0)
4202  return res;
4203  /* Given that we are here means that out_data is no longer
4204  * owned by buf, so set it to NULL. This depends upon
4205  * zero-length header removal compression being ignored. */
4206  av_assert1(out_data != data);
4207  buf = NULL;
4208  }
4209 
4210  if (track->audio.buf) {
4211  res = matroska_parse_rm_audio(matroska, track, st,
4212  out_data, out_size,
4213  timecode, pos);
4214  if (!buf)
4215  av_free(out_data);
4216  if (res)
4217  return res;
4218  } else if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) {
4219  res = matroska_parse_webvtt(matroska, track, st,
4220  out_data, out_size,
4221  timecode, lace_duration,
4222  pos);
4223  if (!buf)
4224  av_free(out_data);
4225  if (res)
4226  return res;
4227  } else {
4228  res = matroska_parse_frame(matroska, track, st, buf, out_data,
4229  out_size, timecode, lace_duration,
4230  pos, is_keyframe,
4231  blockmore, nb_blockmore,
4232  discard_padding);
4233  if (res)
4234  return res;
4235  }
4236 
4237  if (timecode != AV_NOPTS_VALUE)
4238  timecode = lace_duration ? timecode + lace_duration : AV_NOPTS_VALUE;
4239  data += lace_size[n];
4240  }
4241 
4242  return 0;
4243 }
4244 
4245 static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
4246 {
4247  MatroskaCluster *cluster = &matroska->current_cluster;
4248  MatroskaBlock *block = &cluster->block;
4249  int res;
4250 
4251  av_assert0(matroska->num_levels <= 2U);
4252 
4253  if (matroska->num_levels == 1) {
4254  res = ebml_parse(matroska, matroska_segment, NULL);
4255 
4256  if (res == 1) {
4257  /* Found a cluster: subtract the size of the ID already read. */
4258  cluster->pos = avio_tell(matroska->ctx->pb) - 4;
4259 
4260  res = ebml_parse(matroska, matroska_cluster_enter, cluster);
4261  if (res < 0)
4262  return res;
4263  }
4264  }
4265 
4266  if (matroska->num_levels == 2) {
4267  /* We are inside a cluster. */
4268  res = ebml_parse(matroska, matroska_cluster_parsing, cluster);
4269 
4270  if (res >= 0 && block->bin.size > 0) {
4271  int is_keyframe = block->non_simple ? block->reference.count == 0 : -1;
4272 
4273  res = matroska_parse_block(matroska, block->bin.buf, block->bin.data,
4274  block->bin.size, block->bin.pos,
4275  cluster->timecode, block->duration,
4276  is_keyframe, block->blockmore.elem,
4277  block->blockmore.nb_elem, cluster->pos,
4278  block->discard_padding);
4279  }
4280 
4282  memset(block, 0, sizeof(*block));
4283  } else if (!matroska->num_levels) {
4284  if (!avio_feof(matroska->ctx->pb)) {
4285  avio_r8(matroska->ctx->pb);
4286  if (!avio_feof(matroska->ctx->pb)) {
4287  av_log(matroska->ctx, AV_LOG_WARNING, "File extends beyond "
4288  "end of segment.\n");
4289  return AVERROR_INVALIDDATA;
4290  }
4291  }
4292  matroska->done = 1;
4293  return AVERROR_EOF;
4294  }
4295 
4296  return res;
4297 }
4298 
4300 {
4301  MatroskaDemuxContext *matroska = s->priv_data;
4302  int ret = 0;
4303 
4304  if (matroska->resync_pos == -1) {
4305  // This can only happen if generic seeking has been used.
4306  matroska->resync_pos = avio_tell(s->pb);
4307  }
4308 
4309  while (matroska_deliver_packet(matroska, pkt)) {
4310  if (matroska->done)
4311  return (ret < 0) ? ret : AVERROR_EOF;
4312  if (matroska_parse_cluster(matroska) < 0 && !matroska->done)
4313  ret = matroska_resync(matroska, matroska->resync_pos);
4314  }
4315 
4316  return 0;
4317 }
4318 
4319 static int matroska_read_seek(AVFormatContext *s, int stream_index,
4320  int64_t timestamp, int flags)
4321 {
4322  MatroskaDemuxContext *matroska = s->priv_data;
4323  MatroskaTrack *tracks = NULL;
4324  AVStream *st = s->streams[stream_index];
4325  FFStream *const sti = ffstream(st);
4326  int i, index;
4327 
4328  /* Parse the CUES now since we need the index data to seek. */
4329  if (matroska->cues_parsing_deferred > 0) {
4330  matroska->cues_parsing_deferred = 0;
4331  matroska_parse_cues(matroska);
4332  }
4333 
4334  if (!sti->nb_index_entries)
4335  goto err;
4336  timestamp = FFMAX(timestamp, sti->index_entries[0].timestamp);
4337 
4338  if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
4339  index == sti->nb_index_entries - 1) {
4340  matroska_reset_status(matroska, 0, sti->index_entries[sti->nb_index_entries - 1].pos);
4341  while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
4342  index == sti->nb_index_entries - 1) {
4343  matroska_clear_queue(matroska);
4344  if (matroska_parse_cluster(matroska) < 0)
4345  break;
4346  }
4347  }
4348 
4349  matroska_clear_queue(matroska);
4350  if (index < 0 || (matroska->cues_parsing_deferred < 0 &&
4351  index == sti->nb_index_entries - 1))
4352  goto err;
4353 
4354  tracks = matroska->tracks.elem;
4355  for (i = 0; i < matroska->tracks.nb_elem; i++) {
4356  tracks[i].audio.pkt_cnt = 0;
4357  tracks[i].audio.sub_packet_cnt = 0;
4358  tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
4359  tracks[i].end_timecode = 0;
4360  }
4361 
4362  /* We seek to a level 1 element, so set the appropriate status. */
4363  matroska_reset_status(matroska, 0, sti->index_entries[index].pos);
4364  if (flags & AVSEEK_FLAG_ANY) {
4365  sti->skip_to_keyframe = 0;
4366  matroska->skip_to_timecode = timestamp;
4367  } else {
4368  sti->skip_to_keyframe = 1;
4369  matroska->skip_to_timecode = sti->index_entries[index].timestamp;
4370  }
4371  matroska->skip_to_keyframe = 1;
4372  matroska->done = 0;
4374  return 0;
4375 err:
4376  // slightly hackish but allows proper fallback to
4377  // the generic seeking code.
4378  matroska_reset_status(matroska, 0, -1);
4379  matroska->resync_pos = -1;
4380  matroska_clear_queue(matroska);
4382  matroska->skip_to_keyframe = 0;
4383  matroska->done = 0;
4384  return -1;
4385 }
4386 
4388 {
4389  MatroskaDemuxContext *matroska = s->priv_data;
4390  MatroskaTrack *tracks = matroska->tracks.elem;
4391  int n;
4392 
4393  matroska_clear_queue(matroska);
4394 
4395  for (n = 0; n < matroska->tracks.nb_elem; n++)
4396  if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
4397  av_freep(&tracks[n].audio.buf);
4398  ebml_free(matroska_segment, matroska);
4399 
4400  return 0;
4401 }
4402 
4403 #if CONFIG_WEBM_DASH_MANIFEST_DEMUXER
4404 typedef struct {
4405  int64_t start_time_ns;
4406  int64_t end_time_ns;
4407  int64_t start_offset;
4408  int64_t end_offset;
4409 } CueDesc;
4410 
4411 /* This function searches all the Cues and returns the CueDesc corresponding to
4412  * the timestamp ts. Returned CueDesc will be such that start_time_ns <= ts <
4413  * end_time_ns. All 4 fields will be set to -1 if ts >= file's duration or
4414  * if an error occurred.
4415  */
4416 static CueDesc get_cue_desc(AVFormatContext *s, int64_t ts, int64_t cues_start) {
4417  MatroskaDemuxContext *matroska = s->priv_data;
4418  FFStream *const sti = ffstream(s->streams[0]);
4419  AVIndexEntry *const index_entries = sti->index_entries;
4420  int nb_index_entries = sti->nb_index_entries;
4421  CueDesc cue_desc;
4422  int i;
4423 
4424  if (ts >= (int64_t)(matroska->duration * matroska->time_scale))
4425  return (CueDesc) {-1, -1, -1, -1};
4426  for (i = 1; i < nb_index_entries; i++) {
4427  if (index_entries[i - 1].timestamp * matroska->time_scale <= ts &&
4428  index_entries[i].timestamp * matroska->time_scale > ts) {
4429  break;
4430  }
4431  }
4432  --i;
4433  if (index_entries[i].timestamp > matroska->duration)
4434  return (CueDesc) {-1, -1, -1, -1};
4435  cue_desc.start_time_ns = index_entries[i].timestamp * matroska->time_scale;
4436  cue_desc.start_offset = index_entries[i].pos - matroska->segment_start;
4437  if (i != nb_index_entries - 1) {
4438  cue_desc.end_time_ns = index_entries[i + 1].timestamp * matroska->time_scale;
4439  cue_desc.end_offset = index_entries[i + 1].pos - matroska->segment_start;
4440  } else {
4441  cue_desc.end_time_ns = matroska->duration * matroska->time_scale;
4442  // FIXME: this needs special handling for files where Cues appear
4443  // before Clusters. the current logic assumes Cues appear after
4444  // Clusters.
4445  cue_desc.end_offset = cues_start - matroska->segment_start;
4446  }
4447  return cue_desc;
4448 }
4449 
4450 static int webm_clusters_start_with_keyframe(AVFormatContext *s)
4451 {
4452  MatroskaDemuxContext *matroska = s->priv_data;
4453  AVStream *const st = s->streams[0];
4454  FFStream *const sti = ffstream(st);
4455  uint32_t id = matroska->current_id;
4456  int64_t cluster_pos, before_pos;
4457  int index, rv = 1;
4458 
4459  if (sti->nb_index_entries <= 0)
4460  return 0;
4461 
4462  // seek to the first cluster using cues.
4463  index = av_index_search_timestamp(st, 0, 0);
4464  if (index < 0)
4465  return 0;
4466  cluster_pos = sti->index_entries[index].pos;
4467  before_pos = avio_tell(s->pb);
4468  while (1) {
4469  uint64_t cluster_id, cluster_length;
4470  int read;
4471  AVPacket *pkt;
4472  avio_seek(s->pb, cluster_pos, SEEK_SET);
4473  // read cluster id and length
4474  read = ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id, 1);
4475  if (read < 0 || cluster_id != 0xF43B675) // done with all clusters
4476  break;
4477  read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length);
4478  if (read < 0)
4479  break;
4480 
4481  matroska_reset_status(matroska, 0, cluster_pos);
4482  matroska_clear_queue(matroska);
4483  if (matroska_parse_cluster(matroska) < 0 ||
4484  !matroska->queue.head) {
4485  break;
4486  }
4487  pkt = &matroska->queue.head->pkt;
4488  // 4 + read is the length of the cluster id and the cluster length field.
4489  cluster_pos += 4 + read + cluster_length;
4490  if (!(pkt->flags & AV_PKT_FLAG_KEY)) {
4491  rv = 0;
4492  break;
4493  }
4494  }
4495 
4496  /* Restore the status after matroska_read_header: */
4497  matroska_reset_status(matroska, id, before_pos);
4498 
4499  return rv;
4500 }
4501 
4502 static int buffer_size_after_time_downloaded(int64_t time_ns, double search_sec, int64_t bps,
4503  double min_buffer, double* buffer,
4504  double* sec_to_download, AVFormatContext *s,
4505  int64_t cues_start)
4506 {
4507  double nano_seconds_per_second = 1000000000.0;
4508  double time_sec = time_ns / nano_seconds_per_second;
4509  int rv = 0;
4510  int64_t time_to_search_ns = (int64_t)(search_sec * nano_seconds_per_second);
4511  int64_t end_time_ns = time_ns + time_to_search_ns;
4512  double sec_downloaded = 0.0;
4513  CueDesc desc_curr = get_cue_desc(s, time_ns, cues_start);
4514  if (desc_curr.start_time_ns == -1)
4515  return -1;
4516  *sec_to_download = 0.0;
4517 
4518  // Check for non cue start time.
4519  if (time_ns > desc_curr.start_time_ns) {
4520  int64_t cue_nano = desc_curr.end_time_ns - time_ns;
4521  double percent = (double)(cue_nano) / (desc_curr.end_time_ns - desc_curr.start_time_ns);
4522  double cueBytes = (desc_curr.end_offset - desc_curr.start_offset) * percent;
4523  double timeToDownload = (cueBytes * 8.0) / bps;
4524 
4525  sec_downloaded += (cue_nano / nano_seconds_per_second) - timeToDownload;
4526  *sec_to_download += timeToDownload;
4527 
4528  // Check if the search ends within the first cue.
4529  if (desc_curr.end_time_ns >= end_time_ns) {
4530  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4531  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4532  sec_downloaded = percent_to_sub * sec_downloaded;
4533  *sec_to_download = percent_to_sub * *sec_to_download;
4534  }
4535 
4536  if ((sec_downloaded + *buffer) <= min_buffer) {
4537  return 1;
4538  }
4539 
4540  // Get the next Cue.
4541  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4542  }
4543 
4544  while (desc_curr.start_time_ns != -1) {
4545  int64_t desc_bytes = desc_curr.end_offset - desc_curr.start_offset;
4546  int64_t desc_ns = desc_curr.end_time_ns - desc_curr.start_time_ns;
4547  double desc_sec = desc_ns / nano_seconds_per_second;
4548  double bits = (desc_bytes * 8.0);
4549  double time_to_download = bits / bps;
4550 
4551  sec_downloaded += desc_sec - time_to_download;
4552  *sec_to_download += time_to_download;
4553 
4554  if (desc_curr.end_time_ns >= end_time_ns) {
4555  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4556  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4557  sec_downloaded = percent_to_sub * sec_downloaded;
4558  *sec_to_download = percent_to_sub * *sec_to_download;
4559 
4560  if ((sec_downloaded + *buffer) <= min_buffer)
4561  rv = 1;
4562  break;
4563  }
4564 
4565  if ((sec_downloaded + *buffer) <= min_buffer) {
4566  rv = 1;
4567  break;
4568  }
4569 
4570  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4571  }
4572  *buffer = *buffer + sec_downloaded;
4573  return rv;
4574 }
4575 
4576 /* This function computes the bandwidth of the WebM file with the help of
4577  * buffer_size_after_time_downloaded() function. Both of these functions are
4578  * adapted from WebM Tools project and are adapted to work with FFmpeg's
4579  * Matroska parsing mechanism.
4580  *
4581  * Returns the bandwidth of the file on success; -1 on error.
4582  * */
4583 static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t cues_start)
4584 {
4585  MatroskaDemuxContext *matroska = s->priv_data;
4586  AVStream *st = s->streams[0];
4587  FFStream *const sti = ffstream(st);
4588  double bandwidth = 0.0;
4589 
4590  for (int i = 0; i < sti->nb_index_entries; i++) {
4591  int64_t prebuffer_ns = 1000000000;
4592  int64_t time_ns = sti->index_entries[i].timestamp * matroska->time_scale;
4593  double nano_seconds_per_second = 1000000000.0;
4594  int64_t prebuffered_ns;
4595  double prebuffer_bytes = 0.0;
4596  int64_t temp_prebuffer_ns = prebuffer_ns;
4597  int64_t pre_bytes, pre_ns;
4598  double pre_sec, prebuffer, bits_per_second;
4599  CueDesc desc_beg = get_cue_desc(s, time_ns, cues_start);
4600  // Start with the first Cue.
4601  CueDesc desc_end = desc_beg;
4602 
4603  if (time_ns > INT64_MAX - prebuffer_ns)
4604  return -1;
4605  prebuffered_ns = time_ns + prebuffer_ns;
4606 
4607  // Figure out how much data we have downloaded for the prebuffer. This will
4608  // be used later to adjust the bits per sample to try.
4609  while (desc_end.start_time_ns != -1 && desc_end.end_time_ns < prebuffered_ns) {
4610  // Prebuffered the entire Cue.
4611  prebuffer_bytes += desc_end.end_offset - desc_end.start_offset;
4612  temp_prebuffer_ns -= desc_end.end_time_ns - desc_end.start_time_ns;
4613  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4614  }
4615  if (desc_end.start_time_ns == -1) {
4616  // The prebuffer is larger than the duration.
4617  if (matroska->duration * matroska->time_scale >= prebuffered_ns)
4618  return -1;
4619  bits_per_second = 0.0;
4620  } else {
4621  // The prebuffer ends in the last Cue. Estimate how much data was
4622  // prebuffered.
4623  pre_bytes = desc_end.end_offset - desc_end.start_offset;
4624  if (desc_end.end_time_ns <= desc_end.start_time_ns ||
4625  desc_end.end_time_ns - (uint64_t)desc_end.start_time_ns > INT64_MAX)
4626  return -1;
4627  pre_ns = desc_end.end_time_ns - desc_end.start_time_ns;
4628  pre_sec = pre_ns / nano_seconds_per_second;
4629  prebuffer_bytes +=
4630  pre_bytes * ((temp_prebuffer_ns / nano_seconds_per_second) / pre_sec);
4631 
4632  prebuffer = prebuffer_ns / nano_seconds_per_second;
4633 
4634  // Set this to 0.0 in case our prebuffer buffers the entire video.
4635  bits_per_second = 0.0;
4636  do {
4637  int64_t desc_bytes = desc_end.end_offset - desc_beg.start_offset;
4638  int64_t desc_ns = desc_end.end_time_ns - desc_beg.start_time_ns;
4639  double desc_sec, calc_bits_per_second, percent, mod_bits_per_second;
4640  if (desc_bytes <= 0 || desc_bytes > INT64_MAX/8)
4641  return -1;
4642 
4643  desc_sec = desc_ns / nano_seconds_per_second;
4644  calc_bits_per_second = (desc_bytes * 8) / desc_sec;
4645 
4646  // Drop the bps by the percentage of bytes buffered.
4647  percent = (desc_bytes - prebuffer_bytes) / desc_bytes;
4648  mod_bits_per_second = calc_bits_per_second * percent;
4649 
4650  if (prebuffer < desc_sec) {
4651  double search_sec =
4652  (double)(matroska->duration * matroska->time_scale) / nano_seconds_per_second;
4653 
4654  // Add 1 so the bits per second should be a little bit greater than file
4655  // datarate.
4656  int64_t bps = (int64_t)(mod_bits_per_second) + 1;
4657  const double min_buffer = 0.0;
4658  double buffer = prebuffer;
4659  double sec_to_download = 0.0;
4660 
4661  int rv = buffer_size_after_time_downloaded(prebuffered_ns, search_sec, bps,
4662  min_buffer, &buffer, &sec_to_download,
4663  s, cues_start);
4664  if (rv < 0) {
4665  return -1;
4666  } else if (rv == 0) {
4667  bits_per_second = (double)(bps);
4668  break;
4669  }
4670  }
4671 
4672  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4673  } while (desc_end.start_time_ns != -1);
4674  }
4675  if (bandwidth < bits_per_second) bandwidth = bits_per_second;
4676  }
4677  return (int64_t)bandwidth;
4678 }
4679 
4680 static int webm_dash_manifest_cues(AVFormatContext *s, int64_t init_range)
4681 {
4682  MatroskaDemuxContext *matroska = s->priv_data;
4683  EbmlList *seekhead_list = &matroska->seekhead;
4684  MatroskaSeekhead *seekhead = seekhead_list->elem;
4685  AVStream *const st = s->streams[0];
4686  FFStream *const sti = ffstream(st);
4687  AVBPrint bprint;
4688  char *buf;
4689  int64_t cues_start = -1, cues_end = -1, before_pos, bandwidth;
4690  int i;
4691  int ret;
4692 
4693  // determine cues start and end positions
4694  for (i = 0; i < seekhead_list->nb_elem; i++)
4695  if (seekhead[i].id == MATROSKA_ID_CUES)
4696  break;
4697 
4698  if (i >= seekhead_list->nb_elem) return -1;
4699 
4700  before_pos = avio_tell(matroska->ctx->pb);
4701  cues_start = seekhead[i].pos + matroska->segment_start;
4702  if (avio_seek(matroska->ctx->pb, cues_start, SEEK_SET) == cues_start) {
4703  // cues_end is computed as cues_start + cues_length + length of the
4704  // Cues element ID (i.e. 4) + EBML length of the Cues element.
4705  // cues_end is inclusive and the above sum is reduced by 1.
4706  uint64_t cues_length, cues_id;
4707  int bytes_read;
4708  bytes_read = ebml_read_num (matroska, matroska->ctx->pb, 4, &cues_id, 1);
4709  if (bytes_read < 0 || cues_id != (MATROSKA_ID_CUES & 0xfffffff))
4710  return bytes_read < 0 ? bytes_read : AVERROR_INVALIDDATA;
4711  bytes_read = ebml_read_length(matroska, matroska->ctx->pb, &cues_length);
4712  if (bytes_read < 0)
4713  return bytes_read;
4714  cues_end = cues_start + 4 + bytes_read + cues_length - 1;
4715  }
4716  avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
4717  if (cues_start == -1 || cues_end == -1) return -1;
4718 
4719  // parse the cues
4720  matroska_parse_cues(matroska);
4721 
4722  if (!sti->nb_index_entries)
4723  return AVERROR_INVALIDDATA;
4724 
4725  // cues start
4726  av_dict_set_int(&s->streams[0]->metadata, CUES_START, cues_start, 0);
4727 
4728  // cues end
4729  av_dict_set_int(&s->streams[0]->metadata, CUES_END, cues_end, 0);
4730 
4731  // if the file has cues at the start, fix up the init range so that
4732  // it does not include it
4733  if (cues_start <= init_range)
4734  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, cues_start - 1, 0);
4735 
4736  // bandwidth
4737  bandwidth = webm_dash_manifest_compute_bandwidth(s, cues_start);
4738  if (bandwidth < 0) return -1;
4739  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH, bandwidth, 0);
4740 
4741  // check if all clusters start with key frames
4742  av_dict_set_int(&s->streams[0]->metadata, CLUSTER_KEYFRAME, webm_clusters_start_with_keyframe(s), 0);
4743 
4744  // Store cue point timestamps as a comma separated list
4745  // for checking subsegment alignment in the muxer.
4747  for (int i = 0; i < sti->nb_index_entries; i++)
4748  av_bprintf(&bprint, "%" PRId64",", sti->index_entries[i].timestamp);
4749  if (!av_bprint_is_complete(&bprint)) {
4750  av_bprint_finalize(&bprint, NULL);
4751  return AVERROR(ENOMEM);
4752  }
4753  // Remove the trailing ','
4754  bprint.str[--bprint.len] = '\0';
4755  if ((ret = av_bprint_finalize(&bprint, &buf)) < 0)
4756  return ret;
4757  av_dict_set(&s->streams[0]->metadata, CUE_TIMESTAMPS,
4759 
4760  return 0;
4761 }
4762 
4763 static int webm_dash_manifest_read_header(AVFormatContext *s)
4764 {
4765  char *buf;
4766  int ret = matroska_read_header(s);
4767  int64_t init_range;
4768  MatroskaTrack *tracks;
4769  MatroskaDemuxContext *matroska = s->priv_data;
4770  if (ret) {
4771  av_log(s, AV_LOG_ERROR, "Failed to read file headers\n");
4772  return -1;
4773  }
4774  if (!matroska->tracks.nb_elem || !s->nb_streams) {
4775  av_log(s, AV_LOG_ERROR, "No track found\n");
4776  return AVERROR_INVALIDDATA;
4777  }
4778 
4779  if (!matroska->is_live) {
4780  buf = av_asprintf("%g", matroska->duration);
4781  if (!buf)
4782  return AVERROR(ENOMEM);
4783  av_dict_set(&s->streams[0]->metadata, DURATION,
4785 
4786  // initialization range
4787  // 5 is the offset of Cluster ID.
4788  init_range = avio_tell(s->pb) - 5;
4789  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, init_range, 0);
4790  }
4791 
4792  // basename of the file
4793  buf = strrchr(s->url, '/');
4794  av_dict_set(&s->streams[0]->metadata, FILENAME, buf ? ++buf : s->url, 0);
4795 
4796  // track number
4797  tracks = matroska->tracks.elem;
4798  av_dict_set_int(&s->streams[0]->metadata, TRACK_NUMBER, tracks[0].num, 0);
4799 
4800  // parse the cues and populate Cue related fields
4801  if (!matroska->is_live) {
4802  ret = webm_dash_manifest_cues(s, init_range);
4803  if (ret < 0) {
4804  av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
4805  return ret;
4806  }
4807  }
4808 
4809  // use the bandwidth from the command line if it was provided
4810  if (matroska->bandwidth > 0) {
4811  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH,
4812  matroska->bandwidth, 0);
4813  }
4814  return 0;
4815 }
4816 
4817 static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt)
4818 {
4819  return AVERROR_EOF;
4820 }
4821 
4822 #define OFFSET(x) offsetof(MatroskaDemuxContext, x)
4823 static const AVOption options[] = {
4824  { "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 },
4825  { "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 },
4826  { NULL },
4827 };
4828 
4829 static const AVClass webm_dash_class = {
4830  .class_name = "WebM DASH Manifest demuxer",
4831  .item_name = av_default_item_name,
4832  .option = options,
4833  .version = LIBAVUTIL_VERSION_INT,
4834 };
4835 
4837  .p.name = "webm_dash_manifest",
4838  .p.long_name = NULL_IF_CONFIG_SMALL("WebM DASH Manifest"),
4839  .p.priv_class = &webm_dash_class,
4840  .priv_data_size = sizeof(MatroskaDemuxContext),
4841  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
4842  .read_header = webm_dash_manifest_read_header,
4843  .read_packet = webm_dash_manifest_read_packet,
4845 };
4846 #endif
4847 
4849  .p.name = "matroska,webm",
4850  .p.long_name = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
4851  .p.extensions = "mkv,mk3d,mka,mks,webm",
4852  .p.mime_type = "audio/webm,audio/x-matroska,video/webm,video/x-matroska",
4853  .priv_data_size = sizeof(MatroskaDemuxContext),
4854  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
4860 };
AVCOL_PRI_RESERVED
@ AVCOL_PRI_RESERVED
Definition: pixfmt.h:623
MatroskaCluster::timecode
uint64_t timecode
Definition: matroskadec.c:370
MATROSKA_ID_ENCODINGENCRYPTION
#define MATROSKA_ID_ENCODINGENCRYPTION
Definition: matroska.h:183
MatroskaBlockAdditionMapping::type
uint64_t type
Definition: matroskadec.c:254
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: demux_utils.c:43
MatroskaDemuxContext::segment_start
int64_t segment_start
Definition: matroskadec.c:404
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:336
flags
const SwsFlags flags[]
Definition: swscale.c:61
MATROSKA_ID_TAGTARGETS_ATTACHUID
#define MATROSKA_ID_TAGTARGETS_ATTACHUID
Definition: matroska.h:225
MatroskaDemuxContext::pkt
AVPacket * pkt
Definition: matroskadec.c:408
MATROSKA_ID_CHAPCOUNTRY
#define MATROSKA_ID_CHAPCOUNTRY
Definition: matroska.h:268
matroska_block_addition_mapping
static EbmlSyntax matroska_block_addition_mapping[5]
Definition: matroskadec.c:445
ebml_read_master
static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length, int64_t pos)
Definition: matroskadec.c:1108
ebml_read_binary
static int ebml_read_binary(AVIOContext *pb, int length, int64_t pos, EbmlBin *bin)
Definition: matroskadec.c:1080
AV_PKT_DATA_DISPLAYMATRIX
@ AV_PKT_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: packet.h:105
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:430
MATROSKA_ID_VIDEODISPLAYUNIT
#define MATROSKA_ID_VIDEODISPLAYUNIT
Definition: matroska.h:125
mkv_image_mime_tags
static const CodecMime mkv_image_mime_tags[]
Definition: matroskadec.c:810
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:3485
MATROSKA_ID_CODECPRIVATE
#define MATROSKA_ID_CODECPRIVATE
Definition: matroska.h:88
MATROSKA_ID_TRACKNUMBER
#define MATROSKA_ID_TRACKNUMBER
Definition: matroska.h:77
MatroskaTag
Definition: matroskadec.c:323
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
#define MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
Definition: matroska.h:101
MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
Definition: matroska.h:319
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
MATROSKA_ID_CHAPSTRING
#define MATROSKA_ID_CHAPSTRING
Definition: matroska.h:266
MATROSKA_BLOCK_ADD_ID_OPAQUE
#define MATROSKA_BLOCK_ADD_ID_OPAQUE
Definition: matroska.h:368
MATROSKA_ID_ENCODINGSIGHASHALGO
#define MATROSKA_ID_ENCODINGSIGHASHALGO
Definition: matroska.h:188
MatroskaTrack::codec_priv
EbmlBin codec_priv
Definition: matroskadec.c:264
MATROSKA_ID_TAGTARGETS
#define MATROSKA_ID_TAGTARGETS
Definition: matroska.h:220
AVSphericalProjection
AVSphericalProjection
Projection of the video surface(s) on a sphere.
Definition: spherical.h:47
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
EbmlSyntax::id
uint32_t id
Definition: matroskadec.c:113
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:235
PacketList::head
PacketListEntry * head
Definition: packet_internal.h:34
level
uint8_t level
Definition: svq3.c:208
matroska_attachment
static EbmlSyntax matroska_attachment[]
Definition: matroskadec.c:644
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:452
ebml_header
static EbmlSyntax ebml_header[]
Definition: matroskadec.c:450
MatroskaDemuxContext::current_id
uint32_t current_id
Definition: matroskadec.c:387
MatroskaDemuxContext::bandwidth
int bandwidth
Definition: matroskadec.c:434
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:218
MATROSKA_ID_TITLE
#define MATROSKA_ID_TITLE
Definition: matroska.h:67
r
const char * r
Definition: vf_curves.c:127
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:2445
opt.h
matroska_parse_block_additional
static int matroska_parse_block_additional(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVPacket *pkt, const uint8_t *data, int size, uint64_t id)
Definition: matroskadec.c:3876
matroska_parse_tracks
static int matroska_parse_tracks(AVFormatContext *s)
Definition: matroskadec.c:3109
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
AVSphericalMapping::projection
enum AVSphericalProjection projection
Projection type.
Definition: spherical.h:98
MatroskaTrack::operation
MatroskaTrackOperation operation
Definition: matroskadec.c:278
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
AVSphericalMapping::bound_bottom
uint32_t bound_bottom
Distance from the bottom edge.
Definition: spherical.h:182
MATROSKA_ID_CODECDECODEALL
#define MATROSKA_ID_CODECDECODEALL
Definition: matroska.h:92
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:149
MatroskaTrackVideo::pixel_cropt
uint64_t pixel_cropt
Definition: matroskadec.c:212
ebml_read_ascii
static int ebml_read_ascii(AVIOContext *pb, int size, const char *default_value, char **str)
Definition: matroskadec.c:1049
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, MatroskaBlockMore *blockmore, int nb_blockmore, int64_t cluster_pos, int64_t discard_padding)
Definition: matroskadec.c:4087
Ebml
Definition: matroskadec.c:140
EBML_BIN
@ EBML_BIN
Definition: matroskadec.c:95
MATROSKA_ID_CHAPTERFLAGENABLED
#define MATROSKA_ID_CHAPTERFLAGENABLED
Definition: matroska.h:275
MatroskaTrackPlane
Definition: matroskadec.c:242
color
Definition: vf_paletteuse.c:513
EBML_MAX_DEPTH
#define EBML_MAX_DEPTH
Definition: matroska.h:381
matroska_parse_prores
static int matroska_parse_prores(MatroskaTrack *track, uint8_t **data, int *size)
Definition: matroskadec.c:3743
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
MatroskaTrackVideo::pixel_cropr
uint64_t pixel_cropr
Definition: matroskadec.c:215
GetByteContext
Definition: bytestream.h:33
AV_PKT_DATA_FRAME_CROPPING
@ AV_PKT_DATA_FRAME_CROPPING
The number of pixels to discard from the top/bottom/left/right border of the decoded frame to obtain ...
Definition: packet.h:340
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
AVFMT_FLAG_IGNIDX
#define AVFMT_FLAG_IGNIDX
Ignore index.
Definition: avformat.h:1417
segment_start
static int segment_start(AVFormatContext *s, int write_header)
Definition: segment.c:232
EBML_ID_EBMLMAXSIZELENGTH
#define EBML_ID_EBMLMAXSIZELENGTH
Definition: matroska.h:38
MatroskaTrack::audio
MatroskaTrackAudio audio
Definition: matroskadec.c:277
MatroskaAttachment::description
char * description
Definition: matroskadec.c:297
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:123
MatroskaTags
Definition: matroskadec.c:339
MatroskaAttachment::bin
EbmlBin bin
Definition: matroskadec.c:299
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:169
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
MATROSKA_ID_TRACKOPERATION
#define MATROSKA_ID_TRACKOPERATION
Definition: matroska.h:82
ebml_read_num
static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb, int max_size, uint64_t *number, int eof_forbidden)
Definition: matroskadec.c:907
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, MatroskaBlockMore *blockmore, int nb_blockmore, int64_t discard_padding)
Definition: matroskadec.c:3966
MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE
@ MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE
Definition: matroska.h:304
MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS
#define MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS
Definition: matroska.h:102
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
EBML_STOP
@ EBML_STOP
Definition: matroskadec.c:98
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:815
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:210
MATROSKA_ID_VIDEOPIXELWIDTH
#define MATROSKA_ID_VIDEOPIXELWIDTH
Definition: matroska.h:119
TTA_EXTRADATA_SIZE
#define TTA_EXTRADATA_SIZE
Definition: matroskadec.c:2589
MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR
Definition: matroska.h:318
MATROSKA_ID_AUDIOSAMPLINGFREQ
#define MATROSKA_ID_AUDIOSAMPLINGFREQ
Definition: matroska.h:169
AV_PKT_DATA_MASTERING_DISPLAY_METADATA
@ AV_PKT_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata (based on SMPTE-2086:2014).
Definition: packet.h:219
EbmlList
Definition: matroskadec.c:127
av_int2double
static av_always_inline double av_int2double(uint64_t i)
Reinterpret a 64-bit integer as a double.
Definition: intfloat.h:60
matrix
Definition: vc1dsp.c:43
matroska_resync
static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
Definition: matroskadec.c:860
MatroskaSeekhead::pos
uint64_t pos
Definition: matroskadec.c:346
MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR
@ MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR
Definition: matroska.h:354
MatroskaTrack::name
char * name
Definition: matroskadec.c:262
Ebml::version
uint64_t version
Definition: matroskadec.c:141
matroska_track_combine_planes
static EbmlSyntax matroska_track_combine_planes[2]
Definition: matroskadec.c:445
Ebml::max_size
uint64_t max_size
Definition: matroskadec.c:142
MATROSKA_ID_DISCARDPADDING
#define MATROSKA_ID_DISCARDPADDING
Definition: matroska.h:250
MATROSKA_VIDEO_FIELDORDER_BB
@ MATROSKA_VIDEO_FIELDORDER_BB
Definition: matroska.h:307
matroska_cluster_parsing
static EbmlSyntax matroska_cluster_parsing[8]
Definition: matroskadec.c:448
MatroskaTrackAudio::sub_packet_cnt
int sub_packet_cnt
Definition: matroskadec.c:236
EbmlSyntax::n
const struct EbmlSyntax * n
Definition: matroskadec.c:123
int64_t
long long int64_t
Definition: coverity.c:34
MATROSKA_ID_EDITIONFLAGORDERED
#define MATROSKA_ID_EDITIONFLAGORDERED
Definition: matroska.h:272
MATROSKA_ID_DURATION
#define MATROSKA_ID_DURATION
Definition: matroska.h:66
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
av_asprintf
char * av_asprintf(const char *fmt,...)
Definition: avstring.c:115
MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT
Definition: matroska.h:141
MatroskaTrackEncoding::scope
uint64_t scope
Definition: matroskadec.c:159
matroska_read_header
static int matroska_read_header(AVFormatContext *s)
Definition: matroskadec.c:3297
matroska_find_track_by_num
static MatroskaTrack * matroska_find_track_by_num(MatroskaDemuxContext *matroska, uint64_t num)
Definition: matroskadec.c:1655
MATROSKA_ID_VIDEOCOLORPRIMARIES
#define MATROSKA_ID_VIDEOCOLORPRIMARIES
Definition: matroska.h:145
matroska_chapters
static EbmlSyntax matroska_chapters[2]
Definition: matroskadec.c:446
MATROSKA_VIDEO_DISPLAYUNIT_PIXELS
@ MATROSKA_VIDEO_DISPLAYUNIT_PIXELS
Definition: matroska.h:332
av_unused
#define av_unused
Definition: attributes.h:131
MATROSKA_ID_ENCODINGSIGNATURE
#define MATROSKA_ID_ENCODINGSIGNATURE
Definition: matroska.h:190
MATROSKA_ID_SEGMENT
#define MATROSKA_ID_SEGMENT
Definition: matroska.h:52
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:617
mask
int mask
Definition: mediacodecdec_common.c:154
CUES_START
#define CUES_START
Definition: matroska.h:429
out_size
int out_size
Definition: movenc.c:56
MATROSKA_ID_BLKADDIDTYPE
#define MATROSKA_ID_BLKADDIDTYPE
Definition: matroska.h:195
MatroskaMasteringMeta::white_y
double white_y
Definition: matroskadec.c:173
MatroskaTagTarget::trackuid
uint64_t trackuid
Definition: matroskadec.c:334
MatroskaBlock::discard_padding
int64_t discard_padding
Definition: matroskadec.c:365
AV_CODEC_ID_RA_144
@ AV_CODEC_ID_RA_144
Definition: codec_id.h:434
ff_metadata_conv
void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:26
MATROSKA_ID_CHAPTERS
#define MATROSKA_ID_CHAPTERS
Definition: matroska.h:62
MATROSKA_ID_VIDEOCOLOR_BY
#define MATROSKA_ID_VIDEOCOLOR_BY
Definition: matroska.h:155
pixdesc.h
rmsipr.h
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:386
MATROSKA_ID_BLOCKDURATION
#define MATROSKA_ID_BLOCKDURATION
Definition: matroska.h:247
w
uint8_t w
Definition: llviddspenc.c:38
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:750
MATROSKA_ID_VIDEOCOLORRANGE
#define MATROSKA_ID_VIDEOCOLORRANGE
Definition: matroska.h:142
AVFormatContext::strict_std_compliance
int strict_std_compliance
Allow non-standard and experimental extension.
Definition: avformat.h:1618
MATROSKA_ID_BLOCK
#define MATROSKA_ID_BLOCK
Definition: matroska.h:246
MatroskaDemuxContext::unknown_count
int unknown_count
Definition: matroskadec.c:389
av_display_matrix_flip
void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip)
Flip the input matrix horizontally and/or vertically.
Definition: display.c:66
AVPacket::data
uint8_t * data
Definition: packet.h:535
MatroskaTag::string
char * string
Definition: matroskadec.c:325
MATROSKA_ID_TRACKDEFAULTDURATION
#define MATROSKA_ID_TRACKDEFAULTDURATION
Definition: matroska.h:108
MatroskaDemuxContext::num_levels
int num_levels
Definition: matroskadec.c:386
matroska_track_encodings
static EbmlSyntax matroska_track_encodings[2]
Definition: matroskadec.c:444
matroska_tags
static EbmlSyntax matroska_tags[2]
Definition: matroskadec.c:447
MATROSKA_ID_TAGTARGETS_TYPE
#define MATROSKA_ID_TAGTARGETS_TYPE
Definition: matroska.h:221
MatroskaTrackAudio::coded_framesize
int coded_framesize
Definition: matroskadec.c:232
MatroskaSeekhead
Definition: matroskadec.c:344
AVCodecParameters::seek_preroll
int seek_preroll
Audio only.
Definition: codec_par.h:214
bitdepth
#define bitdepth
Definition: aom_film_grain_template.c:67
AVOption
AVOption.
Definition: opt.h:429
matroska_video_stereo_plane
static const char *const matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT]
Definition: matroskadec.c:828
b
#define b
Definition: input.c:42
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:647
matroska_read_seek
static int matroska_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: matroskadec.c:4313
CountedElement::u
uint64_t u
Definition: matroskadec.c:104
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:833
matroska_read_close
static int matroska_read_close(AVFormatContext *s)
Definition: matroskadec.c:4381
PacketList
Definition: packet_internal.h:33
spherical.h
MATROSKA_ID_ENCODINGSCOPE
#define MATROSKA_ID_ENCODINGSCOPE
Definition: matroska.h:177
data
const char data[16]
Definition: mxf.c:149
MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
@ MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
Definition: matroska.h:299
MatroskaTrack::end_timecode
int64_t end_timecode
Definition: matroskadec.c:284
AV_CODEC_ID_ALAC
@ AV_CODEC_ID_ALAC
Definition: codec_id.h:465
MATROSKA_ID_DATEUTC
#define MATROSKA_ID_DATEUTC
Definition: matroska.h:70
FF_COMPLIANCE_STRICT
#define FF_COMPLIANCE_STRICT
Strictly conform to all the things in the spec no matter what consequences.
Definition: defs.h:59
MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ
#define MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ
Definition: matroska.h:136
MatroskaTag::sub
EbmlList sub
Definition: matroskadec.c:328
MatroskaTrack::video
MatroskaTrackVideo video
Definition: matroskadec.c:276
AVIOContext::error
int error
contains the error code or 0 if no error happened
Definition: avio.h:239
AAC_MAX_EXTRADATA_SIZE
#define AAC_MAX_EXTRADATA_SIZE
Definition: matroskadec.c:2588
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR
Definition: matroska.h:326
matroska.h
MatroskaTrackEncoding
Definition: matroskadec.c:158
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
mkv_parse_video_codec
static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par, const MatroskaDemuxContext *matroska, int *extradata_offset)
Definition: matroskadec.c:2868
MATROSKA_ID_VIDEOPIXELCROPT
#define MATROSKA_ID_VIDEOPIXELCROPT
Definition: matroska.h:122
aac_profiles
static const AVProfile aac_profiles[]
Definition: audiotoolboxenc.c:607
MATROSKA_ID_VIDEOPIXELCROPB
#define MATROSKA_ID_VIDEOPIXELCROPB
Definition: matroska.h:121
av_display_rotation_set
void av_display_rotation_set(int32_t matrix[9], double angle)
Initialize a transformation matrix describing a pure clockwise rotation by the specified angle (in de...
Definition: display.c:51
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:553
MATROSKA_ID_VIDEOCOLORCBSUBVERT
#define MATROSKA_ID_VIDEOCOLORCBSUBVERT
Definition: matroska.h:139
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
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:68
MatroskaTrackVideoColor
Definition: matroskadec.c:178
mkv_parse_video_projection
static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, void *logctx)
Definition: matroskadec.c:2398
mathematics.h
MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
@ MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
Definition: matroska.h:340
MATROSKA_ID_CUES
#define MATROSKA_ID_CUES
Definition: matroska.h:57
AVDictionary
Definition: dict.c:32
ffio_init_read_context
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
Definition: aviobuf.c:99
AV_CODEC_ID_FLAC
@ AV_CODEC_ID_FLAC
Definition: codec_id.h:461
MatroskaTrackEncoding::type
uint64_t type
Definition: matroskadec.c:160
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:454
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
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:448
MATROSKA_ID_CUETIME
#define MATROSKA_ID_CUETIME
Definition: matroska.h:202
MatroskaTrackVideoProjection
Definition: matroskadec.c:195
AV_PROFILE_ARIB_PROFILE_C
#define AV_PROFILE_ARIB_PROFILE_C
Definition: defs.h:189
MatroskaMasteringMeta::b_y
double b_y
Definition: matroskadec.c:171
matroska_read_packet
static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: matroskadec.c:4293
MATROSKA_ID_CUERELATIVEPOSITION
#define MATROSKA_ID_CUERELATIVEPOSITION
Definition: matroska.h:208
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
AV_SPHERICAL_EQUIRECTANGULAR
@ AV_SPHERICAL_EQUIRECTANGULAR
Video represents a sphere mapped on a flat surface using equirectangular projection.
Definition: spherical.h:52
intfloat.h
MatroskaDemuxContext::title
char * title
Definition: matroskadec.c:393
MatroskaTrackVideoColor::primaries
uint64_t primaries
Definition: matroskadec.c:189
MATROSKA_ID_CHAPLANG
#define MATROSKA_ID_CHAPLANG
Definition: matroska.h:267
MatroskaTrackVideoProjection::yaw
double yaw
Definition: matroskadec.c:198
ebml_parse
static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
Definition: matroskadec.c:1252
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:493
MATROSKA_ID_CUEDURATION
#define MATROSKA_ID_CUEDURATION
Definition: matroska.h:209
FFIOContext
Definition: avio_internal.h:28
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:590
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:37
MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
Definition: matroska.h:320
MatroskaTrack::stream
AVStream * stream
Definition: matroskadec.c:283
AVIndexEntry
Definition: avformat.h:598
AV_WB64
#define AV_WB64(p, v)
Definition: intreadwrite.h:429
MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL
#define MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL
Definition: matroska.h:135
matroska_segment
static EbmlSyntax matroska_segment[9]
Definition: matroskadec.c:443
AV_CODEC_ID_BIN_DATA
@ AV_CODEC_ID_BIN_DATA
Definition: codec_id.h:601
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:2130
MatroskaBlock::duration
uint64_t duration
Definition: matroskadec.c:360
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:606
AV_FIELD_BT
@ AV_FIELD_BT
Bottom coded first, top displayed first.
Definition: defs.h:214
MatroskaDemuxContext
Definition: matroskadec.c:380
MatroskaTrackVideo::alpha_mode
uint64_t alpha_mode
Definition: matroskadec.c:220
MatroskaTrackVideo::display_unit
uint64_t display_unit
Definition: matroskadec.c:216
MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN
@ MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN
Definition: matroska.h:336
AVContentLightMetadata
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
Definition: mastering_display_metadata.h:107
MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX
Definition: matroska.h:158
update_pos
#define update_pos(td, mb_y, mb_x)
Definition: vp8.c:2382
MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG
Definition: matroska.h:325
MatroskaTrack::flag_default
uint64_t flag_default
Definition: matroskadec.c:268
matroska_track_encoding_compression
static EbmlSyntax matroska_track_encoding_compression[]
Definition: matroskadec.c:549
AVCodecParameters::color_primaries
enum AVColorPrimaries color_primaries
Definition: codec_par.h:167
MATROSKA_ID_VIDEOCOLOR_WHITEY
#define MATROSKA_ID_VIDEOCOLOR_WHITEY
Definition: matroska.h:157
MatroskaTrack::block_addition_mappings
EbmlList block_addition_mappings
Definition: matroskadec.c:288
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
CodecMime
Definition: internal.h:47
primaries
enum AVColorPrimaries primaries
Definition: mediacodec_wrapper.c:2612
AV_PROFILE_ARIB_PROFILE_A
#define AV_PROFILE_ARIB_PROFILE_A
Definition: defs.h:188
AVCOL_SPC_RESERVED
@ AVCOL_SPC_RESERVED
reserved for future use by ITU-T and ISO/IEC just like 15-255 are
Definition: pixfmt.h:677
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:211
ebml_read_sint
static int ebml_read_sint(AVIOContext *pb, int size, int64_t default_value, int64_t *num)
Definition: matroskadec.c:1006
NOTHING
#define NOTHING(STEREOMODETYPE, WDIV, HDIV, WEBM)
ebml_syntax
static EbmlSyntax ebml_syntax[3]
Definition: matroskadec.c:443
MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
#define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
Definition: matroska.h:170
MATROSKA_BLOCK_ADD_ID_TYPE_DEFAULT
@ MATROSKA_BLOCK_ADD_ID_TYPE_DEFAULT
Definition: matroska.h:361
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: avformat.c:777
mpeg4audio.h
MATROSKA_ID_VIDEOPROJECTIONPRIVATE
#define MATROSKA_ID_VIDEOPROJECTIONPRIVATE
Definition: matroska.h:163
MatroskaTrack::ms_compat
int ms_compat
Definition: matroskadec.c:285
av_packet_add_side_data
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
Definition: packet.c:198
MatroskaTag::def
uint64_t def
Definition: matroskadec.c:327
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:47
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:347
MatroskaTrackPlane::uid
uint64_t uid
Definition: matroskadec.c:243
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:337
MatroskaDemuxContext::current_cluster
MatroskaCluster current_cluster
Definition: matroskadec.c:426
MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
@ MATROSKA_VIDEO_STEREOMODE_TYPE_MONO
Definition: matroska.h:313
MATROSKA_ID_ENCODINGSIGALGO
#define MATROSKA_ID_ENCODINGSIGALGO
Definition: matroska.h:187
MATROSKA_ID_VIDEOASPECTRATIO
#define MATROSKA_ID_VIDEOASPECTRATIO
Definition: matroska.h:130
fail
#define fail()
Definition: checkasm.h:196
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2376
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:165
MatroskaDemuxContext::level1_elems
MatroskaLevel1Element level1_elems[64]
Definition: matroskadec.c:423
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:151
MATROSKA_ID_CHAPTERDISPLAY
#define MATROSKA_ID_CHAPTERDISPLAY
Definition: matroska.h:265
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:194
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:122
MATROSKA_ID_TRACKUID
#define MATROSKA_ID_TRACKUID
Definition: matroska.h:78
MATROSKA_ID_ENCODINGSIGKEYID
#define MATROSKA_ID_ENCODINGSIGKEYID
Definition: matroska.h:189
EBML_ID_DOCTYPEVERSION
#define EBML_ID_DOCTYPEVERSION
Definition: matroska.h:40
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:143
MATROSKA_COLOUR_CHROMASITINGVERT_NB
@ MATROSKA_COLOUR_CHROMASITINGVERT_NB
Definition: matroska.h:350
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
MatroskaCluster::pos
int64_t pos
Definition: matroskadec.c:371
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: packet.c:583
MatroskaTrack
Definition: matroskadec.c:258
EbmlBin::buf
AVBufferRef * buf
Definition: matroskadec.c:135
ff_matroska_video_stereo_mode
const char *const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB]
Definition: matroska.c:132
mkv_parse_block_addition_mappings
static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, MatroskaTrack *track)
Definition: matroskadec.c:2498
AVChapter
Definition: avformat.h:1223
MatroskaBlock
Definition: matroskadec.c:359
matroska_probe
static int matroska_probe(const AVProbeData *p)
Definition: matroskadec.c:1608
AV_DISPOSITION_FORCED
#define AV_DISPOSITION_FORCED
Track should be used during playback by default.
Definition: avformat.h:650
MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35
@ MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35
Definition: matroska.h:363
MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL
Definition: matroska.h:317
matroska_segments
static EbmlSyntax matroska_segments[]
Definition: matroskadec.c:764
matroska_doctypes
static const char *const matroska_doctypes[]
Definition: matroskadec.c:834
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:326
mka_parse_audio_codec
static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par, const MatroskaDemuxContext *matroska, AVFormatContext *s, int *extradata_offset)
Definition: matroskadec.c:2592
MATROSKA_ID_VIDEOALPHAMODE
#define MATROSKA_ID_VIDEOALPHAMODE
Definition: matroska.h:129
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:450
mkv_parse_video_color
static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track)
Definition: matroskadec.c:2273
EBML_ID_DOCTYPE
#define EBML_ID_DOCTYPE
Definition: matroska.h:39
MatroskaTrackVideoColor::mastering_meta
MatroskaMasteringMeta mastering_meta
Definition: matroskadec.c:192
MatroskaTrackOperation
Definition: matroskadec.c:247
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:130
MATROSKA_ID_VIDEOCOLOR_WHITEX
#define MATROSKA_ID_VIDEOCOLOR_WHITEX
Definition: matroska.h:156
AVRational::num
int num
Numerator.
Definition: rational.h:59
EbmlSyntax::type
uint8_t type
Definition: matroskadec.c:114
MatroskaSeekhead::id
uint64_t id
Definition: matroskadec.c:345
AV_FIELD_TB
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition: defs.h:213
MATROSKA_TRACK_TYPE_METADATA
@ MATROSKA_TRACK_TYPE_METADATA
Definition: matroska.h:287
AV_CODEC_ID_ATRAC3
@ AV_CODEC_ID_ATRAC3
Definition: codec_id.h:480
matroska_tag
static EbmlSyntax matroska_tag[3]
Definition: matroskadec.c:447
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:79
MatroskaTrackOperation::combine_planes
EbmlList combine_planes
Definition: matroskadec.c:248
MATROSKA_VIDEO_FIELDORDER_TT
@ MATROSKA_VIDEO_FIELDORDER_TT
Definition: matroska.h:305
MatroskaDemuxContext::skip_to_keyframe
int skip_to_keyframe
Definition: matroskadec.c:416
MatroskaDemuxContext::levels
MatroskaLevel levels[EBML_MAX_DEPTH]
Definition: matroskadec.c:385
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:199
MatroskaVideoStereoModeType
MatroskaVideoStereoModeType
Definition: matroska.h:312
AV_CODEC_ID_SIPR
@ AV_CODEC_ID_SIPR
Definition: codec_id.h:490
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:168
CountedElement::f
double f
Definition: matroskadec.c:106
MATROSKA_ID_BLKADDIDNAME
#define MATROSKA_ID_BLKADDIDNAME
Definition: matroska.h:194
AV_CODEC_ID_PCM_S8
@ AV_CODEC_ID_PCM_S8
Definition: codec_id.h:340
description
Tag description
Definition: snow.txt:206
MATROSKA_ID_BLOCKADDITIONAL
#define MATROSKA_ID_BLOCKADDITIONAL
Definition: matroska.h:242
SKIP_THRESHOLD
#define SKIP_THRESHOLD
Definition: matroskadec.c:85
ebml_parse_nest
static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax, void *data)
Definition: matroskadec.c:1162
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:761
pkt
AVPacket * pkt
Definition: movenc.c:60
matroska_parse_seekhead_entry
static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int64_t pos)
Definition: matroskadec.c:1907
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
MatroskaTrackAudio::buf_timecode
uint64_t buf_timecode
Definition: matroskadec.c:238
MATROSKA_ID_TRACKCONTENTENCODING
#define MATROSKA_ID_TRACKCONTENTENCODING
Definition: matroska.h:110
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:180
EBML_ID_VOID
#define EBML_ID_VOID
Definition: matroska.h:44
MATROSKA_ID_TAGDEFAULT_BUG
#define MATROSKA_ID_TAGDEFAULT_BUG
Definition: matroska.h:219
MATROSKA_ID_CODECDOWNLOADURL
#define MATROSKA_ID_CODECDOWNLOADURL
Definition: matroska.h:91
MATROSKA_ID_VIDEOFIELDORDER
#define MATROSKA_ID_VIDEOFIELDORDER
Definition: matroska.h:127
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
AVCodecTag
Definition: internal.h:42
matroska_info
static EbmlSyntax matroska_info[]
Definition: matroskadec.c:467
MATROSKA_ID_VIDEOPIXELCROPR
#define MATROSKA_ID_VIDEOPIXELCROPR
Definition: matroska.h:124
MATROSKA_COLOUR_CHROMASITINGHORZ_NB
@ MATROSKA_COLOUR_CHROMASITINGHORZ_NB
Definition: matroska.h:343
MATROSKA_ID_TAGS
#define MATROSKA_ID_TAGS
Definition: matroska.h:58
AV_CODEC_ID_TTA
@ AV_CODEC_ID_TTA
Definition: codec_id.h:471
matroska_index_entry
static EbmlSyntax matroska_index_entry[3]
Definition: matroskadec.c:447
AV_CODEC_ID_TTF
@ AV_CODEC_ID_TTF
Definition: codec_id.h:590
MatroskaDemuxContext::muxingapp
char * muxingapp
Definition: matroskadec.c:394
AVCOL_PRI_RESERVED0
@ AVCOL_PRI_RESERVED0
Definition: pixfmt.h:620
duration
int64_t duration
Definition: movenc.c:65
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_read_callback.c:42
AV_FIELD_UNKNOWN
@ AV_FIELD_UNKNOWN
Definition: defs.h:209
EBML_ID_EBMLMAXIDLENGTH
#define EBML_ID_EBMLMAXIDLENGTH
Definition: matroska.h:37
AVCodecParameters::frame_size
int frame_size
Audio only.
Definition: codec_par.h:195
MatroskaTrackVideoColor::max_cll
uint64_t max_cll
Definition: matroskadec.c:190
matroska_parse_cluster
static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:4239
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:60
EbmlSyntax::list_elem_size
size_t list_elem_size
Definition: matroskadec.c:116
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: demux_utils.c:107
ebml_read_float
static int ebml_read_float(AVIOContext *pb, int size, double default_value, double *num)
Definition: matroskadec.c:1029
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:497
matroska_find_level1_elem
static MatroskaLevel1Element * matroska_find_level1_elem(MatroskaDemuxContext *matroska, uint32_t id, int64_t pos)
Definition: matroskadec.c:1218
MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED
@ MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED
Definition: matroska.h:347
intreadwrite.h
MATROSKA_ID_FILEUID
#define MATROSKA_ID_FILEUID
Definition: matroska.h:258
MatroskaMasteringMeta::b_x
double b_x
Definition: matroskadec.c:170
s
#define s(width, name)
Definition: cbs_vp9.c:198
MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE
@ MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE
Definition: matroska.h:300
Ebml::id_length
uint64_t id_length
Definition: matroskadec.c:143
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: packet.c:99
MatroskaTag::name
char * name
Definition: matroskadec.c:324
MatroskaLevel1Element::pos
int64_t pos
Definition: matroskadec.c:375
MatroskaDemuxContext::num_level1_elems
int num_level1_elems
Definition: matroskadec.c:424
MatroskaTagTarget::attachuid
uint64_t attachuid
Definition: matroskadec.c:336
CodecTags::str
char str[22]
Definition: matroska.h:376
MatroskaTrackVideo::field_order
uint64_t field_order
Definition: matroskadec.c:218
MATROSKA_ID_VIDEODISPLAYWIDTH
#define MATROSKA_ID_VIDEODISPLAYWIDTH
Definition: matroska.h:117
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1415
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
MATROSKA_VIDEO_FIELDORDER_BT
@ MATROSKA_VIDEO_FIELDORDER_BT
Definition: matroska.h:309
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:453
MatroskaDemuxContext::duration
double duration
Definition: matroskadec.c:392
MatroskaTrackVideo::pixel_width
uint64_t pixel_width
Definition: matroskadec.c:207
AVSphericalMapping::bound_top
uint32_t bound_top
Distance from the top edge.
Definition: spherical.h:180
MATROSKA_ID_TAGNAME
#define MATROSKA_ID_TAGNAME
Definition: matroska.h:215
MatroskaChapter
Definition: matroskadec.c:304
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:222
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:119
EbmlBin::size
int size
Definition: matroskadec.c:134
MATROSKA_ID_TAG
#define MATROSKA_ID_TAG
Definition: matroska.h:213
av_channel_layout_from_mask
int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask)
Initialize a native channel layout from a bitmask indicating which channels are present.
Definition: channel_layout.c:252
MatroskaTrackAudio::sub_packet_size
int sub_packet_size
Definition: matroskadec.c:235
TRACK_NUMBER
#define TRACK_NUMBER
Definition: matroska.h:436
MATROSKA_ID_TIMECODESCALE
#define MATROSKA_ID_TIMECODESCALE
Definition: matroska.h:65
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
matroska_cluster_enter
static EbmlSyntax matroska_cluster_enter[]
Definition: matroskadec.c:804
MATROSKA_ID_CLUSTERPOSITION
#define MATROSKA_ID_CLUSTERPOSITION
Definition: matroska.h:236
bits
uint8_t bits
Definition: vp3data.h:128
AVIndexEntry::timestamp
int64_t timestamp
Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are...
Definition: avformat.h:600
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
MATROSKA_ID_CUETRACKPOSITION
#define MATROSKA_ID_CUETRACKPOSITION
Definition: matroska.h:203
MATROSKA_ID_SEEKENTRY
#define MATROSKA_ID_SEEKENTRY
Definition: matroska.h:228
matroska_decode_buffer
static int matroska_decode_buffer(uint8_t **buf, int *buf_size, MatroskaTrack *track)
Definition: matroskadec.c:1669
MatroskaDemuxContext::attachments
EbmlList attachments
Definition: matroskadec.c:397
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
MATROSKA_ID_TRACKTYPE
#define MATROSKA_ID_TRACKTYPE
Definition: matroska.h:79
AVPacketSideData::data
uint8_t * data
Definition: packet.h:387
CLUSTER_KEYFRAME
#define CLUSTER_KEYFRAME
Definition: matroska.h:434
FFFormatContext::data_offset
int64_t data_offset
offset of the first packet
Definition: internal.h:89
MatroskaTrack::encodings
EbmlList encodings
Definition: matroskadec.c:279
MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR
Definition: matroska.h:322
MATROSKA_ID_SEGMENTUID
#define MATROSKA_ID_SEGMENTUID
Definition: matroska.h:71
channels
channels
Definition: aptx.h:31
EbmlType
EbmlType
Definition: matroskadec.c:88
matroska_track
static EbmlSyntax matroska_track[33]
Definition: matroskadec.c:444
mkv_parse_subtitle_codec
static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVStream *st, AVCodecParameters *par, const MatroskaDemuxContext *matroska)
Definition: matroskadec.c:3058
MATROSKA_ID_TRACKBLKADDMAPPING
#define MATROSKA_ID_TRACKBLKADDMAPPING
Definition: matroska.h:113
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:217
matroska_track_video_projection
static EbmlSyntax matroska_track_video_projection[]
Definition: matroskadec.c:510
MatroskaTrackAudio::sub_packet_h
int sub_packet_h
Definition: matroskadec.c:233
AV_PKT_DATA_STEREO3D
@ AV_PKT_DATA_STEREO3D
This side data should be associated with a video stream and contains Stereoscopic 3D information in f...
Definition: packet.h:111
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:142
WAVPACK_EXTRADATA_SIZE
#define WAVPACK_EXTRADATA_SIZE
Definition: matroskadec.c:2590
MATROSKA_ID_INFO
#define MATROSKA_ID_INFO
Definition: matroska.h:55
Ebml::doctype_version
uint64_t doctype_version
Definition: matroskadec.c:145
MatroskaTrackEncryption::algo
uint64_t algo
Definition: matroskadec.c:154
MatroskaTrackVideo::color
EbmlList color
Definition: matroskadec.c:221
MATROSKA_ID_AUDIOCHANNELS
#define MATROSKA_ID_AUDIOCHANNELS
Definition: matroska.h:173
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
MATROSKA_ID_BLKADDIDVALUE
#define MATROSKA_ID_BLKADDIDVALUE
Definition: matroska.h:193
MatroskaTrackVideoColor::chroma_siting_vert
uint64_t chroma_siting_vert
Definition: matroskadec.c:186
MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED
Definition: matroska.h:323
key
const char * key
Definition: hwcontext_opencl.c:189
MatroskaAttachment::stream
AVStream * stream
Definition: matroskadec.c:301
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:86
MatroskaTagTarget::type
char * type
Definition: matroskadec.c:332
MatroskaDemuxContext::seekhead
EbmlList seekhead
Definition: matroskadec.c:401
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:622
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:72
MATROSKA_ID_VIDEOSTEREOMODE
#define MATROSKA_ID_VIDEOSTEREOMODE
Definition: matroska.h:128
MatroskaDemuxContext::queue
PacketList queue
Definition: matroskadec.c:411
MatroskaTrack::type
uint64_t type
Definition: matroskadec.c:261
matroska_clear_queue
static void matroska_clear_queue(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:3480
AV_CODEC_ID_ARIB_CAPTION
@ AV_CODEC_ID_ARIB_CAPTION
Definition: codec_id.h:585
AVStereo3D::flags
int flags
Additional information about the frame packing.
Definition: stereo3d.h:212
MATROSKA_ID_VIDEOCOLORSPACE
#define MATROSKA_ID_VIDEOCOLORSPACE
Definition: matroska.h:131
AV_CODEC_ID_PNG
@ AV_CODEC_ID_PNG
Definition: codec_id.h:113
time_internal.h
if
if(ret)
Definition: filter_design.txt:179
MATROSKA_ID_TRACKNAME
#define MATROSKA_ID_TRACKNAME
Definition: matroska.h:95
FFFormatContext
Definition: internal.h:64
FF_INFMT_FLAG_INIT_CLEANUP
#define FF_INFMT_FLAG_INIT_CLEANUP
For an FFInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
Definition: demux.h:35
MatroskaTrackCompression::algo
uint64_t algo
Definition: matroskadec.c:149
FFStream::need_parsing
enum AVStreamParseType need_parsing
Definition: internal.h:314
avpriv_packet_list_free
void avpriv_packet_list_free(PacketList *pkt_buf)
Wipe the list and unref all the packets in it.
Definition: packet.c:597
AV_CODEC_ID_WEBVTT
@ AV_CODEC_ID_WEBVTT
Definition: codec_id.h:578
matroska_convert_tag
static void matroska_convert_tag(AVFormatContext *s, EbmlList *list, AVDictionary **metadata, char *prefix)
Definition: matroskadec.c:1807
EBML_ID_DOCTYPEREADVERSION
#define EBML_ID_DOCTYPEREADVERSION
Definition: matroska.h:41
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:229
AVFormatContext
Format I/O context.
Definition: avformat.h:1264
matroska_parse_content_encodings
static int matroska_parse_content_encodings(MatroskaTrackEncoding *encodings, unsigned nb_encodings, MatroskaTrack *track, char **key_id_base64, void *logctx)
Definition: matroskadec.c:2035
MATROSKA_ID_CODECSTATE
#define MATROSKA_ID_CODECSTATE
Definition: matroska.h:249
internal.h
MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
#define MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
Definition: matroska.h:100
AVCOL_TRC_RESERVED0
@ AVCOL_TRC_RESERVED0
Definition: pixfmt.h:645
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:518
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
@ MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
Definition: matroska.h:316
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
MatroskaAttachment::filename
char * filename
Definition: matroskadec.c:296
MATROSKA_ID_ENCODINGENCALGO
#define MATROSKA_ID_ENCODINGENCALGO
Definition: matroska.h:185
MatroskaTrackVideo::cropped_height
uint64_t cropped_height
Definition: matroskadec.c:210
MATROSKA_ID_BLOCKGROUP
#define MATROSKA_ID_BLOCKGROUP
Definition: matroska.h:238
MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN
#define MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN
Definition: matroska.h:159
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
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:783
NULL
#define NULL
Definition: coverity.c:32
MATROSKA_ID_ATTACHMENTS
#define MATROSKA_ID_ATTACHMENTS
Definition: matroska.h:60
STEREOMODE_STEREO3D_MAPPING
#define STEREOMODE_STEREO3D_MAPPING(MAP, MKV_ONLY)
Definition: matroska.h:401
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:262
ebml_parse_id
static EbmlSyntax * ebml_parse_id(EbmlSyntax *syntax, uint32_t id)
Definition: matroskadec.c:1149
MATROSKA_ID_TRACKCONTENTENCODINGS
#define MATROSKA_ID_TRACKCONTENTENCODINGS
Definition: matroska.h:109
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
MatroskaDemuxContext::index
EbmlList index
Definition: matroskadec.c:399
matroska_parse_cues
static void matroska_parse_cues(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:2016
MATROSKA_TRACK_TYPE_AUDIO
@ MATROSKA_TRACK_TYPE_AUDIO
Definition: matroska.h:281
MATROSKA_ID_EDITIONUID
#define MATROSKA_ID_EDITIONUID
Definition: matroska.h:269
isom.h
tmp
static uint8_t tmp[20]
Definition: aes_ctr.c:47
MATROSKA_ID_TRACKFLAGORIGINAL
#define MATROSKA_ID_TRACKFLAGORIGINAL
Definition: matroska.h:103
matroska_reset_status
static int matroska_reset_status(MatroskaDemuxContext *matroska, uint32_t id, int64_t position)
Definition: matroskadec.c:839
ff_matroska_demuxer
const FFInputFormat ff_matroska_demuxer
Definition: matroskadec.c:4842
matroska_execute_seekhead
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:1945
MatroskaTrackVideo::pixel_height
uint64_t pixel_height
Definition: matroskadec.c:208
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: packet.c:544
matroska_ebmlnum_sint
static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska, AVIOContext *pb, int64_t *num)
Definition: matroskadec.c:1130
MATROSKA_ID_ENCODINGORDER
#define MATROSKA_ID_ENCODINGORDER
Definition: matroska.h:176
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:63
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:3764
MATROSKA_ID_WRITINGAPP
#define MATROSKA_ID_WRITINGAPP
Definition: matroska.h:68
isnan
#define isnan(x)
Definition: libm.h:342
AV_DISPOSITION_COMMENT
#define AV_DISPOSITION_COMMENT
The stream is a commentary track.
Definition: avformat.h:635
MATROSKA_ID_VIDEOCOLOR_GY
#define MATROSKA_ID_VIDEOCOLOR_GY
Definition: matroska.h:153
AVPALETTE_SIZE
#define AVPALETTE_SIZE
Definition: pixfmt.h:32
matroska_track_operation
static EbmlSyntax matroska_track_operation[2]
Definition: matroskadec.c:445
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP
@ MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP
Definition: matroska.h:315
MatroskaBlockAdditionMapping::extradata
EbmlBin extradata
Definition: matroskadec.c:255
MatroskaTrackVideo
Definition: matroskadec.c:203
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:240
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:908
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1306
MatroskaBlockMore::additional
EbmlBin additional
Definition: matroskadec.c:356
mkv_field_order
static int mkv_field_order(const MatroskaDemuxContext *matroska, uint64_t field_order)
Definition: matroskadec.c:2191
MatroskaTrackVideoColor::cb_sub_horz
uint64_t cb_sub_horz
Definition: matroskadec.c:183
MATROSKA_ID_SIMPLETAG
#define MATROSKA_ID_SIMPLETAG
Definition: matroska.h:214
MATROSKA_ID_TRACKPLANEUID
#define MATROSKA_ID_TRACKPLANEUID
Definition: matroska.h:85
FFStream::nb_index_entries
int nb_index_entries
Definition: internal.h:186
MATROSKA_ID_VIDEOPROJECTION
#define MATROSKA_ID_VIDEOPROJECTION
Definition: matroska.h:161
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
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
options
Definition: swscale.c:43
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:824
MATROSKA_ID_SEEKID
#define MATROSKA_ID_SEEKID
Definition: matroska.h:231
FLAC_STREAMINFO_SIZE
#define FLAC_STREAMINFO_SIZE
Definition: flac.h:32
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:699
MatroskaTrackAudio::buf
uint8_t * buf
Definition: matroskadec.c:239
double
double
Definition: af_crystalizer.c:132
MatroskaTrack::codec_delay
uint64_t codec_delay
Definition: matroskadec.c:280
LEVEL_ENDED
#define LEVEL_ENDED
Definition: matroskadec.c:84
MATROSKA_ID_CHAPTERTIMESTART
#define MATROSKA_ID_CHAPTERTIMESTART
Definition: matroska.h:263
MatroskaTagTarget::typevalue
uint64_t typevalue
Definition: matroskadec.c:333
ff_codec_movvideo_tags
const AVCodecTag ff_codec_movvideo_tags[]
Definition: isom_tags.c:29
MatroskaMasteringMeta::min_luminance
CountedElement min_luminance
Definition: matroskadec.c:175
MATROSKA_ID_CUEBLOCKNUMBER
#define MATROSKA_ID_CUEBLOCKNUMBER
Definition: matroska.h:210
AV_DISPOSITION_ORIGINAL
#define AV_DISPOSITION_ORIGINAL
The stream is in original language.
Definition: avformat.h:631
MatroskaLevel1Element::parsed
int parsed
Definition: matroskadec.c:377
MatroskaTrack::flag_hearingimpaired
uint64_t flag_hearingimpaired
Definition: matroskadec.c:271
MatroskaTrackVideo::cropped_width
uint64_t cropped_width
Definition: matroskadec.c:209
MATROSKA_TRACK_TYPE_VIDEO
@ MATROSKA_TRACK_TYPE_VIDEO
Definition: matroska.h:280
CountedElement::s
char * s
Definition: matroskadec.c:107
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
av_chroma_location_pos_to_enum
enum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos)
Converts swscale x/y chroma position to AVChromaLocation.
Definition: pixdesc.c:3771
EbmlSyntax::def
union EbmlSyntax::@437 def
MATROSKA_ID_FILEMIMETYPE
#define MATROSKA_ID_FILEMIMETYPE
Definition: matroska.h:256
MATROSKA_ID_VIDEODISPLAYHEIGHT
#define MATROSKA_ID_VIDEODISPLAYHEIGHT
Definition: matroska.h:118
base64.h
MatroskaTrackPlane::type
uint64_t type
Definition: matroskadec.c:244
MatroskaLevel1Element
Definition: matroskadec.c:374
AV_PKT_DATA_CONTENT_LIGHT_LEVEL
@ AV_PKT_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
Definition: packet.h:232
MATROSKA_ID_TRACKAUDIO
#define MATROSKA_ID_TRACKAUDIO
Definition: matroska.h:81
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:716
matroska_index_pos
static EbmlSyntax matroska_index_pos[]
Definition: matroskadec.c:691
CUES_END
#define CUES_END
Definition: matroska.h:430
ff_codec_movaudio_tags
const AVCodecTag ff_codec_movaudio_tags[]
Definition: isom_tags.c:305
MatroskaTrackEncoding::compression
MatroskaTrackCompression compression
Definition: matroskadec.c:161
av_stereo3d_alloc_size
AVStereo3D * av_stereo3d_alloc_size(size_t *size)
Allocate an AVStereo3D structure and set its fields to default values.
Definition: stereo3d.c:40
index
int index
Definition: gxfenc.c:90
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:461
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
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
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
ff_log2_tab
const uint8_t ff_log2_tab[256]
Definition: log2_tab.c:23
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
MatroskaChapter::start
uint64_t start
Definition: matroskadec.c:305
EBML_STR
@ EBML_STR
Definition: matroskadec.c:93
MATROSKA_ID_VIDEOCOLORMAXCLL
#define MATROSKA_ID_VIDEOCOLORMAXCLL
Definition: matroska.h:146
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:225
MATROSKA_ID_TRACKENTRY
#define MATROSKA_ID_TRACKENTRY
Definition: matroska.h:74
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:415
matroska_track_encoding_encryption
static EbmlSyntax matroska_track_encoding_encryption[]
Definition: matroskadec.c:555
EBML_FLOAT
@ EBML_FLOAT
Definition: matroskadec.c:92
MatroskaTrack::default_duration
uint64_t default_duration
Definition: matroskadec.c:267
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:451
ebml_read_uint
static int ebml_read_uint(AVIOContext *pb, int size, uint64_t default_value, uint64_t *num)
Definition: matroskadec.c:985
MATROSKA_ID_TAGDEFAULT
#define MATROSKA_ID_TAGDEFAULT
Definition: matroska.h:218
CountedElement::el
union CountedElement::@436 el
MatroskaTrackVideoProjection::type
uint64_t type
Definition: matroskadec.c:196
MATROSKA_TRACK_ENCODING_COMP_BZLIB
@ MATROSKA_TRACK_ENCODING_COMP_BZLIB
Definition: matroska.h:292
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:688
MATROSKA_ID_AUDIOBITDEPTH
#define MATROSKA_ID_AUDIOBITDEPTH
Definition: matroska.h:172
MatroskaDemuxContext::tracks
EbmlList tracks
Definition: matroskadec.c:396
MatroskaTrackVideoColor::cb_sub_vert
uint64_t cb_sub_vert
Definition: matroskadec.c:184
MatroskaTrack::flag_visualimpaired
uint64_t flag_visualimpaired
Definition: matroskadec.c:272
MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
@ MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT
Definition: matroska.h:314
MATROSKA_ID_TRACKFLAGDEFAULT
#define MATROSKA_ID_TRACKFLAGDEFAULT
Definition: matroska.h:98
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AV_CODEC_ID_PCM_S24LE
@ AV_CODEC_ID_PCM_S24LE
Definition: codec_id.h:348
MatroskaCluster::block
MatroskaBlock block
Definition: matroskadec.c:369
av_lzo1x_decode
int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen)
Decodes LZO 1x compressed data.
Definition: lzo.c:136
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:61
MATROSKA_ID_ENCODINGCOMPALGO
#define MATROSKA_ID_ENCODINGCOMPALGO
Definition: matroska.h:180
AV_CODEC_ID_OTF
@ AV_CODEC_ID_OTF
Definition: codec_id.h:597
MATROSKA_ID_TRACKFLAGCOMMENTARY
#define MATROSKA_ID_TRACKFLAGCOMMENTARY
Definition: matroska.h:104
MatroskaTrack::flag_textdescriptions
uint64_t flag_textdescriptions
Definition: matroskadec.c:273
STEREO_MODE_CONV
#define STEREO_MODE_CONV(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM)
MatroskaDemuxContext::is_live
int is_live
Definition: matroskadec.c:431
EbmlSyntax
Definition: matroskadec.c:112
MATROSKA_ID_TRACKFLAGLACING
#define MATROSKA_ID_TRACKFLAGLACING
Definition: matroska.h:105
AVPacket::size
int size
Definition: packet.h:536
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:94
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:104
MatroskaTrackVideoColor::matrix_coefficients
uint64_t matrix_coefficients
Definition: matroskadec.c:179
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:136
MATROSKA_ID_VIDEOCOLOR_GX
#define MATROSKA_ID_VIDEOCOLOR_GX
Definition: matroska.h:152
mkv_create_display_matrix
static int mkv_create_display_matrix(AVStream *st, const MatroskaTrackVideoProjection *proj, void *logctx)
Definition: matroskadec.c:2356
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:261
qtpalette.h
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:240
FFStream
Definition: internal.h:128
matroska_convert_tags
static void matroska_convert_tags(AVFormatContext *s)
Definition: matroskadec.c:1842
AVSphericalMapping::bound_right
uint32_t bound_right
Distance from the right edge.
Definition: spherical.h:181
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
AV_PKT_DATA_DYNAMIC_HDR10_PLUS
@ AV_PKT_DATA_DYNAMIC_HDR10_PLUS
HDR10+ dynamic metadata associated with a video frame.
Definition: packet.h:296
MatroskaTrackEncoding::encryption
MatroskaTrackEncryption encryption
Definition: matroskadec.c:162
MATROSKA_ID_TRACKFLAGENABLED
#define MATROSKA_ID_TRACKFLAGENABLED
Definition: matroska.h:97
ff_dict_set_timestamp
int ff_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp)
Set a dictionary value to an ISO-8601 compliant timestamp string.
Definition: utils.c:603
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:29
MatroskaTrackAudio::frame_size
int frame_size
Definition: matroskadec.c:234
EBML_NONE
@ EBML_NONE
Definition: matroskadec.c:89
MATROSKA_ID_FILEDATA
#define MATROSKA_ID_FILEDATA
Definition: matroska.h:257
bps
unsigned bps
Definition: movenc.c:1908
MatroskaTrack::max_block_additional_id
uint64_t max_block_additional_id
Definition: matroskadec.c:287
MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH
#define MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH
Definition: matroska.h:165
MatroskaTrack::uid
uint64_t uid
Definition: matroskadec.c:260
size
int size
Definition: twinvq_data.h:10344
MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
@ MATROSKA_VIDEO_FIELDORDER_UNDETERMINED
Definition: matroska.h:306
MATROSKA_ID_BLOCKMORE
#define MATROSKA_ID_BLOCKMORE
Definition: matroska.h:240
mka_parse_audio
static int mka_parse_audio(MatroskaTrack *track, AVStream *st, AVCodecParameters *par, const MatroskaDemuxContext *matroska, AVFormatContext *s, int *extradata_offset)
Definition: matroskadec.c:2822
MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE
@ MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE
Definition: matroska.h:362
AV_WL32A
#define AV_WL32A(p, v)
Definition: intreadwrite.h:571
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:247
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:2218
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:147
PacketListEntry::pkt
AVPacket pkt
Definition: packet_internal.h:30
matroska_attachments
static EbmlSyntax matroska_attachments[2]
Definition: matroskadec.c:446
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[AVCOL_TRC_NB]
Definition: vf_colorspace.c:167
EbmlBin
Definition: matroskadec.c:133
NEEDS_CHECKING
#define NEEDS_CHECKING
Definition: matroskadec.c:83
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:128
AV_DISPOSITION_DUB
#define AV_DISPOSITION_DUB
The stream is not in original language.
Definition: avformat.h:625
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2594
EBML_UNKNOWN_LENGTH
#define EBML_UNKNOWN_LENGTH
Definition: matroskadec.c:82
MATROSKA_ID_VIDEOCOLORCBSUBHORZ
#define MATROSKA_ID_VIDEOCOLORCBSUBHORZ
Definition: matroska.h:138
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:822
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:46
INITIALIZATION_RANGE
#define INITIALIZATION_RANGE
Definition: matroska.h:428
EBML_NEST
@ EBML_NEST
Definition: matroskadec.c:96
MATROSKA_ID_POINTENTRY
#define MATROSKA_ID_POINTENTRY
Definition: matroska.h:199
dovi_isom.h
header
static const uint8_t header[24]
Definition: sdr2.c:68
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:654
MATROSKA_ID_BLKADDIDEXTRADATA
#define MATROSKA_ID_BLKADDIDEXTRADATA
Definition: matroska.h:196
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:534
AV_WL16
#define AV_WL16(p, v)
Definition: intreadwrite.h:408
MatroskaTrack::codec_id
char * codec_id
Definition: matroskadec.c:263
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:603
matroska_simpletag
static EbmlSyntax matroska_simpletag[]
Definition: matroskadec.c:711
AVSphericalMapping::padding
uint32_t padding
Number of pixels to pad from the edge of each cube face.
Definition: spherical.h:194
MatroskaTrack::num
uint64_t num
Definition: matroskadec.c:259
EbmlList::nb_elem
int nb_elem
Definition: matroskadec.c:128
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:178
EBML_SINT
@ EBML_SINT
Definition: matroskadec.c:91
av_packet_side_data_add
AVPacketSideData * av_packet_side_data_add(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, void *data, size_t size, int flags)
Wrap existing data as packet side data.
Definition: packet.c:700
AV_CODEC_ID_RV30
@ AV_CODEC_ID_RV30
Definition: codec_id.h:120
FLAC_METADATA_TYPE_VORBIS_COMMENT
@ FLAC_METADATA_TYPE_VORBIS_COMMENT
Definition: flac.h:50
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:314
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:541
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:233
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:489
MatroskaTrack::codec_delay_in_track_tb
uint64_t codec_delay_in_track_tb
Definition: matroskadec.c:281
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:36
version
version
Definition: libkvazaar.c:315
MATROSKA_ID_VIDEOPIXELHEIGHT
#define MATROSKA_ID_VIDEOPIXELHEIGHT
Definition: matroska.h:120
MatroskaTrackVideoColor::chroma_siting_horz
uint64_t chroma_siting_horz
Definition: matroskadec.c:185
MatroskaTagTarget
Definition: matroskadec.c:331
MatroskaBlockMore::additional_id
uint64_t additional_id
Definition: matroskadec.c:355
MATROSKA_ID_VIDEOFRAMERATE
#define MATROSKA_ID_VIDEOFRAMERATE
Definition: matroska.h:116
MatroskaBlock::non_simple
uint64_t non_simple
Definition: matroskadec.c:362
MatroskaBlockAdditionMapping
Definition: matroskadec.c:251
EBML_UTF8
@ EBML_UTF8
Definition: matroskadec.c:94
MatroskaIndex::pos
EbmlList pos
Definition: matroskadec.c:320
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
CountedElement::count
unsigned count
Definition: matroskadec.c:109
matroska_aac_sri
static int matroska_aac_sri(int samplerate)
Definition: matroskadec.c:2120
MatroskaChapter::chapter
AVChapter * chapter
Definition: matroskadec.c:310
MATROSKA_ID_MUXINGAPP
#define MATROSKA_ID_MUXINGAPP
Definition: matroska.h:69
MatroskaDemuxContext::resync_pos
int64_t resync_pos
Definition: matroskadec.c:388
MATROSKA_ID_EDITIONFLAGDEFAULT
#define MATROSKA_ID_EDITIONFLAGDEFAULT
Definition: matroska.h:271
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:1523
av_mastering_display_metadata_alloc_size
AVMasteringDisplayMetadata * av_mastering_display_metadata_alloc_size(size_t *size)
Allocate an AVMasteringDisplayMetadata structure and set its fields to default values.
Definition: mastering_display_metadata.c:44
MATROSKA_ID_TRACKPLANETYPE
#define MATROSKA_ID_TRACKPLANETYPE
Definition: matroska.h:86
FFStream::skip_to_keyframe
int skip_to_keyframe
Indicates that everything up to the next keyframe should be discarded.
Definition: internal.h:203
ffio_limit
int ffio_limit(AVIOContext *s, int size)
Definition: aviobuf.c:1061
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:90
MatroskaTrackVideo::display_height
uint64_t display_height
Definition: matroskadec.c:206
EBML_TYPE_COUNT
@ EBML_TYPE_COUNT
Definition: matroskadec.c:99
MATROSKA_ID_FILEDESC
#define MATROSKA_ID_FILEDESC
Definition: matroska.h:254
AV_CODEC_ID_GIF
@ AV_CODEC_ID_GIF
Definition: codec_id.h:149
MATROSKA_ID_VIDEOPROJECTIONTYPE
#define MATROSKA_ID_VIDEOPROJECTIONTYPE
Definition: matroska.h:162
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:59
MatroskaLevel::length
uint64_t length
Definition: matroskadec.c:351
EbmlSyntax::i
int64_t i
Definition: matroskadec.c:119
planes
static const struct @509 planes[]
MATROSKA_ID_FILENAME
#define MATROSKA_ID_FILENAME
Definition: matroska.h:255
interlaced
uint8_t interlaced
Definition: mxfenc.c:2287
AV_CODEC_ID_ATRAC1
@ AV_CODEC_ID_ATRAC1
Definition: codec_id.h:495
MatroskaDemuxContext::chapters
EbmlList chapters
Definition: matroskadec.c:398
AV_CODEC_ID_RA_288
@ AV_CODEC_ID_RA_288
Definition: codec_id.h:435
FILENAME
#define FILENAME
Definition: matroska.h:431
bprint.h
AV_CODEC_ID_RV40
@ AV_CODEC_ID_RV40
Definition: codec_id.h:121
MatroskaTrackAudio::pkt_cnt
int pkt_cnt
Definition: matroskadec.c:237
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:140
MatroskaChapter::uid
uint64_t uid
Definition: matroskadec.c:307
MATROSKA_ID_CODECID
#define MATROSKA_ID_CODECID
Definition: matroska.h:87
MatroskaTrackVideoColor::range
uint64_t range
Definition: matroskadec.c:187
AV_CODEC_ID_RV10
@ AV_CODEC_ID_RV10
Definition: codec_id.h:57
MatroskaTrackVideo::color_space
EbmlBin color_space
Definition: matroskadec.c:211
MatroskaTrackVideo::pixel_cropb
uint64_t pixel_cropb
Definition: matroskadec.c:214
MatroskaLevel::start
uint64_t start
Definition: matroskadec.c:350
matroska_track_video
static EbmlSyntax matroska_track_video[19]
Definition: matroskadec.c:443
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:528
avio_internal.h
AV_LZO_OUTPUT_PADDING
#define AV_LZO_OUTPUT_PADDING
Definition: lzo.h:47
MatroskaIndex::time
uint64_t time
Definition: matroskadec.c:319
matroska_track_audio
static EbmlSyntax matroska_track_audio[]
Definition: matroskadec.c:541
ff_isom_parse_dvcc_dvvc
int ff_isom_parse_dvcc_dvvc(void *logctx, AVStream *st, const uint8_t *buf_ptr, uint64_t size)
Definition: dovi_isom.c:32
MatroskaIndexPos
Definition: matroskadec.c:313
matroska_tagtargets
static EbmlSyntax matroska_tagtargets[]
Definition: matroskadec.c:721
MatroskaTags::target
MatroskaTagTarget target
Definition: matroskadec.c:340
BANDWIDTH
#define BANDWIDTH
Definition: matroska.h:432
MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
@ MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
Definition: matroska.h:294
algo
Definition: dct.c:59
AVCodecParameters::height
int height
Definition: codec_par.h:135
CountedElement::i
int64_t i
Definition: matroskadec.c:105
DURATION
#define DURATION
Definition: matroska.h:433
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
MATROSKA_ID_CUECLUSTERPOSITION
#define MATROSKA_ID_CUECLUSTERPOSITION
Definition: matroska.h:207
MATROSKA_TRACK_ENCODING_COMP_ZLIB
@ MATROSKA_TRACK_ENCODING_COMP_ZLIB
Definition: matroska.h:291
AVCodecParameters::block_align
int block_align
Audio only.
Definition: codec_par.h:191
MatroskaMasteringMeta::r_x
double r_x
Definition: matroskadec.c:166
MATROSKA_ID_CHAPTERPHYSEQUIV
#define MATROSKA_ID_CHAPTERPHYSEQUIV
Definition: matroska.h:276
MatroskaTrackVideo::projection
MatroskaTrackVideoProjection projection
Definition: matroskadec.c:222
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
MATROSKA_ID_CUETRACK
#define MATROSKA_ID_CUETRACK
Definition: matroska.h:206
display.h
Ebml::doctype
char * doctype
Definition: matroskadec.c:144
AV_FIELD_BB
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
Definition: defs.h:212
MATROSKA_ID_SEEKPOSITION
#define MATROSKA_ID_SEEKPOSITION
Definition: matroska.h:232
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:57
MATROSKA_ID_CLUSTER
#define MATROSKA_ID_CLUSTER
Definition: matroska.h:61
MATROSKA_ID_TRACKLANGUAGE
#define MATROSKA_ID_TRACKLANGUAGE
Definition: matroska.h:96
AV_CODEC_ID_RV20
@ AV_CODEC_ID_RV20
Definition: codec_id.h:58
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
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:204
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
MatroskaDemuxContext::is_webm
int is_webm
Definition: matroskadec.c:428
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:126
matroska_chapter
static EbmlSyntax matroska_chapter[6]
Definition: matroskadec.c:446
CUE_TIMESTAMPS
#define CUE_TIMESTAMPS
Definition: matroska.h:435
AV_CODEC_ID_PCM_S32BE
@ AV_CODEC_ID_PCM_S32BE
Definition: codec_id.h:345
MatroskaTrackAudio
Definition: matroskadec.c:225
EBML_ID_CRC32
#define EBML_ID_CRC32
Definition: matroska.h:45
EbmlSyntax::data_offset
size_t data_offset
Definition: matroskadec.c:117
MatroskaDemuxContext::tags
EbmlList tags
Definition: matroskadec.c:400
MatroskaLevel1Element::id
uint32_t id
Definition: matroskadec.c:376
EbmlSyntax::f
double f
Definition: matroskadec.c:121
ff_mkv_metadata_conv
const AVMetadataConv ff_mkv_metadata_conv[]
Definition: matroska.c:126
demux.h
AVCodecParameters::color_range
enum AVColorRange color_range
Video only.
Definition: codec_par.h:166
MatroskaTrack::flag_forced
uint64_t flag_forced
Definition: matroskadec.c:269
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:270
get_qt_codec
static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id)
Definition: matroskadec.c:2553
profile
int profile
Definition: mxfenc.c:2250
ff_get_wav_header
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
Definition: riffdec.c:95
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:676
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:129
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:81
MATROSKA_ID_EDITIONFLAGHIDDEN
#define MATROSKA_ID_EDITIONFLAGHIDDEN
Definition: matroska.h:270
MATROSKA_ID_CHAPTERUID
#define MATROSKA_ID_CHAPTERUID
Definition: matroska.h:273
EbmlList::alloc_elem_size
unsigned int alloc_elem_size
Definition: matroskadec.c:129
matroska_index
static EbmlSyntax matroska_index[2]
Definition: matroskadec.c:447
MatroskaTrackCompression::settings
EbmlBin settings
Definition: matroskadec.c:150
AVCodecParameters::field_order
enum AVFieldOrder field_order
Video only.
Definition: codec_par.h:161
AVDynamicHDRPlus
This struct represents dynamic metadata for color volume transform - application 4 of SMPTE 2094-40:2...
Definition: hdr_dynamic_metadata.h:243
MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
@ MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
Definition: matroska.h:324
MatroskaAttachment::uid
uint64_t uid
Definition: matroskadec.c:295
MatroskaTrackAudio::bitdepth
uint64_t bitdepth
Definition: matroskadec.c:228
matroska_mastering_meta
static EbmlSyntax matroska_mastering_meta[]
Definition: matroskadec.c:478
MATROSKA_ID_VIDEOPROJECTIONPOSEYAW
#define MATROSKA_ID_VIDEOPROJECTIONPOSEYAW
Definition: matroska.h:164
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:443
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:813
AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
@ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL
Data found in BlockAdditional element of matroska container.
Definition: packet.h:188
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:658
MatroskaMasteringMeta::g_x
double g_x
Definition: matroskadec.c:168
MatroskaTags::tag
EbmlList tag
Definition: matroskadec.c:341
tag
uint32_t tag
Definition: movenc.c:1907
MatroskaTagTarget::chapteruid
uint64_t chapteruid
Definition: matroskadec.c:335
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
mkv_mime_tags
static const CodecMime mkv_mime_tags[]
Definition: matroskadec.c:819
EbmlBin::pos
int64_t pos
Definition: matroskadec.c:137
mkv_parse_video
static int mkv_parse_video(MatroskaTrack *track, AVStream *st, AVCodecParameters *par, const MatroskaDemuxContext *matroska, int *extradata_offset)
Definition: matroskadec.c:2941
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:231
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:81
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:95
AVSphericalMapping::pitch
int32_t pitch
Rotation around the right vector [-90, 90].
Definition: spherical.h:139
MATROSKA_ID_TRACKCOMBINEPLANES
#define MATROSKA_ID_TRACKCOMBINEPLANES
Definition: matroska.h:83
AVStereo3D::type
enum AVStereo3DType type
How views are packed within the video.
Definition: stereo3d.h:207
MatroskaTrackCompression
Definition: matroskadec.c:148
av_channel_layout_check
int av_channel_layout_check(const AVChannelLayout *channel_layout)
Check whether a channel layout is valid, i.e.
Definition: channel_layout.c:783
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:120
matroska_blockmore
static EbmlSyntax matroska_blockmore[]
Definition: matroskadec.c:769
MATROSKA_ID_VIDEOCOLOR_BX
#define MATROSKA_ID_VIDEOCOLOR_BX
Definition: matroska.h:154
MATROSKA_ID_TAGSTRING
#define MATROSKA_ID_TAGSTRING
Definition: matroska.h:216
MatroskaDemuxContext::ctx
AVFormatContext * ctx
Definition: matroskadec.c:382
AVSTREAM_PARSE_HEADERS
@ AVSTREAM_PARSE_HEADERS
Only parse headers, do not repack.
Definition: avformat.h:590
pos
unsigned int pos
Definition: spdifenc.c:414
MATROSKA_ID_VIDEOCOLORMATRIXCOEFF
#define MATROSKA_ID_VIDEOCOLORMATRIXCOEFF
Definition: matroska.h:134
avformat.h
MatroskaDemuxContext::time_scale
uint64_t time_scale
Definition: matroskadec.c:391
MatroskaAttachment
Definition: matroskadec.c:294
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:99
dict.h
av_packet_side_data_new
AVPacketSideData * av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, size_t size, int flags)
Allocate a new packet side data.
Definition: packet.c:707
lzo.h
MATROSKA_ID_SIMPLEBLOCK
#define MATROSKA_ID_SIMPLEBLOCK
Definition: matroska.h:243
MATROSKA_ID_TRACKPLANE
#define MATROSKA_ID_TRACKPLANE
Definition: matroska.h:84
AV_DISPOSITION_DESCRIPTIONS
#define AV_DISPOSITION_DESCRIPTIONS
The subtitle stream contains a textual description of the video content.
Definition: avformat.h:694
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
id
enum AVCodecID id
Definition: dts2pts.c:367
MATROSKA_ID_VIDEOPIXELCROPL
#define MATROSKA_ID_VIDEOPIXELCROPL
Definition: matroska.h:123
MATROSKA_BLOCK_ADD_ID_TYPE_DVVC
@ MATROSKA_BLOCK_ADD_ID_TYPE_DVVC
Definition: matroska.h:365
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
U
#define U(x)
Definition: vpx_arith.h:37
MatroskaIndex
Definition: matroskadec.c:318
AVCodecParameters::chroma_location
enum AVChromaLocation chroma_location
Definition: codec_par.h:170
MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL
Definition: matroska.h:321
MATROSKA_ID_CODECNAME
#define MATROSKA_ID_CODECNAME
Definition: matroska.h:89
AV_PKT_DATA_WEBVTT_IDENTIFIER
@ AV_PKT_DATA_WEBVTT_IDENTIFIER
The optional first identifier line of a WebVTT cue.
Definition: packet.h:193
webm_dash_class
static const AVClass webm_dash_class
Definition: webmdashenc.c:539
MatroskaTrackVideo::frame_rate
double frame_rate
Definition: matroskadec.c:204
oggdec.h
MATROSKA_ID_EDITIONENTRY
#define MATROSKA_ID_EDITIONENTRY
Definition: matroska.h:261
MatroskaChapter::title
char * title
Definition: matroskadec.c:308
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:443
matroska_seekhead_entry
static EbmlSyntax matroska_seekhead_entry[]
Definition: matroskadec.c:741
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
MATROSKA_ID_TRACKMAXCACHE
#define MATROSKA_ID_TRACKMAXCACHE
Definition: matroska.h:107
matroska_seekhead
static EbmlSyntax matroska_seekhead[2]
Definition: matroskadec.c:447
ff_codec_bmp_tags
const AVCodecTag ff_codec_bmp_tags[]
Definition: riff.c:36
matroska_add_index_entries
static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:1983
MATROSKA_ID_TRACKMAXBLKADDID
#define MATROSKA_ID_TRACKMAXBLKADDID
Definition: matroska.h:112
itut35.h
EBML_ID_HEADER
#define EBML_ID_HEADER
Definition: matroska.h:32
MatroskaTrack::needs_decoding
int needs_decoding
Definition: matroskadec.c:286
matroska_blockgroup
static EbmlSyntax matroska_blockgroup[8]
Definition: matroskadec.c:448
MATROSKA_ID_TAGTARGETS_TYPEVALUE
#define MATROSKA_ID_TAGTARGETS_TYPEVALUE
Definition: matroska.h:222
EBML_ID_EBMLVERSION
#define EBML_ID_EBMLVERSION
Definition: matroska.h:35
MatroskaTrackType
MatroskaTrackType
Definition: matroska.h:278
MatroskaLevel
Definition: matroskadec.c:349
MATROSKA_ID_CLUSTERPREVSIZE
#define MATROSKA_ID_CLUSTERPREVSIZE
Definition: matroska.h:237
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
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: packet.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
MatroskaTrackVideo::display_width
uint64_t display_width
Definition: matroskadec.c:205
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:217
MatroskaTrackVideoColor::chroma_sub_horz
uint64_t chroma_sub_horz
Definition: matroskadec.c:181
is_ebml_id_valid
static int is_ebml_id_valid(uint32_t id)
Definition: matroskadec.c:1205
AVRational::den
int den
Denominator.
Definition: rational.h:60
MatroskaTrackAudio::channels
uint64_t channels
Definition: matroskadec.c:229
MATROSKA_VIDEO_STEREO_PLANE_COUNT
#define MATROSKA_VIDEO_STEREO_PLANE_COUNT
Definition: matroska.h:383
mkv_parse_dvcc_dvvc
static int mkv_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const MatroskaTrack *track, EbmlBin *bin)
Definition: matroskadec.c:2492
MATROSKA_ID_VIDEOCOLOR
#define MATROSKA_ID_VIDEOCOLOR
Definition: matroska.h:132
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
MatroskaChapter::end
uint64_t end
Definition: matroskadec.c:306
matroska_tracks
static EbmlSyntax matroska_tracks[2]
Definition: matroskadec.c:445
defs.h
MatroskaDemuxContext::date_utc
EbmlBin date_utc
Definition: matroskadec.c:395
MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS
#define MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS
Definition: matroska.h:143
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:150
matroska_parse_wavpack
static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t **data, int *size)
Definition: matroskadec.c:3659
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:612
MATROSKA_TRACK_TYPE_SUBTITLE
@ MATROSKA_TRACK_TYPE_SUBTITLE
Definition: matroska.h:284
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:132
MatroskaMasteringMeta::max_luminance
double max_luminance
Definition: matroskadec.c:174
hdr_dynamic_metadata.h
temp
else temp
Definition: vf_mcdeint.c:271
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:878
AV_LZO_OUTPUT_FULL
#define AV_LZO_OUTPUT_FULL
decoded data did not fit into output buffer
Definition: lzo.h:39
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
Definition: packet.h:153
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:599
AVIOContext::eof_reached
int eof_reached
true if was unable to read due to error or eof
Definition: avio.h:238
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:147
MatroskaBlockAdditionMapping::name
char * name
Definition: matroskadec.c:253
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:137
MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
@ MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
Definition: matroska.h:355
AV_RL32A
#define AV_RL32A(p)
Definition: intreadwrite.h:568
EBML_UINT
@ EBML_UINT
Definition: matroskadec.c:90
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1399
AVPacket::stream_index
int stream_index
Definition: packet.h:537
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:3581
MatroskaTrackVideoColor::max_fall
uint64_t max_fall
Definition: matroskadec.c:191
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:318
MatroskaTrackVideoProjection::private
EbmlBin private
Definition: matroskadec.c:197
MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
Definition: matroska.h:140
MATROSKA_TRACK_ENCODING_COMP_LZO
@ MATROSKA_TRACK_ENCODING_COMP_LZO
Definition: matroska.h:293
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:184
ff_mpeg4audio_sample_rates
const int ff_mpeg4audio_sample_rates[16]
Definition: mpeg4audio_sample_rates.h:30
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:177
CodecMime::id
enum AVCodecID id
Definition: internal.h:49
av_spherical_alloc
AVSphericalMapping * av_spherical_alloc(size_t *size)
Allocate a AVSphericalVideo structure and initialize its fields to default values.
Definition: spherical.c:26
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
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:356
MATROSKA_ID_BLOCKREFERENCE
#define MATROSKA_ID_BLOCKREFERENCE
Definition: matroska.h:248
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
AV_CODEC_ID_PCM_S32LE
@ AV_CODEC_ID_PCM_S32LE
Definition: codec_id.h:344
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:110
MatroskaBlock::bin
EbmlBin bin
Definition: matroskadec.c:363
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
CodecTags::id
enum AVCodecID id
Definition: matroska.h:377
packet_internal.h
MATROSKA_ID_VIDEOCOLOR_RY
#define MATROSKA_ID_VIDEOCOLOR_RY
Definition: matroska.h:151
AV_CODEC_ID_PCM_U8
@ AV_CODEC_ID_PCM_U8
Definition: codec_id.h:341
MATROSKA_VIDEO_FIELDORDER_TB
@ MATROSKA_VIDEO_FIELDORDER_TB
Definition: matroska.h:308
mastering_display_metadata.h
SKIP_TRACK
@ SKIP_TRACK
Definition: matroskadec.c:2585
ITU_T_T35_COUNTRY_CODE_US
#define ITU_T_T35_COUNTRY_CODE_US
Definition: itut35.h:24
EbmlSyntax::s
const char * s
Definition: matroskadec.c:122
AVSphericalMapping::bound_left
uint32_t bound_left
Distance from the left edge.
Definition: spherical.h:179
MatroskaTrack::has_palette
int has_palette
Definition: matroskadec.c:291
MatroskaTrackVideoProjection::roll
double roll
Definition: matroskadec.c:200
AVCOL_TRC_RESERVED
@ AVCOL_TRC_RESERVED
Definition: pixfmt.h:648
MATROSKA_ID_TRACKVIDEO
#define MATROSKA_ID_TRACKVIDEO
Definition: matroska.h:80
av_dynamic_hdr_plus_alloc
AVDynamicHDRPlus * av_dynamic_hdr_plus_alloc(size_t *size)
Allocate an AVDynamicHDRPlus structure and set its fields to default values.
Definition: hdr_dynamic_metadata.c:36
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
Definition: matroska.h:327
AVIOContext::buffer
unsigned char * buffer
Start of the buffer.
Definition: avio.h:225
ff_mkv_codec_tags
const CodecTags ff_mkv_codec_tags[]
Definition: matroska.c:27
AV_CODEC_ID_PCM_F64LE
@ AV_CODEC_ID_PCM_F64LE
Definition: codec_id.h:359
MatroskaAttachment::mime
char * mime
Definition: matroskadec.c:298
MATROSKA_ID_TRACKFLAGFORCED
#define MATROSKA_ID_TRACKFLAGFORCED
Definition: matroska.h:99
MATROSKA_VIDEO_STEREOMODE_TYPE_NB
@ MATROSKA_VIDEO_STEREOMODE_TYPE_NB
Definition: matroska.h:328
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
MatroskaBlockMore
Definition: matroskadec.c:354
EBML_VERSION
#define EBML_VERSION
Definition: matroska.h:29
EBML_ID_EBMLREADVERSION
#define EBML_ID_EBMLREADVERSION
Definition: matroska.h:36
matroska_deliver_packet
static int matroska_deliver_packet(MatroskaDemuxContext *matroska, AVPacket *pkt)
Definition: matroskadec.c:3453
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
MatroskaTrack::palette
uint32_t palette[AVPALETTE_COUNT]
Definition: matroskadec.c:290
ITU_T_T35_PROVIDER_CODE_SMTPE
#define ITU_T_T35_PROVIDER_CODE_SMTPE
Definition: itut35.h:30
AVPacket
This structure stores compressed data.
Definition: packet.h:512
MatroskaTrackEncryption::key_id
EbmlBin key_id
Definition: matroskadec.c:155
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
MATROSKA_ID_ENCODINGENCAESSETTINGS
#define MATROSKA_ID_ENCODINGENCAESSETTINGS
Definition: matroska.h:184
MATROSKA_ID_CHAPTERFLAGHIDDEN
#define MATROSKA_ID_CHAPTERFLAGHIDDEN
Definition: matroska.h:274
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:86
riff.h
MATROSKA_ID_ATTACHEDFILE
#define MATROSKA_ID_ATTACHEDFILE
Definition: matroska.h:253
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:555
MATROSKA_ID_TRACKMINCACHE
#define MATROSKA_ID_TRACKMINCACHE
Definition: matroska.h:106
av_dynamic_hdr_plus_from_t35
int av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data, size_t size)
Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRPlus).
Definition: hdr_dynamic_metadata.c:61
MATROSKA_ID_CODECDELAY
#define MATROSKA_ID_CODECDELAY
Definition: matroska.h:93
FFInputFormat
Definition: demux.h:42
MatroskaMasteringMeta::g_y
double g_y
Definition: matroskadec.c:169
MatroskaTrackVideoColor::transfer_characteristics
uint64_t transfer_characteristics
Definition: matroskadec.c:188
FFMAX3
#define FFMAX3(a, b, c)
Definition: macros.h:48
mkv_stereo3d_conv
static int mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
Definition: matroskadec.c:2243
matroska_track_plane
static EbmlSyntax matroska_track_plane[]
Definition: matroskadec.c:579
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:589
MATROSKA_ID_ENCODINGCOMPRESSION
#define MATROSKA_ID_ENCODINGCOMPRESSION
Definition: matroska.h:179
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
MATROSKA_ID_TAGTARGETS_TRACKUID
#define MATROSKA_ID_TAGTARGETS_TRACKUID
Definition: matroska.h:223
MatroskaTrackVideoProjection::pitch
double pitch
Definition: matroskadec.c:199
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:85
AV_CODEC_ID_PCM_F32LE
@ AV_CODEC_ID_PCM_F32LE
Definition: codec_id.h:357
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
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:274
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
MatroskaBlock::blockmore
EbmlList blockmore
Definition: matroskadec.c:364
MatroskaTrackVideo::stereo_mode
uint64_t stereo_mode
Definition: matroskadec.c:219
AV_CODEC_ID_WAVPACK
@ AV_CODEC_ID_WAVPACK
Definition: codec_id.h:474
UNKNOWN_EQUIV
#define UNKNOWN_EQUIV
Definition: matroskadec.c:86
AV_CODEC_ID_COOK
@ AV_CODEC_ID_COOK
Definition: codec_id.h:469
MATROSKA_ID_CHAPTERTIMEEND
#define MATROSKA_ID_CHAPTERTIMEEND
Definition: matroska.h:264
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:444
MatroskaTrack::seek_preroll
uint64_t seek_preroll
Definition: matroskadec.c:275
matroska_chapter_display
static EbmlSyntax matroska_chapter_display[]
Definition: matroskadec.c:658
MatroskaCluster
Definition: matroskadec.c:368
MatroskaTrackVideoColor::chroma_sub_vert
uint64_t chroma_sub_vert
Definition: matroskadec.c:182
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
MATROSKA_ID_TRACKS
#define MATROSKA_ID_TRACKS
Definition: matroska.h:56
MATROSKA_ID_ENCODINGENCKEYID
#define MATROSKA_ID_ENCODINGENCKEYID
Definition: matroska.h:186
h
h
Definition: vp9dsp_template.c:2070
MatroskaTrackAudio::samplerate
double samplerate
Definition: matroskadec.c:226
MatroskaMasteringMeta::white_x
double white_x
Definition: matroskadec.c:172
ebml_free
static void ebml_free(EbmlSyntax *syntax, void *data)
Definition: matroskadec.c:1573
AV_CODEC_ID_TIFF
@ AV_CODEC_ID_TIFF
Definition: codec_id.h:148
AVStereo3D
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
Definition: stereo3d.h:203
AVDictionaryEntry::value
char * value
Definition: dict.h:92
EbmlSyntax::is_counted
uint8_t is_counted
Definition: matroskadec.c:115
avstring.h
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:50
MATROSKA_ID_ENCODINGCOMPSETTINGS
#define MATROSKA_ID_ENCODINGCOMPSETTINGS
Definition: matroska.h:181
flac.h
MatroskaDemuxContext::cues_parsing_deferred
int cues_parsing_deferred
Definition: matroskadec.c:420
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:149
MatroskaIndexPos::pos
uint64_t pos
Definition: matroskadec.c:315
MATROSKA_ID_SEEKPREROLL
#define MATROSKA_ID_SEEKPREROLL
Definition: matroska.h:94
MatroskaTrackVideo::pixel_cropl
uint64_t pixel_cropl
Definition: matroskadec.c:213
AVIOContext::buf_ptr
unsigned char * buf_ptr
Current position in the buffer.
Definition: avio.h:227
MATROSKA_ID_SEEKHEAD
#define MATROSKA_ID_SEEKHEAD
Definition: matroska.h:59
CHILD_OF
#define CHILD_OF(parent)
Definition: matroskadec.c:437
MatroskaBlock::reference
CountedElement reference
Definition: matroskadec.c:361
EbmlBin::data
uint8_t * data
Definition: matroskadec.c:136
EBML_LEVEL1
@ EBML_LEVEL1
Definition: matroskadec.c:97
MATROSKA_BLOCK_ADD_ID_TYPE_DVCC
@ MATROSKA_BLOCK_ADD_ID_TYPE_DVCC
Definition: matroska.h:364
fourcc
uint32_t fourcc
Definition: vaapi_decode.c:263
snprintf
#define snprintf
Definition: snprintf.h:34
MatroskaDemuxContext::skip_to_timecode
uint64_t skip_to_timecode
Definition: matroskadec.c:417
AVCodecParameters::initial_padding
int initial_padding
Audio only.
Definition: codec_par.h:203
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
MATROSKA_ID_VIDEOPROJECTIONPOSEROLL
#define MATROSKA_ID_VIDEOPROJECTIONPOSEROLL
Definition: matroska.h:166
AV_CODEC_ID_PCM_S24BE
@ AV_CODEC_ID_PCM_S24BE
Definition: codec_id.h:349
MATROSKA_ID_BLOCKADDID
#define MATROSKA_ID_BLOCKADDID
Definition: matroska.h:241
AVSphericalMapping
This structure describes how to handle spherical videos, outlining information about projection,...
Definition: spherical.h:94
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:375
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:252
MatroskaTrackAudio::out_samplerate
double out_samplerate
Definition: matroskadec.c:227
AVSphericalMapping::yaw
int32_t yaw
Rotation around the up vector [-180, 180].
Definition: spherical.h:138
src
#define src
Definition: vp8dsp.c:248
MATROSKA_ID_TAGTARGETS_CHAPTERUID
#define MATROSKA_ID_TAGTARGETS_CHAPTERUID
Definition: matroska.h:224
MatroskaTrackEncryption
Definition: matroskadec.c:153
ebml_read_length
static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb, uint64_t *number)
Read a EBML length value.
Definition: matroskadec.c:972
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:231
MATROSKA_ID_TRACKTIMECODESCALE
#define MATROSKA_ID_TRACKTIMECODESCALE
Definition: matroska.h:111
matroska_chapter_entry
static EbmlSyntax matroska_chapter_entry[9]
Definition: matroskadec.c:446
MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP
@ MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP
Definition: matroska.h:356
matroska_aac_profile
static int matroska_aac_profile(char *codec_id)
Definition: matroskadec.c:2109
AV_CODEC_ID_MLP
@ AV_CODEC_ID_MLP
Definition: codec_id.h:478
is_keyframe
static int is_keyframe(NalUnitType naltype)
Definition: libx265.c:94
MatroskaTrack::time_scale
double time_scale
Definition: matroskadec.c:266
MatroskaTrack::language
char * language
Definition: matroskadec.c:265
ff_webm_dash_manifest_demuxer
const FFInputFormat ff_webm_dash_manifest_demuxer
AV_CODEC_ID_PRORES
@ AV_CODEC_ID_PRORES
Definition: codec_id.h:200
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
av_realloc
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
Definition: mem.c:155
CountedElement
Definition: matroskadec.c:102
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:347
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:245
MatroskaMasteringMeta::r_y
double r_y
Definition: matroskadec.c:167
matroska_parse_flac
static int matroska_parse_flac(AVFormatContext *s, MatroskaTrack *track, int *offset)
Definition: matroskadec.c:2136
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:230
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:346
MATROSKA_ID_BLOCKADDITIONS
#define MATROSKA_ID_BLOCKADDITIONS
Definition: matroska.h:239
MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
@ MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
Definition: matroska.h:298
MatroskaDemuxContext::done
int done
Definition: matroskadec.c:413