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