FFmpeg
matroskadec.c
Go to the documentation of this file.
1 /*
2  * Matroska file demuxer
3  * Copyright (c) 2003-2008 The FFmpeg Project
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Matroska file demuxer
25  * @author Ronald Bultje <rbultje@ronald.bitfreak.net>
26  * @author with a little help from Moritz Bunkus <moritz@bunkus.org>
27  * @author totally reworked by Aurelien Jacobs <aurel@gnuage.org>
28  * @see specs available on the Matroska project page: http://www.matroska.org/
29  */
30 
31 #include "config.h"
32 #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 unknown, potentially damaged data is encountered,
89  * it is considered an error. */
90 #define UNKNOWN_EQUIV 50 * 1024 /* An unknown element is considered equivalent
91  * to this many bytes of unknown data for the
92  * SKIP_THRESHOLD check. */
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  if (syntax->id == MATROSKA_ID_TRACKENTRY &&
1342  list->nb_elem >= matroska->ctx->max_streams) {
1343  av_log(matroska->ctx, AV_LOG_ERROR,
1344  "Number of tracks exceeds max_streams (%d)\n",
1345  matroska->ctx->max_streams);
1346  return AVERROR(EINVAL);
1347  }
1348  newelem = av_fast_realloc(list->elem,
1349  &list->alloc_elem_size,
1350  (list->nb_elem + 1) * syntax->list_elem_size);
1351  if (!newelem)
1352  return AVERROR(ENOMEM);
1353  list->elem = newelem;
1354  data = (char *) list->elem + list->nb_elem * syntax->list_elem_size;
1355  memset(data, 0, syntax->list_elem_size);
1356  list->nb_elem++;
1357  }
1358  }
1359 
1360  if (syntax->type != EBML_STOP) {
1361  matroska->current_id = 0;
1362  if ((res = ebml_read_length(matroska, pb, &length)) < 0)
1363  return res;
1364 
1365  pos_alt += res;
1366 
1367  if (matroska->num_levels > 0) {
1368  if (length != EBML_UNKNOWN_LENGTH &&
1369  level->length != EBML_UNKNOWN_LENGTH) {
1370  uint64_t elem_end = pos_alt + length,
1371  level_end = level->start + level->length;
1372 
1373  if (elem_end < level_end) {
1374  level_check = 0;
1375  } else if (elem_end == level_end) {
1376  level_check = LEVEL_ENDED;
1377  } else {
1378  av_log(matroska->ctx, AV_LOG_ERROR,
1379  "Element at 0x%"PRIx64" ending at 0x%"PRIx64" exceeds "
1380  "containing master element ending at 0x%"PRIx64"\n",
1381  pos, elem_end, level_end);
1382  return AVERROR_INVALIDDATA;
1383  }
1384  } else if (length != EBML_UNKNOWN_LENGTH) {
1385  level_check = 0;
1386  } else if (level->length != EBML_UNKNOWN_LENGTH) {
1387  av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element "
1388  "at 0x%"PRIx64" inside parent with finite size\n", pos);
1389  return AVERROR_INVALIDDATA;
1390  } else {
1391  level_check = 0;
1392  if (id != MATROSKA_ID_CLUSTER && (syntax->type == EBML_LEVEL1
1393  || syntax->type == EBML_NEST)) {
1394  // According to the current specifications only clusters and
1395  // segments are allowed to be unknown-length. We also accept
1396  // other unknown-length master elements.
1397  av_log(matroska->ctx, AV_LOG_WARNING,
1398  "Found unknown-length element 0x%"PRIX32" other than "
1399  "a cluster at 0x%"PRIx64". Spec-incompliant, but "
1400  "parsing will nevertheless be attempted.\n", id, pos);
1401  update_pos = -1;
1402  }
1403  }
1404  } else
1405  level_check = 0;
1406 
1407  if (max_lengths[syntax->type] && length > max_lengths[syntax->type]) {
1408  if (length != EBML_UNKNOWN_LENGTH) {
1409  av_log(matroska->ctx, AV_LOG_ERROR,
1410  "Invalid length 0x%"PRIx64" > 0x%"PRIx64" for element "
1411  "with ID 0x%"PRIX32" at 0x%"PRIx64"\n",
1412  length, max_lengths[syntax->type], id, pos);
1413  } else if (syntax->type != EBML_NONE) {
1414  av_log(matroska->ctx, AV_LOG_ERROR,
1415  "Element with ID 0x%"PRIX32" at pos. 0x%"PRIx64" has "
1416  "unknown length, yet the length of an element of its "
1417  "type must be known.\n", id, pos);
1418  } else {
1419  av_log(matroska->ctx, AV_LOG_ERROR,
1420  "Found unknown-length element with ID 0x%"PRIX32" at "
1421  "pos. 0x%"PRIx64" for which no syntax for parsing is "
1422  "available.\n", id, pos);
1423  }
1424  return AVERROR_INVALIDDATA;
1425  }
1426 
1427  if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
1428  // Losing sync will likely manifest itself as encountering unknown
1429  // elements which are not reliably distinguishable from elements
1430  // belonging to future extensions of the format.
1431  // We use a heuristic to detect such situations: If the current
1432  // element is not expected at the current syntax level and there
1433  // were only a few unknown elements in a row, then the element is
1434  // skipped or considered defective based upon the length of the
1435  // current element (i.e. how much would be skipped); if there were
1436  // more than a few skipped elements in a row and skipping the current
1437  // element would lead us more than SKIP_THRESHOLD away from the last
1438  // known good position, then it is inferred that an error occurred.
1439  // The dependency on the number of unknown elements in a row exists
1440  // because the distance to the last known good position is
1441  // automatically big if the last parsed element was big.
1442  // In both cases, each unknown element is considered equivalent to
1443  // UNKNOWN_EQUIV of skipped bytes for the check.
1444  // The whole check is only done for non-seekable output, because
1445  // in this situation skipped data can't simply be rechecked later.
1446  // This is especially important when using unknown length elements
1447  // as the check for whether a child exceeds its containing master
1448  // element is not effective in this situation.
1449  if (update_pos) {
1450  matroska->unknown_count = 0;
1451  } else {
1452  int64_t dist = length + UNKNOWN_EQUIV * matroska->unknown_count++;
1453 
1454  if (matroska->unknown_count > 3)
1455  dist += pos_alt - matroska->resync_pos;
1456 
1457  if (dist > SKIP_THRESHOLD) {
1458  av_log(matroska->ctx, AV_LOG_ERROR,
1459  "Unknown element %"PRIX32" at pos. 0x%"PRIx64" with "
1460  "length 0x%"PRIx64" considered as invalid data. Last "
1461  "known good position 0x%"PRIx64", %d unknown elements"
1462  " in a row\n", id, pos, length, matroska->resync_pos,
1463  matroska->unknown_count);
1464  return AVERROR_INVALIDDATA;
1465  }
1466  }
1467  }
1468 
1469  if (update_pos > 0) {
1470  // We have found an element that is allowed at this place
1471  // in the hierarchy and it passed all checks, so treat the beginning
1472  // of the element as the "last known good" position.
1473  matroska->resync_pos = pos;
1474  }
1475 
1476  if (!data && length != EBML_UNKNOWN_LENGTH)
1477  goto skip;
1478  }
1479 
1480  switch (syntax->type) {
1481  case EBML_UINT:
1482  res = ebml_read_uint(pb, length, syntax->def.u, data);
1483  break;
1484  case EBML_SINT:
1485  res = ebml_read_sint(pb, length, syntax->def.i, data);
1486  break;
1487  case EBML_FLOAT:
1488  res = ebml_read_float(pb, length, syntax->def.f, data);
1489  break;
1490  case EBML_STR:
1491  case EBML_UTF8:
1492  res = ebml_read_ascii(pb, length, syntax->def.s, data);
1493  break;
1494  case EBML_BIN:
1495  res = ebml_read_binary(pb, length, pos_alt, data);
1496  break;
1497  case EBML_LEVEL1:
1498  case EBML_NEST:
1499  if ((res = ebml_read_master(matroska, length, pos_alt)) < 0)
1500  return res;
1501  if (id == MATROSKA_ID_SEGMENT)
1502  matroska->segment_start = pos_alt;
1503  if (id == MATROSKA_ID_CUES)
1504  matroska->cues_parsing_deferred = 0;
1505  if (syntax->type == EBML_LEVEL1 &&
1506  (level1_elem = matroska_find_level1_elem(matroska, syntax->id, pos))) {
1507  if (!level1_elem->pos) {
1508  // Zero is not a valid position for a level 1 element.
1509  level1_elem->pos = pos;
1510  } else if (level1_elem->pos != pos)
1511  av_log(matroska->ctx, AV_LOG_ERROR, "Duplicate element\n");
1512  level1_elem->parsed = 1;
1513  }
1514  if (res = ebml_parse_nest(matroska, syntax->def.n, data))
1515  return res;
1516  break;
1517  case EBML_STOP:
1518  return 1;
1519  skip:
1520  default:
1521  if (length) {
1522  int64_t res2;
1523  if (ffio_limit(pb, length) != length) {
1524  // ffio_limit emits its own error message,
1525  // so we don't have to.
1526  return AVERROR(EIO);
1527  }
1528  if ((res2 = avio_skip(pb, length - 1)) >= 0) {
1529  // avio_skip might take us past EOF. We check for this
1530  // by skipping only length - 1 bytes, reading a byte and
1531  // checking the error flags. This is done in order to check
1532  // that the element has been properly skipped even when
1533  // no filesize (that ffio_limit relies on) is available.
1534  avio_r8(pb);
1535  res = NEEDS_CHECKING;
1536  } else
1537  res = res2;
1538  } else
1539  res = 0;
1540  }
1541  if (res) {
1542  if (res == NEEDS_CHECKING) {
1543  if (pb->eof_reached) {
1544  if (pb->error)
1545  res = pb->error;
1546  else
1547  res = AVERROR_EOF;
1548  } else
1549  goto level_check;
1550  }
1551 
1552  if (res == AVERROR_INVALIDDATA)
1553  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
1554  else if (res == AVERROR(EIO))
1555  av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
1556  else if (res == AVERROR_EOF) {
1557  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely\n");
1558  res = AVERROR(EIO);
1559  }
1560 
1561  return res;
1562  }
1563 
1564 level_check:
1565  if (syntax->is_counted && data) {
1566  CountedElement *elem = data;
1567  if (elem->count != UINT_MAX)
1568  elem->count++;
1569  }
1570 
1571  if (level_check == LEVEL_ENDED && matroska->num_levels) {
1572  level = &matroska->levels[matroska->num_levels - 1];
1573  pos = avio_tell(pb);
1574 
1575  // Given that pos >= level->start no check for
1576  // level->length != EBML_UNKNOWN_LENGTH is necessary.
1577  while (matroska->num_levels && pos == level->start + level->length) {
1578  matroska->num_levels--;
1579  level--;
1580  }
1581  }
1582 
1583  return level_check;
1584 }
1585 
1586 static void ebml_free(EbmlSyntax *syntax, void *data)
1587 {
1588  int i, j;
1589  for (i = 0; syntax[i].id; i++) {
1590  void *data_off = (char *) data + syntax[i].data_offset;
1591  switch (syntax[i].type) {
1592  case EBML_STR:
1593  case EBML_UTF8:
1594  av_freep(data_off);
1595  break;
1596  case EBML_BIN:
1597  av_buffer_unref(&((EbmlBin *) data_off)->buf);
1598  break;
1599  case EBML_LEVEL1:
1600  case EBML_NEST:
1601  if (syntax[i].list_elem_size) {
1602  EbmlList *list = data_off;
1603  char *ptr = list->elem;
1604  for (j = 0; j < list->nb_elem;
1605  j++, ptr += syntax[i].list_elem_size)
1606  ebml_free(syntax[i].def.n, ptr);
1607  av_freep(&list->elem);
1608  list->nb_elem = 0;
1609  list->alloc_elem_size = 0;
1610  } else
1611  ebml_free(syntax[i].def.n, data_off);
1612  default:
1613  break;
1614  }
1615  }
1616 }
1617 
1618 /*
1619  * Autodetecting...
1620  */
1621 static int matroska_probe(const AVProbeData *p)
1622 {
1623  uint64_t total = 0;
1624  int len_mask = 0x80, size = 1, n = 1, i;
1625 
1626  /* EBML header? */
1627  if (AV_RB32(p->buf) != EBML_ID_HEADER)
1628  return 0;
1629 
1630  /* length of header */
1631  total = p->buf[4];
1632  while (size <= 8 && !(total & len_mask)) {
1633  size++;
1634  len_mask >>= 1;
1635  }
1636  if (size > 8)
1637  return 0;
1638  total &= (len_mask - 1);
1639  while (n < size)
1640  total = (total << 8) | p->buf[4 + n++];
1641 
1642  if (total + 1 == 1ULL << (7 * size)){
1643  /* Unknown-length header - simply parse the whole buffer. */
1644  total = p->buf_size - 4 - size;
1645  } else {
1646  /* Does the probe data contain the whole header? */
1647  if (p->buf_size < 4 + size + total)
1648  return 0;
1649  }
1650 
1651  /* The header should contain a known document type. For now,
1652  * we don't parse the whole header but simply check for the
1653  * availability of that array of characters inside the header.
1654  * Not fully fool-proof, but good enough. */
1655  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++) {
1656  size_t probelen = strlen(matroska_doctypes[i]);
1657  if (total < probelen)
1658  continue;
1659  for (n = 4 + size; n <= 4 + size + total - probelen; n++)
1660  if (!memcmp(p->buf + n, matroska_doctypes[i], probelen))
1661  return AVPROBE_SCORE_MAX;
1662  }
1663 
1664  // probably valid EBML header but no recognized doctype
1665  return AVPROBE_SCORE_EXTENSION;
1666 }
1667 
1669  uint64_t num)
1670 {
1671  MatroskaTrack *tracks = matroska->tracks.elem;
1672  int i;
1673 
1674  for (i = 0; i < matroska->tracks.nb_elem; i++)
1675  if (tracks[i].num == num)
1676  return &tracks[i];
1677 
1678  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %"PRIu64"\n", num);
1679  return NULL;
1680 }
1681 
1682 static int matroska_decode_buffer(uint8_t **buf, int *buf_size,
1683  MatroskaTrack *track)
1684 {
1685  MatroskaTrackEncoding *encodings = track->encodings.elem;
1686  uint8_t *data = *buf;
1687  int isize = *buf_size;
1688  uint8_t *pkt_data = NULL;
1689  av_unused uint8_t *newpktdata;
1690  int pkt_size = isize;
1691  int result = 0;
1692  int olen;
1693 
1694  if (pkt_size >= 10000000U)
1695  return AVERROR_INVALIDDATA;
1696 
1697  switch (encodings[0].compression.algo) {
1699  {
1700  int header_size = encodings[0].compression.settings.size;
1701  uint8_t *header = encodings[0].compression.settings.data;
1702 
1703  if (header_size && !header) {
1704  av_log(NULL, AV_LOG_ERROR, "Compression size but no data in headerstrip\n");
1705  return -1;
1706  }
1707 
1708  if (!header_size)
1709  return 0;
1710 
1711  pkt_size = isize + header_size;
1712  pkt_data = av_malloc(pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1713  if (!pkt_data)
1714  return AVERROR(ENOMEM);
1715 
1716  memcpy(pkt_data, header, header_size);
1717  memcpy(pkt_data + header_size, data, isize);
1718  break;
1719  }
1721  do {
1722  int insize = isize;
1723  olen = pkt_size *= 3;
1724  newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING
1726  if (!newpktdata) {
1727  result = AVERROR(ENOMEM);
1728  goto failed;
1729  }
1730  pkt_data = newpktdata;
1731  result = av_lzo1x_decode(pkt_data, &olen, data, &insize);
1732  } while (result == AV_LZO_OUTPUT_FULL && pkt_size < 10000000);
1733  if (result) {
1735  goto failed;
1736  }
1737  pkt_size -= olen;
1738  break;
1739 #if CONFIG_ZLIB
1741  {
1742  z_stream zstream = { 0 };
1743  if (!pkt_size || inflateInit(&zstream) != Z_OK)
1744  return -1;
1745  zstream.next_in = data;
1746  zstream.avail_in = isize;
1747  do {
1748  pkt_size *= 3;
1749  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1750  if (!newpktdata) {
1751  inflateEnd(&zstream);
1752  result = AVERROR(ENOMEM);
1753  goto failed;
1754  }
1755  pkt_data = newpktdata;
1756  zstream.avail_out = pkt_size - zstream.total_out;
1757  zstream.next_out = pkt_data + zstream.total_out;
1758  result = inflate(&zstream, Z_NO_FLUSH);
1759  } while (result == Z_OK && pkt_size < 10000000);
1760  pkt_size = zstream.total_out;
1761  inflateEnd(&zstream);
1762  if (result != Z_STREAM_END) {
1763  if (result == Z_MEM_ERROR)
1764  result = AVERROR(ENOMEM);
1765  else
1767  goto failed;
1768  }
1769  break;
1770  }
1771 #endif
1772 #if CONFIG_BZLIB
1774  {
1775  bz_stream bzstream = { 0 };
1776  if (!pkt_size || BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
1777  return -1;
1778  bzstream.next_in = data;
1779  bzstream.avail_in = isize;
1780  do {
1781  pkt_size *= 3;
1782  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1783  if (!newpktdata) {
1784  BZ2_bzDecompressEnd(&bzstream);
1785  result = AVERROR(ENOMEM);
1786  goto failed;
1787  }
1788  pkt_data = newpktdata;
1789  bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
1790  bzstream.next_out = pkt_data + bzstream.total_out_lo32;
1791  result = BZ2_bzDecompress(&bzstream);
1792  } while (result == BZ_OK && pkt_size < 10000000);
1793  pkt_size = bzstream.total_out_lo32;
1794  BZ2_bzDecompressEnd(&bzstream);
1795  if (result != BZ_STREAM_END) {
1796  if (result == BZ_MEM_ERROR)
1797  result = AVERROR(ENOMEM);
1798  else
1800  goto failed;
1801  }
1802  break;
1803  }
1804 #endif
1805  default:
1806  return AVERROR_INVALIDDATA;
1807  }
1808 
1809  memset(pkt_data + pkt_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1810 
1811  *buf = pkt_data;
1812  *buf_size = pkt_size;
1813  return 0;
1815 failed:
1816  av_free(pkt_data);
1817  return result;
1818 }
1819 
1821  AVDictionary **metadata, char *prefix)
1822 {
1823  MatroskaTag *tags = list->elem;
1824  char key[1024];
1825  int i;
1826 
1827  for (i = 0; i < list->nb_elem; i++) {
1828  const char *lang = tags[i].lang &&
1829  strcmp(tags[i].lang, "und") ? tags[i].lang : NULL;
1830 
1831  if (!tags[i].name) {
1832  av_log(s, AV_LOG_WARNING, "Skipping invalid tag with no TagName.\n");
1833  continue;
1834  }
1835  if (prefix)
1836  snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name);
1837  else
1838  av_strlcpy(key, tags[i].name, sizeof(key));
1839  if (tags[i].def || !lang) {
1840  av_dict_set(metadata, key, tags[i].string, 0);
1841  if (tags[i].sub.nb_elem)
1842  matroska_convert_tag(s, &tags[i].sub, metadata, key);
1843  }
1844  if (lang) {
1845  av_strlcat(key, "-", sizeof(key));
1846  av_strlcat(key, lang, sizeof(key));
1847  av_dict_set(metadata, key, tags[i].string, 0);
1848  if (tags[i].sub.nb_elem)
1850  }
1851  }
1853 }
1854 
1856 {
1857  MatroskaDemuxContext *matroska = s->priv_data;
1858  MatroskaTags *tags = matroska->tags.elem;
1859  int i, j;
1860 
1861  for (i = 0; i < matroska->tags.nb_elem; i++) {
1862  if (tags[i].target.attachuid) {
1863  MatroskaAttachment *attachment = matroska->attachments.elem;
1864  int found = 0;
1865  for (j = 0; j < matroska->attachments.nb_elem; j++) {
1866  if (attachment[j].uid == tags[i].target.attachuid &&
1867  attachment[j].stream) {
1868  matroska_convert_tag(s, &tags[i].tag,
1869  &attachment[j].stream->metadata, NULL);
1870  found = 1;
1871  }
1872  }
1873  if (!found) {
1875  "The tags at index %d refer to a "
1876  "non-existent attachment %"PRId64".\n",
1877  i, tags[i].target.attachuid);
1878  }
1879  } else if (tags[i].target.chapteruid) {
1880  MatroskaChapter *chapter = matroska->chapters.elem;
1881  int found = 0;
1882  for (j = 0; j < matroska->chapters.nb_elem; j++) {
1883  if (chapter[j].uid == tags[i].target.chapteruid &&
1884  chapter[j].chapter) {
1885  matroska_convert_tag(s, &tags[i].tag,
1886  &chapter[j].chapter->metadata, NULL);
1887  found = 1;
1888  }
1889  }
1890  if (!found) {
1892  "The tags at index %d refer to a non-existent chapter "
1893  "%"PRId64".\n",
1894  i, tags[i].target.chapteruid);
1895  }
1896  } else if (tags[i].target.trackuid) {
1897  MatroskaTrack *track = matroska->tracks.elem;
1898  int found = 0;
1899  for (j = 0; j < matroska->tracks.nb_elem; j++) {
1900  if (track[j].uid == tags[i].target.trackuid &&
1901  track[j].stream) {
1902  matroska_convert_tag(s, &tags[i].tag,
1903  &track[j].stream->metadata, NULL);
1904  found = 1;
1905  }
1906  }
1907  if (!found) {
1909  "The tags at index %d refer to a non-existent track "
1910  "%"PRId64".\n",
1911  i, tags[i].target.trackuid);
1912  }
1913  } else {
1914  matroska_convert_tag(s, &tags[i].tag, &s->metadata,
1915  tags[i].target.type);
1916  }
1917  }
1918 }
1919 
1921  int64_t pos)
1922 {
1923  uint32_t saved_id = matroska->current_id;
1924  int64_t before_pos = avio_tell(matroska->ctx->pb);
1925  int ret = 0;
1926  int ret2;
1927 
1928  /* seek */
1929  if (avio_seek(matroska->ctx->pb, pos, SEEK_SET) == pos) {
1930  /* We don't want to lose our seekhead level, so we add
1931  * a dummy. This is a crude hack. */
1932  if (matroska->num_levels == EBML_MAX_DEPTH) {
1933  av_log(matroska->ctx, AV_LOG_INFO,
1934  "Max EBML element depth (%d) reached, "
1935  "cannot parse further.\n", EBML_MAX_DEPTH);
1937  } else {
1938  matroska->levels[matroska->num_levels] = (MatroskaLevel) { 0, EBML_UNKNOWN_LENGTH };
1939  matroska->num_levels++;
1940  matroska->current_id = 0;
1941 
1942  ret = ebml_parse(matroska, matroska_segment, matroska);
1943  if (ret == LEVEL_ENDED) {
1944  /* This can only happen if the seek brought us beyond EOF. */
1945  ret = AVERROR_EOF;
1946  }
1947  }
1948  }
1949  /* Seek back - notice that in all instances where this is used
1950  * it is safe to set the level to 1. */
1951  ret2 = matroska_reset_status(matroska, saved_id, before_pos);
1952  if (ret >= 0)
1953  ret = ret2;
1954 
1955  return ret;
1956 }
1957 
1958 static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
1959 {
1960  EbmlList *seekhead_list = &matroska->seekhead;
1961  int i;
1962 
1963  // we should not do any seeking in the streaming case
1964  if (!(matroska->ctx->pb->seekable & AVIO_SEEKABLE_NORMAL))
1965  return;
1966 
1967  for (i = 0; i < seekhead_list->nb_elem; i++) {
1968  MatroskaSeekhead *seekheads = seekhead_list->elem;
1969  uint32_t id = seekheads[i].id;
1970  int64_t pos = seekheads[i].pos + matroska->segment_start;
1971  MatroskaLevel1Element *elem;
1972 
1973  if (id != seekheads[i].id || pos < matroska->segment_start)
1974  continue;
1975 
1976  elem = matroska_find_level1_elem(matroska, id, pos);
1977  if (!elem || elem->parsed)
1978  continue;
1979 
1980  elem->pos = pos;
1981 
1982  // defer cues parsing until we actually need cue data.
1983  if (id == MATROSKA_ID_CUES)
1984  continue;
1985 
1986  if (matroska_parse_seekhead_entry(matroska, pos) < 0) {
1987  // mark index as broken
1988  matroska->cues_parsing_deferred = -1;
1989  break;
1990  }
1991 
1992  elem->parsed = 1;
1993  }
1994 }
1995 
1996 static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
1997 {
1998  EbmlList *index_list;
2000  uint64_t index_scale = 1;
2001  int i, j;
2002 
2003  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
2004  return;
2005 
2006  index_list = &matroska->index;
2007  index = index_list->elem;
2008  if (index_list->nb_elem < 2)
2009  return;
2010  if (index[1].time > 1E14 / matroska->time_scale) {
2011  av_log(matroska->ctx, AV_LOG_WARNING, "Dropping apparently-broken index.\n");
2012  return;
2013  }
2014  for (i = 0; i < index_list->nb_elem; i++) {
2015  EbmlList *pos_list = &index[i].pos;
2016  MatroskaIndexPos *pos = pos_list->elem;
2017  for (j = 0; j < pos_list->nb_elem; j++) {
2018  MatroskaTrack *track = matroska_find_track_by_num(matroska,
2019  pos[j].track);
2020  if (track && track->stream)
2021  av_add_index_entry(track->stream,
2022  pos[j].pos + matroska->segment_start,
2023  index[i].time / index_scale, 0, 0,
2025  }
2026  }
2027 }
2028 
2029 static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
2030  int i;
2031 
2032  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
2033  return;
2034 
2035  for (i = 0; i < matroska->num_level1_elems; i++) {
2036  MatroskaLevel1Element *elem = &matroska->level1_elems[i];
2037  if (elem->id == MATROSKA_ID_CUES && !elem->parsed) {
2038  if (matroska_parse_seekhead_entry(matroska, elem->pos) < 0)
2039  matroska->cues_parsing_deferred = -1;
2040  elem->parsed = 1;
2041  break;
2042  }
2043  }
2044 
2045  matroska_add_index_entries(matroska);
2046 }
2047 
2049  unsigned nb_encodings,
2050  MatroskaTrack *track,
2051  char **key_id_base64, void *logctx)
2052 {
2053  if (nb_encodings > 1) {
2054  av_log(logctx, AV_LOG_ERROR,
2055  "Multiple combined encodings not supported\n");
2056  return 0;
2057  }
2058  if (!nb_encodings)
2059  return 0;
2060  if (encodings->type) {
2061  if (encodings->encryption.key_id.size > 0) {
2062  /* Save the encryption key id to be stored later
2063  * as a metadata tag. */
2064  const int b64_size = AV_BASE64_SIZE(encodings->encryption.key_id.size);
2065  *key_id_base64 = av_malloc(b64_size);
2066  if (!*key_id_base64)
2067  return AVERROR(ENOMEM);
2068 
2069  av_base64_encode(*key_id_base64, b64_size,
2070  encodings->encryption.key_id.data,
2071  encodings->encryption.key_id.size);
2072  } else {
2073  encodings->scope = 0;
2074  av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type\n");
2075  }
2076  } else if (
2077 #if CONFIG_ZLIB
2079 #endif
2080 #if CONFIG_BZLIB
2082 #endif
2085  encodings->scope = 0;
2086  av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type\n");
2087  } else if (track->codec_priv.size && encodings[0].scope & 2) {
2088  uint8_t *codec_priv = track->codec_priv.data;
2089  int ret = matroska_decode_buffer(&track->codec_priv.data,
2090  &track->codec_priv.size,
2091  track);
2092  if (ret < 0) {
2093  track->codec_priv.data = NULL;
2094  track->codec_priv.size = 0;
2095  av_log(logctx, AV_LOG_ERROR,
2096  "Failed to decode codec private data\n");
2097  }
2098 
2099  if (codec_priv != track->codec_priv.data) {
2100  av_buffer_unref(&track->codec_priv.buf);
2101  if (track->codec_priv.data) {
2102  track->codec_priv.buf = av_buffer_create(track->codec_priv.data,
2104  NULL, NULL, 0);
2105  if (!track->codec_priv.buf) {
2106  av_freep(&track->codec_priv.data);
2107  track->codec_priv.size = 0;
2108  return AVERROR(ENOMEM);
2109  }
2110  }
2111  }
2112  }
2113  track->needs_decoding = !encodings->type &&
2114  encodings->scope & 1 &&
2115  (encodings->compression.algo !=
2117  encodings->compression.settings.size);
2118 
2119  return 0;
2120 }
2121 
2122 static int matroska_aac_profile(char *codec_id)
2123 {
2124  static const char *const aac_profiles[] = { "MAIN", "LC", "SSR" };
2125  int profile;
2126 
2128  if (strstr(codec_id, aac_profiles[profile]))
2129  break;
2130  return profile + 1;
2131 }
2132 
2133 static int matroska_aac_sri(int samplerate)
2134 {
2135  int sri;
2136 
2137  for (sri = 0; sri < FF_ARRAY_ELEMS(ff_mpeg4audio_sample_rates); sri++)
2138  if (ff_mpeg4audio_sample_rates[sri] == samplerate)
2139  break;
2140  return sri;
2141 }
2142 
2144 {
2145  /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */
2146  ff_dict_set_timestamp(metadata, "creation_time", date_utc / 1000 + 978307200000000LL);
2147 }
2148 
2150  MatroskaTrack *track,
2151  int *offset)
2152 {
2153  AVStream *st = track->stream;
2154  uint8_t *p = track->codec_priv.data;
2155  int size = track->codec_priv.size;
2156 
2157  if (size < 8 + FLAC_STREAMINFO_SIZE || p[4] & 0x7f) {
2158  av_log(s, AV_LOG_WARNING, "Invalid FLAC private data\n");
2159  track->codec_priv.size = 0;
2160  return 0;
2161  }
2162  *offset = 8;
2163  track->codec_priv.size = 8 + FLAC_STREAMINFO_SIZE;
2164 
2165  p += track->codec_priv.size;
2166  size -= track->codec_priv.size;
2167 
2168  /* parse the remaining metadata blocks if present */
2169  while (size >= 4) {
2170  int block_last, block_type, block_size;
2171 
2172  flac_parse_block_header(p, &block_last, &block_type, &block_size);
2173 
2174  p += 4;
2175  size -= 4;
2176  if (block_size > size)
2177  return 0;
2178 
2179  /* check for the channel mask */
2180  if (block_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
2181  AVDictionary *dict = NULL;
2182  AVDictionaryEntry *chmask;
2183 
2184  ff_vorbis_comment(s, &dict, p, block_size, 0);
2185  chmask = av_dict_get(dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL, 0);
2186  if (chmask) {
2187  uint64_t mask = strtol(chmask->value, NULL, 0);
2188  if (!mask || mask & ~0x3ffffULL) {
2190  "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
2191  } else
2193  }
2194  av_dict_free(&dict);
2195  }
2196 
2197  p += block_size;
2198  size -= block_size;
2199  }
2200 
2201  return 0;
2202 }
2203 
2204 static int mkv_field_order(const MatroskaDemuxContext *matroska, uint64_t field_order)
2205 {
2206  int minor, micro, bttb = 0;
2207 
2208  /* workaround a bug in our Matroska muxer, introduced in version 57.36 alongside
2209  * this function, and fixed in 57.52 */
2210  if (matroska->muxingapp && sscanf(matroska->muxingapp, "Lavf57.%d.%d", &minor, &micro) == 2)
2211  bttb = (minor >= 36 && minor <= 51 && micro >= 100);
2212 
2213  switch (field_order) {
2215  return AV_FIELD_PROGRESSIVE;
2217  return AV_FIELD_UNKNOWN;
2219  return AV_FIELD_TT;
2221  return AV_FIELD_BB;
2223  return bttb ? AV_FIELD_TB : AV_FIELD_BT;
2225  return bttb ? AV_FIELD_BT : AV_FIELD_TB;
2226  default:
2227  return AV_FIELD_UNKNOWN;
2228  }
2229 }
2230 
2231 static void mkv_stereo_mode_display_mul(int stereo_mode,
2232  int *h_width, int *h_height)
2233 {
2234  switch (stereo_mode) {
2240  break;
2245  *h_width = 2;
2246  break;
2251  *h_height = 2;
2252  break;
2253  }
2254 }
2255 
2256 static int mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
2257 {
2258  static const struct {
2259  char type;
2260  char flags;
2261  } stereo_mode_conv [] = {
2262 #define STEREO_MODE_CONV(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
2263  [(STEREOMODETYPE)] = { .type = (STEREO3DTYPE), .flags = (FLAGS) },
2264 #define NOTHING(STEREOMODETYPE, WDIV, HDIV, WEBM)
2266  };
2267  AVStereo3D *stereo;
2268  size_t size;
2269 
2270  stereo = av_stereo3d_alloc_size(&size);
2271  if (!stereo)
2272  return AVERROR(ENOMEM);
2273 
2274  stereo->type = stereo_mode_conv[stereo_mode].type;
2275  stereo->flags = stereo_mode_conv[stereo_mode].flags;
2276 
2278  AV_PKT_DATA_STEREO3D, stereo, size, 0)) {
2279  av_freep(&stereo);
2280  return AVERROR(ENOMEM);
2281  }
2282 
2283  return 0;
2284 }
2285 
2286 static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) {
2287  const MatroskaTrackVideoColor *color = track->video.color.elem;
2288  const MatroskaMasteringMeta *mastering_meta;
2289  int has_mastering_primaries, has_mastering_luminance;
2290 
2291  if (!track->video.color.nb_elem)
2292  return 0;
2293 
2294  mastering_meta = &color->mastering_meta;
2295  // Mastering primaries are CIE 1931 coords, and must be > 0.
2296  has_mastering_primaries =
2297  mastering_meta->r_x > 0 && mastering_meta->r_y > 0 &&
2298  mastering_meta->g_x > 0 && mastering_meta->g_y > 0 &&
2299  mastering_meta->b_x > 0 && mastering_meta->b_y > 0 &&
2300  mastering_meta->white_x > 0 && mastering_meta->white_y > 0;
2301  has_mastering_luminance = mastering_meta->max_luminance >
2302  mastering_meta->min_luminance.el.f &&
2303  mastering_meta->min_luminance.el.f >= 0 &&
2304  mastering_meta->min_luminance.count;
2305 
2306  if (color->matrix_coefficients != AVCOL_SPC_RESERVED)
2307  st->codecpar->color_space = color->matrix_coefficients;
2308  if (color->primaries != AVCOL_PRI_RESERVED &&
2309  color->primaries != AVCOL_PRI_RESERVED0)
2310  st->codecpar->color_primaries = color->primaries;
2311  if (color->transfer_characteristics != AVCOL_TRC_RESERVED &&
2312  color->transfer_characteristics != AVCOL_TRC_RESERVED0)
2313  st->codecpar->color_trc = color->transfer_characteristics;
2314  if (color->range != AVCOL_RANGE_UNSPECIFIED &&
2315  color->range <= AVCOL_RANGE_JPEG)
2316  st->codecpar->color_range = color->range;
2317  if (color->chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED &&
2318  color->chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED &&
2319  color->chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB &&
2320  color->chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) {
2321  st->codecpar->chroma_location =
2322  av_chroma_location_pos_to_enum((color->chroma_siting_horz - 1) << 7,
2323  (color->chroma_siting_vert - 1) << 7);
2324  }
2325  if (color->max_cll && color->max_fall) {
2326  size_t size = 0;
2328  if (!metadata)
2329  return AVERROR(ENOMEM);
2332  av_freep(&metadata);
2333  return AVERROR(ENOMEM);
2334  }
2335  metadata->MaxCLL = color->max_cll;
2336  metadata->MaxFALL = color->max_fall;
2337  }
2338 
2339  if (has_mastering_primaries || has_mastering_luminance) {
2340  size_t size = 0;
2342  if (!metadata)
2343  return AVERROR(ENOMEM);
2346  av_freep(&metadata);
2347  return AVERROR(ENOMEM);
2348  }
2349  if (has_mastering_primaries) {
2350  metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX);
2351  metadata->display_primaries[0][1] = av_d2q(mastering_meta->r_y, INT_MAX);
2352  metadata->display_primaries[1][0] = av_d2q(mastering_meta->g_x, INT_MAX);
2353  metadata->display_primaries[1][1] = av_d2q(mastering_meta->g_y, INT_MAX);
2354  metadata->display_primaries[2][0] = av_d2q(mastering_meta->b_x, INT_MAX);
2355  metadata->display_primaries[2][1] = av_d2q(mastering_meta->b_y, INT_MAX);
2356  metadata->white_point[0] = av_d2q(mastering_meta->white_x, INT_MAX);
2357  metadata->white_point[1] = av_d2q(mastering_meta->white_y, INT_MAX);
2358  metadata->has_primaries = 1;
2359  }
2360  if (has_mastering_luminance) {
2361  metadata->max_luminance = av_d2q(mastering_meta->max_luminance, INT_MAX);
2362  metadata->min_luminance = av_d2q(mastering_meta->min_luminance.el.f, INT_MAX);
2363  metadata->has_luminance = 1;
2364  }
2365  }
2366  return 0;
2367 }
2368 
2369 static int mkv_create_display_matrix(AVStream *st,
2370  const MatroskaTrackVideoProjection *proj,
2371  void *logctx)
2372 {
2373  AVPacketSideData *sd;
2374  double pitch = proj->pitch, yaw = proj->yaw, roll = proj->roll;
2375  int32_t *matrix;
2376  int hflip;
2377 
2378  if (pitch == 0.0 && yaw == 0.0 && roll == 0.0)
2379  return 0;
2380 
2381  /* Note: The following constants are exactly representable
2382  * as floating-point numbers. */
2383  if (pitch != 0.0 || (yaw != 0.0 && yaw != 180.0 && yaw != -180.0) ||
2384  isnan(roll)) {
2385  av_log(logctx, AV_LOG_WARNING, "Ignoring non-2D rectangular "
2386  "projection in stream %u (yaw %f, pitch %f, roll %f)\n",
2387  st->index, yaw, pitch, roll);
2388  return 0;
2389  }
2393  9 * sizeof(*matrix), 0);
2394  if (!sd)
2395  return AVERROR(ENOMEM);
2396  matrix = (int32_t*)sd->data;
2397 
2398  hflip = yaw != 0.0;
2399  /* ProjectionPoseRoll is in the counter-clockwise direction
2400  * whereas av_display_rotation_set() expects its argument
2401  * to be oriented clockwise, so we need to negate roll.
2402  * Furthermore, if hflip is set, we need to negate it again
2403  * to account for the fact that the Matroska specifications
2404  * require the yaw rotation to be applied first. */
2405  av_display_rotation_set(matrix, roll * (2 * hflip - 1));
2406  av_display_matrix_flip(matrix, hflip, 0);
2407 
2408  return 0;
2409 }
2410 
2411 static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track,
2412  void *logctx)
2413 {
2414  AVSphericalMapping *spherical;
2415  const MatroskaTrackVideoProjection *mkv_projection = &track->video.projection;
2416  const uint8_t *priv_data = mkv_projection->private.data;
2417  enum AVSphericalProjection projection;
2418  size_t spherical_size;
2419  uint32_t l = 0, t = 0, r = 0, b = 0;
2420  uint32_t padding = 0;
2421 
2422  if (mkv_projection->private.size && priv_data[0] != 0) {
2423  av_log(logctx, AV_LOG_WARNING, "Unknown spherical metadata\n");
2424  return 0;
2425  }
2426 
2427  switch (track->video.projection.type) {
2429  return mkv_create_display_matrix(st, mkv_projection, logctx);
2431  if (track->video.projection.private.size == 20) {
2432  t = AV_RB32(priv_data + 4);
2433  b = AV_RB32(priv_data + 8);
2434  l = AV_RB32(priv_data + 12);
2435  r = AV_RB32(priv_data + 16);
2436 
2437  if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
2438  av_log(logctx, AV_LOG_ERROR,
2439  "Invalid bounding rectangle coordinates "
2440  "%"PRIu32",%"PRIu32",%"PRIu32",%"PRIu32"\n",
2441  l, t, r, b);
2442  return AVERROR_INVALIDDATA;
2443  }
2444  } else if (track->video.projection.private.size != 0) {
2445  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2446  return AVERROR_INVALIDDATA;
2447  }
2448 
2449  if (l || t || r || b)
2450  projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
2451  else
2452  projection = AV_SPHERICAL_EQUIRECTANGULAR;
2453  break;
2455  if (track->video.projection.private.size < 4) {
2456  av_log(logctx, AV_LOG_ERROR, "Missing projection private properties\n");
2457  return AVERROR_INVALIDDATA;
2458  } else if (track->video.projection.private.size == 12) {
2459  uint32_t layout = AV_RB32(priv_data + 4);
2460  if (layout) {
2461  av_log(logctx, AV_LOG_WARNING,
2462  "Unknown spherical cubemap layout %"PRIu32"\n", layout);
2463  return 0;
2464  }
2465  projection = AV_SPHERICAL_CUBEMAP;
2466  padding = AV_RB32(priv_data + 8);
2467  } else {
2468  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2469  return AVERROR_INVALIDDATA;
2470  }
2471  break;
2472  default:
2473  av_log(logctx, AV_LOG_WARNING,
2474  "Unknown spherical metadata type %"PRIu64"\n",
2475  track->video.projection.type);
2476  return 0;
2477  }
2478 
2479  spherical = av_spherical_alloc(&spherical_size);
2480  if (!spherical)
2481  return AVERROR(ENOMEM);
2482 
2483  spherical->projection = projection;
2484 
2485  spherical->yaw = (int32_t) (track->video.projection.yaw * (1 << 16));
2486  spherical->pitch = (int32_t) (track->video.projection.pitch * (1 << 16));
2487  spherical->roll = (int32_t) (track->video.projection.roll * (1 << 16));
2488 
2489  spherical->padding = padding;
2490 
2491  spherical->bound_left = l;
2492  spherical->bound_top = t;
2493  spherical->bound_right = r;
2494  spherical->bound_bottom = b;
2495 
2497  AV_PKT_DATA_SPHERICAL, spherical, spherical_size, 0)) {
2498  av_freep(&spherical);
2499  return AVERROR(ENOMEM);
2500  }
2501 
2502  return 0;
2503 }
2504 
2506  EbmlBin *bin)
2507 {
2508  return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size);
2509 }
2510 
2512 {
2513  const EbmlList *mappings_list = &track->block_addition_mappings;
2514  MatroskaBlockAdditionMapping *mappings = mappings_list->elem;
2515  int ret;
2516 
2517  for (int i = 0; i < mappings_list->nb_elem; i++) {
2518  MatroskaBlockAdditionMapping *mapping = &mappings[i];
2519  uint64_t type = mapping->type;
2520 
2521  switch (mapping->type) {
2524  "Explicit block Addition Mapping type \"Use BlockAddIDValue\", value %"PRIu64","
2525  " name \"%s\" found.\n", mapping->value, mapping->name ? mapping->name : "");
2527  // fall-through
2530  if (mapping->value != type) {
2531  int strict = s->strict_std_compliance >= FF_COMPLIANCE_STRICT;
2532  av_log(s, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
2533  "Invalid Block Addition Value 0x%"PRIx64" for Block Addition Mapping Type "
2534  "0x%"PRIx64", name \"%s\"\n", mapping->value, mapping->type,
2535  mapping->name ? mapping->name : "");
2536  if (strict)
2537  return AVERROR_INVALIDDATA;
2538  }
2539  break;
2542  if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0)
2543  return ret;
2544 
2545  break;
2546  default:
2548  "Unknown Block Addition Mapping type 0x%"PRIx64", value %"PRIu64", name \"%s\"\n",
2549  mapping->type, mapping->value, mapping->name ? mapping->name : "");
2550  if (mapping->value < 2) {
2551  int strict = s->strict_std_compliance >= FF_COMPLIANCE_STRICT;
2552  av_log(s, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
2553  "Invalid Block Addition value 0x%"PRIu64" for unknown Block Addition Mapping "
2554  "type %"PRIx64", name \"%s\"\n", mapping->value, mapping->type,
2555  mapping->name ? mapping->name : "");
2556  if (strict)
2557  return AVERROR_INVALIDDATA;
2558  }
2559  break;
2560  }
2561  }
2562 
2563  return 0;
2564 }
2565 
2566 static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id)
2567 {
2568  const AVCodecTag *codec_tags;
2569 
2570  codec_tags = track->type == MATROSKA_TRACK_TYPE_VIDEO ?
2572 
2573  /* Normalize noncompliant private data that starts with the fourcc
2574  * by expanding/shifting the data by 4 bytes and storing the data
2575  * size at the start. */
2576  if (ff_codec_get_id(codec_tags, AV_RL32(track->codec_priv.data))) {
2577  int ret = av_buffer_realloc(&track->codec_priv.buf,
2579  if (ret < 0)
2580  return ret;
2581 
2582  track->codec_priv.data = track->codec_priv.buf->data;
2583  memmove(track->codec_priv.data + 4, track->codec_priv.data, track->codec_priv.size);
2584  track->codec_priv.size += 4;
2585  AV_WB32(track->codec_priv.data, track->codec_priv.size);
2586  }
2587 
2588  *fourcc = AV_RL32(track->codec_priv.data + 4);
2589  *codec_id = ff_codec_get_id(codec_tags, *fourcc);
2590 
2591  return 0;
2593 
2594 /* An enum with potential return values of the functions for parsing a track.
2595  * Apart from that all these functions can also indicate ordinary errors via
2596  * negative return values. */
2597 enum {
2598  SKIP_TRACK = 1,
2599 };
2600 
2601 #define AAC_MAX_EXTRADATA_SIZE 5
2602 #define TTA_EXTRADATA_SIZE 22
2603 #define WAVPACK_EXTRADATA_SIZE 2
2604 /* Performs the codec-specific part of parsing an audio track. */
2605 static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
2606  const MatroskaDemuxContext *matroska,
2607  AVFormatContext *s, int *extradata_offset)
2608 {
2609  uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
2612  int extradata_size = 0; // > 0 means that the extradata buffer is used
2613  int ret;
2614 
2615  if (!strcmp(track->codec_id, "A_MS/ACM") &&
2616  track->codec_priv.size >= 14) {
2617  FFIOContext b;
2619  track->codec_priv.size);
2620  ret = ff_get_wav_header(s, &b.pub, par,
2621  track->codec_priv.size, 0);
2622  if (ret < 0)
2623  return ret;
2624  *extradata_offset = FFMIN(track->codec_priv.size, 18);
2625  return 0;
2626  } else if (!strcmp(track->codec_id, "A_QUICKTIME") &&
2627  /* Normally 36, but allow noncompliant private data */
2628  track->codec_priv.size >= 32) {
2629  enum AVCodecID codec_id;
2630  uint32_t fourcc;
2631  uint16_t sample_size;
2632 
2633  ret = get_qt_codec(track, &fourcc, &codec_id);
2634  if (ret < 0)
2635  return ret;
2636  sample_size = AV_RB16(track->codec_priv.data + 26);
2637  if (fourcc == 0) {
2638  if (sample_size == 8) {
2639  fourcc = MKTAG('r','a','w',' ');
2641  } else if (sample_size == 16) {
2642  fourcc = MKTAG('t','w','o','s');
2644  }
2645  }
2646  if ((fourcc == MKTAG('t','w','o','s') ||
2647  fourcc == MKTAG('s','o','w','t')) && sample_size == 8)
2649  par->codec_id = codec_id;
2650  par->codec_tag = fourcc;
2651  return 0;
2652  }
2653 
2654  switch (par->codec_id) {
2655  case AV_CODEC_ID_PCM_S16BE:
2656  switch (track->audio.bitdepth) {
2657  case 8:
2659  break;
2660  case 24:
2662  break;
2663  case 32:
2665  break;
2666  }
2667  break;
2668  case AV_CODEC_ID_PCM_S16LE:
2669  switch (track->audio.bitdepth) {
2670  case 8:
2672  break;
2673  case 24:
2675  break;
2676  case 32:
2678  break;
2679  }
2680  break;
2681  case AV_CODEC_ID_PCM_F32LE:
2682  if (track->audio.bitdepth == 64)
2684  break;
2685  case AV_CODEC_ID_AAC:
2686  if (!track->codec_priv.size) {
2687  int profile = matroska_aac_profile(track->codec_id);
2688  int sri = matroska_aac_sri(track->audio.samplerate);
2689 
2690  extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
2691  extradata[1] = ((sri & 0x01) << 7) | (track->audio.channels << 3);
2692  if (strstr(track->codec_id, "SBR")) {
2693  sri = matroska_aac_sri(track->audio.out_samplerate);
2694  extradata[2] = 0x56;
2695  extradata[3] = 0xE5;
2696  extradata[4] = 0x80 | (sri << 3);
2697  extradata_size = 5;
2698  } else
2699  extradata_size = 2;
2700  }
2701  break;
2702  case AV_CODEC_ID_ALAC:
2703  if (track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - AV_INPUT_BUFFER_PADDING_SIZE) {
2704  /* Only ALAC's magic cookie is stored in Matroska's track headers.
2705  * Create the "atom size", "tag", and "tag version" fields the
2706  * decoder expects manually. */
2707  ret = ff_alloc_extradata(par, 12 + track->codec_priv.size);
2708  if (ret < 0)
2709  return ret;
2710  AV_WB32(par->extradata, par->extradata_size);
2711  AV_WB32(&par->extradata[4], MKBETAG('a', 'l', 'a', 'c'));
2712  AV_WB32(&par->extradata[8], 0);
2713  memcpy(&par->extradata[12], track->codec_priv.data,
2714  track->codec_priv.size);
2715  }
2716  break;
2717  case AV_CODEC_ID_TTA:
2718  {
2719  uint8_t *ptr;
2720  if (track->audio.channels > UINT16_MAX ||
2721  track->audio.bitdepth > UINT16_MAX) {
2722  av_log(matroska->ctx, AV_LOG_WARNING,
2723  "Too large audio channel number %"PRIu64
2724  " or bitdepth %"PRIu64". Skipping track.\n",
2725  track->audio.channels, track->audio.bitdepth);
2726  if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
2727  return AVERROR_INVALIDDATA;
2728  else
2729  return SKIP_TRACK;
2730  }
2731  if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
2732  return AVERROR_INVALIDDATA;
2733  extradata_size = TTA_EXTRADATA_SIZE;
2734  ptr = extradata;
2735  bytestream_put_be32(&ptr, AV_RB32("TTA1"));
2736  bytestream_put_le16(&ptr, 1);
2737  bytestream_put_le16(&ptr, track->audio.channels);
2738  bytestream_put_le16(&ptr, track->audio.bitdepth);
2739  bytestream_put_le32(&ptr, track->audio.out_samplerate);
2740  bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
2741  track->audio.out_samplerate,
2742  AV_TIME_BASE * 1000));
2743  break;
2744  }
2745  case AV_CODEC_ID_RA_144:
2746  track->audio.out_samplerate = 8000;
2747  track->audio.channels = 1;
2748  break;
2749  case AV_CODEC_ID_RA_288:
2750  case AV_CODEC_ID_COOK:
2751  case AV_CODEC_ID_ATRAC3:
2752  case AV_CODEC_ID_SIPR:
2753  {
2754  const uint8_t *ptr = track->codec_priv.data;
2755  int flavor;
2756 
2757  if (!track->codec_priv.size)
2758  break;
2759 
2760  if (track->codec_priv.size < 46)
2761  return AVERROR_INVALIDDATA;
2762  ptr += 22;
2763  flavor = bytestream_get_be16(&ptr);
2764  track->audio.coded_framesize = bytestream_get_be32(&ptr);
2765  ptr += 12;
2766  track->audio.sub_packet_h = bytestream_get_be16(&ptr);
2767  track->audio.frame_size = bytestream_get_be16(&ptr);
2768  track->audio.sub_packet_size = bytestream_get_be16(&ptr);
2769  if (track->audio.coded_framesize <= 0 ||
2770  track->audio.sub_packet_h <= 0 ||
2771  track->audio.frame_size <= 0)
2772  return AVERROR_INVALIDDATA;
2773 
2774  if (par->codec_id == AV_CODEC_ID_RA_288) {
2775  if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
2776  != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
2777  return AVERROR_INVALIDDATA;
2778  par->block_align = track->audio.coded_framesize;
2779  track->codec_priv.size = 0;
2780  } else {
2781  if (par->codec_id == AV_CODEC_ID_SIPR) {
2782  static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
2783  if (flavor > 3)
2784  return AVERROR_INVALIDDATA;
2785  track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
2786  par->bit_rate = sipr_bit_rate[flavor];
2787  } else if (track->audio.sub_packet_size <= 0 ||
2788  track->audio.frame_size % track->audio.sub_packet_size)
2789  return AVERROR_INVALIDDATA;
2790  par->block_align = track->audio.sub_packet_size;
2791  *extradata_offset = 78;
2792  }
2793  if (par->block_align <= 0 ||
2794  track->audio.sub_packet_h * (unsigned)track->audio.frame_size > INT_MAX ||
2795  track->audio.frame_size * track->audio.sub_packet_h < par->block_align)
2796  return AVERROR_INVALIDDATA;
2797  track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
2798  track->audio.frame_size);
2799  if (!track->audio.buf)
2800  return AVERROR(ENOMEM);
2801  break;
2802  }
2803  case AV_CODEC_ID_ATRAC1:
2804  /* ATRAC1 uses a constant frame size.
2805  * Typical ATRAC1 streams are either mono or stereo.
2806  * At most, ATRAC1 was used to store 8 channels of audio. */
2807  if (track->audio.channels > 8)
2808  return AVERROR_INVALIDDATA;
2809  par->block_align = track->audio.channels * 212;
2810  break;
2811  case AV_CODEC_ID_FLAC:
2812  if (track->codec_priv.size) {
2813  ret = matroska_parse_flac(s, track, extradata_offset);
2814  if (ret < 0)
2815  return ret;
2816  }
2817  break;
2818  case AV_CODEC_ID_WAVPACK:
2819  if (track->codec_priv.size < 2) {
2820  av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
2821  "in absence of valid CodecPrivate.\n");
2822  extradata_size = WAVPACK_EXTRADATA_SIZE;
2823  AV_WL16(extradata, 0x410);
2824  }
2825  break;
2826  }
2827 
2828  if (extradata_size > 0) {
2829  ret = ff_alloc_extradata(par, extradata_size);
2830  if (ret < 0)
2831  return ret;
2832  memcpy(par->extradata, extradata, extradata_size);
2833  }
2834 
2835  return 0;
2836 }
2837 
2838 /* Performs the generic part of parsing an audio track. */
2839 static int mka_parse_audio(MatroskaTrack *track, AVStream *st,
2840  AVCodecParameters *par,
2841  const MatroskaDemuxContext *matroska,
2842  AVFormatContext *s, int *extradata_offset)
2843 {
2844  FFStream *const sti = ffstream(st);
2845  int ret;
2846 
2847  ret = mka_parse_audio_codec(track, par, matroska,
2848  s, extradata_offset);
2849  if (ret)
2850  return ret;
2851 
2853  par->sample_rate = track->audio.out_samplerate;
2854  // channel layout may be already set by codec private checks above
2855  if (!av_channel_layout_check(&par->ch_layout)) {
2856  if (track->audio.channels > INT32_MAX)
2857  return AVERROR_PATCHWELCOME;
2859  par->ch_layout.nb_channels = track->audio.channels;
2860  }
2861  if (!par->bits_per_coded_sample)
2862  par->bits_per_coded_sample = track->audio.bitdepth;
2863  if (par->codec_id == AV_CODEC_ID_MP3 ||
2864  par->codec_id == AV_CODEC_ID_MLP ||
2865  par->codec_id == AV_CODEC_ID_TRUEHD)
2867  else if (par->codec_id != AV_CODEC_ID_AAC)
2869  if (track->codec_delay > 0) {
2871  (AVRational){1, 1000000000},
2872  (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
2873  48000 : par->sample_rate});
2874  sti->skip_samples = par->initial_padding;
2875  }
2876  if (track->seek_preroll > 0) {
2877  par->seek_preroll = av_rescale_q(track->seek_preroll,
2878  (AVRational){1, 1000000000},
2879  (AVRational){1, par->sample_rate});
2880  }
2881 
2882  return 0;
2883 }
2884 
2885 /* Performs the codec-specific part of parsing a video track. */
2886 static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
2887  const MatroskaDemuxContext *matroska,
2888  int *extradata_offset)
2889 {
2890  if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
2891  track->codec_priv.size >= 40) {
2892  uint32_t size = AV_RL32A(track->codec_priv.data);
2893  // VFW extradata is padded to an even length, yet
2894  // the size field contains the real length.
2895  if (size & 1 && size == track->codec_priv.size - 1)
2896  --track->codec_priv.size;
2897  track->ms_compat = 1;
2898  par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
2899  par->codec_tag = AV_RL32(track->codec_priv.data + 16);
2901  par->codec_tag);
2902  if (!par->codec_id)
2904  par->codec_tag);
2905  *extradata_offset = 40;
2906  return 0;
2907  } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
2908  track->codec_priv.size >= 21) {
2909  enum AVCodecID codec_id;
2910  uint32_t fourcc;
2911  int ret = get_qt_codec(track, &fourcc, &codec_id);
2912  if (ret < 0)
2913  return ret;
2914  if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
2915  fourcc = MKTAG('S','V','Q','3');
2917  }
2918  par->codec_id = codec_id;
2919  if (codec_id == AV_CODEC_ID_NONE)
2920  av_log(matroska->ctx, AV_LOG_ERROR,
2921  "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
2922  if (track->codec_priv.size >= 86) {
2923  FFIOContext b;
2924  unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
2926  track->codec_priv.size);
2927  if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
2928  bit_depth &= 0x1F;
2929  track->has_palette = 1;
2930  }
2932  }
2933  par->codec_tag = fourcc;
2934  return 0;
2935  }
2936 
2937  switch (par->codec_id) {
2938  case AV_CODEC_ID_RV10:
2939  case AV_CODEC_ID_RV20:
2940  case AV_CODEC_ID_RV30:
2941  case AV_CODEC_ID_RV40:
2942  *extradata_offset = 26;
2943  break;
2944  case AV_CODEC_ID_PRORES:
2945  if (track->codec_priv.size == 4)
2946  par->codec_tag = AV_RL32(track->codec_priv.data);
2947  break;
2948  case AV_CODEC_ID_VP9:
2949  /* we don't need any value stored in CodecPrivate.
2950  * make sure that it's not exported as extradata. */
2951  track->codec_priv.size = 0;
2952  break;
2953  }
2954 
2955  return 0;
2956 }
2957 
2958 /* Performs the generic part of parsing a video track. */
2959 static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
2960  AVCodecParameters *par,
2961  const MatroskaDemuxContext *matroska,
2962  int *extradata_offset)
2963 {
2964  FFStream *const sti = ffstream(st);
2966  int display_width_mul = 1;
2967  int display_height_mul = 1;
2968  int ret;
2969 
2970  if (track->video.color_space.size == 4)
2971  par->codec_tag = AV_RL32(track->video.color_space.data);
2972 
2973  ret = mkv_parse_video_codec(track, par, matroska,
2974  extradata_offset);
2975  if (ret < 0)
2976  return ret;
2977 
2979  par->width = track->video.pixel_width;
2980  par->height = track->video.pixel_height;
2981 
2983  par->field_order = mkv_field_order(matroska, track->video.field_order);
2986 
2989  &display_width_mul, &display_height_mul);
2990 
2992  if (track->video.display_width && track->video.display_height &&
2993  track->video.display_width != -1 && track->video.display_height != -1 &&
2994  track->video.cropped_height < INT64_MAX / track->video.display_width / display_width_mul &&
2995  track->video.cropped_width < INT64_MAX / track->video.display_height / display_height_mul)
2997  &st->sample_aspect_ratio.den,
2998  track->video.cropped_height * track->video.display_width * display_width_mul,
2999  track->video.cropped_width * track->video.display_height * display_height_mul,
3000  INT_MAX);
3001  }
3002  if (track->video.cropped_width != track->video.pixel_width ||
3003  track->video.cropped_height != track->video.pixel_height) {
3004  uint8_t *cropping;
3008  sizeof(uint32_t) * 4, 0);
3009  if (!sd)
3010  return AVERROR(ENOMEM);
3011 
3012  cropping = sd->data;
3013  bytestream_put_le32(&cropping, track->video.pixel_cropt);
3014  bytestream_put_le32(&cropping, track->video.pixel_cropb);
3015  bytestream_put_le32(&cropping, track->video.pixel_cropl);
3016  bytestream_put_le32(&cropping, track->video.pixel_cropr);
3017  }
3018  if (par->codec_id != AV_CODEC_ID_HEVC)
3020 
3021  if (track->default_duration) {
3022  int div = track->default_duration <= INT64_MAX ? 1 : 2;
3024  1000000000 / div, track->default_duration / div, 30000);
3025 #if FF_API_R_FRAME_RATE
3026  if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
3027  && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
3028  st->r_frame_rate = st->avg_frame_rate;
3029 #endif
3030  }
3031 
3032  /* export stereo mode flag as metadata tag */
3034  av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
3035 
3036  /* export alpha mode flag as metadata tag */
3037  if (track->video.alpha_mode)
3038  av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
3039 
3040  /* if we have virtual track, mark the real tracks */
3042  for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) {
3043  MatroskaTrack *tracks = matroska->tracks.elem;
3044  char buf[32];
3046  continue;
3047  snprintf(buf, sizeof(buf), "%s_%d",
3049  for (int k = 0; k < matroska->tracks.nb_elem; k++)
3050  if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
3051  av_dict_set(&tracks[k].stream->metadata,
3052  "stereo_mode", buf, 0);
3053  break;
3054  }
3055  }
3056  // add stream level stereo3d side data if it is a supported format
3060  int ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
3061  if (ret < 0)
3062  return ret;
3063  }
3064 
3065  ret = mkv_parse_video_color(st, track);
3066  if (ret < 0)
3067  return ret;
3068  ret = mkv_parse_video_projection(st, track, matroska->ctx);
3069  if (ret < 0)
3070  return ret;
3071 
3072  return 0;
3073 }
3074 
3075 /* Performs the codec-specific part of parsing a subtitle track. */
3076 static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVStream *st,
3077  AVCodecParameters *par,
3078  const MatroskaDemuxContext *matroska)
3079 {
3080  switch (par->codec_id) {
3082  if (track->codec_priv.size == 3) {
3083  int component_tag = track->codec_priv.data[0];
3084  int data_component_id = AV_RB16(track->codec_priv.data + 1);
3085 
3086  switch (data_component_id) {
3087  case 0x0008:
3088  // [0x30..0x37] are component tags utilized for
3089  // non-mobile captioning service ("profile A").
3090  if (component_tag >= 0x30 && component_tag <= 0x37) {
3092  }
3093  break;
3094  case 0x0012:
3095  // component tag 0x87 signifies a mobile/partial reception
3096  // (1seg) captioning service ("profile C").
3097  if (component_tag == 0x87) {
3099  }
3100  break;
3101  default:
3102  break;
3103  }
3104 
3105  if (par->profile == AV_PROFILE_UNKNOWN)
3106  av_log(matroska->ctx, AV_LOG_WARNING,
3107  "Unknown ARIB caption profile utilized: %02x / %04x\n",
3108  component_tag, data_component_id);
3109 
3110  track->codec_priv.size = 0;
3111  }
3112  break;
3113  case AV_CODEC_ID_WEBVTT:
3114  if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
3116  } else if (!strcmp(track->codec_id, "D_WEBVTT/DESCRIPTIONS")) {
3118  } else if (!strcmp(track->codec_id, "D_WEBVTT/METADATA")) {
3120  }
3121  break;
3122  }
3123 
3124  return 0;
3125 }
3126 
3128 {
3129  MatroskaDemuxContext *matroska = s->priv_data;
3130  MatroskaTrack *tracks = matroska->tracks.elem;
3131  int i, j, ret;
3132 
3133  for (i = 0; i < matroska->tracks.nb_elem; i++) {
3134  MatroskaTrack *track = &tracks[i];
3136  AVCodecParameters *par;
3138  int extradata_offset = 0;
3139  AVStream *st;
3140  char* key_id_base64 = NULL;
3141 
3142  /* Apply some sanity checks. */
3143  if (track->type != MATROSKA_TRACK_TYPE_VIDEO &&
3144  track->type != MATROSKA_TRACK_TYPE_AUDIO &&
3145  track->type != MATROSKA_TRACK_TYPE_SUBTITLE &&
3146  track->type != MATROSKA_TRACK_TYPE_METADATA) {
3147  av_log(matroska->ctx, AV_LOG_INFO,
3148  "Unknown or unsupported track type %"PRIu64"\n",
3149  track->type);
3150  continue;
3151  }
3152  if (!track->codec_id)
3153  continue;
3154 
3155  if ( track->type == MATROSKA_TRACK_TYPE_AUDIO && track->codec_id[0] != 'A'
3156  || track->type == MATROSKA_TRACK_TYPE_VIDEO && track->codec_id[0] != 'V'
3157  || track->type == MATROSKA_TRACK_TYPE_SUBTITLE && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
3158  || track->type == MATROSKA_TRACK_TYPE_METADATA && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
3159  ) {
3160  av_log(matroska->ctx, AV_LOG_INFO, "Inconsistent track type\n");
3161  continue;
3162  }
3163 
3164  if (track->audio.samplerate < 0 || track->audio.samplerate > INT_MAX ||
3165  isnan(track->audio.samplerate)) {
3166  av_log(matroska->ctx, AV_LOG_WARNING,
3167  "Invalid sample rate %f, defaulting to 8000 instead.\n",
3168  track->audio.samplerate);
3169  track->audio.samplerate = 8000;
3170  }
3171 
3172  if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
3173  if (!track->default_duration && track->video.frame_rate > 0) {
3174  double default_duration = 1000000000 / track->video.frame_rate;
3175  if (default_duration > UINT64_MAX || default_duration < 0) {
3176  av_log(matroska->ctx, AV_LOG_WARNING,
3177  "Invalid frame rate %e. Cannot calculate default duration.\n",
3178  track->video.frame_rate);
3179  } else {
3180  track->default_duration = default_duration;
3181  }
3182  }
3183  int has_dimensions = track->video.pixel_width || track->video.pixel_height;
3184  if ((matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT &&
3185  (!track->video.pixel_width || !track->video.pixel_height)) ||
3186  (track->video.pixel_cropl >= INT_MAX - track->video.pixel_cropr ||
3187  track->video.pixel_cropt >= INT_MAX - track->video.pixel_cropb ||
3188  (track->video.pixel_cropl + track->video.pixel_cropr) >= track->video.pixel_width + !has_dimensions ||
3189  (track->video.pixel_cropt + track->video.pixel_cropb) >= track->video.pixel_height + !has_dimensions)) {
3190  av_log(matroska->ctx, AV_LOG_ERROR,
3191  "Invalid coded dimensions %"PRId64"x%"PRId64" [%"PRId64", %"PRId64", %"PRId64", %"PRId64"].\n",
3192  track->video.pixel_width, track->video.pixel_height,
3193  track->video.pixel_cropl, track->video.pixel_cropr,
3194  track->video.pixel_cropt, track->video.pixel_cropb);
3195  return AVERROR_INVALIDDATA;
3196  }
3197  track->video.cropped_width = track->video.pixel_width -
3198  track->video.pixel_cropl - track->video.pixel_cropr;
3199  track->video.cropped_height = track->video.pixel_height -
3200  track->video.pixel_cropt - track->video.pixel_cropb;
3202  if (track->video.display_width == -1)
3203  track->video.display_width = track->video.cropped_width;
3204  if (track->video.display_height == -1)
3205  track->video.display_height = track->video.cropped_height;
3206  }
3207  } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
3208  if (!track->audio.out_samplerate)
3209  track->audio.out_samplerate = track->audio.samplerate;
3210  }
3212  track->encodings.nb_elem,
3213  track, &key_id_base64, matroska->ctx);
3214  if (ret < 0)
3215  return ret;
3216 
3217  for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
3218  if (av_strstart(track->codec_id, ff_mkv_codec_tags[j].str, NULL)) {
3220  break;
3221  }
3222  }
3223 
3224  st = track->stream = avformat_new_stream(s, NULL);
3225  if (!st) {
3226  av_free(key_id_base64);
3227  return AVERROR(ENOMEM);
3228  }
3229  par = st->codecpar;
3230 
3231  par->codec_id = codec_id;
3232 
3233  if (track->flag_default)
3235  if (track->flag_forced)
3237  if (track->flag_comment)
3239  if (track->flag_hearingimpaired)
3241  if (track->flag_visualimpaired)
3243  if (track->flag_original.count > 0)
3246 
3247  if (key_id_base64) {
3248  /* export encryption key id as base64 metadata tag */
3249  av_dict_set(&st->metadata, "enc_key_id", key_id_base64,
3251  }
3252 
3253  if (strcmp(track->language, "und"))
3254  av_dict_set(&st->metadata, "language", track->language, 0);
3255  av_dict_set(&st->metadata, "title", track->name, 0);
3256 
3257  if (track->time_scale < 0.01) {
3258  av_log(matroska->ctx, AV_LOG_WARNING,
3259  "Track TimestampScale too small %f, assuming 1.0.\n",
3260  track->time_scale);
3261  track->time_scale = 1.0;
3262  }
3263 
3264  if (matroska->time_scale * track->time_scale > UINT_MAX)
3265  return AVERROR_INVALIDDATA;
3266 
3267  avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale,
3268  1000 * 1000 * 1000); /* 64 bit pts in ns */
3269 
3270  /* convert the delay from ns to the track timebase */
3272  (AVRational){ 1, 1000000000 },
3273  st->time_base);
3274 
3275  type = track->type;
3276  if (par->codec_id == AV_CODEC_ID_WEBVTT)
3278  switch (type) {
3280  ret = mka_parse_audio(track, st, par, matroska,
3281  s, &extradata_offset);
3282  if (ret < 0)
3283  return ret;
3284  if (ret == SKIP_TRACK)
3285  continue;
3286  break;
3288  ret = mkv_parse_video(track, st, par, matroska, &extradata_offset);
3289  if (ret < 0)
3290  return ret;
3291  break;
3293  ret = mkv_parse_subtitle_codec(track, st, par, matroska);
3294  if (ret < 0)
3295  return ret;
3297 
3298  if (track->flag_textdescriptions)
3300  break;
3301  }
3302 
3303  if (par->codec_id == AV_CODEC_ID_NONE)
3304  av_log(matroska->ctx, AV_LOG_INFO,
3305  "Unknown/unsupported AVCodecID %s.\n", track->codec_id);
3306 
3307  if (!par->extradata && track->codec_priv.size > extradata_offset) {
3308  const uint8_t *src = track->codec_priv.data + extradata_offset;
3309  unsigned extra_size = track->codec_priv.size - extradata_offset;
3310  ret = ff_alloc_extradata(par, extra_size);
3311  if (ret < 0)
3312  return ret;
3313  memcpy(par->extradata, src, extra_size);
3314  }
3315 
3316  ret = mkv_parse_block_addition_mappings(s, st, track);
3317  if (ret < 0)
3318  return ret;
3319  }
3320 
3321  return 0;
3322 }
3323 
3325 {
3326  FFFormatContext *const si = ffformatcontext(s);
3327  MatroskaDemuxContext *matroska = s->priv_data;
3328  EbmlList *attachments_list = &matroska->attachments;
3329  EbmlList *chapters_list = &matroska->chapters;
3330  MatroskaAttachment *attachments;
3331  MatroskaChapter *chapters;
3332  uint64_t max_start = 0;
3333  int64_t pos;
3334  Ebml ebml = { 0 };
3335  int i, j, res;
3336 
3337  matroska->ctx = s;
3338  matroska->cues_parsing_deferred = 1;
3339 
3340  /* First read the EBML header. */
3341  if (ebml_parse(matroska, ebml_syntax, &ebml) || !ebml.doctype) {
3342  av_log(matroska->ctx, AV_LOG_ERROR, "EBML header parsing failed\n");
3343  ebml_free(ebml_syntax, &ebml);
3344  return AVERROR_INVALIDDATA;
3345  }
3346  if (ebml.version > EBML_VERSION ||
3347  ebml.max_size > sizeof(uint64_t) ||
3348  ebml.id_length > sizeof(uint32_t) ||
3349  ebml.doctype_version > 3) {
3351  "EBML version %"PRIu64", doctype %s, doc version %"PRIu64,
3352  ebml.version, ebml.doctype, ebml.doctype_version);
3353  ebml_free(ebml_syntax, &ebml);
3354  return AVERROR_PATCHWELCOME;
3355  } else if (ebml.doctype_version == 3) {
3356  av_log(matroska->ctx, AV_LOG_WARNING,
3357  "EBML header using unsupported features\n"
3358  "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
3359  ebml.version, ebml.doctype, ebml.doctype_version);
3360  }
3361  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++)
3362  if (!strcmp(ebml.doctype, matroska_doctypes[i]))
3363  break;
3365  av_log(s, AV_LOG_WARNING, "Unknown EBML doctype '%s'\n", ebml.doctype);
3366  if (matroska->ctx->error_recognition & AV_EF_EXPLODE) {
3367  ebml_free(ebml_syntax, &ebml);
3368  return AVERROR_INVALIDDATA;
3369  }
3370  }
3371  matroska->is_webm = !strcmp(ebml.doctype, "webm");
3372 
3373  ebml_free(ebml_syntax, &ebml);
3374 
3375  matroska->pkt = si->parse_pkt;
3376 
3377  /* The next thing is a segment. */
3378  pos = avio_tell(matroska->ctx->pb);
3379  res = ebml_parse(matroska, matroska_segments, matroska);
3380  // Try resyncing until we find an EBML_STOP type element.
3381  while (res != 1) {
3382  res = matroska_resync(matroska, pos);
3383  if (res < 0)
3384  return res;
3385  pos = avio_tell(matroska->ctx->pb);
3386  res = ebml_parse(matroska, matroska_segment, matroska);
3387  if (res == AVERROR(EIO)) // EOF is translated to EIO, this exists the loop on EOF
3388  return res;
3389  }
3390  /* Set data_offset as it might be needed later by seek_frame_generic. */
3391  if (matroska->current_id == MATROSKA_ID_CLUSTER)
3392  si->data_offset = avio_tell(matroska->ctx->pb) - 4;
3393  matroska_execute_seekhead(matroska);
3394 
3395  if (!matroska->time_scale)
3396  matroska->time_scale = 1000000;
3397  if (isnan(matroska->duration))
3398  matroska->duration = 0;
3399  if (matroska->duration)
3400  matroska->ctx->duration = matroska->duration * matroska->time_scale *
3401  1000 / AV_TIME_BASE;
3402  av_dict_set(&s->metadata, "title", matroska->title, 0);
3403  av_dict_set(&s->metadata, "encoder", matroska->muxingapp, 0);
3404 
3405  if (matroska->date_utc.size == 8)
3406  matroska_metadata_creation_time(&s->metadata, AV_RB64(matroska->date_utc.data));
3407 
3408  res = matroska_parse_tracks(s);
3409  if (res < 0)
3410  return res;
3411 
3412  attachments = attachments_list->elem;
3413  for (j = 0; j < attachments_list->nb_elem; j++) {
3414  if (!(attachments[j].filename && attachments[j].mime &&
3415  attachments[j].bin.data && attachments[j].bin.size > 0)) {
3416  av_log(matroska->ctx, AV_LOG_ERROR, "incomplete attachment\n");
3417  } else {
3419  if (!st)
3420  break;
3421  av_dict_set(&st->metadata, "filename", attachments[j].filename, 0);
3422  av_dict_set(&st->metadata, "mimetype", attachments[j].mime, 0);
3423  if (attachments[j].description)
3424  av_dict_set(&st->metadata, "title", attachments[j].description, 0);
3426 
3427  for (i = 0; mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3428  if (av_strstart(attachments[j].mime, mkv_image_mime_tags[i].str, NULL)) {
3430  break;
3431  }
3432  }
3433 
3434  attachments[j].stream = st;
3435 
3436  if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
3437  res = ff_add_attached_pic(s, st, NULL, &attachments[j].bin.buf, 0);
3438  if (res < 0)
3439  return res;
3440  } else {
3442  if (ff_alloc_extradata(st->codecpar, attachments[j].bin.size))
3443  break;
3444  memcpy(st->codecpar->extradata, attachments[j].bin.data,
3445  attachments[j].bin.size);
3446 
3447  for (i = 0; mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3448  if (av_strstart(attachments[j].mime, mkv_mime_tags[i].str, NULL)) {
3450  break;
3451  }
3452  }
3453  }
3454  }
3455  }
3456 
3457  chapters = chapters_list->elem;
3458  for (i = 0; i < chapters_list->nb_elem; i++)
3459  if (chapters[i].start != AV_NOPTS_VALUE && chapters[i].uid &&
3460  (max_start == 0 || chapters[i].start > max_start)) {
3461  chapters[i].chapter =
3462  avpriv_new_chapter(s, chapters[i].uid,
3463  (AVRational) { 1, 1000000000 },
3464  chapters[i].start, chapters[i].end,
3465  chapters[i].title);
3466  max_start = chapters[i].start;
3467  }
3468 
3469  matroska_add_index_entries(matroska);
3470 
3472 
3473  return 0;
3475 
3476 /*
3477  * Put one packet in an application-supplied AVPacket struct.
3478  * Returns 0 on success or -1 on failure.
3479  */
3480 static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
3481  AVPacket *pkt)
3482 {
3483  if (matroska->queue.head) {
3484  MatroskaTrack *tracks = matroska->tracks.elem;
3485  MatroskaTrack *track;
3486 
3487  avpriv_packet_list_get(&matroska->queue, pkt);
3488  track = &tracks[pkt->stream_index];
3489  if (track->has_palette) {
3491  if (!pal) {
3492  av_log(matroska->ctx, AV_LOG_ERROR, "Cannot append palette to packet\n");
3493  } else {
3494  memcpy(pal, track->palette, AVPALETTE_SIZE);
3495  }
3496  track->has_palette = 0;
3497  }
3498  return 0;
3499  }
3500 
3501  return -1;
3502 }
3503 
3504 /*
3505  * Free all packets in our internal queue.
3506  */
3507 static void matroska_clear_queue(MatroskaDemuxContext *matroska)
3508 {
3509  avpriv_packet_list_free(&matroska->queue);
3510 }
3511 
3512 static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf,
3513  int size, int type, AVIOContext *pb,
3514  uint32_t lace_size[256], int *laces)
3515 {
3516  int n;
3517  uint8_t *data = *buf;
3518 
3519  if (!type) {
3520  *laces = 1;
3521  lace_size[0] = size;
3522  return 0;
3523  }
3524 
3525  if (size <= 0)
3526  return AVERROR_INVALIDDATA;
3527 
3528  *laces = *data + 1;
3529  data += 1;
3530  size -= 1;
3531 
3532  switch (type) {
3533  case 0x1: /* Xiph lacing */
3534  {
3535  uint8_t temp;
3536  uint32_t total = 0;
3537  for (n = 0; n < *laces - 1; n++) {
3538  lace_size[n] = 0;
3539 
3540  do {
3541  if (size <= total)
3542  return AVERROR_INVALIDDATA;
3543  temp = *data;
3544  total += temp;
3545  lace_size[n] += temp;
3546  data += 1;
3547  size -= 1;
3548  } while (temp == 0xff);
3549  }
3550  if (size < total)
3551  return AVERROR_INVALIDDATA;
3552 
3553  lace_size[n] = size - total;
3554  break;
3555  }
3556 
3557  case 0x2: /* fixed-size lacing */
3558  if (size % (*laces))
3559  return AVERROR_INVALIDDATA;
3560  for (n = 0; n < *laces; n++)
3561  lace_size[n] = size / *laces;
3562  break;
3563 
3564  case 0x3: /* EBML lacing */
3565  {
3566  uint64_t num;
3567  uint64_t total;
3568  int offset;
3569 
3570  avio_skip(pb, 4);
3571 
3572  n = ebml_read_num(matroska, pb, 8, &num, 1);
3573  if (n < 0)
3574  return n;
3575  if (num > INT_MAX)
3576  return AVERROR_INVALIDDATA;
3577 
3578  total = lace_size[0] = num;
3579  offset = n;
3580  for (n = 1; n < *laces - 1; n++) {
3581  int64_t snum;
3582  int r;
3583  r = matroska_ebmlnum_sint(matroska, pb, &snum);
3584  if (r < 0)
3585  return r;
3586  if (lace_size[n - 1] + snum > (uint64_t)INT_MAX)
3587  return AVERROR_INVALIDDATA;
3588 
3589  lace_size[n] = lace_size[n - 1] + snum;
3590  total += lace_size[n];
3591  offset += r;
3592  }
3593  data += offset;
3594  size -= offset;
3595  if (size < total)
3596  return AVERROR_INVALIDDATA;
3597 
3598  lace_size[*laces - 1] = size - total;
3599  break;
3600  }
3601  }
3603  *buf = data;
3604 
3605  return 0;
3606 }
3607 
3608 static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
3609  MatroskaTrack *track, AVStream *st,
3610  uint8_t *data, int size, uint64_t timecode,
3611  int64_t pos)
3612 {
3613  const int a = st->codecpar->block_align;
3614  const int sps = track->audio.sub_packet_size;
3615  const int cfs = track->audio.coded_framesize;
3616  const int h = track->audio.sub_packet_h;
3617  const int w = track->audio.frame_size;
3618  int y = track->audio.sub_packet_cnt;
3619  int x;
3620 
3621  if (!track->audio.pkt_cnt) {
3622  if (track->audio.sub_packet_cnt == 0)
3623  track->audio.buf_timecode = timecode;
3624  if (st->codecpar->codec_id == AV_CODEC_ID_RA_288) {
3625  if (size < cfs * h / 2) {
3626  av_log(matroska->ctx, AV_LOG_ERROR,
3627  "Corrupt int4 RM-style audio packet size\n");
3628  return AVERROR_INVALIDDATA;
3629  }
3630  for (x = 0; x < h / 2; x++)
3631  memcpy(track->audio.buf + x * 2 * w + y * cfs,
3632  data + x * cfs, cfs);
3633  } else if (st->codecpar->codec_id == AV_CODEC_ID_SIPR) {
3634  if (size < w) {
3635  av_log(matroska->ctx, AV_LOG_ERROR,
3636  "Corrupt sipr RM-style audio packet size\n");
3637  return AVERROR_INVALIDDATA;
3638  }
3639  memcpy(track->audio.buf + y * w, data, w);
3640  } else {
3641  if (size < w) {
3642  av_log(matroska->ctx, AV_LOG_ERROR,
3643  "Corrupt generic RM-style audio packet size\n");
3644  return AVERROR_INVALIDDATA;
3645  }
3646  for (x = 0; x < w / sps; x++)
3647  memcpy(track->audio.buf +
3648  sps * (h * x + ((h + 1) / 2) * (y & 1) + (y >> 1)),
3649  data + x * sps, sps);
3650  }
3651 
3652  if (++track->audio.sub_packet_cnt >= h) {
3653  if (st->codecpar->codec_id == AV_CODEC_ID_SIPR)
3654  ff_rm_reorder_sipr_data(track->audio.buf, h, w);
3655  track->audio.sub_packet_cnt = 0;
3656  track->audio.pkt_cnt = h * w / a;
3657  }
3658  }
3659 
3660  while (track->audio.pkt_cnt) {
3661  int ret;
3662  AVPacket *pkt = matroska->pkt;
3663 
3664  ret = av_new_packet(pkt, a);
3665  if (ret < 0) {
3666  return ret;
3667  }
3668  memcpy(pkt->data,
3669  track->audio.buf + a * (h * w / a - track->audio.pkt_cnt--),
3670  a);
3671  pkt->pts = track->audio.buf_timecode;
3673  pkt->pos = pos;
3674  pkt->stream_index = st->index;
3675  ret = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3676  if (ret < 0) {
3678  return AVERROR(ENOMEM);
3679  }
3680  }
3681 
3682  return 0;
3683 }
3684 
3685 /* reconstruct full wavpack blocks from mangled matroska ones */
3686 static int matroska_parse_wavpack(MatroskaTrack *track,
3687  uint8_t **data, int *size)
3688 {
3689  uint8_t *dst = NULL;
3690  uint8_t *src = *data;
3691  int dstlen = 0;
3692  int srclen = *size;
3693  uint32_t samples;
3694  uint16_t ver;
3695  int ret, offset = 0;
3696 
3697  if (srclen < 12)
3698  return AVERROR_INVALIDDATA;
3699 
3700  av_assert1(track->stream->codecpar->extradata_size >= 2);
3701  ver = AV_RL16(track->stream->codecpar->extradata);
3702 
3703  samples = AV_RL32(src);
3704  src += 4;
3705  srclen -= 4;
3706 
3707  while (srclen >= 8) {
3708  int multiblock;
3709  uint32_t blocksize;
3710  uint8_t *tmp;
3711 
3712  uint32_t flags = AV_RL32(src);
3713  uint32_t crc = AV_RL32(src + 4);
3714  src += 8;
3715  srclen -= 8;
3716 
3717  multiblock = (flags & 0x1800) != 0x1800;
3718  if (multiblock) {
3719  if (srclen < 4) {
3721  goto fail;
3722  }
3723  blocksize = AV_RL32(src);
3724  src += 4;
3725  srclen -= 4;
3726  } else
3727  blocksize = srclen;
3728 
3729  if (blocksize > srclen) {
3731  goto fail;
3732  }
3733 
3734  tmp = av_realloc(dst, dstlen + blocksize + 32 + AV_INPUT_BUFFER_PADDING_SIZE);
3735  if (!tmp) {
3736  ret = AVERROR(ENOMEM);
3737  goto fail;
3738  }
3739  dst = tmp;
3740  dstlen += blocksize + 32;
3741 
3742  AV_WL32(dst + offset, MKTAG('w', 'v', 'p', 'k')); // tag
3743  AV_WL32(dst + offset + 4, blocksize + 24); // blocksize - 8
3744  AV_WL16(dst + offset + 8, ver); // version
3745  AV_WL16(dst + offset + 10, 0); // track/index_no
3746  AV_WL32(dst + offset + 12, 0); // total samples
3747  AV_WL32(dst + offset + 16, 0); // block index
3748  AV_WL32(dst + offset + 20, samples); // number of samples
3749  AV_WL32(dst + offset + 24, flags); // flags
3750  AV_WL32(dst + offset + 28, crc); // crc
3751  memcpy(dst + offset + 32, src, blocksize); // block data
3752 
3753  src += blocksize;
3754  srclen -= blocksize;
3755  offset += blocksize + 32;
3756  }
3757 
3758  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3759 
3760  *data = dst;
3761  *size = dstlen;
3762 
3763  return 0;
3765 fail:
3766  av_freep(&dst);
3767  return ret;
3768 }
3769 
3770 static int matroska_parse_prores(MatroskaTrack *track,
3771  uint8_t **data, int *size)
3772 {
3773  uint8_t *dst;
3774  int dstlen = *size + 8;
3775 
3777  if (!dst)
3778  return AVERROR(ENOMEM);
3779 
3780  AV_WB32(dst, dstlen);
3781  AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f'));
3782  memcpy(dst + 8, *data, dstlen - 8);
3783  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3784 
3785  *data = dst;
3786  *size = dstlen;
3787 
3788  return 0;
3789 }
3790 
3791 static int matroska_parse_webvtt(MatroskaDemuxContext *matroska,
3792  MatroskaTrack *track,
3793  AVStream *st,
3794  uint8_t *data, int data_len,
3795  uint64_t timecode,
3796  uint64_t duration,
3797  int64_t pos)
3798 {
3799  AVPacket *pkt = matroska->pkt;
3800  uint8_t *id, *settings, *text, *buf;
3801  int id_len, settings_len, text_len;
3802  uint8_t *p, *q;
3803  int err;
3804 
3805  if (data_len <= 0)
3806  return AVERROR_INVALIDDATA;
3807 
3808  p = data;
3809  q = data + data_len;
3810 
3811  id = p;
3812  id_len = -1;
3813  while (p < q) {
3814  if (*p == '\r' || *p == '\n') {
3815  id_len = p - id;
3816  if (*p == '\r')
3817  p++;
3818  break;
3819  }
3820  p++;
3821  }
3822 
3823  if (p >= q || *p != '\n')
3824  return AVERROR_INVALIDDATA;
3825  p++;
3826 
3827  settings = p;
3828  settings_len = -1;
3829  while (p < q) {
3830  if (*p == '\r' || *p == '\n') {
3831  settings_len = p - settings;
3832  if (*p == '\r')
3833  p++;
3834  break;
3835  }
3836  p++;
3837  }
3838 
3839  if (p >= q || *p != '\n')
3840  return AVERROR_INVALIDDATA;
3841  p++;
3842 
3843  text = p;
3844  text_len = q - p;
3845  while (text_len > 0) {
3846  const int len = text_len - 1;
3847  const uint8_t c = p[len];
3848  if (c != '\r' && c != '\n')
3849  break;
3850  text_len = len;
3851  }
3852 
3853  err = av_new_packet(pkt, text_len);
3854  if (err < 0) {
3855  return err;
3856  }
3857 
3858  memcpy(pkt->data, text, text_len);
3859 
3860  if (id_len > 0) {
3863  id_len);
3864  if (!buf) {
3866  return AVERROR(ENOMEM);
3867  }
3868  memcpy(buf, id, id_len);
3869  }
3870 
3871  if (settings_len > 0) {
3874  settings_len);
3875  if (!buf) {
3877  return AVERROR(ENOMEM);
3878  }
3879  memcpy(buf, settings, settings_len);
3880  }
3881 
3882  // Do we need this for subtitles?
3883  // pkt->flags = AV_PKT_FLAG_KEY;
3884 
3885  pkt->stream_index = st->index;
3886  pkt->pts = timecode;
3887 
3888  // Do we need this for subtitles?
3889  // pkt->dts = timecode;
3890 
3891  pkt->duration = duration;
3892  pkt->pos = pos;
3893 
3894  err = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3895  if (err < 0) {
3897  return AVERROR(ENOMEM);
3898  }
3899 
3900  return 0;
3901 }
3902 
3904  MatroskaTrack *track, AVPacket *pkt,
3905  const uint8_t *data, int size, uint64_t id)
3906 {
3907  const EbmlList *mappings_list = &track->block_addition_mappings;
3908  MatroskaBlockAdditionMapping *mappings = mappings_list->elem, *mapping = NULL;
3909  uint8_t *side_data;
3910  int res;
3911 
3912  if (!matroska->is_webm && track->max_block_additional_id && id > track->max_block_additional_id) {
3913  int strict = matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT;
3914  av_log(matroska->ctx, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
3915  "BlockAddID %"PRIu64" is higher than the reported MaxBlockAdditionID %"PRIu64" "
3916  "for Track with TrackNumber %"PRIu64"\n", id, track->max_block_additional_id,
3917  track->num);
3918  if (strict)
3919  return AVERROR_INVALIDDATA;
3920  }
3921 
3922  for (int i = 0; i < mappings_list->nb_elem; i++) {
3923  if (id != mappings[i].value)
3924  continue;
3925  mapping = &mappings[i];
3926  break;
3927  }
3928 
3929  if (id != 1 && !matroska->is_webm && !mapping) {
3930  av_log(matroska->ctx, AV_LOG_WARNING, "BlockAddID %"PRIu64" has no mapping. Skipping\n", id);
3931  return 0;
3932  }
3933 
3934  if (mapping && mapping->type)
3935  id = mapping->type;
3936 
3937  switch (id) {
3939  GetByteContext bc;
3940  int country_code, provider_code;
3941  int provider_oriented_code, application_identifier;
3942  size_t hdrplus_size;
3943  AVDynamicHDRPlus *hdrplus;
3944 
3945  if (size < 6)
3946  break; //ignore
3947 
3948  bytestream2_init(&bc, data, size);
3949 
3950  /* ITU-T T.35 metadata */
3951  country_code = bytestream2_get_byteu(&bc);
3952  provider_code = bytestream2_get_be16u(&bc);
3953 
3954  if (country_code != ITU_T_T35_COUNTRY_CODE_US ||
3955  provider_code != ITU_T_T35_PROVIDER_CODE_SAMSUNG)
3956  break; // ignore
3957 
3958  provider_oriented_code = bytestream2_get_be16u(&bc);
3959  application_identifier = bytestream2_get_byteu(&bc);
3960 
3961  if (provider_oriented_code != 1 || application_identifier != 4)
3962  break; // ignore
3963 
3964  hdrplus = av_dynamic_hdr_plus_alloc(&hdrplus_size);
3965  if (!hdrplus)
3966  return AVERROR(ENOMEM);
3967 
3968  if ((res = av_dynamic_hdr_plus_from_t35(hdrplus, bc.buffer,
3969  bytestream2_get_bytes_left(&bc))) < 0 ||
3971  (uint8_t *)hdrplus, hdrplus_size)) < 0) {
3972  av_free(hdrplus);
3973  return res;
3974  }
3975 
3976  return 0;
3977  }
3978  default:
3979  break;
3980  }
3981 
3983  size + (size_t)8);
3984  if (!side_data)
3985  return AVERROR(ENOMEM);
3986 
3987  AV_WB64(side_data, id);
3988  memcpy(side_data + 8, data, size);
3989 
3990  return 0;
3991 }
3992 
3993 static int matroska_parse_frame(MatroskaDemuxContext *matroska,
3994  MatroskaTrack *track, AVStream *st,
3995  AVBufferRef *buf, uint8_t *data, int pkt_size,
3996  uint64_t timecode, uint64_t lace_duration,
3997  int64_t pos, int is_keyframe,
3998  MatroskaBlockMore *blockmore, int nb_blockmore,
3999  int64_t discard_padding)
4000 {
4001  uint8_t *pkt_data = data;
4002  int res = 0;
4003  AVPacket *pkt = matroska->pkt;
4004 
4005  if (st->codecpar->codec_id == AV_CODEC_ID_WAVPACK) {
4006  res = matroska_parse_wavpack(track, &pkt_data, &pkt_size);
4007  if (res < 0) {
4008  av_log(matroska->ctx, AV_LOG_ERROR,
4009  "Error parsing a wavpack block.\n");
4010  goto fail;
4011  }
4012  if (!buf)
4013  av_freep(&data);
4014  buf = NULL;
4015  }
4016 
4017  if (st->codecpar->codec_id == AV_CODEC_ID_PRORES &&
4018  AV_RB32(pkt_data + 4) != MKBETAG('i', 'c', 'p', 'f')) {
4019  res = matroska_parse_prores(track, &pkt_data, &pkt_size);
4020  if (res < 0) {
4021  av_log(matroska->ctx, AV_LOG_ERROR,
4022  "Error parsing a prores block.\n");
4023  goto fail;
4024  }
4025  if (!buf)
4026  av_freep(&data);
4027  buf = NULL;
4028  }
4029 
4030  if (!pkt_size && !nb_blockmore)
4031  goto no_output;
4032 
4033  if (!matroska->is_webm && nb_blockmore && !track->max_block_additional_id) {
4034  int strict = matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT;
4035  av_log(matroska->ctx, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
4036  "Unexpected BlockAdditions found in a Block from Track with TrackNumber %"PRIu64" "
4037  "where MaxBlockAdditionID is 0\n", track->num);
4038  if (strict) {
4039  res = AVERROR_INVALIDDATA;
4040  goto fail;
4041  }
4042  }
4043 
4044  if (!buf)
4045  pkt->buf = av_buffer_create(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE,
4046  NULL, NULL, 0);
4047  else
4048  pkt->buf = av_buffer_ref(buf);
4049 
4050  if (!pkt->buf) {
4051  res = AVERROR(ENOMEM);
4052  goto fail;
4053  }
4054 
4055  pkt->data = pkt_data;
4056  pkt->size = pkt_size;
4057  pkt->flags = is_keyframe;
4058  pkt->stream_index = st->index;
4059 
4060  for (int i = 0; i < nb_blockmore; i++) {
4061  MatroskaBlockMore *more = &blockmore[i];
4062 
4063  if (!more->additional.size)
4064  continue;
4065 
4066  res = matroska_parse_block_additional(matroska, track, pkt, more->additional.data,
4067  more->additional.size, more->additional_id);
4068  if (res < 0) {
4070  return res;
4071  }
4072  }
4073 
4074  if (discard_padding) {
4075  uint8_t *side_data = av_packet_new_side_data(pkt,
4077  10);
4078  if (!side_data) {
4080  return AVERROR(ENOMEM);
4081  }
4082  discard_padding = av_rescale_q(discard_padding,
4083  (AVRational){1, 1000000000},
4084  (AVRational){1, st->codecpar->sample_rate});
4085  if (discard_padding > 0) {
4086  AV_WL32A(side_data + 4, discard_padding);
4087  } else {
4088  AV_WL32A(side_data, -discard_padding);
4089  }
4090  }
4091 
4092  if (track->ms_compat)
4093  pkt->dts = timecode;
4094  else
4095  pkt->pts = timecode;
4096  pkt->pos = pos;
4097  pkt->duration = lace_duration;
4098 
4099  res = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
4100  if (res < 0) {
4102  return AVERROR(ENOMEM);
4103  }
4104 
4105  return 0;
4106 
4107 no_output:
4109  if (!buf)
4110  av_free(pkt_data);
4111  return res;
4112 }
4113 
4114 static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf, uint8_t *data,
4115  int size, int64_t pos, uint64_t cluster_time,
4116  uint64_t block_duration, int is_keyframe,
4117  MatroskaBlockMore *blockmore, int nb_blockmore,
4118  int64_t cluster_pos, int64_t discard_padding)
4119 {
4120  uint64_t timecode = AV_NOPTS_VALUE;
4121  MatroskaTrack *track;
4122  FFIOContext pb;
4123  int res = 0;
4124  AVStream *st;
4125  int16_t block_time;
4126  uint32_t lace_size[256];
4127  int n, flags, laces = 0;
4128  uint64_t num;
4129  int trust_default_duration;
4130 
4131  av_assert1(buf);
4132 
4134 
4135  if ((n = ebml_read_num(matroska, &pb.pub, 8, &num, 1)) < 0)
4136  return n;
4137  data += n;
4138  size -= n;
4139 
4140  track = matroska_find_track_by_num(matroska, num);
4141  if (!track || size < 3)
4142  return AVERROR_INVALIDDATA;
4143 
4144  if (!(st = track->stream)) {
4145  av_log(matroska->ctx, AV_LOG_VERBOSE,
4146  "No stream associated to TrackNumber %"PRIu64". "
4147  "Ignoring Block with this TrackNumber.\n", num);
4148  return 0;
4149  }
4150 
4151  if (st->discard >= AVDISCARD_ALL)
4152  return res;
4153  if (block_duration > INT64_MAX)
4154  block_duration = INT64_MAX;
4155 
4156  block_time = sign_extend(AV_RB16(data), 16);
4157  data += 2;
4158  flags = *data++;
4159  size -= 3;
4160  if (is_keyframe == -1)
4161  is_keyframe = flags & 0x80 ? AV_PKT_FLAG_KEY : 0;
4162 
4163  if (cluster_time != (uint64_t) -1 &&
4164  (block_time >= 0 || cluster_time >= -block_time)) {
4165  uint64_t timecode_cluster_in_track_tb = (double) cluster_time / track->time_scale;
4166  timecode = timecode_cluster_in_track_tb + block_time - track->codec_delay_in_track_tb;
4167  if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE &&
4168  timecode < track->end_timecode)
4169  is_keyframe = 0; /* overlapping subtitles are not key frame */
4170  if (is_keyframe) {
4171  ff_reduce_index(matroska->ctx, st->index);
4172  av_add_index_entry(st, cluster_pos, timecode, 0, 0,
4174  }
4175  }
4176 
4177  if (matroska->skip_to_keyframe &&
4178  track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
4179  // Compare signed timecodes. Timecode may be negative due to codec delay
4180  // offset. We don't support timestamps greater than int64_t anyway - see
4181  // AVPacket's pts.
4182  if ((int64_t)timecode < (int64_t)matroska->skip_to_timecode)
4183  return res;
4184  if (is_keyframe)
4185  matroska->skip_to_keyframe = 0;
4186  else if (!ffstream(st)->skip_to_keyframe) {
4187  av_log(matroska->ctx, AV_LOG_ERROR, "File is broken, keyframes not correctly marked!\n");
4188  matroska->skip_to_keyframe = 0;
4189  }
4190  }
4191 
4192  res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1,
4193  &pb.pub, lace_size, &laces);
4194  if (res < 0) {
4195  av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n");
4196  return res;
4197  }
4198 
4199  trust_default_duration = track->default_duration != 0;
4200  if (track->audio.samplerate == 8000 && trust_default_duration) {
4201  // If this is needed for more codecs, then add them here
4202  if (st->codecpar->codec_id == AV_CODEC_ID_AC3) {
4203  if (track->audio.samplerate != st->codecpar->sample_rate || !st->codecpar->frame_size)
4204  trust_default_duration = 0;
4205  }
4206  }
4207 
4208  if (!block_duration && trust_default_duration)
4209  block_duration = track->default_duration * laces / matroska->time_scale;
4210 
4211  if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time))
4212  track->end_timecode =
4213  FFMAX(track->end_timecode, timecode + block_duration);
4214 
4215  for (n = 0; n < laces; n++) {
4216  int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
4217  uint8_t *out_data = data;
4218  int out_size = lace_size[n];
4219 
4220  if (track->needs_decoding) {
4221  res = matroska_decode_buffer(&out_data, &out_size, track);
4222  if (res < 0)
4223  return res;
4224  /* Given that we are here means that out_data is no longer
4225  * owned by buf, so set it to NULL. This depends upon
4226  * zero-length header removal compression being ignored. */
4227  av_assert1(out_data != data);
4228  buf = NULL;
4229  }
4230 
4231  if (track->audio.buf) {
4232  res = matroska_parse_rm_audio(matroska, track, st,
4233  out_data, out_size,
4234  timecode, pos);
4235  if (!buf)
4236  av_free(out_data);
4237  if (res)
4238  return res;
4239  } else if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) {
4240  res = matroska_parse_webvtt(matroska, track, st,
4241  out_data, out_size,
4242  timecode, lace_duration,
4243  pos);
4244  if (!buf)
4245  av_free(out_data);
4246  if (res)
4247  return res;
4248  } else {
4249  res = matroska_parse_frame(matroska, track, st, buf, out_data,
4250  out_size, timecode, lace_duration,
4251  pos, is_keyframe,
4252  blockmore, nb_blockmore,
4253  discard_padding);
4254  if (res)
4255  return res;
4256  }
4257 
4258  if (timecode != AV_NOPTS_VALUE)
4259  timecode = lace_duration ? timecode + lace_duration : AV_NOPTS_VALUE;
4260  data += lace_size[n];
4261  }
4262 
4263  return 0;
4264 }
4265 
4266 static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
4267 {
4268  MatroskaCluster *cluster = &matroska->current_cluster;
4269  MatroskaBlock *block = &cluster->block;
4270  int res;
4271 
4272  av_assert0(matroska->num_levels <= 2U);
4273 
4274  if (matroska->num_levels == 1) {
4275  res = ebml_parse(matroska, matroska_segment, NULL);
4276 
4277  if (res == 1) {
4278  /* Found a cluster: subtract the size of the ID already read. */
4279  cluster->pos = avio_tell(matroska->ctx->pb) - 4;
4280 
4281  res = ebml_parse(matroska, matroska_cluster_enter, cluster);
4282  if (res < 0)
4283  return res;
4284  }
4285  }
4286 
4287  if (matroska->num_levels == 2) {
4288  /* We are inside a cluster. */
4289  res = ebml_parse(matroska, matroska_cluster_parsing, cluster);
4290 
4291  if (res >= 0 && block->bin.size > 0) {
4292  int is_keyframe = block->non_simple ? block->reference.count == 0 : -1;
4293 
4294  res = matroska_parse_block(matroska, block->bin.buf, block->bin.data,
4295  block->bin.size, block->bin.pos,
4296  cluster->timecode, block->duration,
4297  is_keyframe, block->blockmore.elem,
4298  block->blockmore.nb_elem, cluster->pos,
4299  block->discard_padding);
4300  }
4301 
4303  memset(block, 0, sizeof(*block));
4304  } else if (!matroska->num_levels) {
4305  if (!avio_feof(matroska->ctx->pb)) {
4306  avio_r8(matroska->ctx->pb);
4307  if (!avio_feof(matroska->ctx->pb)) {
4308  av_log(matroska->ctx, AV_LOG_WARNING, "File extends beyond "
4309  "end of segment.\n");
4310  return AVERROR_INVALIDDATA;
4311  }
4312  }
4313  matroska->done = 1;
4314  return AVERROR_EOF;
4315  }
4316 
4317  return res;
4318 }
4319 
4321 {
4322  MatroskaDemuxContext *matroska = s->priv_data;
4323  int ret = 0;
4324 
4325  if (matroska->resync_pos == -1) {
4326  // This can only happen if generic seeking has been used.
4327  matroska->resync_pos = avio_tell(s->pb);
4328  }
4329 
4330  while (matroska_deliver_packet(matroska, pkt)) {
4331  if (matroska->done)
4332  return (ret < 0) ? ret : AVERROR_EOF;
4333  if (matroska_parse_cluster(matroska) < 0 && !matroska->done)
4334  ret = matroska_resync(matroska, matroska->resync_pos);
4335  }
4336 
4337  return 0;
4338 }
4339 
4340 static int matroska_read_seek(AVFormatContext *s, int stream_index,
4341  int64_t timestamp, int flags)
4342 {
4343  MatroskaDemuxContext *matroska = s->priv_data;
4344  MatroskaTrack *tracks = NULL;
4345  AVStream *st = s->streams[stream_index];
4346  FFStream *const sti = ffstream(st);
4347  int i, index;
4348 
4349  /* Parse the CUES now since we need the index data to seek. */
4350  if (matroska->cues_parsing_deferred > 0) {
4351  matroska->cues_parsing_deferred = 0;
4352  matroska_parse_cues(matroska);
4353  }
4354 
4355  if (!sti->nb_index_entries)
4356  goto err;
4357  timestamp = FFMAX(timestamp, sti->index_entries[0].timestamp);
4358 
4359  if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
4360  index == sti->nb_index_entries - 1) {
4361  matroska_reset_status(matroska, 0, sti->index_entries[sti->nb_index_entries - 1].pos);
4362  while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
4363  index == sti->nb_index_entries - 1) {
4364  matroska_clear_queue(matroska);
4365  if (matroska_parse_cluster(matroska) < 0)
4366  break;
4367  }
4368  }
4369 
4370  matroska_clear_queue(matroska);
4371  if (index < 0 || (matroska->cues_parsing_deferred < 0 &&
4372  index == sti->nb_index_entries - 1))
4373  goto err;
4374 
4375  tracks = matroska->tracks.elem;
4376  for (i = 0; i < matroska->tracks.nb_elem; i++) {
4377  tracks[i].audio.pkt_cnt = 0;
4378  tracks[i].audio.sub_packet_cnt = 0;
4379  tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
4380  tracks[i].end_timecode = 0;
4381  }
4382 
4383  /* We seek to a level 1 element, so set the appropriate status. */
4384  matroska_reset_status(matroska, 0, sti->index_entries[index].pos);
4385  if (flags & AVSEEK_FLAG_ANY) {
4386  sti->skip_to_keyframe = 0;
4387  matroska->skip_to_timecode = timestamp;
4388  } else {
4389  sti->skip_to_keyframe = 1;
4390  matroska->skip_to_timecode = sti->index_entries[index].timestamp;
4391  }
4392  matroska->skip_to_keyframe = 1;
4393  matroska->done = 0;
4395  return 0;
4396 err:
4397  // slightly hackish but allows proper fallback to
4398  // the generic seeking code.
4399  matroska_reset_status(matroska, 0, -1);
4400  matroska->resync_pos = -1;
4401  matroska_clear_queue(matroska);
4403  matroska->skip_to_keyframe = 0;
4404  matroska->done = 0;
4405  return -1;
4406 }
4407 
4409 {
4410  MatroskaDemuxContext *matroska = s->priv_data;
4411  MatroskaTrack *tracks = matroska->tracks.elem;
4412  int n;
4413 
4414  matroska_clear_queue(matroska);
4415 
4416  for (n = 0; n < matroska->tracks.nb_elem; n++)
4417  if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
4418  av_freep(&tracks[n].audio.buf);
4419  ebml_free(matroska_segment, matroska);
4420 
4421  return 0;
4422 }
4423 
4424 #if CONFIG_WEBM_DASH_MANIFEST_DEMUXER
4425 typedef struct {
4426  int64_t start_time_ns;
4427  int64_t end_time_ns;
4428  int64_t start_offset;
4429  int64_t end_offset;
4430 } CueDesc;
4431 
4432 /* This function searches all the Cues and returns the CueDesc corresponding to
4433  * the timestamp ts. Returned CueDesc will be such that start_time_ns <= ts <
4434  * end_time_ns. All 4 fields will be set to -1 if ts >= file's duration or
4435  * if an error occurred.
4436  */
4437 static CueDesc get_cue_desc(AVFormatContext *s, int64_t ts, int64_t cues_start) {
4438  MatroskaDemuxContext *matroska = s->priv_data;
4439  FFStream *const sti = ffstream(s->streams[0]);
4440  AVIndexEntry *const index_entries = sti->index_entries;
4441  int nb_index_entries = sti->nb_index_entries;
4442  CueDesc cue_desc;
4443  int i;
4444 
4445  if (ts >= (int64_t)(matroska->duration * matroska->time_scale))
4446  return (CueDesc) {-1, -1, -1, -1};
4447  for (i = 1; i < nb_index_entries; i++) {
4448  if (index_entries[i - 1].timestamp * matroska->time_scale <= ts &&
4449  index_entries[i].timestamp * matroska->time_scale > ts) {
4450  break;
4451  }
4452  }
4453  --i;
4454  if (index_entries[i].timestamp > matroska->duration)
4455  return (CueDesc) {-1, -1, -1, -1};
4456  cue_desc.start_time_ns = index_entries[i].timestamp * matroska->time_scale;
4457  cue_desc.start_offset = index_entries[i].pos - matroska->segment_start;
4458  if (i != nb_index_entries - 1) {
4459  cue_desc.end_time_ns = index_entries[i + 1].timestamp * matroska->time_scale;
4460  cue_desc.end_offset = index_entries[i + 1].pos - matroska->segment_start;
4461  } else {
4462  cue_desc.end_time_ns = matroska->duration * matroska->time_scale;
4463  // FIXME: this needs special handling for files where Cues appear
4464  // before Clusters. the current logic assumes Cues appear after
4465  // Clusters.
4466  cue_desc.end_offset = cues_start - matroska->segment_start;
4467  }
4468 
4469  if (cue_desc.end_time_ns < cue_desc.start_time_ns ||
4470  cue_desc.end_time_ns - (uint64_t)cue_desc.start_time_ns > INT64_MAX)
4471  return (CueDesc) {-1, -1, -1, -1};
4472 
4473  return cue_desc;
4474 }
4475 
4476 static int webm_clusters_start_with_keyframe(AVFormatContext *s)
4477 {
4478  MatroskaDemuxContext *matroska = s->priv_data;
4479  AVStream *const st = s->streams[0];
4480  FFStream *const sti = ffstream(st);
4481  uint32_t id = matroska->current_id;
4482  int64_t cluster_pos, before_pos;
4483  int index, rv = 1;
4484 
4485  if (sti->nb_index_entries <= 0)
4486  return 0;
4487 
4488  // seek to the first cluster using cues.
4489  index = av_index_search_timestamp(st, 0, 0);
4490  if (index < 0)
4491  return 0;
4492  cluster_pos = sti->index_entries[index].pos;
4493  before_pos = avio_tell(s->pb);
4494  while (1) {
4495  uint64_t cluster_id, cluster_length;
4496  int read;
4497  AVPacket *pkt;
4498  avio_seek(s->pb, cluster_pos, SEEK_SET);
4499  // read cluster id and length
4500  read = ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id, 1);
4501  if (read < 0 || cluster_id != 0xF43B675) // done with all clusters
4502  break;
4503  read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length);
4504  if (read < 0)
4505  break;
4506 
4507  matroska_reset_status(matroska, 0, cluster_pos);
4508  matroska_clear_queue(matroska);
4509  if (matroska_parse_cluster(matroska) < 0 ||
4510  !matroska->queue.head) {
4511  break;
4512  }
4513  pkt = &matroska->queue.head->pkt;
4514  // 4 + read is the length of the cluster id and the cluster length field.
4515  cluster_pos += 4 + read + cluster_length;
4516  if (!(pkt->flags & AV_PKT_FLAG_KEY)) {
4517  rv = 0;
4518  break;
4519  }
4520  }
4521 
4522  /* Restore the status after matroska_read_header: */
4523  matroska_reset_status(matroska, id, before_pos);
4524 
4525  return rv;
4526 }
4527 
4528 static int buffer_size_after_time_downloaded(int64_t time_ns, double search_sec, int64_t bps,
4529  double min_buffer, double* buffer,
4530  double* sec_to_download, AVFormatContext *s,
4531  int64_t cues_start)
4532 {
4533  double nano_seconds_per_second = 1000000000.0;
4534  double time_sec = time_ns / nano_seconds_per_second;
4535  int rv = 0;
4536  int64_t time_to_search_ns = (int64_t)(search_sec * nano_seconds_per_second);
4537  int64_t end_time_ns = time_ns + time_to_search_ns;
4538  double sec_downloaded = 0.0;
4539  CueDesc desc_curr = get_cue_desc(s, time_ns, cues_start);
4540  if (desc_curr.start_time_ns == -1)
4541  return -1;
4542  *sec_to_download = 0.0;
4543 
4544  // Check for non cue start time.
4545  if (time_ns > desc_curr.start_time_ns) {
4546  int64_t cue_nano = desc_curr.end_time_ns - time_ns;
4547  double percent = (double)(cue_nano) / (desc_curr.end_time_ns - desc_curr.start_time_ns);
4548  double cueBytes = (desc_curr.end_offset - desc_curr.start_offset) * percent;
4549  double timeToDownload = (cueBytes * 8.0) / bps;
4550 
4551  sec_downloaded += (cue_nano / nano_seconds_per_second) - timeToDownload;
4552  *sec_to_download += timeToDownload;
4553 
4554  // Check if the search ends within the first cue.
4555  if (desc_curr.end_time_ns >= end_time_ns) {
4556  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4557  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4558  sec_downloaded = percent_to_sub * sec_downloaded;
4559  *sec_to_download = percent_to_sub * *sec_to_download;
4560  }
4561 
4562  if ((sec_downloaded + *buffer) <= min_buffer) {
4563  return 1;
4564  }
4565 
4566  // Get the next Cue.
4567  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4568  }
4569 
4570  while (desc_curr.start_time_ns != -1) {
4571  int64_t desc_bytes = desc_curr.end_offset - desc_curr.start_offset;
4572  int64_t desc_ns = desc_curr.end_time_ns - desc_curr.start_time_ns;
4573  double desc_sec = desc_ns / nano_seconds_per_second;
4574  double bits = (desc_bytes * 8.0);
4575  double time_to_download = bits / bps;
4576 
4577  sec_downloaded += desc_sec - time_to_download;
4578  *sec_to_download += time_to_download;
4579 
4580  if (desc_curr.end_time_ns >= end_time_ns) {
4581  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4582  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4583  sec_downloaded = percent_to_sub * sec_downloaded;
4584  *sec_to_download = percent_to_sub * *sec_to_download;
4585 
4586  if ((sec_downloaded + *buffer) <= min_buffer)
4587  rv = 1;
4588  break;
4589  }
4590 
4591  if ((sec_downloaded + *buffer) <= min_buffer) {
4592  rv = 1;
4593  break;
4594  }
4595 
4596  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4597  }
4598  *buffer = *buffer + sec_downloaded;
4599  return rv;
4600 }
4601 
4602 /* This function computes the bandwidth of the WebM file with the help of
4603  * buffer_size_after_time_downloaded() function. Both of these functions are
4604  * adapted from WebM Tools project and are adapted to work with FFmpeg's
4605  * Matroska parsing mechanism.
4606  *
4607  * Returns the bandwidth of the file on success; -1 on error.
4608  * */
4609 static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t cues_start)
4610 {
4611  MatroskaDemuxContext *matroska = s->priv_data;
4612  AVStream *st = s->streams[0];
4613  FFStream *const sti = ffstream(st);
4614  double bandwidth = 0.0;
4615 
4616  for (int i = 0; i < sti->nb_index_entries; i++) {
4617  int64_t prebuffer_ns = 1000000000;
4618  int64_t time_ns = sti->index_entries[i].timestamp * matroska->time_scale;
4619  double nano_seconds_per_second = 1000000000.0;
4620  int64_t prebuffered_ns;
4621  double prebuffer_bytes = 0.0;
4622  int64_t temp_prebuffer_ns = prebuffer_ns;
4623  int64_t pre_bytes, pre_ns;
4624  double pre_sec, prebuffer, bits_per_second;
4625  CueDesc desc_beg = get_cue_desc(s, time_ns, cues_start);
4626  // Start with the first Cue.
4627  CueDesc desc_end = desc_beg;
4628 
4629  if (time_ns > INT64_MAX - prebuffer_ns)
4630  return -1;
4631  prebuffered_ns = time_ns + prebuffer_ns;
4632 
4633  // Figure out how much data we have downloaded for the prebuffer. This will
4634  // be used later to adjust the bits per sample to try.
4635  while (desc_end.start_time_ns != -1 && desc_end.end_time_ns < prebuffered_ns) {
4636  // Prebuffered the entire Cue.
4637  prebuffer_bytes += desc_end.end_offset - desc_end.start_offset;
4638  temp_prebuffer_ns -= desc_end.end_time_ns - desc_end.start_time_ns;
4639  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4640  }
4641  if (desc_end.start_time_ns == -1) {
4642  // The prebuffer is larger than the duration.
4643  if (matroska->duration * matroska->time_scale >= prebuffered_ns)
4644  return -1;
4645  bits_per_second = 0.0;
4646  } else {
4647  // The prebuffer ends in the last Cue. Estimate how much data was
4648  // prebuffered.
4649  pre_bytes = desc_end.end_offset - desc_end.start_offset;
4650  if (desc_end.end_time_ns <= desc_end.start_time_ns ||
4651  desc_end.end_time_ns - (uint64_t)desc_end.start_time_ns > INT64_MAX)
4652  return -1;
4653  pre_ns = desc_end.end_time_ns - desc_end.start_time_ns;
4654  pre_sec = pre_ns / nano_seconds_per_second;
4655  prebuffer_bytes +=
4656  pre_bytes * ((temp_prebuffer_ns / nano_seconds_per_second) / pre_sec);
4657 
4658  prebuffer = prebuffer_ns / nano_seconds_per_second;
4659 
4660  // Set this to 0.0 in case our prebuffer buffers the entire video.
4661  bits_per_second = 0.0;
4662  do {
4663  int64_t desc_bytes = desc_end.end_offset - desc_beg.start_offset;
4664  double desc_sec, calc_bits_per_second, percent, mod_bits_per_second;
4665  if (desc_bytes <= 0 || desc_bytes > INT64_MAX/8)
4666  return -1;
4667  if (desc_end.end_time_ns <= desc_beg.start_time_ns ||
4668  desc_end.end_time_ns - (uint64_t)desc_beg.start_time_ns > INT64_MAX)
4669  return -1;
4670 
4671  int64_t desc_ns = desc_end.end_time_ns - desc_beg.start_time_ns;
4672  desc_sec = desc_ns / nano_seconds_per_second;
4673  calc_bits_per_second = (desc_bytes * 8) / desc_sec;
4674 
4675  // Drop the bps by the percentage of bytes buffered.
4676  percent = (desc_bytes - prebuffer_bytes) / desc_bytes;
4677  mod_bits_per_second = calc_bits_per_second * percent;
4678 
4679  if (prebuffer < desc_sec) {
4680  double search_sec =
4681  (double)(matroska->duration * matroska->time_scale) / nano_seconds_per_second;
4682 
4683  // Add 1 so the bits per second should be a little bit greater than file
4684  // datarate.
4685  int64_t bps = (int64_t)(mod_bits_per_second) + 1;
4686  const double min_buffer = 0.0;
4687  double buffer = prebuffer;
4688  double sec_to_download = 0.0;
4689 
4690  int rv = buffer_size_after_time_downloaded(prebuffered_ns, search_sec, bps,
4691  min_buffer, &buffer, &sec_to_download,
4692  s, cues_start);
4693  if (rv < 0) {
4694  return -1;
4695  } else if (rv == 0) {
4696  bits_per_second = (double)(bps);
4697  break;
4698  }
4699  }
4700 
4701  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4702  } while (desc_end.start_time_ns != -1);
4703  }
4704  if (bandwidth < bits_per_second) bandwidth = bits_per_second;
4705  }
4706  return (int64_t)bandwidth;
4707 }
4708 
4709 static int webm_dash_manifest_cues(AVFormatContext *s, int64_t init_range)
4710 {
4711  MatroskaDemuxContext *matroska = s->priv_data;
4712  EbmlList *seekhead_list = &matroska->seekhead;
4713  MatroskaSeekhead *seekhead = seekhead_list->elem;
4714  AVStream *const st = s->streams[0];
4715  FFStream *const sti = ffstream(st);
4716  AVBPrint bprint;
4717  char *buf;
4718  int64_t cues_start = -1, cues_end = -1, before_pos, bandwidth;
4719  int i;
4720  int ret;
4721 
4722  // determine cues start and end positions
4723  for (i = 0; i < seekhead_list->nb_elem; i++)
4724  if (seekhead[i].id == MATROSKA_ID_CUES)
4725  break;
4726 
4727  if (i >= seekhead_list->nb_elem) return -1;
4728 
4729  before_pos = avio_tell(matroska->ctx->pb);
4730  cues_start = seekhead[i].pos + matroska->segment_start;
4731  if (avio_seek(matroska->ctx->pb, cues_start, SEEK_SET) == cues_start) {
4732  // cues_end is computed as cues_start + cues_length + length of the
4733  // Cues element ID (i.e. 4) + EBML length of the Cues element.
4734  // cues_end is inclusive and the above sum is reduced by 1.
4735  uint64_t cues_length, cues_id;
4736  int bytes_read;
4737  bytes_read = ebml_read_num (matroska, matroska->ctx->pb, 4, &cues_id, 1);
4738  if (bytes_read < 0 || cues_id != (MATROSKA_ID_CUES & 0xfffffff))
4739  return bytes_read < 0 ? bytes_read : AVERROR_INVALIDDATA;
4740  bytes_read = ebml_read_length(matroska, matroska->ctx->pb, &cues_length);
4741  if (bytes_read < 0)
4742  return bytes_read;
4743  cues_end = cues_start + 4 + bytes_read + cues_length - 1;
4744  }
4745  avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
4746  if (cues_start == -1 || cues_end == -1) return -1;
4747 
4748  // parse the cues
4749  matroska_parse_cues(matroska);
4750 
4751  if (!sti->nb_index_entries)
4752  return AVERROR_INVALIDDATA;
4753 
4754  // cues start
4755  av_dict_set_int(&s->streams[0]->metadata, CUES_START, cues_start, 0);
4756 
4757  // cues end
4758  av_dict_set_int(&s->streams[0]->metadata, CUES_END, cues_end, 0);
4759 
4760  // if the file has cues at the start, fix up the init range so that
4761  // it does not include it
4762  if (cues_start <= init_range)
4763  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, cues_start - 1, 0);
4764 
4765  // bandwidth
4766  bandwidth = webm_dash_manifest_compute_bandwidth(s, cues_start);
4767  if (bandwidth < 0) return -1;
4768  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH, bandwidth, 0);
4769 
4770  // check if all clusters start with key frames
4771  av_dict_set_int(&s->streams[0]->metadata, CLUSTER_KEYFRAME, webm_clusters_start_with_keyframe(s), 0);
4772 
4773  // Store cue point timestamps as a comma separated list
4774  // for checking subsegment alignment in the muxer.
4776  for (int i = 0; i < sti->nb_index_entries; i++)
4777  av_bprintf(&bprint, "%" PRId64",", sti->index_entries[i].timestamp);
4778  if (!av_bprint_is_complete(&bprint)) {
4779  av_bprint_finalize(&bprint, NULL);
4780  return AVERROR(ENOMEM);
4781  }
4782  // Remove the trailing ','
4783  bprint.str[--bprint.len] = '\0';
4784  if ((ret = av_bprint_finalize(&bprint, &buf)) < 0)
4785  return ret;
4786  av_dict_set(&s->streams[0]->metadata, CUE_TIMESTAMPS,
4788 
4789  return 0;
4790 }
4791 
4792 static int webm_dash_manifest_read_header(AVFormatContext *s)
4793 {
4794  char *buf;
4795  int ret = matroska_read_header(s);
4796  int64_t init_range;
4797  MatroskaTrack *tracks;
4798  MatroskaDemuxContext *matroska = s->priv_data;
4799  if (ret) {
4800  av_log(s, AV_LOG_ERROR, "Failed to read file headers\n");
4801  return -1;
4802  }
4803  if (!matroska->tracks.nb_elem || !s->nb_streams) {
4804  av_log(s, AV_LOG_ERROR, "No track found\n");
4805  return AVERROR_INVALIDDATA;
4806  }
4807 
4808  if (!matroska->is_live) {
4809  buf = av_asprintf("%g", matroska->duration);
4810  if (!buf)
4811  return AVERROR(ENOMEM);
4812  av_dict_set(&s->streams[0]->metadata, DURATION,
4814 
4815  // initialization range
4816  // 5 is the offset of Cluster ID.
4817  init_range = avio_tell(s->pb) - 5;
4818  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, init_range, 0);
4819  }
4820 
4821  // basename of the file
4822  buf = strrchr(s->url, '/');
4823  av_dict_set(&s->streams[0]->metadata, FILENAME, buf ? ++buf : s->url, 0);
4824 
4825  // track number
4826  tracks = matroska->tracks.elem;
4827  av_dict_set_int(&s->streams[0]->metadata, TRACK_NUMBER, tracks[0].num, 0);
4828 
4829  // parse the cues and populate Cue related fields
4830  if (!matroska->is_live) {
4831  ret = webm_dash_manifest_cues(s, init_range);
4832  if (ret < 0) {
4833  av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
4834  return ret;
4835  }
4836  }
4837 
4838  // use the bandwidth from the command line if it was provided
4839  if (matroska->bandwidth > 0) {
4840  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH,
4841  matroska->bandwidth, 0);
4842  }
4843  return 0;
4844 }
4845 
4846 static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt)
4847 {
4848  return AVERROR_EOF;
4849 }
4850 
4851 #define OFFSET(x) offsetof(MatroskaDemuxContext, x)
4852 static const AVOption options[] = {
4853  { "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 },
4854  { "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 },
4855  { NULL },
4856 };
4857 
4858 static const AVClass webm_dash_class = {
4859  .class_name = "WebM DASH Manifest demuxer",
4860  .item_name = av_default_item_name,
4861  .option = options,
4862  .version = LIBAVUTIL_VERSION_INT,
4863 };
4864 
4866  .p.name = "webm_dash_manifest",
4867  .p.long_name = NULL_IF_CONFIG_SMALL("WebM DASH Manifest"),
4868  .p.priv_class = &webm_dash_class,
4869  .priv_data_size = sizeof(MatroskaDemuxContext),
4870  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
4871  .read_header = webm_dash_manifest_read_header,
4872  .read_packet = webm_dash_manifest_read_packet,
4874 };
4875 #endif
4876 
4878  .p.name = "matroska,webm",
4879  .p.long_name = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
4880  .p.extensions = "mkv,mk3d,mka,mks,webm",
4881  .p.mime_type = "audio/webm,audio/x-matroska,video/webm,video/x-matroska",
4882  .priv_data_size = sizeof(MatroskaDemuxContext),
4883  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
4889 };
AVCOL_PRI_RESERVED
@ AVCOL_PRI_RESERVED
Definition: pixfmt.h:640
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:338
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:432
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:3506
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
FFStream::skip_samples
int skip_samples
Number of samples to skip at the start of the frame decoded from the next packet.
Definition: internal.h:208
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:463
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:2486
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:3897
matroska_parse_tracks
static int matroska_parse_tracks(AVFormatContext *s)
Definition: matroskadec.c:3121
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:104
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
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:188
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:4108
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:3764
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:1416
segment_start
static int segment_start(AVFormatContext *s, int write_header)
Definition: segment.c:238
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:3987
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:213
MATROSKA_ID_VIDEOPIXELWIDTH
#define MATROSKA_ID_VIDEOPIXELWIDTH
Definition: matroska.h:119
TTA_EXTRADATA_SIZE
#define TTA_EXTRADATA_SIZE
Definition: matroskadec.c:2596
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
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:3318
matroska_find_track_by_num
static MatroskaTrack * matroska_find_track_by_num(MatroskaDemuxContext *matroska, uint64_t num)
Definition: matroskadec.c:1662
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:156
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
static 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:445
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:409
MATROSKA_ID_BLOCKDURATION
#define MATROSKA_ID_BLOCKDURATION
Definition: matroska.h:247
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
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:1617
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:588
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:669
matroska_read_seek
static int matroska_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: matroskadec.c:4334
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:4402
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:476
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
FLAC_METADATA_TYPE_VORBIS_COMMENT
@ FLAC_METADATA_TYPE_VORBIS_COMMENT
Definition: flac.h:50
AAC_MAX_EXTRADATA_SIZE
#define AAC_MAX_EXTRADATA_SIZE
Definition: matroskadec.c:2595
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:2880
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:606
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:2405
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:472
MatroskaTrackEncoding::type
uint64_t type
Definition: matroskadec.c:160
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:192
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:4314
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:504
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:643
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:613
matroska_metadata_creation_time
static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
Definition: matroskadec.c:2137
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:217
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:191
AVCOL_SPC_RESERVED
@ AVCOL_SPC_RESERVED
reserved for future use by ITU-T and ISO/IEC just like 15-255 are
Definition: pixfmt.h:704
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:214
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:781
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:197
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:362
MatroskaTrackPlane::uid
uint64_t uid
Definition: matroskadec.c:243
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:339
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:219
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2475
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:595
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:2505
AVChapter
Definition: avformat.h:1222
MatroskaBlock
Definition: matroskadec.c:359
matroska_probe
static int matroska_probe(const AVProbeData *p)
Definition: matroskadec.c:1615
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:2599
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:461
mkv_parse_video_color
static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track)
Definition: matroskadec.c:2280
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:216
MATROSKA_TRACK_TYPE_METADATA
@ MATROSKA_TRACK_TYPE_METADATA
Definition: matroska.h:287
AV_CODEC_ID_ATRAC3
@ AV_CODEC_ID_ATRAC3
Definition: codec_id.h:491
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:501
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:342
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:764
matroska_parse_seekhead_entry
static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int64_t pos)
Definition: matroskadec.c:1914
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:482
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[]
Definition: vf_colorspace.c:177
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:602
MatroskaDemuxContext::muxingapp
char * muxingapp
Definition: matroskadec.c:394
AVCOL_PRI_RESERVED0
@ AVCOL_PRI_RESERVED0
Definition: pixfmt.h:637
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:212
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:4260
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:98
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:1414
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
CountedElement::el
union CountedElement::@469 el
MATROSKA_VIDEO_FIELDORDER_BT
@ MATROSKA_VIDEO_FIELDORDER_BT
Definition: matroska.h:309
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:186
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:42
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:1676
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:410
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:3070
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:2597
SKIP_TRACK
@ SKIP_TRACK
Definition: matroskadec.c:2592
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:639
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
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
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:3501
AV_CODEC_ID_ARIB_CAPTION
@ AV_CODEC_ID_ARIB_CAPTION
Definition: codec_id.h:597
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:609
AV_CODEC_ID_WEBVTT
@ AV_CODEC_ID_WEBVTT
Definition: codec_id.h:590
matroska_convert_tag
static void matroska_convert_tag(AVFormatContext *s, EbmlList *list, AVDictionary **metadata, char *prefix)
Definition: matroskadec.c:1814
EBML_ID_DOCTYPEREADVERSION
#define EBML_ID_DOCTYPEREADVERSION
Definition: matroska.h:41
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1263
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:2042
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:667
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:571
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
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
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:2023
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
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:4871
matroska_execute_seekhead
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:1952
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:546
matroska_ebmlnum_sint
static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska, AVIOContext *pb, int64_t *num)
Definition: matroskadec.c:1130
AVFormatContext::max_streams
int max_streams
The maximum number of streams.
Definition: avformat.h:1546
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:3785
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:242
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:911
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1305
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:2198
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
planes
static const struct @562 planes[]
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:3910
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:743
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:311
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
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:462
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
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:350
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:609
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:589
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:143
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:2363
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:235
FFStream
Definition: internal.h:128
matroska_convert_tags
static void matroska_convert_tags(AVFormatContext *s)
Definition: matroskadec.c:1849
AVSphericalMapping::bound_right
uint32_t bound_right
Distance from the right edge.
Definition: spherical.h:187
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
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
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:610
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:2033
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:2833
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:2225
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
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
EbmlSyntax::def
union EbmlSyntax::@470 def
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:70
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:587
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:606
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:200
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:687
AV_CODEC_ID_RV30
@ AV_CODEC_ID_RV30
Definition: codec_id.h:120
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:594
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:498
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:313
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:2127
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:1522
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:1064
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
MATROSKA_ID_FILENAME
#define MATROSKA_ID_FILENAME
Definition: matroska.h:255
interlaced
uint8_t interlaced
Definition: mxfenc.c:2334
AV_CODEC_ID_ATRAC1
@ AV_CODEC_ID_ATRAC1
Definition: codec_id.h:506
MatroskaDemuxContext::chapters
EbmlList chapters
Definition: matroskadec.c:398
AV_CODEC_ID_RA_288
@ AV_CODEC_ID_RA_288
Definition: codec_id.h:446
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:146
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
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
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:58
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:215
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:58
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:347
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:2560
profile
int profile
Definition: mxfenc.c:2297
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:703
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:2032
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:2953
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
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:145
MATROSKA_ID_TRACKCOMBINEPLANES
#define MATROSKA_ID_TRACKCOMBINEPLANES
Definition: matroska.h:83
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
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:122
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:694
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:577
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:444
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:1990
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:231
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:2499
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:3680
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
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:135
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
Recommends 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
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
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:1398
AVPacket::stream_index
int stream_index
Definition: packet.h:590
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:3602
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:321
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:346
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:343
MATROSKA_VIDEO_FIELDORDER_TB
@ MATROSKA_VIDEO_FIELDORDER_TB
Definition: matroska.h:308
mastering_display_metadata.h
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:185
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:670
w
uint8_t w
Definition: llvidencdsp.c:39
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:361
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:3474
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
AVPacket
This structure stores compressed data.
Definition: packet.h:565
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:608
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:66
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:2250
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:359
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
ITU_T_T35_PROVIDER_CODE_SAMSUNG
#define ITU_T_T35_PROVIDER_CODE_SAMSUNG
Definition: itut35.h:39
MatroskaTrackVideo::stereo_mode
uint64_t stereo_mode
Definition: matroskadec.c:219
AV_CODEC_ID_WAVPACK
@ AV_CODEC_ID_WAVPACK
Definition: codec_id.h:485
UNKNOWN_EQUIV
#define UNKNOWN_EQUIV
Definition: matroskadec.c:86
AV_CODEC_ID_COOK
@ AV_CODEC_ID_COOK
Definition: codec_id.h:480
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:1580
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
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
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:351
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:100
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:383
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:144
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
duration
static int64_t duration
Definition: ffplay.c:329
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:239
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:2116
AV_CODEC_ID_MLP
@ AV_CODEC_ID_MLP
Definition: codec_id.h:489
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:2143
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:237
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:349
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