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/attributes.h"
38 #include "libavutil/avstring.h"
39 #include "libavutil/base64.h"
40 #include "libavutil/bprint.h"
41 #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 unknown, 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 id64;
1285  res = ebml_read_num(matroska, pb, 4, &id64, 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 = id64 | 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  if (syntax->id == MATROSKA_ID_TRACKENTRY &&
1343  list->nb_elem >= matroska->ctx->max_streams) {
1344  av_log(matroska->ctx, AV_LOG_ERROR,
1345  "Number of tracks exceeds max_streams (%d)\n",
1346  matroska->ctx->max_streams);
1347  return AVERROR(EINVAL);
1348  }
1349  newelem = av_fast_realloc(list->elem,
1350  &list->alloc_elem_size,
1351  (list->nb_elem + 1) * syntax->list_elem_size);
1352  if (!newelem)
1353  return AVERROR(ENOMEM);
1354  list->elem = newelem;
1355  data = (char *) list->elem + list->nb_elem * syntax->list_elem_size;
1356  memset(data, 0, syntax->list_elem_size);
1357  list->nb_elem++;
1358  }
1359  }
1360 
1361  if (syntax->type != EBML_STOP) {
1362  matroska->current_id = 0;
1363  if ((res = ebml_read_length(matroska, pb, &length)) < 0)
1364  return res;
1365 
1366  pos_alt += res;
1367 
1368  if (matroska->num_levels > 0) {
1369  if (length != EBML_UNKNOWN_LENGTH &&
1370  level->length != EBML_UNKNOWN_LENGTH) {
1371  uint64_t elem_end = pos_alt + length,
1372  level_end = level->start + level->length;
1373 
1374  if (elem_end < level_end) {
1375  level_check = 0;
1376  } else if (elem_end == level_end) {
1377  level_check = LEVEL_ENDED;
1378  } else {
1379  av_log(matroska->ctx, AV_LOG_ERROR,
1380  "Element at 0x%"PRIx64" ending at 0x%"PRIx64" exceeds "
1381  "containing master element ending at 0x%"PRIx64"\n",
1382  pos, elem_end, level_end);
1383  return AVERROR_INVALIDDATA;
1384  }
1385  } else if (length != EBML_UNKNOWN_LENGTH) {
1386  level_check = 0;
1387  } else if (level->length != EBML_UNKNOWN_LENGTH) {
1388  av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element "
1389  "at 0x%"PRIx64" inside parent with finite size\n", pos);
1390  return AVERROR_INVALIDDATA;
1391  } else {
1392  level_check = 0;
1393  if (id != MATROSKA_ID_CLUSTER && (syntax->type == EBML_LEVEL1
1394  || syntax->type == EBML_NEST)) {
1395  // According to the current specifications only clusters and
1396  // segments are allowed to be unknown-length. We also accept
1397  // other unknown-length master elements.
1398  av_log(matroska->ctx, AV_LOG_WARNING,
1399  "Found unknown-length element 0x%"PRIX32" other than "
1400  "a cluster at 0x%"PRIx64". Spec-incompliant, but "
1401  "parsing will nevertheless be attempted.\n", id, pos);
1402  update_pos = -1;
1403  }
1404  }
1405  } else
1406  level_check = 0;
1407 
1408  if (max_lengths[syntax->type] && length > max_lengths[syntax->type]) {
1409  if (length != EBML_UNKNOWN_LENGTH) {
1410  av_log(matroska->ctx, AV_LOG_ERROR,
1411  "Invalid length 0x%"PRIx64" > 0x%"PRIx64" for element "
1412  "with ID 0x%"PRIX32" at 0x%"PRIx64"\n",
1413  length, max_lengths[syntax->type], id, pos);
1414  } else if (syntax->type != EBML_NONE) {
1415  av_log(matroska->ctx, AV_LOG_ERROR,
1416  "Element with ID 0x%"PRIX32" at pos. 0x%"PRIx64" has "
1417  "unknown length, yet the length of an element of its "
1418  "type must be known.\n", id, pos);
1419  } else {
1420  av_log(matroska->ctx, AV_LOG_ERROR,
1421  "Found unknown-length element with ID 0x%"PRIX32" at "
1422  "pos. 0x%"PRIx64" for which no syntax for parsing is "
1423  "available.\n", id, pos);
1424  }
1425  return AVERROR_INVALIDDATA;
1426  }
1427 
1428  if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
1429  // Losing sync will likely manifest itself as encountering unknown
1430  // elements which are not reliably distinguishable from elements
1431  // belonging to future extensions of the format.
1432  // We use a heuristic to detect such situations: If the current
1433  // element is not expected at the current syntax level and there
1434  // were only a few unknown elements in a row, then the element is
1435  // skipped or considered defective based upon the length of the
1436  // current element (i.e. how much would be skipped); if there were
1437  // more than a few skipped elements in a row and skipping the current
1438  // element would lead us more than SKIP_THRESHOLD away from the last
1439  // known good position, then it is inferred that an error occurred.
1440  // The dependency on the number of unknown elements in a row exists
1441  // because the distance to the last known good position is
1442  // automatically big if the last parsed element was big.
1443  // In both cases, each unknown element is considered equivalent to
1444  // UNKNOWN_EQUIV of skipped bytes for the check.
1445  // The whole check is only done for non-seekable output, because
1446  // in this situation skipped data can't simply be rechecked later.
1447  // This is especially important when using unknown length elements
1448  // as the check for whether a child exceeds its containing master
1449  // element is not effective in this situation.
1450  if (update_pos) {
1451  matroska->unknown_count = 0;
1452  } else {
1453  int64_t dist = length + UNKNOWN_EQUIV * matroska->unknown_count++;
1454 
1455  if (matroska->unknown_count > 3)
1456  dist += pos_alt - matroska->resync_pos;
1457 
1458  if (dist > SKIP_THRESHOLD) {
1459  av_log(matroska->ctx, AV_LOG_ERROR,
1460  "Unknown element %"PRIX32" at pos. 0x%"PRIx64" with "
1461  "length 0x%"PRIx64" considered as invalid data. Last "
1462  "known good position 0x%"PRIx64", %d unknown elements"
1463  " in a row\n", id, pos, length, matroska->resync_pos,
1464  matroska->unknown_count);
1465  return AVERROR_INVALIDDATA;
1466  }
1467  }
1468  }
1469 
1470  if (update_pos > 0) {
1471  // We have found an element that is allowed at this place
1472  // in the hierarchy and it passed all checks, so treat the beginning
1473  // of the element as the "last known good" position.
1474  matroska->resync_pos = pos;
1475  }
1476 
1477  if (!data && length != EBML_UNKNOWN_LENGTH)
1478  goto skip;
1479  }
1480 
1481  switch (syntax->type) {
1482  case EBML_UINT:
1483  res = ebml_read_uint(pb, length, syntax->def.u, data);
1484  break;
1485  case EBML_SINT:
1486  res = ebml_read_sint(pb, length, syntax->def.i, data);
1487  break;
1488  case EBML_FLOAT:
1489  res = ebml_read_float(pb, length, syntax->def.f, data);
1490  break;
1491  case EBML_STR:
1492  case EBML_UTF8:
1493  res = ebml_read_ascii(pb, length, syntax->def.s, data);
1494  break;
1495  case EBML_BIN:
1496  res = ebml_read_binary(pb, length, pos_alt, data);
1497  break;
1498  case EBML_LEVEL1:
1499  case EBML_NEST:
1500  if ((res = ebml_read_master(matroska, length, pos_alt)) < 0)
1501  return res;
1502  if (id == MATROSKA_ID_SEGMENT)
1503  matroska->segment_start = pos_alt;
1504  if (id == MATROSKA_ID_CUES)
1505  matroska->cues_parsing_deferred = 0;
1506  if (syntax->type == EBML_LEVEL1 &&
1507  (level1_elem = matroska_find_level1_elem(matroska, syntax->id, pos))) {
1508  if (!level1_elem->pos) {
1509  // Zero is not a valid position for a level 1 element.
1510  level1_elem->pos = pos;
1511  } else if (level1_elem->pos != pos)
1512  av_log(matroska->ctx, AV_LOG_ERROR, "Duplicate element\n");
1513  level1_elem->parsed = 1;
1514  }
1515  if (res = ebml_parse_nest(matroska, syntax->def.n, data))
1516  return res;
1517  break;
1518  case EBML_STOP:
1519  return 1;
1520  skip:
1521  default:
1522  if (length) {
1523  int64_t res2;
1524  if (ffio_limit(pb, length) != length) {
1525  // ffio_limit emits its own error message,
1526  // so we don't have to.
1527  return AVERROR(EIO);
1528  }
1529  if ((res2 = avio_skip(pb, length - 1)) >= 0) {
1530  // avio_skip might take us past EOF. We check for this
1531  // by skipping only length - 1 bytes, reading a byte and
1532  // checking the error flags. This is done in order to check
1533  // that the element has been properly skipped even when
1534  // no filesize (that ffio_limit relies on) is available.
1535  avio_r8(pb);
1536  res = NEEDS_CHECKING;
1537  } else
1538  res = res2;
1539  } else
1540  res = 0;
1541  }
1542  if (res) {
1543  if (res == NEEDS_CHECKING) {
1544  if (pb->eof_reached) {
1545  if (pb->error)
1546  res = pb->error;
1547  else
1548  res = AVERROR_EOF;
1549  } else
1550  goto level_check;
1551  }
1552 
1553  if (res == AVERROR_INVALIDDATA)
1554  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
1555  else if (res == AVERROR(EIO))
1556  av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
1557  else if (res == AVERROR_EOF) {
1558  av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely\n");
1559  res = AVERROR(EIO);
1560  }
1561 
1562  return res;
1563  }
1564 
1565 level_check:
1566  if (syntax->is_counted && data) {
1567  CountedElement *elem = data;
1568  if (elem->count != UINT_MAX)
1569  elem->count++;
1570  }
1571 
1572  if (level_check == LEVEL_ENDED && matroska->num_levels) {
1573  level = &matroska->levels[matroska->num_levels - 1];
1574  pos = avio_tell(pb);
1575 
1576  // Given that pos >= level->start no check for
1577  // level->length != EBML_UNKNOWN_LENGTH is necessary.
1578  while (matroska->num_levels && pos == level->start + level->length) {
1579  matroska->num_levels--;
1580  level--;
1581  }
1582  }
1583 
1584  return level_check;
1585 }
1586 
1587 static void ebml_free(EbmlSyntax *syntax, void *data)
1588 {
1589  int i, j;
1590  for (i = 0; syntax[i].id; i++) {
1591  void *data_off = (char *) data + syntax[i].data_offset;
1592  switch (syntax[i].type) {
1593  case EBML_STR:
1594  case EBML_UTF8:
1595  av_freep(data_off);
1596  break;
1597  case EBML_BIN:
1598  av_buffer_unref(&((EbmlBin *) data_off)->buf);
1599  break;
1600  case EBML_LEVEL1:
1601  case EBML_NEST:
1602  if (syntax[i].list_elem_size) {
1603  EbmlList *list = data_off;
1604  char *ptr = list->elem;
1605  for (j = 0; j < list->nb_elem;
1606  j++, ptr += syntax[i].list_elem_size)
1607  ebml_free(syntax[i].def.n, ptr);
1608  av_freep(&list->elem);
1609  list->nb_elem = 0;
1610  list->alloc_elem_size = 0;
1611  } else
1612  ebml_free(syntax[i].def.n, data_off);
1613  break;
1614  default:
1615  break;
1616  }
1617  }
1618 }
1619 
1620 /*
1621  * Autodetecting...
1622  */
1623 static int matroska_probe(const AVProbeData *p)
1624 {
1625  uint64_t total = 0;
1626  int len_mask = 0x80, size = 1, n = 1, i;
1627 
1628  /* EBML header? */
1629  if (AV_RB32(p->buf) != EBML_ID_HEADER)
1630  return 0;
1631 
1632  /* length of header */
1633  total = p->buf[4];
1634  while (size <= 8 && !(total & len_mask)) {
1635  size++;
1636  len_mask >>= 1;
1637  }
1638  if (size > 8)
1639  return 0;
1640  total &= (len_mask - 1);
1641  while (n < size)
1642  total = (total << 8) | p->buf[4 + n++];
1643 
1644  if (total + 1 == 1ULL << (7 * size)){
1645  /* Unknown-length header - simply parse the whole buffer. */
1646  total = p->buf_size - 4 - size;
1647  } else {
1648  /* Does the probe data contain the whole header? */
1649  if (p->buf_size < 4 + size + total)
1650  return 0;
1651  }
1652 
1653  /* The header should contain a known document type. For now,
1654  * we don't parse the whole header but simply check for the
1655  * availability of that array of characters inside the header.
1656  * Not fully fool-proof, but good enough. */
1657  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++) {
1658  size_t probelen = strlen(matroska_doctypes[i]);
1659  if (total < probelen)
1660  continue;
1661  for (n = 4 + size; n <= 4 + size + total - probelen; n++)
1662  if (!memcmp(p->buf + n, matroska_doctypes[i], probelen))
1663  return AVPROBE_SCORE_MAX;
1664  }
1665 
1666  // probably valid EBML header but no recognized doctype
1667  return AVPROBE_SCORE_EXTENSION;
1668 }
1669 
1671  uint64_t num)
1672 {
1673  MatroskaTrack *tracks = matroska->tracks.elem;
1674  int i;
1675 
1676  for (i = 0; i < matroska->tracks.nb_elem; i++)
1677  if (tracks[i].num == num)
1678  return &tracks[i];
1679 
1680  av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %"PRIu64"\n", num);
1681  return NULL;
1682 }
1683 
1684 static int matroska_decode_buffer(uint8_t **buf, int *buf_size,
1685  MatroskaTrack *track)
1686 {
1687  MatroskaTrackEncoding *encodings = track->encodings.elem;
1688  uint8_t *data = *buf;
1689  int isize = *buf_size;
1690  uint8_t *pkt_data = NULL;
1691  av_unused uint8_t *newpktdata;
1692  int pkt_size = isize;
1693  int result = 0;
1694  int olen;
1695 
1696  if (pkt_size >= 10000000U)
1697  return AVERROR_INVALIDDATA;
1698 
1699  switch (encodings[0].compression.algo) {
1701  {
1702  int header_size = encodings[0].compression.settings.size;
1703  uint8_t *header = encodings[0].compression.settings.data;
1704 
1705  if (header_size && !header) {
1706  av_log(NULL, AV_LOG_ERROR, "Compression size but no data in headerstrip\n");
1707  return -1;
1708  }
1709 
1710  if (!header_size)
1711  return 0;
1712 
1713  pkt_size = isize + header_size;
1714  pkt_data = av_malloc(pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1715  if (!pkt_data)
1716  return AVERROR(ENOMEM);
1717 
1718  memcpy(pkt_data, header, header_size);
1719  memcpy(pkt_data + header_size, data, isize);
1720  break;
1721  }
1723  do {
1724  int insize = isize;
1725  olen = pkt_size *= 3;
1726  newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING
1728  if (!newpktdata) {
1729  result = AVERROR(ENOMEM);
1730  goto failed;
1731  }
1732  pkt_data = newpktdata;
1733  result = av_lzo1x_decode(pkt_data, &olen, data, &insize);
1734  } while (result == AV_LZO_OUTPUT_FULL && pkt_size < 10000000);
1735  if (result) {
1737  goto failed;
1738  }
1739  pkt_size -= olen;
1740  break;
1741 #if CONFIG_ZLIB
1743  {
1744  z_stream zstream = { 0 };
1745  if (!pkt_size || inflateInit(&zstream) != Z_OK)
1746  return -1;
1747  zstream.next_in = data;
1748  zstream.avail_in = isize;
1749  do {
1750  pkt_size *= 3;
1751  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1752  if (!newpktdata) {
1753  inflateEnd(&zstream);
1754  result = AVERROR(ENOMEM);
1755  goto failed;
1756  }
1757  pkt_data = newpktdata;
1758  zstream.avail_out = pkt_size - zstream.total_out;
1759  zstream.next_out = pkt_data + zstream.total_out;
1760  result = inflate(&zstream, Z_NO_FLUSH);
1761  } while (result == Z_OK && pkt_size < 10000000);
1762  pkt_size = zstream.total_out;
1763  inflateEnd(&zstream);
1764  if (result != Z_STREAM_END) {
1765  if (result == Z_MEM_ERROR)
1766  result = AVERROR(ENOMEM);
1767  else
1769  goto failed;
1770  }
1771  break;
1772  }
1773 #endif
1774 #if CONFIG_BZLIB
1776  {
1777  bz_stream bzstream = { 0 };
1778  if (!pkt_size || BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
1779  return -1;
1780  bzstream.next_in = data;
1781  bzstream.avail_in = isize;
1782  do {
1783  pkt_size *= 3;
1784  newpktdata = av_realloc(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE);
1785  if (!newpktdata) {
1786  BZ2_bzDecompressEnd(&bzstream);
1787  result = AVERROR(ENOMEM);
1788  goto failed;
1789  }
1790  pkt_data = newpktdata;
1791  bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
1792  bzstream.next_out = pkt_data + bzstream.total_out_lo32;
1793  result = BZ2_bzDecompress(&bzstream);
1794  } while (result == BZ_OK && pkt_size < 10000000);
1795  pkt_size = bzstream.total_out_lo32;
1796  BZ2_bzDecompressEnd(&bzstream);
1797  if (result != BZ_STREAM_END) {
1798  if (result == BZ_MEM_ERROR)
1799  result = AVERROR(ENOMEM);
1800  else
1802  goto failed;
1803  }
1804  break;
1805  }
1806 #endif
1807  default:
1808  return AVERROR_INVALIDDATA;
1809  }
1810 
1811  memset(pkt_data + pkt_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1812 
1813  *buf = pkt_data;
1814  *buf_size = pkt_size;
1815  return 0;
1817 failed:
1818  av_free(pkt_data);
1819  return result;
1820 }
1821 
1823  AVDictionary **metadata, char *prefix)
1824 {
1825  MatroskaTag *tags = list->elem;
1826  char key[1024];
1827  int i;
1828 
1829  for (i = 0; i < list->nb_elem; i++) {
1830  const char *lang = tags[i].lang &&
1831  strcmp(tags[i].lang, "und") ? tags[i].lang : NULL;
1832 
1833  if (!tags[i].name) {
1834  av_log(s, AV_LOG_WARNING, "Skipping invalid tag with no TagName.\n");
1835  continue;
1836  }
1837  if (prefix)
1838  snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name);
1839  else
1840  av_strlcpy(key, tags[i].name, sizeof(key));
1841  if (tags[i].def || !lang) {
1842  av_dict_set(metadata, key, tags[i].string, 0);
1843  if (tags[i].sub.nb_elem)
1844  matroska_convert_tag(s, &tags[i].sub, metadata, key);
1845  }
1846  if (lang) {
1847  av_strlcat(key, "-", sizeof(key));
1848  av_strlcat(key, lang, sizeof(key));
1849  av_dict_set(metadata, key, tags[i].string, 0);
1850  if (tags[i].sub.nb_elem)
1852  }
1853  }
1855 }
1856 
1858 {
1859  MatroskaDemuxContext *matroska = s->priv_data;
1860  MatroskaTags *tags = matroska->tags.elem;
1861  int i, j;
1862 
1863  for (i = 0; i < matroska->tags.nb_elem; i++) {
1864  if (tags[i].target.attachuid) {
1865  MatroskaAttachment *attachment = matroska->attachments.elem;
1866  int found = 0;
1867  for (j = 0; j < matroska->attachments.nb_elem; j++) {
1868  if (attachment[j].uid == tags[i].target.attachuid &&
1869  attachment[j].stream) {
1870  matroska_convert_tag(s, &tags[i].tag,
1871  &attachment[j].stream->metadata, NULL);
1872  found = 1;
1873  }
1874  }
1875  if (!found) {
1877  "The tags at index %d refer to a "
1878  "non-existent attachment %"PRId64".\n",
1879  i, tags[i].target.attachuid);
1880  }
1881  } else if (tags[i].target.chapteruid) {
1882  MatroskaChapter *chapter = matroska->chapters.elem;
1883  int found = 0;
1884  for (j = 0; j < matroska->chapters.nb_elem; j++) {
1885  if (chapter[j].uid == tags[i].target.chapteruid &&
1886  chapter[j].chapter) {
1887  matroska_convert_tag(s, &tags[i].tag,
1888  &chapter[j].chapter->metadata, NULL);
1889  found = 1;
1890  }
1891  }
1892  if (!found) {
1894  "The tags at index %d refer to a non-existent chapter "
1895  "%"PRId64".\n",
1896  i, tags[i].target.chapteruid);
1897  }
1898  } else if (tags[i].target.trackuid) {
1899  MatroskaTrack *track = matroska->tracks.elem;
1900  int found = 0;
1901  for (j = 0; j < matroska->tracks.nb_elem; j++) {
1902  if (track[j].uid == tags[i].target.trackuid &&
1903  track[j].stream) {
1904  matroska_convert_tag(s, &tags[i].tag,
1905  &track[j].stream->metadata, NULL);
1906  found = 1;
1907  }
1908  }
1909  if (!found) {
1911  "The tags at index %d refer to a non-existent track "
1912  "%"PRId64".\n",
1913  i, tags[i].target.trackuid);
1914  }
1915  } else {
1916  matroska_convert_tag(s, &tags[i].tag, &s->metadata,
1917  tags[i].target.type);
1918  }
1919  }
1920 }
1921 
1923  int64_t pos)
1924 {
1925  uint32_t saved_id = matroska->current_id;
1926  int64_t before_pos = avio_tell(matroska->ctx->pb);
1927  int ret = 0;
1928  int ret2;
1929 
1930  /* seek */
1931  if (avio_seek(matroska->ctx->pb, pos, SEEK_SET) == pos) {
1932  /* We don't want to lose our seekhead level, so we add
1933  * a dummy. This is a crude hack. */
1934  if (matroska->num_levels == EBML_MAX_DEPTH) {
1935  av_log(matroska->ctx, AV_LOG_INFO,
1936  "Max EBML element depth (%d) reached, "
1937  "cannot parse further.\n", EBML_MAX_DEPTH);
1939  } else {
1940  matroska->levels[matroska->num_levels] = (MatroskaLevel) { 0, EBML_UNKNOWN_LENGTH };
1941  matroska->num_levels++;
1942  matroska->current_id = 0;
1943 
1944  ret = ebml_parse(matroska, matroska_segment, matroska);
1945  if (ret == LEVEL_ENDED) {
1946  /* This can only happen if the seek brought us beyond EOF. */
1947  ret = AVERROR_EOF;
1948  }
1949  }
1950  }
1951  /* Seek back - notice that in all instances where this is used
1952  * it is safe to set the level to 1. */
1953  ret2 = matroska_reset_status(matroska, saved_id, before_pos);
1954  if (ret >= 0)
1955  ret = ret2;
1956 
1957  return ret;
1958 }
1959 
1960 static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
1961 {
1962  EbmlList *seekhead_list = &matroska->seekhead;
1963  int i;
1964 
1965  // we should not do any seeking in the streaming case
1966  if (!(matroska->ctx->pb->seekable & AVIO_SEEKABLE_NORMAL))
1967  return;
1968 
1969  for (i = 0; i < seekhead_list->nb_elem; i++) {
1970  MatroskaSeekhead *seekheads = seekhead_list->elem;
1971  uint32_t id = seekheads[i].id;
1972  int64_t pos = seekheads[i].pos + matroska->segment_start;
1973  MatroskaLevel1Element *elem;
1974 
1975  if (id != seekheads[i].id || pos < matroska->segment_start)
1976  continue;
1977 
1978  elem = matroska_find_level1_elem(matroska, id, pos);
1979  if (!elem || elem->parsed)
1980  continue;
1981 
1982  elem->pos = pos;
1983 
1984  // defer cues parsing until we actually need cue data.
1985  if (id == MATROSKA_ID_CUES)
1986  continue;
1987 
1988  if (matroska_parse_seekhead_entry(matroska, pos) < 0) {
1989  // mark index as broken
1990  matroska->cues_parsing_deferred = -1;
1991  break;
1992  }
1993 
1994  elem->parsed = 1;
1995  }
1996 }
1997 
1998 static void matroska_add_index_entries(MatroskaDemuxContext *matroska)
1999 {
2000  EbmlList *index_list;
2002  uint64_t index_scale = 1;
2003  int i, j;
2004 
2005  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
2006  return;
2007 
2008  index_list = &matroska->index;
2009  index = index_list->elem;
2010  if (index_list->nb_elem < 2)
2011  return;
2012  if (index[1].time > 1E14 / matroska->time_scale) {
2013  av_log(matroska->ctx, AV_LOG_WARNING, "Dropping apparently-broken index.\n");
2014  return;
2015  }
2016  for (i = 0; i < index_list->nb_elem; i++) {
2017  EbmlList *pos_list = &index[i].pos;
2018  MatroskaIndexPos *pos = pos_list->elem;
2019  for (j = 0; j < pos_list->nb_elem; j++) {
2020  MatroskaTrack *track = matroska_find_track_by_num(matroska,
2021  pos[j].track);
2022  if (track && track->stream)
2023  av_add_index_entry(track->stream,
2024  pos[j].pos + matroska->segment_start,
2025  index[i].time / index_scale, 0, 0,
2027  }
2028  }
2029 }
2030 
2031 static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
2032  int i;
2033 
2034  if (matroska->ctx->flags & AVFMT_FLAG_IGNIDX)
2035  return;
2036 
2037  for (i = 0; i < matroska->num_level1_elems; i++) {
2038  MatroskaLevel1Element *elem = &matroska->level1_elems[i];
2039  if (elem->id == MATROSKA_ID_CUES && !elem->parsed) {
2040  if (matroska_parse_seekhead_entry(matroska, elem->pos) < 0)
2041  matroska->cues_parsing_deferred = -1;
2042  elem->parsed = 1;
2043  break;
2044  }
2045  }
2046 
2047  matroska_add_index_entries(matroska);
2048 }
2049 
2051  unsigned nb_encodings,
2052  MatroskaTrack *track,
2053  char **key_id_base64, void *logctx)
2054 {
2055  if (nb_encodings > 1) {
2056  av_log(logctx, AV_LOG_ERROR,
2057  "Multiple combined encodings not supported\n");
2058  return 0;
2059  }
2060  if (!nb_encodings)
2061  return 0;
2062  if (encodings->type) {
2063  if (encodings->encryption.key_id.size > 0) {
2064  /* Save the encryption key id to be stored later
2065  * as a metadata tag. */
2066  const int b64_size = AV_BASE64_SIZE(encodings->encryption.key_id.size);
2067  *key_id_base64 = av_malloc(b64_size);
2068  if (!*key_id_base64)
2069  return AVERROR(ENOMEM);
2070 
2071  av_base64_encode(*key_id_base64, b64_size,
2072  encodings->encryption.key_id.data,
2073  encodings->encryption.key_id.size);
2074  } else {
2075  encodings->scope = 0;
2076  av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type\n");
2077  }
2078  } else if (
2079 #if CONFIG_ZLIB
2081 #endif
2082 #if CONFIG_BZLIB
2084 #endif
2087  encodings->scope = 0;
2088  av_log(logctx, AV_LOG_ERROR, "Unsupported encoding type\n");
2089  } else if (track->codec_priv.size && encodings[0].scope & 2) {
2090  uint8_t *codec_priv = track->codec_priv.data;
2091  int ret = matroska_decode_buffer(&track->codec_priv.data,
2092  &track->codec_priv.size,
2093  track);
2094  if (ret < 0) {
2095  track->codec_priv.data = NULL;
2096  track->codec_priv.size = 0;
2097  av_log(logctx, AV_LOG_ERROR,
2098  "Failed to decode codec private data\n");
2099  }
2100 
2101  if (codec_priv != track->codec_priv.data) {
2102  av_buffer_unref(&track->codec_priv.buf);
2103  if (track->codec_priv.data) {
2104  track->codec_priv.buf = av_buffer_create(track->codec_priv.data,
2106  NULL, NULL, 0);
2107  if (!track->codec_priv.buf) {
2108  av_freep(&track->codec_priv.data);
2109  track->codec_priv.size = 0;
2110  return AVERROR(ENOMEM);
2111  }
2112  }
2113  }
2114  }
2115  track->needs_decoding = !encodings->type &&
2116  encodings->scope & 1 &&
2117  (encodings->compression.algo !=
2119  encodings->compression.settings.size);
2120 
2121  return 0;
2122 }
2123 
2124 static int matroska_aac_profile(char *codec_id)
2125 {
2126  static const char *const aac_profiles[] = { "MAIN", "LC", "SSR" };
2127  int profile;
2128 
2130  if (strstr(codec_id, aac_profiles[profile]))
2131  break;
2132  return profile + 1;
2133 }
2134 
2135 static int matroska_aac_sri(int samplerate)
2136 {
2137  int sri;
2138 
2139  for (sri = 0; sri < FF_ARRAY_ELEMS(ff_mpeg4audio_sample_rates); sri++)
2140  if (ff_mpeg4audio_sample_rates[sri] == samplerate)
2141  break;
2142  return sri;
2143 }
2144 
2146 {
2147  /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */
2148  ff_dict_set_timestamp(metadata, "creation_time", date_utc / 1000 + 978307200000000LL);
2149 }
2150 
2152  MatroskaTrack *track,
2153  int *offset)
2154 {
2155  AVStream *st = track->stream;
2156  uint8_t *p = track->codec_priv.data;
2157  int size = track->codec_priv.size;
2158 
2159  if (size < 8 + FLAC_STREAMINFO_SIZE || p[4] & 0x7f) {
2160  av_log(s, AV_LOG_WARNING, "Invalid FLAC private data\n");
2161  track->codec_priv.size = 0;
2162  return 0;
2163  }
2164  *offset = 8;
2165  track->codec_priv.size = 8 + FLAC_STREAMINFO_SIZE;
2166 
2167  p += track->codec_priv.size;
2168  size -= track->codec_priv.size;
2169 
2170  /* parse the remaining metadata blocks if present */
2171  while (size >= 4) {
2172  int block_last, block_type, block_size;
2173 
2174  flac_parse_block_header(p, &block_last, &block_type, &block_size);
2175 
2176  p += 4;
2177  size -= 4;
2178  if (block_size > size)
2179  return 0;
2180 
2181  /* check for the channel mask */
2182  if (block_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
2183  AVDictionary *dict = NULL;
2184  AVDictionaryEntry *chmask;
2185 
2186  ff_vorbis_comment(s, &dict, p, block_size, 0);
2187  chmask = av_dict_get(dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL, 0);
2188  if (chmask) {
2189  uint64_t mask = strtol(chmask->value, NULL, 0);
2190  if (!mask || mask & ~0x3ffffULL) {
2192  "Invalid value of WAVEFORMATEXTENSIBLE_CHANNEL_MASK\n");
2193  } else
2195  }
2196  av_dict_free(&dict);
2197  }
2198 
2199  p += block_size;
2200  size -= block_size;
2201  }
2202 
2203  return 0;
2204 }
2205 
2206 static int mkv_field_order(const MatroskaDemuxContext *matroska, uint64_t field_order)
2207 {
2208  int minor, micro, bttb = 0;
2209 
2210  /* workaround a bug in our Matroska muxer, introduced in version 57.36 alongside
2211  * this function, and fixed in 57.52 */
2212  if (matroska->muxingapp && sscanf(matroska->muxingapp, "Lavf57.%d.%d", &minor, &micro) == 2)
2213  bttb = (minor >= 36 && minor <= 51 && micro >= 100);
2214 
2215  switch (field_order) {
2217  return AV_FIELD_PROGRESSIVE;
2219  return AV_FIELD_UNKNOWN;
2221  return AV_FIELD_TT;
2223  return AV_FIELD_BB;
2225  return bttb ? AV_FIELD_TB : AV_FIELD_BT;
2227  return bttb ? AV_FIELD_BT : AV_FIELD_TB;
2228  default:
2229  return AV_FIELD_UNKNOWN;
2230  }
2231 }
2232 
2233 static void mkv_stereo_mode_display_mul(int stereo_mode,
2234  int *h_width, int *h_height)
2235 {
2236  switch (stereo_mode) {
2242  break;
2247  *h_width = 2;
2248  break;
2253  *h_height = 2;
2254  break;
2255  }
2256 }
2257 
2258 static int mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
2259 {
2260  static const struct {
2261  char type;
2262  char flags;
2263  } stereo_mode_conv [] = {
2264 #define STEREO_MODE_CONV(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
2265  [(STEREOMODETYPE)] = { .type = (STEREO3DTYPE), .flags = (FLAGS) },
2266 #define NOTHING(STEREOMODETYPE, WDIV, HDIV, WEBM)
2268  };
2269  AVStereo3D *stereo;
2270  size_t size;
2271 
2272  stereo = av_stereo3d_alloc_size(&size);
2273  if (!stereo)
2274  return AVERROR(ENOMEM);
2275 
2276  stereo->type = stereo_mode_conv[stereo_mode].type;
2277  stereo->flags = stereo_mode_conv[stereo_mode].flags;
2278 
2280  AV_PKT_DATA_STEREO3D, stereo, size, 0)) {
2281  av_freep(&stereo);
2282  return AVERROR(ENOMEM);
2283  }
2284 
2285  return 0;
2286 }
2287 
2288 static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) {
2289  const MatroskaTrackVideoColor *color = track->video.color.elem;
2290  const MatroskaMasteringMeta *mastering_meta;
2291  int has_mastering_primaries, has_mastering_luminance;
2292 
2293  if (!track->video.color.nb_elem)
2294  return 0;
2295 
2296  mastering_meta = &color->mastering_meta;
2297  // Mastering primaries are CIE 1931 coords, and must be > 0.
2298  has_mastering_primaries =
2299  mastering_meta->r_x > 0 && mastering_meta->r_y > 0 &&
2300  mastering_meta->g_x > 0 && mastering_meta->g_y > 0 &&
2301  mastering_meta->b_x > 0 && mastering_meta->b_y > 0 &&
2302  mastering_meta->white_x > 0 && mastering_meta->white_y > 0;
2303  has_mastering_luminance = mastering_meta->max_luminance >
2304  mastering_meta->min_luminance.el.f &&
2305  mastering_meta->min_luminance.el.f >= 0 &&
2306  mastering_meta->min_luminance.count;
2307 
2308  if (color->matrix_coefficients != AVCOL_SPC_RESERVED)
2309  st->codecpar->color_space = color->matrix_coefficients;
2310  if (color->primaries != AVCOL_PRI_RESERVED &&
2311  color->primaries != AVCOL_PRI_RESERVED0)
2312  st->codecpar->color_primaries = color->primaries;
2313  if (color->transfer_characteristics != AVCOL_TRC_RESERVED &&
2314  color->transfer_characteristics != AVCOL_TRC_RESERVED0)
2315  st->codecpar->color_trc = color->transfer_characteristics;
2316  if (color->range != AVCOL_RANGE_UNSPECIFIED &&
2317  color->range <= AVCOL_RANGE_JPEG)
2318  st->codecpar->color_range = color->range;
2319  if (color->chroma_siting_horz != MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED &&
2320  color->chroma_siting_vert != MATROSKA_COLOUR_CHROMASITINGVERT_UNDETERMINED &&
2321  color->chroma_siting_horz < MATROSKA_COLOUR_CHROMASITINGHORZ_NB &&
2322  color->chroma_siting_vert < MATROSKA_COLOUR_CHROMASITINGVERT_NB) {
2323  st->codecpar->chroma_location =
2324  av_chroma_location_pos_to_enum((color->chroma_siting_horz - 1) << 7,
2325  (color->chroma_siting_vert - 1) << 7);
2326  }
2327  if (color->max_cll && color->max_fall) {
2328  size_t size = 0;
2330  if (!metadata)
2331  return AVERROR(ENOMEM);
2334  av_freep(&metadata);
2335  return AVERROR(ENOMEM);
2336  }
2337  metadata->MaxCLL = color->max_cll;
2338  metadata->MaxFALL = color->max_fall;
2339  }
2340 
2341  if (has_mastering_primaries || has_mastering_luminance) {
2342  size_t size = 0;
2344  if (!metadata)
2345  return AVERROR(ENOMEM);
2348  av_freep(&metadata);
2349  return AVERROR(ENOMEM);
2350  }
2351  if (has_mastering_primaries) {
2352  metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX);
2353  metadata->display_primaries[0][1] = av_d2q(mastering_meta->r_y, INT_MAX);
2354  metadata->display_primaries[1][0] = av_d2q(mastering_meta->g_x, INT_MAX);
2355  metadata->display_primaries[1][1] = av_d2q(mastering_meta->g_y, INT_MAX);
2356  metadata->display_primaries[2][0] = av_d2q(mastering_meta->b_x, INT_MAX);
2357  metadata->display_primaries[2][1] = av_d2q(mastering_meta->b_y, INT_MAX);
2358  metadata->white_point[0] = av_d2q(mastering_meta->white_x, INT_MAX);
2359  metadata->white_point[1] = av_d2q(mastering_meta->white_y, INT_MAX);
2360  metadata->has_primaries = 1;
2361  }
2362  if (has_mastering_luminance) {
2363  metadata->max_luminance = av_d2q(mastering_meta->max_luminance, INT_MAX);
2364  metadata->min_luminance = av_d2q(mastering_meta->min_luminance.el.f, INT_MAX);
2365  metadata->has_luminance = 1;
2366  }
2367  }
2368  return 0;
2369 }
2370 
2371 static int mkv_create_display_matrix(AVStream *st,
2372  const MatroskaTrackVideoProjection *proj,
2373  void *logctx)
2374 {
2375  AVPacketSideData *sd;
2376  double pitch = proj->pitch, yaw = proj->yaw, roll = proj->roll;
2377  int32_t *matrix;
2378  int hflip;
2379 
2380  if (pitch == 0.0 && yaw == 0.0 && roll == 0.0)
2381  return 0;
2382 
2383  /* Note: The following constants are exactly representable
2384  * as floating-point numbers. */
2385  if (pitch != 0.0 || (yaw != 0.0 && yaw != 180.0 && yaw != -180.0) ||
2386  isnan(roll)) {
2387  av_log(logctx, AV_LOG_WARNING, "Ignoring non-2D rectangular "
2388  "projection in stream %u (yaw %f, pitch %f, roll %f)\n",
2389  st->index, yaw, pitch, roll);
2390  return 0;
2391  }
2395  9 * sizeof(*matrix), 0);
2396  if (!sd)
2397  return AVERROR(ENOMEM);
2398  matrix = (int32_t*)sd->data;
2399 
2400  hflip = yaw != 0.0;
2401  /* ProjectionPoseRoll is in the counter-clockwise direction
2402  * whereas av_display_rotation_set() expects its argument
2403  * to be oriented clockwise, so we need to negate roll.
2404  * Furthermore, if hflip is set, we need to negate it again
2405  * to account for the fact that the Matroska specifications
2406  * require the yaw rotation to be applied first. */
2407  av_display_rotation_set(matrix, roll * (2 * hflip - 1));
2408  av_display_matrix_flip(matrix, hflip, 0);
2409 
2410  return 0;
2411 }
2412 
2413 static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track,
2414  void *logctx)
2415 {
2416  AVSphericalMapping *spherical;
2417  const MatroskaTrackVideoProjection *mkv_projection = &track->video.projection;
2418  const uint8_t *priv_data = mkv_projection->private.data;
2419  enum AVSphericalProjection projection;
2420  size_t spherical_size;
2421  uint32_t l = 0, t = 0, r = 0, b = 0;
2422  uint32_t padding = 0;
2423 
2424  if (mkv_projection->private.size && priv_data[0] != 0) {
2425  av_log(logctx, AV_LOG_WARNING, "Unknown spherical metadata\n");
2426  return 0;
2427  }
2428 
2429  switch (track->video.projection.type) {
2431  return mkv_create_display_matrix(st, mkv_projection, logctx);
2433  if (track->video.projection.private.size == 20) {
2434  t = AV_RB32(priv_data + 4);
2435  b = AV_RB32(priv_data + 8);
2436  l = AV_RB32(priv_data + 12);
2437  r = AV_RB32(priv_data + 16);
2438 
2439  if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
2440  av_log(logctx, AV_LOG_ERROR,
2441  "Invalid bounding rectangle coordinates "
2442  "%"PRIu32",%"PRIu32",%"PRIu32",%"PRIu32"\n",
2443  l, t, r, b);
2444  return AVERROR_INVALIDDATA;
2445  }
2446  } else if (track->video.projection.private.size != 0) {
2447  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2448  return AVERROR_INVALIDDATA;
2449  }
2450 
2451  if (l || t || r || b)
2452  projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
2453  else
2454  projection = AV_SPHERICAL_EQUIRECTANGULAR;
2455  break;
2457  if (track->video.projection.private.size < 4) {
2458  av_log(logctx, AV_LOG_ERROR, "Missing projection private properties\n");
2459  return AVERROR_INVALIDDATA;
2460  } else if (track->video.projection.private.size == 12) {
2461  uint32_t layout = AV_RB32(priv_data + 4);
2462  if (layout) {
2463  av_log(logctx, AV_LOG_WARNING,
2464  "Unknown spherical cubemap layout %"PRIu32"\n", layout);
2465  return 0;
2466  }
2467  projection = AV_SPHERICAL_CUBEMAP;
2468  padding = AV_RB32(priv_data + 8);
2469  } else {
2470  av_log(logctx, AV_LOG_ERROR, "Unknown spherical metadata\n");
2471  return AVERROR_INVALIDDATA;
2472  }
2473  break;
2474  default:
2475  av_log(logctx, AV_LOG_WARNING,
2476  "Unknown spherical metadata type %"PRIu64"\n",
2477  track->video.projection.type);
2478  return 0;
2479  }
2480 
2481  spherical = av_spherical_alloc(&spherical_size);
2482  if (!spherical)
2483  return AVERROR(ENOMEM);
2484 
2485  spherical->projection = projection;
2486 
2487  spherical->yaw = (int32_t) (track->video.projection.yaw * (1 << 16));
2488  spherical->pitch = (int32_t) (track->video.projection.pitch * (1 << 16));
2489  spherical->roll = (int32_t) (track->video.projection.roll * (1 << 16));
2490 
2491  spherical->padding = padding;
2492 
2493  spherical->bound_left = l;
2494  spherical->bound_top = t;
2495  spherical->bound_right = r;
2496  spherical->bound_bottom = b;
2497 
2499  AV_PKT_DATA_SPHERICAL, spherical, spherical_size, 0)) {
2500  av_freep(&spherical);
2501  return AVERROR(ENOMEM);
2502  }
2503 
2504  return 0;
2505 }
2506 
2508  EbmlBin *bin)
2509 {
2510  return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size);
2511 }
2512 
2513 static int mkv_parse_hvce(AVFormatContext *s, AVStream *st, EbmlBin *bin)
2514 {
2515  AVPacketSideData *sd;
2516 
2517  if (bin->size < 23) {
2518  av_log(s, AV_LOG_ERROR, "Invalid hvcE size %d\n", bin->size);
2519  return AVERROR_INVALIDDATA;
2520  }
2521 
2525  bin->size, 0);
2526  if (!sd)
2527  return AVERROR(ENOMEM);
2528 
2529  memcpy(sd->data, bin->data, bin->size);
2530  return 0;
2531 }
2532 
2534 {
2535  const EbmlList *mappings_list = &track->block_addition_mappings;
2536  MatroskaBlockAdditionMapping *mappings = mappings_list->elem;
2537  int ret;
2538 
2539  for (int i = 0; i < mappings_list->nb_elem; i++) {
2540  MatroskaBlockAdditionMapping *mapping = &mappings[i];
2541  uint64_t type = mapping->type;
2542 
2543  switch (mapping->type) {
2546  "Explicit block Addition Mapping type \"Use BlockAddIDValue\", value %"PRIu64","
2547  " name \"%s\" found.\n", mapping->value, mapping->name ? mapping->name : "");
2552  if (mapping->value != type) {
2553  int strict = s->strict_std_compliance >= FF_COMPLIANCE_STRICT;
2554  av_log(s, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
2555  "Invalid Block Addition Value 0x%"PRIx64" for Block Addition Mapping Type "
2556  "0x%"PRIx64", name \"%s\"\n", mapping->value, mapping->type,
2557  mapping->name ? mapping->name : "");
2558  if (strict)
2559  return AVERROR_INVALIDDATA;
2560  }
2561  break;
2564  if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0)
2565  return ret;
2566 
2567  break;
2569  if ((ret = mkv_parse_hvce(s, st, &mapping->extradata)) < 0)
2570  return ret;
2571 
2572  break;
2573  default:
2575  "Unknown Block Addition Mapping type 0x%"PRIx64", value %"PRIu64", name \"%s\"\n",
2576  mapping->type, mapping->value, mapping->name ? mapping->name : "");
2577  if (mapping->value < 2) {
2578  int strict = s->strict_std_compliance >= FF_COMPLIANCE_STRICT;
2579  av_log(s, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
2580  "Invalid Block Addition value 0x%"PRIu64" for unknown Block Addition Mapping "
2581  "type %"PRIx64", name \"%s\"\n", mapping->value, mapping->type,
2582  mapping->name ? mapping->name : "");
2583  if (strict)
2584  return AVERROR_INVALIDDATA;
2585  }
2586  break;
2587  }
2588  }
2589 
2590  return 0;
2591 }
2592 
2593 static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id)
2594 {
2595  const AVCodecTag *codec_tags;
2596 
2597  codec_tags = track->type == MATROSKA_TRACK_TYPE_VIDEO ?
2599 
2600  /* Normalize noncompliant private data that starts with the fourcc
2601  * by expanding/shifting the data by 4 bytes and storing the data
2602  * size at the start. */
2603  if (ff_codec_get_id(codec_tags, AV_RL32(track->codec_priv.data))) {
2604  int ret = av_buffer_realloc(&track->codec_priv.buf,
2606  if (ret < 0)
2607  return ret;
2608 
2609  track->codec_priv.data = track->codec_priv.buf->data;
2610  memmove(track->codec_priv.data + 4, track->codec_priv.data, track->codec_priv.size);
2611  track->codec_priv.size += 4;
2612  AV_WB32(track->codec_priv.data, track->codec_priv.size);
2613  }
2614 
2615  *fourcc = AV_RL32(track->codec_priv.data + 4);
2616  *codec_id = ff_codec_get_id(codec_tags, *fourcc);
2617 
2618  return 0;
2620 
2621 /* An enum with potential return values of the functions for parsing a track.
2622  * Apart from that all these functions can also indicate ordinary errors via
2623  * negative return values. */
2624 enum {
2625  SKIP_TRACK = 1,
2626 };
2627 
2628 #define AAC_MAX_EXTRADATA_SIZE 5
2629 #define TTA_EXTRADATA_SIZE 22
2630 #define WAVPACK_EXTRADATA_SIZE 2
2631 /* Performs the codec-specific part of parsing an audio track. */
2632 static int mka_parse_audio_codec(MatroskaTrack *track, AVCodecParameters *par,
2633  const MatroskaDemuxContext *matroska,
2634  AVFormatContext *s, int *extradata_offset)
2635 {
2636  uint8_t extradata[FFMAX3(AAC_MAX_EXTRADATA_SIZE,
2639  int extradata_size = 0; // > 0 means that the extradata buffer is used
2640  int ret;
2641 
2642  if (!strcmp(track->codec_id, "A_MS/ACM") &&
2643  track->codec_priv.size >= 14) {
2644  FFIOContext b;
2646  track->codec_priv.size);
2647  ret = ff_get_wav_header(s, &b.pub, par,
2648  track->codec_priv.size, 0);
2649  if (ret < 0)
2650  return ret;
2651  *extradata_offset = FFMIN(track->codec_priv.size, 18);
2652  return 0;
2653  } else if (!strcmp(track->codec_id, "A_QUICKTIME") &&
2654  /* Normally 36, but allow noncompliant private data */
2655  track->codec_priv.size >= 32) {
2656  enum AVCodecID codec_id;
2657  uint32_t fourcc;
2658  uint16_t sample_size;
2659 
2660  ret = get_qt_codec(track, &fourcc, &codec_id);
2661  if (ret < 0)
2662  return ret;
2663  sample_size = AV_RB16(track->codec_priv.data + 26);
2664  if (fourcc == 0) {
2665  if (sample_size == 8) {
2666  fourcc = MKTAG('r','a','w',' ');
2668  } else if (sample_size == 16) {
2669  fourcc = MKTAG('t','w','o','s');
2671  }
2672  }
2673  if ((fourcc == MKTAG('t','w','o','s') ||
2674  fourcc == MKTAG('s','o','w','t')) && sample_size == 8)
2676  par->codec_id = codec_id;
2677  par->codec_tag = fourcc;
2678  return 0;
2679  }
2680 
2681  switch (par->codec_id) {
2682  case AV_CODEC_ID_PCM_S16BE:
2683  switch (track->audio.bitdepth) {
2684  case 8:
2686  break;
2687  case 24:
2689  break;
2690  case 32:
2692  break;
2693  }
2694  break;
2695  case AV_CODEC_ID_PCM_S16LE:
2696  switch (track->audio.bitdepth) {
2697  case 8:
2699  break;
2700  case 24:
2702  break;
2703  case 32:
2705  break;
2706  }
2707  break;
2708  case AV_CODEC_ID_PCM_F32LE:
2709  if (track->audio.bitdepth == 64)
2711  break;
2712  case AV_CODEC_ID_AAC:
2713  if (!track->codec_priv.size) {
2714  int profile = matroska_aac_profile(track->codec_id);
2715  int sri = matroska_aac_sri(track->audio.samplerate);
2716 
2717  extradata[0] = (profile << 3) | ((sri & 0x0E) >> 1);
2718  extradata[1] = ((sri & 0x01) << 7) | (track->audio.channels << 3);
2719  if (strstr(track->codec_id, "SBR")) {
2720  sri = matroska_aac_sri(track->audio.out_samplerate);
2721  extradata[2] = 0x56;
2722  extradata[3] = 0xE5;
2723  extradata[4] = 0x80 | (sri << 3);
2724  extradata_size = 5;
2725  } else
2726  extradata_size = 2;
2727  }
2728  break;
2729  case AV_CODEC_ID_ALAC:
2730  if (track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - AV_INPUT_BUFFER_PADDING_SIZE) {
2731  /* Only ALAC's magic cookie is stored in Matroska's track headers.
2732  * Create the "atom size", "tag", and "tag version" fields the
2733  * decoder expects manually. */
2734  ret = ff_alloc_extradata(par, 12 + track->codec_priv.size);
2735  if (ret < 0)
2736  return ret;
2737  AV_WB32(par->extradata, par->extradata_size);
2738  AV_WB32(&par->extradata[4], MKBETAG('a', 'l', 'a', 'c'));
2739  AV_WB32(&par->extradata[8], 0);
2740  memcpy(&par->extradata[12], track->codec_priv.data,
2741  track->codec_priv.size);
2742  }
2743  break;
2744  case AV_CODEC_ID_TTA:
2745  {
2746  uint8_t *ptr;
2747  if (track->audio.channels > UINT16_MAX ||
2748  track->audio.bitdepth > UINT16_MAX) {
2749  av_log(matroska->ctx, AV_LOG_WARNING,
2750  "Too large audio channel number %"PRIu64
2751  " or bitdepth %"PRIu64". Skipping track.\n",
2752  track->audio.channels, track->audio.bitdepth);
2753  if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
2754  return AVERROR_INVALIDDATA;
2755  else
2756  return SKIP_TRACK;
2757  }
2758  if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
2759  return AVERROR_INVALIDDATA;
2760  extradata_size = TTA_EXTRADATA_SIZE;
2761  ptr = extradata;
2762  bytestream_put_be32(&ptr, AV_RB32("TTA1"));
2763  bytestream_put_le16(&ptr, 1);
2764  bytestream_put_le16(&ptr, track->audio.channels);
2765  bytestream_put_le16(&ptr, track->audio.bitdepth);
2766  bytestream_put_le32(&ptr, track->audio.out_samplerate);
2767  bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
2768  track->audio.out_samplerate,
2769  AV_TIME_BASE * 1000));
2770  break;
2771  }
2772  case AV_CODEC_ID_RA_144:
2773  track->audio.out_samplerate = 8000;
2774  track->audio.channels = 1;
2775  break;
2776  case AV_CODEC_ID_RA_288:
2777  case AV_CODEC_ID_COOK:
2778  case AV_CODEC_ID_ATRAC3:
2779  case AV_CODEC_ID_SIPR:
2780  {
2781  const uint8_t *ptr = track->codec_priv.data;
2782  int flavor;
2783 
2784  if (!track->codec_priv.size)
2785  break;
2786 
2787  if (track->codec_priv.size < 46)
2788  return AVERROR_INVALIDDATA;
2789  ptr += 22;
2790  flavor = bytestream_get_be16(&ptr);
2791  track->audio.coded_framesize = bytestream_get_be32(&ptr);
2792  ptr += 12;
2793  track->audio.sub_packet_h = bytestream_get_be16(&ptr);
2794  track->audio.frame_size = bytestream_get_be16(&ptr);
2795  track->audio.sub_packet_size = bytestream_get_be16(&ptr);
2796  if (track->audio.coded_framesize <= 0 ||
2797  track->audio.sub_packet_h <= 0 ||
2798  track->audio.frame_size <= 0)
2799  return AVERROR_INVALIDDATA;
2800 
2801  if (par->codec_id == AV_CODEC_ID_RA_288) {
2802  if (track->audio.sub_packet_h & 1 || 2 * track->audio.frame_size
2803  != (int64_t)track->audio.sub_packet_h * track->audio.coded_framesize)
2804  return AVERROR_INVALIDDATA;
2805  par->block_align = track->audio.coded_framesize;
2806  track->codec_priv.size = 0;
2807  } else {
2808  if (par->codec_id == AV_CODEC_ID_SIPR) {
2809  static const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
2810  if (flavor > 3)
2811  return AVERROR_INVALIDDATA;
2812  track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
2813  par->bit_rate = sipr_bit_rate[flavor];
2814  } else if (track->audio.sub_packet_size <= 0 ||
2815  track->audio.frame_size % track->audio.sub_packet_size)
2816  return AVERROR_INVALIDDATA;
2817  par->block_align = track->audio.sub_packet_size;
2818  *extradata_offset = 78;
2819  }
2820  if (par->block_align <= 0 ||
2821  track->audio.sub_packet_h * (unsigned)track->audio.frame_size > INT_MAX ||
2822  track->audio.frame_size * track->audio.sub_packet_h < par->block_align)
2823  return AVERROR_INVALIDDATA;
2824  track->audio.buf = av_malloc_array(track->audio.sub_packet_h,
2825  track->audio.frame_size);
2826  if (!track->audio.buf)
2827  return AVERROR(ENOMEM);
2828  break;
2829  }
2830  case AV_CODEC_ID_ATRAC1:
2831  /* ATRAC1 uses a constant frame size.
2832  * Typical ATRAC1 streams are either mono or stereo.
2833  * At most, ATRAC1 was used to store 8 channels of audio. */
2834  if (track->audio.channels > 8)
2835  return AVERROR_INVALIDDATA;
2836  par->block_align = track->audio.channels * 212;
2837  break;
2838  case AV_CODEC_ID_FLAC:
2839  if (track->codec_priv.size) {
2840  ret = matroska_parse_flac(s, track, extradata_offset);
2841  if (ret < 0)
2842  return ret;
2843  }
2844  break;
2845  case AV_CODEC_ID_WAVPACK:
2846  if (track->codec_priv.size < 2) {
2847  av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
2848  "in absence of valid CodecPrivate.\n");
2849  extradata_size = WAVPACK_EXTRADATA_SIZE;
2850  AV_WL16(extradata, 0x410);
2851  }
2852  break;
2853  }
2854 
2855  if (extradata_size > 0) {
2856  ret = ff_alloc_extradata(par, extradata_size);
2857  if (ret < 0)
2858  return ret;
2859  memcpy(par->extradata, extradata, extradata_size);
2860  }
2861 
2862  return 0;
2863 }
2864 
2865 /* Performs the generic part of parsing an audio track. */
2866 static int mka_parse_audio(MatroskaTrack *track, AVStream *st,
2867  AVCodecParameters *par,
2868  const MatroskaDemuxContext *matroska,
2869  AVFormatContext *s, int *extradata_offset)
2870 {
2871  FFStream *const sti = ffstream(st);
2872  int ret;
2873 
2874  ret = mka_parse_audio_codec(track, par, matroska,
2875  s, extradata_offset);
2876  if (ret)
2877  return ret;
2878 
2880  par->sample_rate = track->audio.out_samplerate;
2881  // channel layout may be already set by codec private checks above
2882  if (!av_channel_layout_check(&par->ch_layout)) {
2883  if (track->audio.channels > INT32_MAX)
2884  return AVERROR_PATCHWELCOME;
2886  par->ch_layout.nb_channels = track->audio.channels;
2887  }
2888  if (!par->bits_per_coded_sample)
2889  par->bits_per_coded_sample = track->audio.bitdepth;
2890  if (par->codec_id == AV_CODEC_ID_MP3 ||
2891  par->codec_id == AV_CODEC_ID_MLP ||
2892  par->codec_id == AV_CODEC_ID_TRUEHD)
2894  else if (par->codec_id != AV_CODEC_ID_AAC)
2896  if (track->codec_delay > 0) {
2898  (AVRational){1, 1000000000},
2899  (AVRational){1, par->codec_id == AV_CODEC_ID_OPUS ?
2900  48000 : par->sample_rate});
2901  sti->skip_samples = par->initial_padding;
2902  }
2903  if (track->seek_preroll > 0) {
2904  par->seek_preroll = av_rescale_q(track->seek_preroll,
2905  (AVRational){1, 1000000000},
2906  (AVRational){1, par->sample_rate});
2907  }
2908 
2909  return 0;
2910 }
2911 
2912 /* Performs the codec-specific part of parsing a video track. */
2913 static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par,
2914  const MatroskaDemuxContext *matroska,
2915  int *extradata_offset)
2916 {
2917  if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
2918  track->codec_priv.size >= 40) {
2919  uint32_t size = AV_RL32A(track->codec_priv.data);
2920  // VFW extradata is padded to an even length, yet
2921  // the size field contains the real length.
2922  if (size & 1 && size == track->codec_priv.size - 1)
2923  --track->codec_priv.size;
2924  track->ms_compat = 1;
2925  par->bits_per_coded_sample = AV_RL16(track->codec_priv.data + 14);
2926  par->codec_tag = AV_RL32(track->codec_priv.data + 16);
2928  par->codec_tag);
2929  if (!par->codec_id)
2931  par->codec_tag);
2932  *extradata_offset = 40;
2933  return 0;
2934  } else if (!strcmp(track->codec_id, "V_QUICKTIME") &&
2935  track->codec_priv.size >= 21) {
2936  enum AVCodecID codec_id;
2937  uint32_t fourcc;
2938  int ret = get_qt_codec(track, &fourcc, &codec_id);
2939  if (ret < 0)
2940  return ret;
2941  if (codec_id == AV_CODEC_ID_NONE && AV_RL32(track->codec_priv.data+4) == AV_RL32("SMI ")) {
2942  fourcc = MKTAG('S','V','Q','3');
2944  }
2945  par->codec_id = codec_id;
2946  if (codec_id == AV_CODEC_ID_NONE)
2947  av_log(matroska->ctx, AV_LOG_ERROR,
2948  "mov FourCC not found %s.\n", av_fourcc2str(fourcc));
2949  if (track->codec_priv.size >= 86) {
2950  FFIOContext b;
2951  unsigned bit_depth = AV_RB16(track->codec_priv.data + 82);
2953  track->codec_priv.size);
2954  if (ff_get_qtpalette(codec_id, &b.pub, track->palette)) {
2955  bit_depth &= 0x1F;
2956  track->has_palette = 1;
2957  }
2959  }
2960  par->codec_tag = fourcc;
2961  return 0;
2962  }
2963 
2964  switch (par->codec_id) {
2965  case AV_CODEC_ID_RV10:
2966  case AV_CODEC_ID_RV20:
2967  case AV_CODEC_ID_RV30:
2968  case AV_CODEC_ID_RV40:
2969  *extradata_offset = 26;
2970  break;
2971  case AV_CODEC_ID_PRORES:
2972  if (track->codec_priv.size == 4)
2973  par->codec_tag = AV_RL32(track->codec_priv.data);
2974  break;
2975  case AV_CODEC_ID_VP9:
2976  /* we don't need any value stored in CodecPrivate.
2977  * make sure that it's not exported as extradata. */
2978  track->codec_priv.size = 0;
2979  break;
2980  }
2981 
2982  return 0;
2983 }
2984 
2985 /* Performs the generic part of parsing a video track. */
2986 static int mkv_parse_video(MatroskaTrack *track, AVStream *st,
2987  AVCodecParameters *par,
2988  const MatroskaDemuxContext *matroska,
2989  int *extradata_offset)
2990 {
2991  FFStream *const sti = ffstream(st);
2993  int display_width_mul = 1;
2994  int display_height_mul = 1;
2995  int ret;
2996 
2997  if (track->video.color_space.size == 4)
2998  par->codec_tag = AV_RL32(track->video.color_space.data);
2999 
3000  ret = mkv_parse_video_codec(track, par, matroska,
3001  extradata_offset);
3002  if (ret < 0)
3003  return ret;
3004 
3006  par->width = track->video.pixel_width;
3007  par->height = track->video.pixel_height;
3008 
3010  par->field_order = mkv_field_order(matroska, track->video.field_order);
3013 
3016  &display_width_mul, &display_height_mul);
3017 
3019  if (track->video.display_width && track->video.display_height &&
3020  track->video.display_width != -1 && track->video.display_height != -1 &&
3021  track->video.cropped_height < INT64_MAX / track->video.display_width / display_width_mul &&
3022  track->video.cropped_width < INT64_MAX / track->video.display_height / display_height_mul)
3024  &st->sample_aspect_ratio.den,
3025  track->video.cropped_height * track->video.display_width * display_width_mul,
3026  track->video.cropped_width * track->video.display_height * display_height_mul,
3027  INT_MAX);
3028  }
3029  if (track->video.cropped_width != track->video.pixel_width ||
3030  track->video.cropped_height != track->video.pixel_height) {
3031  uint8_t *cropping;
3035  sizeof(uint32_t) * 4, 0);
3036  if (!sd)
3037  return AVERROR(ENOMEM);
3038 
3039  cropping = sd->data;
3040  bytestream_put_le32(&cropping, track->video.pixel_cropt);
3041  bytestream_put_le32(&cropping, track->video.pixel_cropb);
3042  bytestream_put_le32(&cropping, track->video.pixel_cropl);
3043  bytestream_put_le32(&cropping, track->video.pixel_cropr);
3044  }
3045  if (par->codec_id != AV_CODEC_ID_HEVC)
3047 
3048  if (track->default_duration) {
3049  int div = track->default_duration <= INT64_MAX ? 1 : 2;
3051  1000000000 / div, track->default_duration / div, 30000);
3052 #if FF_API_R_FRAME_RATE
3053  if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL
3054  && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL)
3055  st->r_frame_rate = st->avg_frame_rate;
3056 #endif
3057  }
3058 
3059  /* export stereo mode flag as metadata tag */
3061  av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
3062 
3063  /* export alpha mode flag as metadata tag */
3064  if (track->video.alpha_mode)
3065  av_dict_set_int(&st->metadata, "alpha_mode", 1, 0);
3066 
3067  /* if we have virtual track, mark the real tracks */
3069  for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) {
3070  MatroskaTrack *tracks = matroska->tracks.elem;
3071  char buf[32];
3073  continue;
3074  snprintf(buf, sizeof(buf), "%s_%d",
3076  for (int k = 0; k < matroska->tracks.nb_elem; k++)
3077  if (planes[j].uid == tracks[k].uid && tracks[k].stream) {
3078  av_dict_set(&tracks[k].stream->metadata,
3079  "stereo_mode", buf, 0);
3080  break;
3081  }
3082  }
3083  // add stream level stereo3d side data if it is a supported format
3087  ret = mkv_stereo3d_conv(st, track->video.stereo_mode);
3088  if (ret < 0)
3089  return ret;
3090  }
3091 
3092  ret = mkv_parse_video_color(st, track);
3093  if (ret < 0)
3094  return ret;
3095  ret = mkv_parse_video_projection(st, track, matroska->ctx);
3096  if (ret < 0)
3097  return ret;
3098 
3099  return 0;
3100 }
3101 
3102 /* Performs the codec-specific part of parsing a subtitle track. */
3103 static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVStream *st,
3104  AVCodecParameters *par,
3105  const MatroskaDemuxContext *matroska)
3106 {
3107  switch (par->codec_id) {
3109  if (track->codec_priv.size == 3) {
3110  int component_tag = track->codec_priv.data[0];
3111  int data_component_id = AV_RB16(track->codec_priv.data + 1);
3112 
3113  switch (data_component_id) {
3114  case 0x0008:
3115  // [0x30..0x37] are component tags utilized for
3116  // non-mobile captioning service ("profile A").
3117  if (component_tag >= 0x30 && component_tag <= 0x37) {
3119  }
3120  break;
3121  case 0x0012:
3122  // component tag 0x87 signifies a mobile/partial reception
3123  // (1seg) captioning service ("profile C").
3124  if (component_tag == 0x87) {
3126  }
3127  break;
3128  default:
3129  break;
3130  }
3131 
3132  if (par->profile == AV_PROFILE_UNKNOWN)
3133  av_log(matroska->ctx, AV_LOG_WARNING,
3134  "Unknown ARIB caption profile utilized: %02x / %04x\n",
3135  component_tag, data_component_id);
3136 
3137  track->codec_priv.size = 0;
3138  }
3139  break;
3140  case AV_CODEC_ID_WEBVTT:
3141  if (!strcmp(track->codec_id, "D_WEBVTT/CAPTIONS")) {
3143  } else if (!strcmp(track->codec_id, "D_WEBVTT/DESCRIPTIONS")) {
3145  } else if (!strcmp(track->codec_id, "D_WEBVTT/METADATA")) {
3147  }
3148  break;
3149  }
3150 
3151  return 0;
3152 }
3153 
3155 {
3156  MatroskaDemuxContext *matroska = s->priv_data;
3157  MatroskaTrack *tracks = matroska->tracks.elem;
3158  int i, j, ret;
3159 
3160  for (i = 0; i < matroska->tracks.nb_elem; i++) {
3161  MatroskaTrack *track = &tracks[i];
3163  AVCodecParameters *par;
3165  int extradata_offset = 0;
3166  AVStream *st;
3167  char* key_id_base64 = NULL;
3168 
3169  /* Apply some sanity checks. */
3170  if (track->type != MATROSKA_TRACK_TYPE_VIDEO &&
3171  track->type != MATROSKA_TRACK_TYPE_AUDIO &&
3172  track->type != MATROSKA_TRACK_TYPE_SUBTITLE &&
3173  track->type != MATROSKA_TRACK_TYPE_METADATA) {
3174  av_log(matroska->ctx, AV_LOG_INFO,
3175  "Unknown or unsupported track type %"PRIu64"\n",
3176  track->type);
3177  continue;
3178  }
3179  if (!track->codec_id)
3180  continue;
3181 
3182  if ( track->type == MATROSKA_TRACK_TYPE_AUDIO && track->codec_id[0] != 'A'
3183  || track->type == MATROSKA_TRACK_TYPE_VIDEO && track->codec_id[0] != 'V'
3184  || track->type == MATROSKA_TRACK_TYPE_SUBTITLE && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
3185  || track->type == MATROSKA_TRACK_TYPE_METADATA && track->codec_id[0] != 'D' && track->codec_id[0] != 'S'
3186  ) {
3187  av_log(matroska->ctx, AV_LOG_INFO, "Inconsistent track type\n");
3188  continue;
3189  }
3190 
3191  if (track->audio.samplerate < 0 || track->audio.samplerate > INT_MAX ||
3192  isnan(track->audio.samplerate)) {
3193  av_log(matroska->ctx, AV_LOG_WARNING,
3194  "Invalid sample rate %f, defaulting to 8000 instead.\n",
3195  track->audio.samplerate);
3196  track->audio.samplerate = 8000;
3197  }
3198 
3199  if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
3200  if (!track->default_duration && track->video.frame_rate > 0) {
3201  double default_duration = 1000000000 / track->video.frame_rate;
3202  if (default_duration > UINT64_MAX || default_duration < 0) {
3203  av_log(matroska->ctx, AV_LOG_WARNING,
3204  "Invalid frame rate %e. Cannot calculate default duration.\n",
3205  track->video.frame_rate);
3206  } else {
3207  track->default_duration = default_duration;
3208  }
3209  }
3210  int has_dimensions = track->video.pixel_width || track->video.pixel_height;
3211  if ((matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT &&
3212  (!track->video.pixel_width || !track->video.pixel_height)) ||
3213  (track->video.pixel_cropl >= INT_MAX - track->video.pixel_cropr ||
3214  track->video.pixel_cropt >= INT_MAX - track->video.pixel_cropb ||
3215  (track->video.pixel_cropl + track->video.pixel_cropr) >= track->video.pixel_width + !has_dimensions ||
3216  (track->video.pixel_cropt + track->video.pixel_cropb) >= track->video.pixel_height + !has_dimensions)) {
3217  av_log(matroska->ctx, AV_LOG_ERROR,
3218  "Invalid coded dimensions %"PRId64"x%"PRId64" [%"PRId64", %"PRId64", %"PRId64", %"PRId64"].\n",
3219  track->video.pixel_width, track->video.pixel_height,
3220  track->video.pixel_cropl, track->video.pixel_cropr,
3221  track->video.pixel_cropt, track->video.pixel_cropb);
3222  return AVERROR_INVALIDDATA;
3223  }
3224  track->video.cropped_width = track->video.pixel_width -
3225  track->video.pixel_cropl - track->video.pixel_cropr;
3226  track->video.cropped_height = track->video.pixel_height -
3227  track->video.pixel_cropt - track->video.pixel_cropb;
3229  if (track->video.display_width == -1)
3230  track->video.display_width = track->video.cropped_width;
3231  if (track->video.display_height == -1)
3232  track->video.display_height = track->video.cropped_height;
3233  }
3234  } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
3235  if (!track->audio.out_samplerate)
3236  track->audio.out_samplerate = track->audio.samplerate;
3237  }
3239  track->encodings.nb_elem,
3240  track, &key_id_base64, matroska->ctx);
3241  if (ret < 0)
3242  return ret;
3243 
3244  for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
3245  if (av_strstart(track->codec_id, ff_mkv_codec_tags[j].str, NULL)) {
3247  break;
3248  }
3249  }
3250 
3251  st = track->stream = avformat_new_stream(s, NULL);
3252  if (!st) {
3253  av_free(key_id_base64);
3254  return AVERROR(ENOMEM);
3255  }
3256  par = st->codecpar;
3257 
3258  par->codec_id = codec_id;
3259 
3260  if (track->flag_default)
3262  if (track->flag_forced)
3264  if (track->flag_comment)
3266  if (track->flag_hearingimpaired)
3268  if (track->flag_visualimpaired)
3270  if (track->flag_original.count > 0)
3273 
3274  if (key_id_base64) {
3275  /* export encryption key id as base64 metadata tag */
3276  av_dict_set(&st->metadata, "enc_key_id", key_id_base64,
3278  }
3279 
3280  if (strcmp(track->language, "und"))
3281  av_dict_set(&st->metadata, "language", track->language, 0);
3282  av_dict_set(&st->metadata, "title", track->name, 0);
3283 
3284  if (track->time_scale < 0.01) {
3285  av_log(matroska->ctx, AV_LOG_WARNING,
3286  "Track TimestampScale too small %f, assuming 1.0.\n",
3287  track->time_scale);
3288  track->time_scale = 1.0;
3289  }
3290 
3291  if (matroska->time_scale * track->time_scale > UINT_MAX)
3292  return AVERROR_INVALIDDATA;
3293 
3294  avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale,
3295  1000 * 1000 * 1000); /* 64 bit pts in ns */
3296 
3297  /* convert the delay from ns to the track timebase */
3299  (AVRational){ 1, 1000000000 },
3300  st->time_base);
3301 
3302  type = track->type;
3303  if (par->codec_id == AV_CODEC_ID_WEBVTT)
3305  switch (type) {
3307  ret = mka_parse_audio(track, st, par, matroska,
3308  s, &extradata_offset);
3309  if (ret < 0)
3310  return ret;
3311  if (ret == SKIP_TRACK)
3312  continue;
3313  break;
3315  ret = mkv_parse_video(track, st, par, matroska, &extradata_offset);
3316  if (ret < 0)
3317  return ret;
3318  break;
3320  ret = mkv_parse_subtitle_codec(track, st, par, matroska);
3321  if (ret < 0)
3322  return ret;
3324 
3325  if (track->flag_textdescriptions)
3327  break;
3328  }
3329 
3330  if (par->codec_id == AV_CODEC_ID_NONE)
3331  av_log(matroska->ctx, AV_LOG_INFO,
3332  "Unknown/unsupported AVCodecID %s.\n", track->codec_id);
3333 
3334  if (!par->extradata && track->codec_priv.size > extradata_offset) {
3335  const uint8_t *src = track->codec_priv.data + extradata_offset;
3336  unsigned extra_size = track->codec_priv.size - extradata_offset;
3337  ret = ff_alloc_extradata(par, extra_size);
3338  if (ret < 0)
3339  return ret;
3340  memcpy(par->extradata, src, extra_size);
3341  }
3342 
3343  ret = mkv_parse_block_addition_mappings(s, st, track);
3344  if (ret < 0)
3345  return ret;
3346  }
3347 
3348  return 0;
3349 }
3350 
3352 {
3353  AVStream *bl_st = NULL, *el_st = NULL;
3354  AVStreamGroup *stg;
3355  int err;
3356 
3357  /* Matroska has no explicit cross-track Dolby Vision reference, so the
3358  * pairing is recovered from the dvcC/dvvC config records. Find a single
3359  * HEVC track whose record declares a profile 7 enhancement layer
3360  * (el_present_flag=1) and a single sibling HEVC BL candidate. If either
3361  * side is ambiguous, leave the streams ungrouped. */
3362  if (s->nb_streams <= 1)
3363  return 0;
3364 
3365  for (int i = 0; i < s->nb_streams; i++) {
3366  AVStream *st = s->streams[i];
3367  const AVPacketSideData *sd;
3369 
3370  if (st->codecpar->codec_id != AV_CODEC_ID_HEVC)
3371  continue;
3372 
3376  if (sd) {
3377  dovi = (const AVDOVIDecoderConfigurationRecord *)sd->data;
3378  if (dovi->dv_profile == 7 && dovi->el_present_flag) {
3379  /* bl_present_flag is not checked, because the files in the
3380  * wild set it to 1 for EL stream, while the expectation, based
3381  * on Dolby spec for MPEG-TS would be that it's set to 0.
3382  * Ignore this, if we have EL track and single other video track
3383  * it's safe to assume it's BL. */
3384  if (el_st)
3385  return 0;
3386  el_st = st;
3387  continue;
3388  }
3389  }
3390 
3391  if (bl_st)
3392  return 0;
3393  bl_st = st;
3394  }
3395 
3396  if (!el_st || !bl_st)
3397  return 0;
3398 
3400  if (!stg)
3401  return AVERROR(ENOMEM);
3402 
3403  stg->id = el_st->id;
3404 
3405  err = avformat_stream_group_add_stream(stg, bl_st);
3406  if (err < 0)
3407  return err;
3408 
3409  err = avformat_stream_group_add_stream(stg, el_st);
3410  if (err < 0)
3411  return err;
3412 
3413  stg->params.layered_video->el_index = stg->nb_streams - 1;
3415  stg->params.layered_video->height = bl_st->codecpar->height;
3416 
3417  return 0;
3418 }
3419 
3421 {
3422  FFFormatContext *const si = ffformatcontext(s);
3423  MatroskaDemuxContext *matroska = s->priv_data;
3424  EbmlList *attachments_list = &matroska->attachments;
3425  EbmlList *chapters_list = &matroska->chapters;
3426  MatroskaAttachment *attachments;
3427  MatroskaChapter *chapters;
3428  uint64_t max_start = 0;
3429  int64_t pos;
3430  Ebml ebml = { 0 };
3431  int i, j, res;
3432 
3433  matroska->ctx = s;
3434  matroska->cues_parsing_deferred = 1;
3435 
3436  /* First read the EBML header. */
3437  if (ebml_parse(matroska, ebml_syntax, &ebml) || !ebml.doctype) {
3438  av_log(matroska->ctx, AV_LOG_ERROR, "EBML header parsing failed\n");
3439  ebml_free(ebml_syntax, &ebml);
3440  return AVERROR_INVALIDDATA;
3441  }
3442  if (ebml.version > EBML_VERSION ||
3443  ebml.max_size > sizeof(uint64_t) ||
3444  ebml.id_length > sizeof(uint32_t) ||
3445  ebml.doctype_version > 3) {
3447  "EBML version %"PRIu64", doctype %s, doc version %"PRIu64,
3448  ebml.version, ebml.doctype, ebml.doctype_version);
3449  ebml_free(ebml_syntax, &ebml);
3450  return AVERROR_PATCHWELCOME;
3451  } else if (ebml.doctype_version == 3) {
3452  av_log(matroska->ctx, AV_LOG_WARNING,
3453  "EBML header using unsupported features\n"
3454  "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
3455  ebml.version, ebml.doctype, ebml.doctype_version);
3456  }
3457  for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++)
3458  if (!strcmp(ebml.doctype, matroska_doctypes[i]))
3459  break;
3461  av_log(s, AV_LOG_WARNING, "Unknown EBML doctype '%s'\n", ebml.doctype);
3462  if (matroska->ctx->error_recognition & AV_EF_EXPLODE) {
3463  ebml_free(ebml_syntax, &ebml);
3464  return AVERROR_INVALIDDATA;
3465  }
3466  }
3467  matroska->is_webm = !strcmp(ebml.doctype, "webm");
3468 
3469  ebml_free(ebml_syntax, &ebml);
3470 
3471  matroska->pkt = si->parse_pkt;
3472 
3473  /* The next thing is a segment. */
3474  pos = avio_tell(matroska->ctx->pb);
3475  res = ebml_parse(matroska, matroska_segments, matroska);
3476  // Try resyncing until we find an EBML_STOP type element.
3477  while (res != 1) {
3478  res = matroska_resync(matroska, pos);
3479  if (res < 0)
3480  return res;
3481  pos = avio_tell(matroska->ctx->pb);
3482  res = ebml_parse(matroska, matroska_segment, matroska);
3483  if (res == AVERROR(EIO)) // EOF is translated to EIO, this exists the loop on EOF
3484  return res;
3485  }
3486  /* Set data_offset as it might be needed later by seek_frame_generic. */
3487  if (matroska->current_id == MATROSKA_ID_CLUSTER)
3488  si->data_offset = avio_tell(matroska->ctx->pb) - 4;
3489  matroska_execute_seekhead(matroska);
3490 
3491  if (!matroska->time_scale)
3492  matroska->time_scale = 1000000;
3493  if (isnan(matroska->duration))
3494  matroska->duration = 0;
3495  if (matroska->duration)
3496  matroska->ctx->duration = matroska->duration * matroska->time_scale *
3497  1000 / AV_TIME_BASE;
3498  av_dict_set(&s->metadata, "title", matroska->title, 0);
3499  av_dict_set(&s->metadata, "encoder", matroska->muxingapp, 0);
3500 
3501  if (matroska->date_utc.size == 8)
3502  matroska_metadata_creation_time(&s->metadata, AV_RB64(matroska->date_utc.data));
3503 
3504  res = matroska_parse_tracks(s);
3505  if (res < 0)
3506  return res;
3507 
3508  attachments = attachments_list->elem;
3509  for (j = 0; j < attachments_list->nb_elem; j++) {
3510  if (!(attachments[j].filename && attachments[j].mime &&
3511  attachments[j].bin.data && attachments[j].bin.size > 0)) {
3512  av_log(matroska->ctx, AV_LOG_ERROR, "incomplete attachment\n");
3513  } else {
3515  if (!st)
3516  break;
3517  av_dict_set(&st->metadata, "filename", attachments[j].filename, 0);
3518  av_dict_set(&st->metadata, "mimetype", attachments[j].mime, 0);
3519  if (attachments[j].description)
3520  av_dict_set(&st->metadata, "title", attachments[j].description, 0);
3522 
3523  for (i = 0; mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3524  if (av_strstart(attachments[j].mime, mkv_image_mime_tags[i].str, NULL)) {
3526  break;
3527  }
3528  }
3529 
3530  attachments[j].stream = st;
3531 
3532  if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
3533  res = ff_add_attached_pic(s, st, NULL, &attachments[j].bin.buf, 0);
3534  if (res < 0)
3535  return res;
3536  } else {
3538  if (ff_alloc_extradata(st->codecpar, attachments[j].bin.size))
3539  break;
3540  memcpy(st->codecpar->extradata, attachments[j].bin.data,
3541  attachments[j].bin.size);
3542 
3543  for (i = 0; mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
3544  if (av_strstart(attachments[j].mime, mkv_mime_tags[i].str, NULL)) {
3546  break;
3547  }
3548  }
3549  }
3550  }
3551  }
3552 
3553  chapters = chapters_list->elem;
3554  for (i = 0; i < chapters_list->nb_elem; i++)
3555  if (chapters[i].start != AV_NOPTS_VALUE && chapters[i].uid &&
3556  (max_start == 0 || chapters[i].start > max_start)) {
3557  chapters[i].chapter =
3558  avpriv_new_chapter(s, chapters[i].uid,
3559  (AVRational) { 1, 1000000000 },
3560  chapters[i].start, chapters[i].end,
3561  chapters[i].title);
3562  max_start = chapters[i].start;
3563  }
3564 
3565  matroska_add_index_entries(matroska);
3566 
3568 
3570  if (res < 0)
3571  return res;
3572 
3573  return 0;
3575 
3576 /*
3577  * Put one packet in an application-supplied AVPacket struct.
3578  * Returns 0 on success or -1 on failure.
3579  */
3580 static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
3581  AVPacket *pkt)
3582 {
3583  if (matroska->queue.head) {
3584  MatroskaTrack *tracks = matroska->tracks.elem;
3585  MatroskaTrack *track;
3586 
3587  avpriv_packet_list_get(&matroska->queue, pkt);
3588  track = &tracks[pkt->stream_index];
3589  if (track->has_palette) {
3591  if (!pal) {
3592  av_log(matroska->ctx, AV_LOG_ERROR, "Cannot append palette to packet\n");
3593  } else {
3594  memcpy(pal, track->palette, AVPALETTE_SIZE);
3595  }
3596  track->has_palette = 0;
3597  }
3598  return 0;
3599  }
3600 
3601  return -1;
3602 }
3603 
3604 /*
3605  * Free all packets in our internal queue.
3606  */
3607 static void matroska_clear_queue(MatroskaDemuxContext *matroska)
3608 {
3609  avpriv_packet_list_free(&matroska->queue);
3610 }
3611 
3612 static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf,
3613  int size, int type, AVIOContext *pb,
3614  uint32_t lace_size[256], int *laces)
3615 {
3616  int n;
3617  uint8_t *data = *buf;
3618 
3619  if (!type) {
3620  *laces = 1;
3621  lace_size[0] = size;
3622  return 0;
3623  }
3624 
3625  if (size <= 0)
3626  return AVERROR_INVALIDDATA;
3627 
3628  *laces = *data + 1;
3629  data += 1;
3630  size -= 1;
3631 
3632  switch (type) {
3633  case 0x1: /* Xiph lacing */
3634  {
3635  uint8_t temp;
3636  uint32_t total = 0;
3637  for (n = 0; n < *laces - 1; n++) {
3638  lace_size[n] = 0;
3639 
3640  do {
3641  if (size <= total)
3642  return AVERROR_INVALIDDATA;
3643  temp = *data;
3644  total += temp;
3645  lace_size[n] += temp;
3646  data += 1;
3647  size -= 1;
3648  } while (temp == 0xff);
3649  }
3650  if (size < total)
3651  return AVERROR_INVALIDDATA;
3652 
3653  lace_size[n] = size - total;
3654  break;
3655  }
3656 
3657  case 0x2: /* fixed-size lacing */
3658  if (size % (*laces))
3659  return AVERROR_INVALIDDATA;
3660  for (n = 0; n < *laces; n++)
3661  lace_size[n] = size / *laces;
3662  break;
3663 
3664  case 0x3: /* EBML lacing */
3665  {
3666  uint64_t num;
3667  uint64_t total;
3668  int offset;
3669 
3670  avio_skip(pb, 4);
3671 
3672  n = ebml_read_num(matroska, pb, 8, &num, 1);
3673  if (n < 0)
3674  return n;
3675  if (num > INT_MAX)
3676  return AVERROR_INVALIDDATA;
3677 
3678  total = lace_size[0] = num;
3679  offset = n;
3680  for (n = 1; n < *laces - 1; n++) {
3681  int64_t snum;
3682  int r;
3683  r = matroska_ebmlnum_sint(matroska, pb, &snum);
3684  if (r < 0)
3685  return r;
3686  if (lace_size[n - 1] + snum > (uint64_t)INT_MAX)
3687  return AVERROR_INVALIDDATA;
3688 
3689  lace_size[n] = lace_size[n - 1] + snum;
3690  total += lace_size[n];
3691  offset += r;
3692  }
3693  data += offset;
3694  size -= offset;
3695  if (size < total)
3696  return AVERROR_INVALIDDATA;
3697 
3698  lace_size[*laces - 1] = size - total;
3699  break;
3700  }
3701  }
3703  *buf = data;
3704 
3705  return 0;
3706 }
3707 
3708 static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
3709  MatroskaTrack *track, AVStream *st,
3710  uint8_t *data, int size, uint64_t timecode,
3711  int64_t pos)
3712 {
3713  const int a = st->codecpar->block_align;
3714  const int sps = track->audio.sub_packet_size;
3715  const int cfs = track->audio.coded_framesize;
3716  const int h = track->audio.sub_packet_h;
3717  const int w = track->audio.frame_size;
3718  int y = track->audio.sub_packet_cnt;
3719  int x;
3720 
3721  if (!track->audio.pkt_cnt) {
3722  if (track->audio.sub_packet_cnt == 0)
3723  track->audio.buf_timecode = timecode;
3724  if (st->codecpar->codec_id == AV_CODEC_ID_RA_288) {
3725  if (size < cfs * h / 2) {
3726  av_log(matroska->ctx, AV_LOG_ERROR,
3727  "Corrupt int4 RM-style audio packet size\n");
3728  return AVERROR_INVALIDDATA;
3729  }
3730  for (x = 0; x < h / 2; x++)
3731  memcpy(track->audio.buf + x * 2 * w + y * cfs,
3732  data + x * cfs, cfs);
3733  } else if (st->codecpar->codec_id == AV_CODEC_ID_SIPR) {
3734  if (size < w) {
3735  av_log(matroska->ctx, AV_LOG_ERROR,
3736  "Corrupt sipr RM-style audio packet size\n");
3737  return AVERROR_INVALIDDATA;
3738  }
3739  memcpy(track->audio.buf + y * w, data, w);
3740  } else {
3741  if (size < w) {
3742  av_log(matroska->ctx, AV_LOG_ERROR,
3743  "Corrupt generic RM-style audio packet size\n");
3744  return AVERROR_INVALIDDATA;
3745  }
3746  for (x = 0; x < w / sps; x++)
3747  memcpy(track->audio.buf +
3748  sps * (h * x + ((h + 1) / 2) * (y & 1) + (y >> 1)),
3749  data + x * sps, sps);
3750  }
3751 
3752  if (++track->audio.sub_packet_cnt >= h) {
3753  if (st->codecpar->codec_id == AV_CODEC_ID_SIPR)
3754  ff_rm_reorder_sipr_data(track->audio.buf, h, w);
3755  track->audio.sub_packet_cnt = 0;
3756  track->audio.pkt_cnt = h * w / a;
3757  }
3758  }
3759 
3760  while (track->audio.pkt_cnt) {
3761  int ret;
3762  AVPacket *pkt = matroska->pkt;
3763 
3764  ret = av_new_packet(pkt, a);
3765  if (ret < 0) {
3766  return ret;
3767  }
3768  memcpy(pkt->data,
3769  track->audio.buf + a * (h * w / a - track->audio.pkt_cnt--),
3770  a);
3771  pkt->pts = track->audio.buf_timecode;
3773  pkt->pos = pos;
3774  pkt->stream_index = st->index;
3775  ret = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3776  if (ret < 0) {
3778  return AVERROR(ENOMEM);
3779  }
3780  }
3781 
3782  return 0;
3783 }
3784 
3785 /* reconstruct full wavpack blocks from mangled matroska ones */
3786 static int matroska_parse_wavpack(MatroskaTrack *track,
3787  uint8_t **data, int *size)
3788 {
3789  uint8_t *dst = NULL;
3790  uint8_t *src = *data;
3791  int dstlen = 0;
3792  int srclen = *size;
3793  uint32_t samples;
3794  uint16_t ver;
3795  int ret, offset = 0;
3796 
3797  if (srclen < 12)
3798  return AVERROR_INVALIDDATA;
3799 
3800  av_assert1(track->stream->codecpar->extradata_size >= 2);
3801  ver = AV_RL16(track->stream->codecpar->extradata);
3802 
3803  samples = AV_RL32(src);
3804  src += 4;
3805  srclen -= 4;
3806 
3807  while (srclen >= 8) {
3808  int multiblock;
3809  uint32_t blocksize;
3810  uint8_t *tmp;
3811 
3812  uint32_t flags = AV_RL32(src);
3813  uint32_t crc = AV_RL32(src + 4);
3814  src += 8;
3815  srclen -= 8;
3816 
3817  multiblock = (flags & 0x1800) != 0x1800;
3818  if (multiblock) {
3819  if (srclen < 4) {
3821  goto fail;
3822  }
3823  blocksize = AV_RL32(src);
3824  src += 4;
3825  srclen -= 4;
3826  } else
3827  blocksize = srclen;
3828 
3829  if (blocksize > srclen) {
3831  goto fail;
3832  }
3833 
3834  tmp = av_realloc(dst, dstlen + blocksize + 32 + AV_INPUT_BUFFER_PADDING_SIZE);
3835  if (!tmp) {
3836  ret = AVERROR(ENOMEM);
3837  goto fail;
3838  }
3839  dst = tmp;
3840  dstlen += blocksize + 32;
3841 
3842  AV_WL32(dst + offset, MKTAG('w', 'v', 'p', 'k')); // tag
3843  AV_WL32(dst + offset + 4, blocksize + 24); // blocksize - 8
3844  AV_WL16(dst + offset + 8, ver); // version
3845  AV_WL16(dst + offset + 10, 0); // track/index_no
3846  AV_WL32(dst + offset + 12, 0); // total samples
3847  AV_WL32(dst + offset + 16, 0); // block index
3848  AV_WL32(dst + offset + 20, samples); // number of samples
3849  AV_WL32(dst + offset + 24, flags); // flags
3850  AV_WL32(dst + offset + 28, crc); // crc
3851  memcpy(dst + offset + 32, src, blocksize); // block data
3852 
3853  src += blocksize;
3854  srclen -= blocksize;
3855  offset += blocksize + 32;
3856  }
3857 
3858  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3859 
3860  *data = dst;
3861  *size = dstlen;
3862 
3863  return 0;
3865 fail:
3866  av_freep(&dst);
3867  return ret;
3868 }
3869 
3870 static int matroska_parse_prores(MatroskaTrack *track,
3871  uint8_t **data, int *size)
3872 {
3873  uint8_t *dst;
3874  int dstlen = *size + 8;
3875 
3877  if (!dst)
3878  return AVERROR(ENOMEM);
3879 
3880  AV_WB32(dst, dstlen);
3881  AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f'));
3882  memcpy(dst + 8, *data, dstlen - 8);
3883  memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
3884 
3885  *data = dst;
3886  *size = dstlen;
3887 
3888  return 0;
3889 }
3890 
3891 static int matroska_parse_webvtt(MatroskaDemuxContext *matroska,
3892  MatroskaTrack *track,
3893  AVStream *st,
3894  uint8_t *data, int data_len,
3895  uint64_t timecode,
3896  uint64_t duration,
3897  int64_t pos)
3898 {
3899  AVPacket *pkt = matroska->pkt;
3900  uint8_t *id, *settings, *text, *buf;
3901  int id_len, settings_len, text_len;
3902  uint8_t *p, *q;
3903  int err;
3904 
3905  if (data_len <= 0)
3906  return AVERROR_INVALIDDATA;
3907 
3908  p = data;
3909  q = data + data_len;
3910 
3911  id = p;
3912  id_len = -1;
3913  while (p < q) {
3914  if (*p == '\r' || *p == '\n') {
3915  id_len = p - id;
3916  if (*p == '\r')
3917  p++;
3918  break;
3919  }
3920  p++;
3921  }
3922 
3923  if (p >= q || *p != '\n')
3924  return AVERROR_INVALIDDATA;
3925  p++;
3926 
3927  settings = p;
3928  settings_len = -1;
3929  while (p < q) {
3930  if (*p == '\r' || *p == '\n') {
3931  settings_len = p - settings;
3932  if (*p == '\r')
3933  p++;
3934  break;
3935  }
3936  p++;
3937  }
3938 
3939  if (p >= q || *p != '\n')
3940  return AVERROR_INVALIDDATA;
3941  p++;
3942 
3943  text = p;
3944  text_len = q - p;
3945  while (text_len > 0) {
3946  const int len = text_len - 1;
3947  const uint8_t c = p[len];
3948  if (c != '\r' && c != '\n')
3949  break;
3950  text_len = len;
3951  }
3952 
3953  err = av_new_packet(pkt, text_len);
3954  if (err < 0) {
3955  return err;
3956  }
3957 
3958  memcpy(pkt->data, text, text_len);
3959 
3960  if (id_len > 0) {
3963  id_len);
3964  if (!buf) {
3966  return AVERROR(ENOMEM);
3967  }
3968  memcpy(buf, id, id_len);
3969  }
3970 
3971  if (settings_len > 0) {
3974  settings_len);
3975  if (!buf) {
3977  return AVERROR(ENOMEM);
3978  }
3979  memcpy(buf, settings, settings_len);
3980  }
3981 
3982  // Do we need this for subtitles?
3983  // pkt->flags = AV_PKT_FLAG_KEY;
3984 
3985  pkt->stream_index = st->index;
3986  pkt->pts = timecode;
3987 
3988  // Do we need this for subtitles?
3989  // pkt->dts = timecode;
3990 
3991  pkt->duration = duration;
3992  pkt->pos = pos;
3993 
3994  err = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
3995  if (err < 0) {
3997  return AVERROR(ENOMEM);
3998  }
3999 
4000  return 0;
4001 }
4002 
4004  MatroskaTrack *track, AVPacket *pkt,
4005  const uint8_t *data, int size, uint64_t id)
4006 {
4007  const EbmlList *mappings_list = &track->block_addition_mappings;
4008  MatroskaBlockAdditionMapping *mappings = mappings_list->elem, *mapping = NULL;
4009  uint8_t *side_data;
4010  int res;
4011 
4012  if (!matroska->is_webm && track->max_block_additional_id && id > track->max_block_additional_id) {
4013  int strict = matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT;
4014  av_log(matroska->ctx, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
4015  "BlockAddID %"PRIu64" is higher than the reported MaxBlockAdditionID %"PRIu64" "
4016  "for Track with TrackNumber %"PRIu64"\n", id, track->max_block_additional_id,
4017  track->num);
4018  if (strict)
4019  return AVERROR_INVALIDDATA;
4020  }
4021 
4022  for (int i = 0; i < mappings_list->nb_elem; i++) {
4023  if (id != mappings[i].value)
4024  continue;
4025  mapping = &mappings[i];
4026  break;
4027  }
4028 
4029  if (id != 1 && !matroska->is_webm && !mapping) {
4030  av_log(matroska->ctx, AV_LOG_WARNING, "BlockAddID %"PRIu64" has no mapping. Skipping\n", id);
4031  return 0;
4032  }
4033 
4034  if (mapping && mapping->type)
4035  id = mapping->type;
4036 
4037  switch (id) {
4039  GetByteContext bc;
4040  int country_code, provider_code;
4041  int provider_oriented_code, application_identifier;
4042  size_t hdrplus_size;
4043  AVDynamicHDRPlus *hdrplus;
4044 
4045  if (size < 6)
4046  break; //ignore
4047 
4048  bytestream2_init(&bc, data, size);
4049 
4050  /* ITU-T T.35 metadata */
4051  country_code = bytestream2_get_byteu(&bc);
4052  switch (country_code) {
4054  provider_code = bytestream2_get_be16u(&bc);
4055 
4056  switch (provider_code) {
4058  provider_oriented_code = bytestream2_get_be16u(&bc);
4059  application_identifier = bytestream2_get_byteu(&bc);
4060 
4061  if (provider_oriented_code != 1 || application_identifier != 4)
4062  break; // ignore
4063 
4064  hdrplus = av_dynamic_hdr_plus_alloc(&hdrplus_size);
4065  if (!hdrplus)
4066  return AVERROR(ENOMEM);
4067 
4068  if ((res = av_dynamic_hdr_plus_from_t35(hdrplus, bc.buffer,
4069  bytestream2_get_bytes_left(&bc))) < 0 ||
4071  (uint8_t *)hdrplus, hdrplus_size)) < 0) {
4072  av_free(hdrplus);
4073  return res;
4074  }
4075 
4076  break;
4077  }
4079  AVDynamicHDRSmpte2094App5 *hdr_smpte_2094_app5;
4080  size_t hdr_smpte_2094_app5_size;
4081 
4082  provider_oriented_code = bytestream2_get_be16u(&bc);
4083  if (provider_oriented_code != 1)
4084  break; // ignore
4085 
4086  hdr_smpte_2094_app5 = av_dynamic_hdr_smpte2094_app5_alloc(&hdr_smpte_2094_app5_size);
4087  if (!hdr_smpte_2094_app5)
4088  return AVERROR(ENOMEM);
4089 
4090  if ((res = av_dynamic_hdr_smpte2094_app5_from_t35(hdr_smpte_2094_app5,
4091  bc.buffer,
4092  bytestream2_get_bytes_left(&bc))) < 0 ||
4095  (uint8_t *)hdr_smpte_2094_app5,
4096  hdr_smpte_2094_app5_size)) < 0) {
4097  av_free(hdr_smpte_2094_app5);
4098  return res;
4099  }
4100 
4101  break;
4102  }
4103  default:
4104  break;
4105  }
4106  break;
4108  bytestream2_skipu(&bc, 1); // t35_uk_country_code_second_octet
4109  if (bytestream2_get_bytes_left(&bc) < 2)
4110  return AVERROR_INVALIDDATA;
4111 
4112  provider_code = bytestream2_get_be16u(&bc);
4113 
4114  switch (provider_code) {
4116  uint8_t *data;
4117  int left = bytestream2_get_bytes_left(&bc);
4118 
4119  if (left < 2)
4120  return AVERROR_INVALIDDATA;
4122  if (!data)
4123  return AVERROR(ENOMEM);
4124 
4126 
4127  return 0;
4128  }
4129  default:
4130  break;
4131  }
4132  break;
4133  default:
4134  break;
4135  }
4136  break;
4137  }
4138  default:
4140  size + (size_t)8);
4141  if (!side_data)
4142  return AVERROR(ENOMEM);
4143 
4144  AV_WB64(side_data, id);
4145  memcpy(side_data + 8, data, size);
4146  break;
4147  }
4148 
4149  return 0;
4150 }
4151 
4152 static int matroska_parse_frame(MatroskaDemuxContext *matroska,
4153  MatroskaTrack *track, AVStream *st,
4154  AVBufferRef *buf, uint8_t *data, int pkt_size,
4155  uint64_t timecode, uint64_t lace_duration,
4156  int64_t pos, int is_keyframe,
4157  MatroskaBlockMore *blockmore, int nb_blockmore,
4158  int64_t discard_padding)
4159 {
4160  uint8_t *pkt_data = data;
4161  int res = 0;
4162  AVPacket *pkt = matroska->pkt;
4163 
4164  if (st->codecpar->codec_id == AV_CODEC_ID_WAVPACK) {
4165  res = matroska_parse_wavpack(track, &pkt_data, &pkt_size);
4166  if (res < 0) {
4167  av_log(matroska->ctx, AV_LOG_ERROR,
4168  "Error parsing a wavpack block.\n");
4169  goto fail;
4170  }
4171  if (!buf)
4172  av_freep(&data);
4173  buf = NULL;
4174  }
4175 
4176  if (st->codecpar->codec_id == AV_CODEC_ID_PRORES &&
4177  AV_RB32(pkt_data + 4) != MKBETAG('i', 'c', 'p', 'f')) {
4178  res = matroska_parse_prores(track, &pkt_data, &pkt_size);
4179  if (res < 0) {
4180  av_log(matroska->ctx, AV_LOG_ERROR,
4181  "Error parsing a prores block.\n");
4182  goto fail;
4183  }
4184  if (!buf)
4185  av_freep(&data);
4186  buf = NULL;
4187  }
4188 
4189  if (!pkt_size && !nb_blockmore)
4190  goto no_output;
4191 
4192  if (!matroska->is_webm && nb_blockmore && !track->max_block_additional_id) {
4193  int strict = matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT;
4194  av_log(matroska->ctx, strict ? AV_LOG_ERROR : AV_LOG_WARNING,
4195  "Unexpected BlockAdditions found in a Block from Track with TrackNumber %"PRIu64" "
4196  "where MaxBlockAdditionID is 0\n", track->num);
4197  if (strict) {
4198  res = AVERROR_INVALIDDATA;
4199  goto fail;
4200  }
4201  }
4202 
4203  if (!buf)
4204  pkt->buf = av_buffer_create(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE,
4205  NULL, NULL, 0);
4206  else
4207  pkt->buf = av_buffer_ref(buf);
4208 
4209  if (!pkt->buf) {
4210  res = AVERROR(ENOMEM);
4211  goto fail;
4212  }
4213 
4214  pkt->data = pkt_data;
4215  pkt->size = pkt_size;
4216  pkt->flags = is_keyframe;
4217  pkt->stream_index = st->index;
4218 
4219  for (int i = 0; i < nb_blockmore; i++) {
4220  MatroskaBlockMore *more = &blockmore[i];
4221 
4222  if (!more->additional.size)
4223  continue;
4224 
4225  res = matroska_parse_block_additional(matroska, track, pkt, more->additional.data,
4226  more->additional.size, more->additional_id);
4227  if (res < 0) {
4229  return res;
4230  }
4231  }
4232 
4233  if (discard_padding) {
4234  uint8_t *side_data = av_packet_new_side_data(pkt,
4236  10);
4237  if (!side_data) {
4239  return AVERROR(ENOMEM);
4240  }
4241  discard_padding = av_rescale_q(discard_padding,
4242  (AVRational){1, 1000000000},
4243  (AVRational){1, st->codecpar->sample_rate});
4244  if (discard_padding > 0) {
4245  AV_WL32A(side_data + 4, discard_padding);
4246  } else {
4247  AV_WL32A(side_data, -discard_padding);
4248  }
4249  }
4250 
4251  if (track->ms_compat)
4252  pkt->dts = timecode;
4253  else
4254  pkt->pts = timecode;
4255  pkt->pos = pos;
4256  pkt->duration = lace_duration;
4257 
4258  res = avpriv_packet_list_put(&matroska->queue, pkt, NULL, 0);
4259  if (res < 0) {
4261  return AVERROR(ENOMEM);
4262  }
4263 
4264  return 0;
4265 
4266 no_output:
4268  if (!buf)
4269  av_free(pkt_data);
4270  return res;
4271 }
4272 
4273 static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf, uint8_t *data,
4274  int size, int64_t pos, uint64_t cluster_time,
4275  uint64_t block_duration, int is_keyframe,
4276  MatroskaBlockMore *blockmore, int nb_blockmore,
4277  int64_t cluster_pos, int64_t discard_padding)
4278 {
4279  uint64_t timecode = AV_NOPTS_VALUE;
4280  MatroskaTrack *track;
4281  FFIOContext pb;
4282  int res = 0;
4283  AVStream *st;
4284  int16_t block_time;
4285  uint32_t lace_size[256];
4286  int n, flags, laces = 0;
4287  uint64_t num;
4288  int trust_default_duration;
4289 
4290  av_assert1(buf);
4291 
4293 
4294  if ((n = ebml_read_num(matroska, &pb.pub, 8, &num, 1)) < 0)
4295  return n;
4296  data += n;
4297  size -= n;
4298 
4299  track = matroska_find_track_by_num(matroska, num);
4300  if (!track || size < 3)
4301  return AVERROR_INVALIDDATA;
4302 
4303  if (!(st = track->stream)) {
4304  av_log(matroska->ctx, AV_LOG_VERBOSE,
4305  "No stream associated to TrackNumber %"PRIu64". "
4306  "Ignoring Block with this TrackNumber.\n", num);
4307  return 0;
4308  }
4309 
4310  if (st->discard >= AVDISCARD_ALL)
4311  return res;
4312  if (block_duration > INT64_MAX)
4313  block_duration = INT64_MAX;
4314 
4315  block_time = sign_extend(AV_RB16(data), 16);
4316  data += 2;
4317  flags = *data++;
4318  size -= 3;
4319  if (is_keyframe == -1)
4320  is_keyframe = flags & 0x80 ? AV_PKT_FLAG_KEY : 0;
4321 
4322  if (cluster_time != (uint64_t) -1 &&
4323  (block_time >= 0 || cluster_time >= -block_time)) {
4324  uint64_t timecode_cluster_in_track_tb = (double) cluster_time / track->time_scale;
4325  timecode = timecode_cluster_in_track_tb + block_time - track->codec_delay_in_track_tb;
4326  if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE &&
4327  timecode < track->end_timecode)
4328  is_keyframe = 0; /* overlapping subtitles are not key frame */
4329  if (is_keyframe) {
4330  ff_reduce_index(matroska->ctx, st->index);
4331  av_add_index_entry(st, cluster_pos, timecode, 0, 0,
4333  }
4334  }
4335 
4336  if (matroska->skip_to_keyframe &&
4337  track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
4338  // Compare signed timecodes. Timecode may be negative due to codec delay
4339  // offset. We don't support timestamps greater than int64_t anyway - see
4340  // AVPacket's pts.
4341  if ((int64_t)timecode < (int64_t)matroska->skip_to_timecode)
4342  return res;
4343  if (is_keyframe)
4344  matroska->skip_to_keyframe = 0;
4345  else if (!ffstream(st)->skip_to_keyframe) {
4346  av_log(matroska->ctx, AV_LOG_ERROR, "File is broken, keyframes not correctly marked!\n");
4347  matroska->skip_to_keyframe = 0;
4348  }
4349  }
4350 
4351  res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1,
4352  &pb.pub, lace_size, &laces);
4353  if (res < 0) {
4354  av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n");
4355  return res;
4356  }
4357 
4358  trust_default_duration = track->default_duration != 0;
4359  if (track->audio.samplerate == 8000 && trust_default_duration) {
4360  // If this is needed for more codecs, then add them here
4361  if (st->codecpar->codec_id == AV_CODEC_ID_AC3) {
4362  if (track->audio.samplerate != st->codecpar->sample_rate || !st->codecpar->frame_size)
4363  trust_default_duration = 0;
4364  }
4365  }
4366 
4367  if (!block_duration && trust_default_duration)
4368  block_duration = track->default_duration * laces / matroska->time_scale;
4369 
4370  if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time))
4371  track->end_timecode =
4372  FFMAX(track->end_timecode, timecode + block_duration);
4373 
4374  for (n = 0; n < laces; n++) {
4375  int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
4376  uint8_t *out_data = data;
4377  int out_size = lace_size[n];
4378 
4379  if (track->needs_decoding) {
4380  res = matroska_decode_buffer(&out_data, &out_size, track);
4381  if (res < 0)
4382  return res;
4383  /* Given that we are here means that out_data is no longer
4384  * owned by buf, so set it to NULL. This depends upon
4385  * zero-length header removal compression being ignored. */
4386  av_assert1(out_data != data);
4387  buf = NULL;
4388  }
4389 
4390  if (track->audio.buf) {
4391  res = matroska_parse_rm_audio(matroska, track, st,
4392  out_data, out_size,
4393  timecode, pos);
4394  if (!buf)
4395  av_free(out_data);
4396  if (res)
4397  return res;
4398  } else if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) {
4399  res = matroska_parse_webvtt(matroska, track, st,
4400  out_data, out_size,
4401  timecode, lace_duration,
4402  pos);
4403  if (!buf)
4404  av_free(out_data);
4405  if (res)
4406  return res;
4407  } else {
4408  res = matroska_parse_frame(matroska, track, st, buf, out_data,
4409  out_size, timecode, lace_duration,
4410  pos, is_keyframe,
4411  blockmore, nb_blockmore,
4412  discard_padding);
4413  if (res)
4414  return res;
4415  }
4416 
4417  if (timecode != AV_NOPTS_VALUE)
4418  timecode = lace_duration ? timecode + lace_duration : AV_NOPTS_VALUE;
4419  data += lace_size[n];
4420  }
4421 
4422  return 0;
4423 }
4424 
4425 static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
4426 {
4427  MatroskaCluster *cluster = &matroska->current_cluster;
4428  MatroskaBlock *block = &cluster->block;
4429  int res;
4430 
4431  av_assert0(matroska->num_levels <= 2U);
4432 
4433  if (matroska->num_levels == 1) {
4434  res = ebml_parse(matroska, matroska_segment, NULL);
4435 
4436  if (res == 1) {
4437  /* Found a cluster: subtract the size of the ID already read. */
4438  cluster->pos = avio_tell(matroska->ctx->pb) - 4;
4439 
4440  res = ebml_parse(matroska, matroska_cluster_enter, cluster);
4441  if (res < 0)
4442  return res;
4443  }
4444  }
4445 
4446  if (matroska->num_levels == 2) {
4447  /* We are inside a cluster. */
4448  res = ebml_parse(matroska, matroska_cluster_parsing, cluster);
4449 
4450  if (res >= 0 && block->bin.size > 0) {
4451  int is_keyframe = block->non_simple ? block->reference.count == 0 : -1;
4452 
4453  res = matroska_parse_block(matroska, block->bin.buf, block->bin.data,
4454  block->bin.size, block->bin.pos,
4455  cluster->timecode, block->duration,
4456  is_keyframe, block->blockmore.elem,
4457  block->blockmore.nb_elem, cluster->pos,
4458  block->discard_padding);
4459  }
4460 
4462  memset(block, 0, sizeof(*block));
4463  } else if (!matroska->num_levels) {
4464  if (!avio_feof(matroska->ctx->pb)) {
4465  avio_r8(matroska->ctx->pb);
4466  if (!avio_feof(matroska->ctx->pb)) {
4467  av_log(matroska->ctx, AV_LOG_WARNING, "File extends beyond "
4468  "end of segment.\n");
4469  return AVERROR_INVALIDDATA;
4470  }
4471  }
4472  matroska->done = 1;
4473  return AVERROR_EOF;
4474  }
4475 
4476  return res;
4477 }
4478 
4480 {
4481  MatroskaDemuxContext *matroska = s->priv_data;
4482  int ret = 0;
4483 
4484  if (matroska->resync_pos == -1) {
4485  // This can only happen if generic seeking has been used.
4486  matroska->resync_pos = avio_tell(s->pb);
4487  }
4488 
4489  while (matroska_deliver_packet(matroska, pkt)) {
4490  if (matroska->done)
4491  return (ret < 0) ? ret : AVERROR_EOF;
4492  if (matroska_parse_cluster(matroska) < 0 && !matroska->done)
4493  ret = matroska_resync(matroska, matroska->resync_pos);
4494  }
4495 
4496  return 0;
4497 }
4498 
4499 static int matroska_read_seek(AVFormatContext *s, int stream_index,
4500  int64_t timestamp, int flags)
4501 {
4502  MatroskaDemuxContext *matroska = s->priv_data;
4503  MatroskaTrack *tracks = NULL;
4504  AVStream *st = s->streams[stream_index];
4505  FFStream *const sti = ffstream(st);
4506  int i, index;
4507 
4508  /* Parse the CUES now since we need the index data to seek. */
4509  if (matroska->cues_parsing_deferred > 0) {
4510  matroska->cues_parsing_deferred = 0;
4511  matroska_parse_cues(matroska);
4512  }
4513 
4514  if (!sti->nb_index_entries)
4515  goto err;
4516  timestamp = FFMAX(timestamp, sti->index_entries[0].timestamp);
4517 
4518  if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
4519  index == sti->nb_index_entries - 1) {
4520  matroska_reset_status(matroska, 0, sti->index_entries[sti->nb_index_entries - 1].pos);
4521  while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 ||
4522  index == sti->nb_index_entries - 1) {
4523  matroska_clear_queue(matroska);
4524  if (matroska_parse_cluster(matroska) < 0)
4525  break;
4526  }
4527  }
4528 
4529  matroska_clear_queue(matroska);
4530  if (index < 0 || (matroska->cues_parsing_deferred < 0 &&
4531  index == sti->nb_index_entries - 1))
4532  goto err;
4533 
4534  tracks = matroska->tracks.elem;
4535  for (i = 0; i < matroska->tracks.nb_elem; i++) {
4536  tracks[i].audio.pkt_cnt = 0;
4537  tracks[i].audio.sub_packet_cnt = 0;
4538  tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
4539  tracks[i].end_timecode = 0;
4540  }
4541 
4542  /* We seek to a level 1 element, so set the appropriate status. */
4543  matroska_reset_status(matroska, 0, sti->index_entries[index].pos);
4544  if (flags & AVSEEK_FLAG_ANY) {
4545  sti->skip_to_keyframe = 0;
4546  matroska->skip_to_timecode = timestamp;
4547  } else {
4548  sti->skip_to_keyframe = 1;
4549  matroska->skip_to_timecode = sti->index_entries[index].timestamp;
4550  }
4551  matroska->skip_to_keyframe = 1;
4552  matroska->done = 0;
4554  return 0;
4555 err:
4556  // slightly hackish but allows proper fallback to
4557  // the generic seeking code.
4558  matroska_reset_status(matroska, 0, -1);
4559  matroska->resync_pos = -1;
4560  matroska_clear_queue(matroska);
4562  matroska->skip_to_keyframe = 0;
4563  matroska->done = 0;
4564  return -1;
4565 }
4566 
4568 {
4569  MatroskaDemuxContext *matroska = s->priv_data;
4570  MatroskaTrack *tracks = matroska->tracks.elem;
4571  int n;
4572 
4573  matroska_clear_queue(matroska);
4574 
4575  for (n = 0; n < matroska->tracks.nb_elem; n++)
4576  if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
4577  av_freep(&tracks[n].audio.buf);
4578  ebml_free(matroska_segment, matroska);
4579 
4580  return 0;
4581 }
4582 
4583 #if CONFIG_WEBM_DASH_MANIFEST_DEMUXER
4584 typedef struct {
4585  int64_t start_time_ns;
4586  int64_t end_time_ns;
4587  int64_t start_offset;
4588  int64_t end_offset;
4589 } CueDesc;
4590 
4591 /* This function searches all the Cues and returns the CueDesc corresponding to
4592  * the timestamp ts. Returned CueDesc will be such that start_time_ns <= ts <
4593  * end_time_ns. All 4 fields will be set to -1 if ts >= file's duration or
4594  * if an error occurred.
4595  */
4596 static CueDesc get_cue_desc(AVFormatContext *s, int64_t ts, int64_t cues_start) {
4597  MatroskaDemuxContext *matroska = s->priv_data;
4598  FFStream *const sti = ffstream(s->streams[0]);
4599  AVIndexEntry *const index_entries = sti->index_entries;
4600  int nb_index_entries = sti->nb_index_entries;
4601  CueDesc cue_desc;
4602  int i;
4603 
4604  if (ts >= (int64_t)(matroska->duration * matroska->time_scale))
4605  return (CueDesc) {-1, -1, -1, -1};
4606  for (i = 1; i < nb_index_entries; i++) {
4607  if (index_entries[i - 1].timestamp * matroska->time_scale <= ts &&
4608  index_entries[i].timestamp * matroska->time_scale > ts) {
4609  break;
4610  }
4611  }
4612  --i;
4613  if (index_entries[i].timestamp > matroska->duration)
4614  return (CueDesc) {-1, -1, -1, -1};
4615  cue_desc.start_time_ns = index_entries[i].timestamp * matroska->time_scale;
4616  cue_desc.start_offset = index_entries[i].pos - matroska->segment_start;
4617  if (i != nb_index_entries - 1) {
4618  cue_desc.end_time_ns = index_entries[i + 1].timestamp * matroska->time_scale;
4619  cue_desc.end_offset = index_entries[i + 1].pos - matroska->segment_start;
4620  } else {
4621  cue_desc.end_time_ns = matroska->duration * matroska->time_scale;
4622  // FIXME: this needs special handling for files where Cues appear
4623  // before Clusters. the current logic assumes Cues appear after
4624  // Clusters.
4625  cue_desc.end_offset = cues_start - matroska->segment_start;
4626  }
4627 
4628  if (cue_desc.end_time_ns < cue_desc.start_time_ns)
4629  return (CueDesc) {-1, -1, -1, -1};
4630 
4631  return cue_desc;
4632 }
4633 
4634 static int webm_clusters_start_with_keyframe(AVFormatContext *s)
4635 {
4636  MatroskaDemuxContext *matroska = s->priv_data;
4637  AVStream *const st = s->streams[0];
4638  FFStream *const sti = ffstream(st);
4639  uint32_t id = matroska->current_id;
4640  int64_t cluster_pos, before_pos;
4641  int index, rv = 1;
4642 
4643  if (sti->nb_index_entries <= 0)
4644  return 0;
4645 
4646  // seek to the first cluster using cues.
4647  index = av_index_search_timestamp(st, 0, 0);
4648  if (index < 0)
4649  return 0;
4650  cluster_pos = sti->index_entries[index].pos;
4651  before_pos = avio_tell(s->pb);
4652  while (1) {
4653  uint64_t cluster_id, cluster_length;
4654  int read;
4655  AVPacket *pkt;
4656  avio_seek(s->pb, cluster_pos, SEEK_SET);
4657  // read cluster id and length
4658  read = ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id, 1);
4659  if (read < 0 || cluster_id != 0xF43B675) // done with all clusters
4660  break;
4661  read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length);
4662  if (read < 0)
4663  break;
4664 
4665  matroska_reset_status(matroska, 0, cluster_pos);
4666  matroska_clear_queue(matroska);
4667  if (matroska_parse_cluster(matroska) < 0 ||
4668  !matroska->queue.head) {
4669  break;
4670  }
4671  pkt = &matroska->queue.head->pkt;
4672  // 4 + read is the length of the cluster id and the cluster length field.
4673  cluster_pos += 4 + read + cluster_length;
4674  if (!(pkt->flags & AV_PKT_FLAG_KEY)) {
4675  rv = 0;
4676  break;
4677  }
4678  }
4679 
4680  /* Restore the status after matroska_read_header: */
4681  matroska_reset_status(matroska, id, before_pos);
4682 
4683  return rv;
4684 }
4685 
4686 static int buffer_size_after_time_downloaded(int64_t time_ns, double search_sec, int64_t bps,
4687  double min_buffer, double* buffer,
4688  double* sec_to_download, AVFormatContext *s,
4689  int64_t cues_start)
4690 {
4691  double nano_seconds_per_second = 1000000000.0;
4692  double time_sec = time_ns / nano_seconds_per_second;
4693  int rv = 0;
4694  int64_t time_to_search_ns = (int64_t)(search_sec * nano_seconds_per_second);
4695  int64_t end_time_ns = time_ns + time_to_search_ns;
4696  double sec_downloaded = 0.0;
4697  CueDesc desc_curr = get_cue_desc(s, time_ns, cues_start);
4698  if (desc_curr.start_time_ns == -1)
4699  return -1;
4700  *sec_to_download = 0.0;
4701 
4702  // Check for non cue start time.
4703  if (time_ns > desc_curr.start_time_ns) {
4704  int64_t cue_nano = desc_curr.end_time_ns - time_ns;
4705  double percent = (double)(cue_nano) / (desc_curr.end_time_ns - desc_curr.start_time_ns);
4706  double cueBytes = (desc_curr.end_offset - desc_curr.start_offset) * percent;
4707  double timeToDownload = (cueBytes * 8.0) / bps;
4708 
4709  sec_downloaded += (cue_nano / nano_seconds_per_second) - timeToDownload;
4710  *sec_to_download += timeToDownload;
4711 
4712  // Check if the search ends within the first cue.
4713  if (desc_curr.end_time_ns >= end_time_ns) {
4714  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4715  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4716  sec_downloaded = percent_to_sub * sec_downloaded;
4717  *sec_to_download = percent_to_sub * *sec_to_download;
4718  }
4719 
4720  if ((sec_downloaded + *buffer) <= min_buffer) {
4721  return 1;
4722  }
4723 
4724  // Get the next Cue.
4725  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4726  }
4727 
4728  while (desc_curr.start_time_ns != -1) {
4729  int64_t desc_bytes = desc_curr.end_offset - desc_curr.start_offset;
4730  int64_t desc_ns = desc_curr.end_time_ns - desc_curr.start_time_ns;
4731  double desc_sec = desc_ns / nano_seconds_per_second;
4732  double bits = (desc_bytes * 8.0);
4733  double time_to_download = bits / bps;
4734 
4735  sec_downloaded += desc_sec - time_to_download;
4736  *sec_to_download += time_to_download;
4737 
4738  if (desc_curr.end_time_ns >= end_time_ns) {
4739  double desc_end_time_sec = desc_curr.end_time_ns / nano_seconds_per_second;
4740  double percent_to_sub = search_sec / (desc_end_time_sec - time_sec);
4741  sec_downloaded = percent_to_sub * sec_downloaded;
4742  *sec_to_download = percent_to_sub * *sec_to_download;
4743 
4744  if ((sec_downloaded + *buffer) <= min_buffer)
4745  rv = 1;
4746  break;
4747  }
4748 
4749  if ((sec_downloaded + *buffer) <= min_buffer) {
4750  rv = 1;
4751  break;
4752  }
4753 
4754  desc_curr = get_cue_desc(s, desc_curr.end_time_ns, cues_start);
4755  }
4756  *buffer = *buffer + sec_downloaded;
4757  return rv;
4758 }
4759 
4760 /* This function computes the bandwidth of the WebM file with the help of
4761  * buffer_size_after_time_downloaded() function. Both of these functions are
4762  * adapted from WebM Tools project and are adapted to work with FFmpeg's
4763  * Matroska parsing mechanism.
4764  *
4765  * Returns the bandwidth of the file on success; -1 on error.
4766  * */
4767 static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t cues_start)
4768 {
4769  MatroskaDemuxContext *matroska = s->priv_data;
4770  AVStream *st = s->streams[0];
4771  FFStream *const sti = ffstream(st);
4772  double bandwidth = 0.0;
4773 
4774  for (int i = 0; i < sti->nb_index_entries; i++) {
4775  int64_t prebuffer_ns = 1000000000;
4776  int64_t time_ns = sti->index_entries[i].timestamp * matroska->time_scale;
4777  double nano_seconds_per_second = 1000000000.0;
4778  int64_t prebuffered_ns;
4779  double prebuffer_bytes = 0.0;
4780  int64_t temp_prebuffer_ns = prebuffer_ns;
4781  int64_t pre_bytes, pre_ns;
4782  double pre_sec, prebuffer, bits_per_second;
4783  CueDesc desc_beg = get_cue_desc(s, time_ns, cues_start);
4784  // Start with the first Cue.
4785  CueDesc desc_end = desc_beg;
4786 
4787  if (time_ns > INT64_MAX - prebuffer_ns)
4788  return -1;
4789  prebuffered_ns = time_ns + prebuffer_ns;
4790 
4791  // Figure out how much data we have downloaded for the prebuffer. This will
4792  // be used later to adjust the bits per sample to try.
4793  while (desc_end.start_time_ns != -1 && desc_end.end_time_ns < prebuffered_ns) {
4794  // Prebuffered the entire Cue.
4795  prebuffer_bytes += desc_end.end_offset - desc_end.start_offset;
4796  temp_prebuffer_ns -= desc_end.end_time_ns - desc_end.start_time_ns;
4797  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4798  }
4799  if (desc_end.start_time_ns == -1) {
4800  // The prebuffer is larger than the duration.
4801  if (matroska->duration * matroska->time_scale >= prebuffered_ns)
4802  return -1;
4803  bits_per_second = 0.0;
4804  } else {
4805  // The prebuffer ends in the last Cue. Estimate how much data was
4806  // prebuffered.
4807  pre_bytes = desc_end.end_offset - desc_end.start_offset;
4808  if (desc_end.end_time_ns <= desc_end.start_time_ns ||
4809  desc_end.end_time_ns - (uint64_t)desc_end.start_time_ns > INT64_MAX)
4810  return -1;
4811  pre_ns = desc_end.end_time_ns - desc_end.start_time_ns;
4812  pre_sec = pre_ns / nano_seconds_per_second;
4813  prebuffer_bytes +=
4814  pre_bytes * ((temp_prebuffer_ns / nano_seconds_per_second) / pre_sec);
4815 
4816  prebuffer = prebuffer_ns / nano_seconds_per_second;
4817 
4818  // Set this to 0.0 in case our prebuffer buffers the entire video.
4819  bits_per_second = 0.0;
4820  do {
4821  int64_t desc_bytes = desc_end.end_offset - desc_beg.start_offset;
4822  int64_t desc_ns = desc_end.end_time_ns - desc_beg.start_time_ns;
4823  double desc_sec, calc_bits_per_second, percent, mod_bits_per_second;
4824  if (desc_bytes <= 0 || desc_bytes > INT64_MAX/8)
4825  return -1;
4826 
4827  desc_sec = desc_ns / nano_seconds_per_second;
4828  calc_bits_per_second = (desc_bytes * 8) / desc_sec;
4829 
4830  // Drop the bps by the percentage of bytes buffered.
4831  percent = (desc_bytes - prebuffer_bytes) / desc_bytes;
4832  mod_bits_per_second = calc_bits_per_second * percent;
4833 
4834  if (prebuffer < desc_sec) {
4835  double search_sec =
4836  (double)(matroska->duration * matroska->time_scale) / nano_seconds_per_second;
4837 
4838  // Add 1 so the bits per second should be a little bit greater than file
4839  // datarate.
4840  int64_t bps = (int64_t)(mod_bits_per_second) + 1;
4841  const double min_buffer = 0.0;
4842  double buffer = prebuffer;
4843  double sec_to_download = 0.0;
4844 
4845  int rv = buffer_size_after_time_downloaded(prebuffered_ns, search_sec, bps,
4846  min_buffer, &buffer, &sec_to_download,
4847  s, cues_start);
4848  if (rv < 0) {
4849  return -1;
4850  } else if (rv == 0) {
4851  bits_per_second = (double)(bps);
4852  break;
4853  }
4854  }
4855 
4856  desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
4857  } while (desc_end.start_time_ns != -1);
4858  }
4859  if (bandwidth < bits_per_second) bandwidth = bits_per_second;
4860  }
4861  return (int64_t)bandwidth;
4862 }
4863 
4864 static int webm_dash_manifest_cues(AVFormatContext *s, int64_t init_range)
4865 {
4866  MatroskaDemuxContext *matroska = s->priv_data;
4867  EbmlList *seekhead_list = &matroska->seekhead;
4868  MatroskaSeekhead *seekhead = seekhead_list->elem;
4869  AVStream *const st = s->streams[0];
4870  FFStream *const sti = ffstream(st);
4871  AVBPrint bprint;
4872  char *buf;
4873  int64_t cues_start = -1, cues_end = -1, before_pos, bandwidth;
4874  int i;
4875  int ret;
4876 
4877  // determine cues start and end positions
4878  for (i = 0; i < seekhead_list->nb_elem; i++)
4879  if (seekhead[i].id == MATROSKA_ID_CUES)
4880  break;
4881 
4882  if (i >= seekhead_list->nb_elem) return -1;
4883 
4884  before_pos = avio_tell(matroska->ctx->pb);
4885  cues_start = seekhead[i].pos + matroska->segment_start;
4886  if (avio_seek(matroska->ctx->pb, cues_start, SEEK_SET) == cues_start) {
4887  // cues_end is computed as cues_start + cues_length + length of the
4888  // Cues element ID (i.e. 4) + EBML length of the Cues element.
4889  // cues_end is inclusive and the above sum is reduced by 1.
4890  uint64_t cues_length, cues_id;
4891  int bytes_read;
4892  bytes_read = ebml_read_num (matroska, matroska->ctx->pb, 4, &cues_id, 1);
4893  if (bytes_read < 0 || cues_id != (MATROSKA_ID_CUES & 0xfffffff))
4894  return bytes_read < 0 ? bytes_read : AVERROR_INVALIDDATA;
4895  bytes_read = ebml_read_length(matroska, matroska->ctx->pb, &cues_length);
4896  if (bytes_read < 0)
4897  return bytes_read;
4898  cues_end = cues_start + 4 + bytes_read + cues_length - 1;
4899  }
4900  avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
4901  if (cues_start == -1 || cues_end == -1) return -1;
4902 
4903  // parse the cues
4904  matroska_parse_cues(matroska);
4905 
4906  if (!sti->nb_index_entries)
4907  return AVERROR_INVALIDDATA;
4908 
4909  // cues start
4910  av_dict_set_int(&s->streams[0]->metadata, CUES_START, cues_start, 0);
4911 
4912  // cues end
4913  av_dict_set_int(&s->streams[0]->metadata, CUES_END, cues_end, 0);
4914 
4915  // if the file has cues at the start, fix up the init range so that
4916  // it does not include it
4917  if (cues_start <= init_range)
4918  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, cues_start - 1, 0);
4919 
4920  // bandwidth
4921  bandwidth = webm_dash_manifest_compute_bandwidth(s, cues_start);
4922  if (bandwidth < 0) return -1;
4923  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH, bandwidth, 0);
4924 
4925  // check if all clusters start with key frames
4926  av_dict_set_int(&s->streams[0]->metadata, CLUSTER_KEYFRAME, webm_clusters_start_with_keyframe(s), 0);
4927 
4928  // Store cue point timestamps as a comma separated list
4929  // for checking subsegment alignment in the muxer.
4931  for (int j = 0; j < sti->nb_index_entries; j++)
4932  av_bprintf(&bprint, "%" PRId64",", sti->index_entries[j].timestamp);
4933  if (!av_bprint_is_complete(&bprint)) {
4934  av_bprint_finalize(&bprint, NULL);
4935  return AVERROR(ENOMEM);
4936  }
4937  // Remove the trailing ','
4938  bprint.str[--bprint.len] = '\0';
4939  if ((ret = av_bprint_finalize(&bprint, &buf)) < 0)
4940  return ret;
4941  av_dict_set(&s->streams[0]->metadata, CUE_TIMESTAMPS,
4943 
4944  return 0;
4945 }
4946 
4947 static int webm_dash_manifest_read_header(AVFormatContext *s)
4948 {
4949  char *buf;
4950  int ret = matroska_read_header(s);
4951  int64_t init_range;
4952  MatroskaTrack *tracks;
4953  MatroskaDemuxContext *matroska = s->priv_data;
4954  if (ret) {
4955  av_log(s, AV_LOG_ERROR, "Failed to read file headers\n");
4956  return -1;
4957  }
4958  if (!matroska->tracks.nb_elem || !s->nb_streams) {
4959  av_log(s, AV_LOG_ERROR, "No track found\n");
4960  return AVERROR_INVALIDDATA;
4961  }
4962 
4963  if (!matroska->is_live) {
4964  buf = av_asprintf("%g", matroska->duration);
4965  if (!buf)
4966  return AVERROR(ENOMEM);
4967  av_dict_set(&s->streams[0]->metadata, DURATION,
4969 
4970  // initialization range
4971  // 5 is the offset of Cluster ID.
4972  init_range = avio_tell(s->pb) - 5;
4973  av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, init_range, 0);
4974  }
4975 
4976  // basename of the file
4977  buf = strrchr(s->url, '/');
4978  av_dict_set(&s->streams[0]->metadata, FILENAME, buf ? ++buf : s->url, 0);
4979 
4980  // track number
4981  tracks = matroska->tracks.elem;
4982  av_dict_set_int(&s->streams[0]->metadata, TRACK_NUMBER, tracks[0].num, 0);
4983 
4984  // parse the cues and populate Cue related fields
4985  if (!matroska->is_live) {
4986  ret = webm_dash_manifest_cues(s, init_range);
4987  if (ret < 0) {
4988  av_log(s, AV_LOG_ERROR, "Error parsing Cues\n");
4989  return ret;
4990  }
4991  }
4992 
4993  // use the bandwidth from the command line if it was provided
4994  if (matroska->bandwidth > 0) {
4995  av_dict_set_int(&s->streams[0]->metadata, BANDWIDTH,
4996  matroska->bandwidth, 0);
4997  }
4998  return 0;
4999 }
5000 
5001 static int webm_dash_manifest_read_packet(AVFormatContext *s, AVPacket *pkt)
5002 {
5003  return AVERROR_EOF;
5004 }
5005 
5006 #define OFFSET(x) offsetof(MatroskaDemuxContext, x)
5007 static const AVOption options[] = {
5008  { "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 },
5009  { "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 },
5010  { NULL },
5011 };
5012 
5013 static const AVClass webm_dash_class = {
5014  .class_name = "WebM DASH Manifest demuxer",
5015  .item_name = av_default_item_name,
5016  .option = options,
5017  .version = LIBAVUTIL_VERSION_INT,
5018 };
5019 
5021  .p.name = "webm_dash_manifest",
5022  .p.long_name = NULL_IF_CONFIG_SMALL("WebM DASH Manifest"),
5023  .p.priv_class = &webm_dash_class,
5024  .priv_data_size = sizeof(MatroskaDemuxContext),
5025  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
5026  .read_header = webm_dash_manifest_read_header,
5027  .read_packet = webm_dash_manifest_read_packet,
5029 };
5030 #endif
5031 
5033  .p.name = "matroska,webm",
5034  .p.long_name = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
5035  .p.extensions = "mkv,mk3d,mka,mks,webm",
5036  .p.mime_type = "audio/webm,audio/x-matroska,video/webm,video/x-matroska",
5037  .priv_data_size = sizeof(MatroskaDemuxContext),
5038  .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP,
5044 };
AVCOL_PRI_RESERVED
@ AVCOL_PRI_RESERVED
Definition: pixfmt.h:640
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:43
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:339
flags
const SwsFlags flags[]
Definition: swscale.c:84
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
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:434
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:3606
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:203
MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
#define MATROSKA_ID_TRACKFLAGVISUALIMPAIRED
Definition: matroska.h:101
MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL
Definition: matroska.h:319
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
MATROSKA_ID_CHAPSTRING
#define MATROSKA_ID_CHAPSTRING
Definition: matroska.h:266
MATROSKA_BLOCK_ADD_ID_OPAQUE
#define MATROSKA_BLOCK_ADD_ID_OPAQUE
Definition: matroska.h:369
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
FFStream::skip_samples
int skip_samples
Number of samples to skip at the start of the frame decoded from the next packet.
Definition: internal.h:208
AVSphericalProjection
AVSphericalProjection
Projection of the video surface(s) on a sphere.
Definition: spherical.h:47
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:71
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:208
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
AVStreamGroup::id
int64_t id
Group type-specific group ID.
Definition: avformat.h:1159
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:464
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:2488
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:3997
matroska_parse_tracks
static int matroska_parse_tracks(AVFormatContext *s)
Definition: matroskadec.c:3148
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:53
AVSphericalMapping::projection
enum AVSphericalProjection projection
Projection type.
Definition: spherical.h:104
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
MatroskaTrack::operation
MatroskaTrackOperation operation
Definition: matroskadec.c: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:188
MATROSKA_ID_CODECDECODEALL
#define MATROSKA_ID_CODECDECODEALL
Definition: matroska.h:92
ff_rm_reorder_sipr_data
void ff_rm_reorder_sipr_data(uint8_t *buf, int sub_packet_h, int framesize)
Perform 4-bit block reordering for SIPR data.
Definition: rmsipr.c:41
MATROSKA_ID_VIDEOCOLORMASTERINGMETA
#define MATROSKA_ID_VIDEOCOLORMASTERINGMETA
Definition: matroska.h:149
MatroskaTrackVideo::pixel_cropt
uint64_t pixel_cropt
Definition: matroskadec.c: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:4267
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:513
EBML_MAX_DEPTH
#define EBML_MAX_DEPTH
Definition: matroska.h:382
matroska_parse_prores
static int matroska_parse_prores(MatroskaTrack *track, uint8_t **data, int *size)
Definition: matroskadec.c:3864
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:49
AVFMT_FLAG_IGNIDX
#define AVFMT_FLAG_IGNIDX
Ignore index.
Definition: avformat.h:1467
segment_start
static int segment_start(AVFormatContext *s, int write_header)
Definition: segment.c:246
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:123
MatroskaTags
Definition: matroskadec.c:340
MatroskaAttachment::bin
EbmlBin bin
Definition: matroskadec.c:300
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:192
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:4146
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:818
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:213
MATROSKA_ID_VIDEOPIXELWIDTH
#define MATROSKA_ID_VIDEOPIXELWIDTH
Definition: matroska.h:119
TTA_EXTRADATA_SIZE
#define TTA_EXTRADATA_SIZE
Definition: matroskadec.c:2623
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
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
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
bytestream2_skipu
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition: bytestream.h:174
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:3414
matroska_find_track_by_num
static MatroskaTrack * matroska_find_track_by_num(MatroskaDemuxContext *matroska, uint64_t num)
Definition: matroskadec.c:1664
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
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:620
mask
int mask
Definition: mediacodecdec_common.c:154
CUES_START
#define CUES_START
Definition: matroska.h:430
out_size
static int out_size
Definition: movenc.c:56
MATROSKA_ID_BLKADDIDTYPE
#define MATROSKA_ID_BLKADDIDTYPE
Definition: matroska.h:195
MatroskaMasteringMeta::white_y
double white_y
Definition: matroskadec.c: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:446
ff_metadata_conv
void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:26
MATROSKA_ID_CHAPTERS
#define MATROSKA_ID_CHAPTERS
Definition: matroska.h:62
MATROSKA_ID_VIDEOCOLOR_BY
#define MATROSKA_ID_VIDEOCOLOR_BY
Definition: matroska.h:155
pixdesc.h
rmsipr.h
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:424
MATROSKA_ID_BLOCKDURATION
#define MATROSKA_ID_BLOCKDURATION
Definition: matroska.h:247
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:777
MATROSKA_ID_VIDEOCOLORRANGE
#define MATROSKA_ID_VIDEOCOLORRANGE
Definition: matroska.h:142
AVFormatContext::strict_std_compliance
int strict_std_compliance
Allow non-standard and experimental extension.
Definition: avformat.h:1673
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:603
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
Number of audio samples to skip after a discontinuity.
Definition: codec_par.h:256
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:43
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:669
matroska_read_seek
static int matroska_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: matroskadec.c:4493
CountedElement::u
uint64_t u
Definition: matroskadec.c:105
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:836
matroska_read_close
static int matroska_read_close(AVFormatContext *s)
Definition: matroskadec.c:4561
PacketList
Definition: packet_internal.h:33
spherical.h
MATROSKA_ID_ENCODINGSCOPE
#define MATROSKA_ID_ENCODINGSCOPE
Definition: matroska.h:177
data
const char data[16]
Definition: mxf.c:149
MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
@ MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED
Definition: matroska.h:299
MatroskaTrack::end_timecode
int64_t end_timecode
Definition: matroskadec.c:285
AV_CODEC_ID_ALAC
@ AV_CODEC_ID_ALAC
Definition: codec_id.h:477
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:2622
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
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
mkv_parse_video_codec
static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par, const MatroskaDemuxContext *matroska, int *extradata_offset)
Definition: matroskadec.c:2907
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:621
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:61
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:2407
mathematics.h
MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
@ MATROSKA_COLOUR_CHROMASITINGHORZ_UNDETERMINED
Definition: matroska.h:340
MATROSKA_ID_CUES
#define MATROSKA_ID_CUES
Definition: matroska.h:57
AVDictionary
Definition: dict.c:32
ffio_init_read_context
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
Definition: aviobuf.c:99
AV_CODEC_ID_FLAC
@ AV_CODEC_ID_FLAC
Definition: codec_id.h:473
MatroskaTrackEncoding::type
uint64_t type
Definition: matroskadec.c:161
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
matroska_blockadditions
static EbmlSyntax matroska_blockadditions[2]
Definition: matroskadec.c: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:192
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:4473
MATROSKA_ID_CUERELATIVEPOSITION
#define MATROSKA_ID_CUERELATIVEPOSITION
Definition: matroska.h:208
av_dynamic_hdr_smpte2094_app5_alloc
AVDynamicHDRSmpte2094App5 * av_dynamic_hdr_smpte2094_app5_alloc(size_t *size)
Allocate an AVDynamicHDRSmpte2094App5 structure and set its fields to default values.
Definition: hdr_dynamic_metadata.c:399
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
AV_SPHERICAL_EQUIRECTANGULAR
@ AV_SPHERICAL_EQUIRECTANGULAR
Video represents a sphere mapped on a flat surface using equirectangular projection.
Definition: spherical.h:52
intfloat.h
MatroskaDemuxContext::title
char * title
Definition: matroskadec.c: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:505
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:658
avpriv_update_cur_dts
void avpriv_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
Update cur_dts of all streams based on the given timestamp and AVStream.
Definition: seek.c:37
MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
@ MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR
Definition: matroska.h:320
MatroskaTrack::stream
AVStream * stream
Definition: matroskadec.c:284
AVIndexEntry
Definition: avformat.h:601
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:614
matroska_metadata_creation_time
static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
Definition: matroskadec.c:2139
MatroskaBlock::duration
uint64_t duration
Definition: matroskadec.c:361
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:609
AV_FIELD_BT
@ AV_FIELD_BT
Bottom coded first, top displayed first.
Definition: defs.h:217
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:2383
AV_PKT_DATA_DOVI_CONF
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition: packet.h:280
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:190
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:464
CodecMime
Definition: internal.h:47
primaries
enum AVColorPrimaries primaries
Definition: mediacodec_wrapper.c:2612
AV_PROFILE_ARIB_PROFILE_A
#define AV_PROFILE_ARIB_PROFILE_A
Definition: defs.h:191
AVCOL_SPC_RESERVED
@ AVCOL_SPC_RESERVED
reserved for future use by ITU-T and ISO/IEC just like 15-255 are
Definition: pixfmt.h:704
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:214
ebml_read_sint
static int ebml_read_sint(AVIOContext *pb, int size, int64_t default_value, int64_t *num)
Definition: matroskadec.c: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:902
mpeg4audio.h
ITU_T_T35_PROVIDER_CODE_VNOVA
#define ITU_T_T35_PROVIDER_CODE_VNOVA
Definition: itut35.h:42
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:362
MatroskaTrackPlane::uid
uint64_t uid
Definition: matroskadec.c:244
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:340
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
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2575
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:122
MATROSKA_ID_TRACKUID
#define MATROSKA_ID_TRACKUID
Definition: matroska.h:78
MATROSKA_ID_ENCODINGSIGKEYID
#define MATROSKA_ID_ENCODINGSIGKEYID
Definition: matroska.h:189
EBML_ID_DOCTYPEVERSION
#define EBML_ID_DOCTYPEVERSION
Definition: matroska.h:40
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:143
MATROSKA_COLOUR_CHROMASITINGVERT_NB
@ MATROSKA_COLOUR_CHROMASITINGVERT_NB
Definition: matroska.h:350
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
MatroskaCluster::pos
int64_t pos
Definition: matroskadec.c: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:597
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:132
mkv_parse_block_addition_mappings
static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, MatroskaTrack *track)
Definition: matroskadec.c:2527
AVChapter
Definition: avformat.h:1273
MatroskaBlock
Definition: matroskadec.c:360
matroska_probe
static int matroska_probe(const AVProbeData *p)
Definition: matroskadec.c:1617
AV_DISPOSITION_FORCED
#define AV_DISPOSITION_FORCED
Track should be used during playback by default.
Definition: avformat.h:653
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:2626
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:462
mkv_parse_video_color
static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track)
Definition: matroskadec.c:2282
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
AV_STREAM_GROUP_PARAMS_DOLBY_VISION
@ AV_STREAM_GROUP_PARAMS_DOLBY_VISION
Definition: avformat.h:1134
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_unused
#define av_unused
Definition: attributes.h:164
AV_FIELD_TB
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition: defs.h:216
MATROSKA_TRACK_TYPE_METADATA
@ MATROSKA_TRACK_TYPE_METADATA
Definition: matroska.h:287
AV_CODEC_ID_ATRAC3
@ AV_CODEC_ID_ATRAC3
Definition: codec_id.h:492
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:502
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:191
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:343
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:764
matroska_parse_seekhead_entry
static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int64_t pos)
Definition: matroskadec.c:1916
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
MatroskaTrackAudio::buf_timecode
uint64_t buf_timecode
Definition: matroskadec.c: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
planes
static const struct @587 planes[]
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
AVStreamGroup::params
union AVStreamGroup::@448 params
Group type-specific parameters.
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:483
transfer_characteristics
static const struct TransferCharacteristics transfer_characteristics[]
Definition: vf_colorspace.c:178
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:603
MatroskaDemuxContext::muxingapp
char * muxingapp
Definition: matroskadec.c:395
AVCOL_PRI_RESERVED0
@ AVCOL_PRI_RESERVED0
Definition: pixfmt.h:637
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_read_callback.c:42
AV_FIELD_UNKNOWN
@ AV_FIELD_UNKNOWN
Definition: defs.h:212
EBML_ID_EBMLMAXIDLENGTH
#define EBML_ID_EBMLMAXIDLENGTH
Definition: matroska.h:37
AVCodecParameters::frame_size
int frame_size
Audio frame size, if known.
Definition: codec_par.h:227
MatroskaTrackVideoColor::max_cll
uint64_t max_cll
Definition: matroskadec.c:191
matroska_parse_cluster
static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:4419
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:60
EbmlSyntax::list_elem_size
size_t list_elem_size
Definition: matroskadec.c: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:107
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
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:377
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:1465
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:551
MATROSKA_VIDEO_FIELDORDER_BT
@ MATROSKA_VIDEO_FIELDORDER_BT
Definition: matroska.h:309
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:186
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:201
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:222
AVCodecParameters::width
int width
The width of the video frame in pixels.
Definition: codec_par.h:143
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:119
EbmlBin::size
int size
Definition: matroskadec.c: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:253
MatroskaTrackAudio::sub_packet_size
int sub_packet_size
Definition: matroskadec.c:236
TRACK_NUMBER
#define TRACK_NUMBER
Definition: matroska.h:437
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:603
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
MATROSKA_ID_CUETRACKPOSITION
#define MATROSKA_ID_CUETRACKPOSITION
Definition: matroska.h:203
MATROSKA_ID_SEEKENTRY
#define MATROSKA_ID_SEEKENTRY
Definition: matroska.h:228
matroska_decode_buffer
static int matroska_decode_buffer(uint8_t **buf, int *buf_size, MatroskaTrack *track)
Definition: matroskadec.c:1678
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:231
MATROSKA_ID_TRACKTYPE
#define MATROSKA_ID_TRACKTYPE
Definition: matroska.h:79
AVPacketSideData::data
uint8_t * data
Definition: packet.h:425
CLUSTER_KEYFRAME
#define CLUSTER_KEYFRAME
Definition: matroska.h:435
AVDOVIDecoderConfigurationRecord::dv_profile
uint8_t dv_profile
Definition: dovi_meta.h:58
FFFormatContext::data_offset
int64_t data_offset
offset of the first packet
Definition: internal.h:89
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:3097
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:2624
AV_PKT_DATA_LCEVC
@ AV_PKT_DATA_LCEVC
Raw LCEVC payload data, as a uint8_t array, with NAL emulation bytes intact.
Definition: packet.h:346
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:410
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:88
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:639
SKIP_TRACK
@ SKIP_TRACK
Definition: matroskadec.c:2619
AVStreamGroup::layered_video
struct AVStreamGroupLayeredVideo * layered_video
Definition: avformat.h:1176
av_content_light_metadata_alloc
AVContentLightMetadata * av_content_light_metadata_alloc(size_t *size)
Allocate an AVContentLightMetadata structure and set its fields to default values.
Definition: mastering_display_metadata.c:72
MATROSKA_ID_VIDEOSTEREOMODE
#define MATROSKA_ID_VIDEOSTEREOMODE
Definition: matroska.h:128
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
MatroskaDemuxContext::queue
PacketList queue
Definition: matroskadec.c:412
MatroskaTrack::type
uint64_t type
Definition: matroskadec.c:262
matroska_clear_queue
static void matroska_clear_queue(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:3601
AV_CODEC_ID_ARIB_CAPTION
@ AV_CODEC_ID_ARIB_CAPTION
Definition: codec_id.h:598
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:314
avpriv_packet_list_free
void avpriv_packet_list_free(PacketList *pkt_buf)
Wipe the list and unref all the packets in it.
Definition: packet.c:611
AV_CODEC_ID_WEBVTT
@ AV_CODEC_ID_WEBVTT
Definition: codec_id.h:591
matroska_convert_tag
static void matroska_convert_tag(AVFormatContext *s, EbmlList *list, AVDictionary **metadata, char *prefix)
Definition: matroskadec.c:1816
EBML_ID_DOCTYPEREADVERSION
#define EBML_ID_DOCTYPEREADVERSION
Definition: matroska.h:41
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1314
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:2044
MATROSKA_ID_CODECSTATE
#define MATROSKA_ID_CODECSTATE
Definition: matroska.h:249
fail
#define fail
Definition: test.h:478
internal.h
MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
#define MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED
Definition: matroska.h:100
AVCOL_TRC_RESERVED0
@ AVCOL_TRC_RESERVED0
Definition: pixfmt.h:667
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:586
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:770
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
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:76
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
metadata
Stream codec metadata
Definition: ogg-flac-chained-meta.txt:2
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:786
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:402
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:2025
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:5026
matroska_execute_seekhead
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
Definition: matroskadec.c:1954
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:548
matroska_ebmlnum_sint
static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska, AVIOContext *pb, int64_t *num)
Definition: matroskadec.c:1131
AVFormatContext::max_streams
int max_streams
The maximum number of streams.
Definition: avformat.h:1602
MATROSKA_ID_ENCODINGORDER
#define MATROSKA_ID_ENCODINGORDER
Definition: matroska.h:176
AVDynamicHDRSmpte2094App5
This struct represents dynamic metadata for color volume transform as specified in the SMPTE 2094-50 ...
Definition: hdr_dynamic_metadata.h:387
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:3885
MATROSKA_ID_WRITINGAPP
#define MATROSKA_ID_WRITINGAPP
Definition: matroska.h:68
isnan
#define isnan(x)
Definition: libm.h:342
AV_DISPOSITION_COMMENT
#define AV_DISPOSITION_COMMENT
The stream is a commentary track.
Definition: avformat.h:638
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
av_fallthrough
#define av_fallthrough
Definition: attributes.h:67
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:242
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:911
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1356
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:2200
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:186
MATROSKA_ID_VIDEOPROJECTION
#define MATROSKA_ID_VIDEOPROJECTION
Definition: matroska.h:161
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:452
list
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
Definition: filter_design.txt:25
options
Definition: swscale.c:49
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:827
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:702
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
attributes.h
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:634
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
The channel layout and number of channels.
Definition: codec_par.h:207
av_chroma_location_pos_to_enum
enum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos)
Converts swscale x/y chroma position to AVChromaLocation.
Definition: pixdesc.c:3910
MATROSKA_ID_FILEMIMETYPE
#define MATROSKA_ID_FILEMIMETYPE
Definition: matroska.h:256
MATROSKA_ID_VIDEODISPLAYHEIGHT
#define MATROSKA_ID_VIDEODISPLAYHEIGHT
Definition: matroska.h:118
base64.h
MatroskaTrackPlane::type
uint64_t type
Definition: matroskadec.c: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
matroska_parse_dovi_streams
static int matroska_parse_dovi_streams(AVFormatContext *s)
Definition: matroskadec.c:3345
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:743
matroska_index_pos
static EbmlSyntax matroska_index_pos[]
Definition: matroskadec.c:692
CUES_END
#define CUES_END
Definition: matroska.h:431
ff_codec_movaudio_tags
const AVCodecTag ff_codec_movaudio_tags[]
Definition: isom_tags.c:311
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:39
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:462
AVCodecParameters::sample_rate
int sample_rate
The number of audio samples per second.
Definition: codec_par.h:213
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
ff_log2_tab
const uint8_t ff_log2_tab[256]
Definition: log2_tab.c:23
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
av_packet_side_data_get
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
Definition: packet.c:646
MatroskaChapter::start
uint64_t start
Definition: matroskadec.c:306
avformat_stream_group_add_stream
int avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st)
Add an already allocated stream to a stream group.
Definition: options.c:560
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:75
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:463
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
EbmlSyntax::def
union EbmlSyntax::@483 def
ITU_T_T35_PROVIDER_CODE_SMPTE
#define ITU_T_T35_PROVIDER_CODE_SMPTE
Definition: itut35.h:48
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:691
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:351
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:610
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:604
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
FFFormatContext::parse_pkt
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition: internal.h:104
MatroskaTrackVideoColor::matrix_coefficients
uint64_t matrix_coefficients
Definition: matroskadec.c:180
ff_codec_get_id
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition: utils.c:143
MATROSKA_ID_VIDEOCOLOR_GX
#define MATROSKA_ID_VIDEOCOLOR_GX
Definition: matroska.h:152
mkv_create_display_matrix
static int mkv_create_display_matrix(AVStream *st, const MatroskaTrackVideoProjection *proj, void *logctx)
Definition: matroskadec.c:2365
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:261
qtpalette.h
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
FFStream
Definition: internal.h:128
matroska_convert_tags
static void matroska_convert_tags(AVFormatContext *s)
Definition: matroskadec.c:1851
AVSphericalMapping::bound_right
uint32_t bound_right
Distance from the right edge.
Definition: spherical.h:187
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
AV_PKT_DATA_DYNAMIC_HDR10_PLUS
@ AV_PKT_DATA_DYNAMIC_HDR10_PLUS
HDR10+ dynamic metadata associated with a video frame.
Definition: packet.h:296
MatroskaTrackEncoding::encryption
MatroskaTrackEncryption encryption
Definition: matroskadec.c:163
MATROSKA_ID_TRACKFLAGENABLED
#define MATROSKA_ID_TRACKFLAGENABLED
Definition: matroska.h:97
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
ff_dict_set_timestamp
int ff_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp)
Set a dictionary value to an ISO-8601 compliant timestamp string.
Definition: utils.c:610
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:29
MatroskaTrackAudio::frame_size
int frame_size
Definition: matroskadec.c: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:2055
MatroskaTrack::max_block_additional_id
uint64_t max_block_additional_id
Definition: matroskadec.c:288
MATROSKA_BLOCK_ADD_ID_TYPE_HVCE
@ MATROSKA_BLOCK_ADD_ID_TYPE_HVCE
Definition: matroska.h:366
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:2860
MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE
@ MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE
Definition: matroska.h:362
AV_WL32A
#define AV_WL32A(p, v)
Definition: intreadwrite.h:571
ff_get_qtpalette
int ff_get_qtpalette(int codec_id, AVIOContext *pb, uint32_t *palette)
Retrieve the palette (or "color table" in QuickTime terms), either from the video sample description,...
Definition: qtpalette.c:323
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
MKBETAG
#define MKBETAG(a, b, c, d)
Definition: macros.h:56
mkv_stereo_mode_display_mul
static void mkv_stereo_mode_display_mul(int stereo_mode, int *h_width, int *h_height)
Definition: matroskadec.c:2227
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
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:135
AV_DISPOSITION_DUB
#define AV_DISPOSITION_DUB
The stream is not in original language.
Definition: avformat.h:628
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2594
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:825
FFInputFormat::p
AVInputFormat p
The public AVInputFormat.
Definition: demux.h:70
INITIALIZATION_RANGE
#define INITIALIZATION_RANGE
Definition: matroska.h:429
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:657
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:602
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:606
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:200
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
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:689
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:609
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:574
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:313
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:221
CountedElement::count
unsigned count
Definition: matroskadec.c:110
matroska_aac_sri
static int matroska_aac_sri(int samplerate)
Definition: matroskadec.c:2129
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:1573
av_mastering_display_metadata_alloc_size
AVMasteringDisplayMetadata * av_mastering_display_metadata_alloc_size(size_t *size)
Allocate an AVMasteringDisplayMetadata structure and set its fields to default values.
Definition: mastering_display_metadata.c:44
MATROSKA_ID_TRACKPLANETYPE
#define MATROSKA_ID_TRACKPLANETYPE
Definition: matroska.h:86
FFStream::skip_to_keyframe
int skip_to_keyframe
Indicates that everything up to the next keyframe should be discarded.
Definition: internal.h:203
ffio_limit
int ffio_limit(AVIOContext *s, int size)
Definition: aviobuf.c:1064
layout
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout
Definition: filter_design.txt:18
MATROSKA_ID_CODECINFOURL
#define MATROSKA_ID_CODECINFOURL
Definition: matroska.h:90
MatroskaTrackVideo::display_height
uint64_t display_height
Definition: matroskadec.c: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:2336
AV_CODEC_ID_ATRAC1
@ AV_CODEC_ID_ATRAC1
Definition: codec_id.h:507
MatroskaDemuxContext::chapters
EbmlList chapters
Definition: matroskadec.c:399
AV_CODEC_ID_RA_288
@ AV_CODEC_ID_RA_288
Definition: codec_id.h:447
FILENAME
#define FILENAME
Definition: matroska.h:432
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:146
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_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:596
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:433
MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
@ MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP
Definition: matroska.h:294
algo
Definition: dct.c:58
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
CountedElement::i
int64_t i
Definition: matroskadec.c:106
DURATION
#define DURATION
Definition: matroska.h:434
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
MATROSKA_ID_CUECLUSTERPOSITION
#define MATROSKA_ID_CUECLUSTERPOSITION
Definition: matroska.h:207
MATROSKA_TRACK_ENCODING_COMP_ZLIB
@ MATROSKA_TRACK_ENCODING_COMP_ZLIB
Definition: matroska.h:291
AVCodecParameters::block_align
int block_align
The number of bytes per coded audio frame, required by some formats.
Definition: codec_par.h:221
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:32
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:215
MATROSKA_ID_SEEKPOSITION
#define MATROSKA_ID_SEEKPOSITION
Definition: matroska.h:232
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
AVStreamGroupLayeredVideo::width
int width
Width of the final stream for presentation.
Definition: avformat.h:1095
MATROSKA_ID_CLUSTER
#define MATROSKA_ID_CLUSTER
Definition: matroska.h:61
MATROSKA_ID_TRACKLANGUAGE
#define MATROSKA_ID_TRACKLANGUAGE
Definition: matroska.h:96
AV_CODEC_ID_RV20
@ AV_CODEC_ID_RV20
Definition: codec_id.h:58
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:204
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
MatroskaDemuxContext::is_webm
int is_webm
Definition: matroskadec.c: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:436
AV_CODEC_ID_PCM_S32BE
@ AV_CODEC_ID_PCM_S32BE
Definition: codec_id.h:348
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:126
demux.h
AVCodecParameters::color_range
enum AVColorRange color_range
Additional colorspace characteristics.
Definition: codec_par.h:189
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:2587
profile
int profile
Definition: mxfenc.c:2299
ff_get_wav_header
int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par, int size, int big_endian)
Definition: riffdec.c:95
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:703
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:83
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
The order of the fields in interlaced video.
Definition: codec_par.h:182
mkv_parse_hvce
static int mkv_parse_hvce(AVFormatContext *s, AVStream *st, EbmlBin *bin)
Definition: matroskadec.c:2507
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:816
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:661
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:2054
MatroskaTagTarget::chapteruid
uint64_t chapteruid
Definition: matroskadec.c:336
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:747
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:2980
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
AVStreamGroupLayeredVideo::height
int height
Height of the final image for presentation.
Definition: avformat.h:1099
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
av_strlcat
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
Definition: avstring.c:95
AVSphericalMapping::pitch
int32_t pitch
Rotation around the right vector [-90, 90].
Definition: spherical.h:145
MATROSKA_ID_TRACKCOMBINEPLANES
#define MATROSKA_ID_TRACKCOMBINEPLANES
Definition: matroska.h:83
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:785
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:593
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:122
dict.h
av_packet_side_data_new
AVPacketSideData * av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, size_t size, int flags)
Allocate a new packet side data.
Definition: packet.c:696
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:697
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
id
enum AVCodecID id
Definition: dts2pts.c:578
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
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
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:193
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
AVStreamGroup
Definition: avformat.h:1140
syntax
static const ParseSyntax syntax[]
Definition: concatdec.c:444
matroska_seekhead_entry
static EbmlSyntax matroska_seekhead_entry[]
Definition: matroskadec.c:742
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:753
MATROSKA_ID_TRACKMAXCACHE
#define MATROSKA_ID_TRACKMAXCACHE
Definition: matroska.h:107
matroska_seekhead
static EbmlSyntax matroska_seekhead[2]
Definition: matroskadec.c:448
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:1992
MATROSKA_ID_TRACKMAXBLKADDID
#define MATROSKA_ID_TRACKMAXBLKADDID
Definition: matroska.h:112
itut35.h
AVStreamGroup::nb_streams
unsigned int nb_streams
Number of elements in AVStreamGroup.streams.
Definition: avformat.h:1202
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
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:384
mkv_parse_dvcc_dvvc
static int mkv_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const MatroskaTrack *track, EbmlBin *bin)
Definition: matroskadec.c:2501
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:3780
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
MATROSKA_TRACK_TYPE_SUBTITLE
@ MATROSKA_TRACK_TYPE_SUBTITLE
Definition: matroska.h:284
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:135
MatroskaMasteringMeta::max_luminance
double max_luminance
Definition: matroskadec.c:175
hdr_dynamic_metadata.h
temp
else temp
Definition: vf_mcdeint.c:271
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:881
AV_LZO_OUTPUT_FULL
#define AV_LZO_OUTPUT_FULL
decoded data did not fit into output buffer
Definition: lzo.h:39
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommends skipping the specified number of samples.
Definition: packet.h:153
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:602
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
AVDOVIDecoderConfigurationRecord::el_present_flag
uint8_t el_present_flag
Definition: dovi_meta.h:61
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
MATROSKA_ID_VIDEOCOLORCHROMASUBVERT
#define MATROSKA_ID_VIDEOCOLORCHROMASUBVERT
Definition: matroska.h:137
MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
@ MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR
Definition: matroska.h:355
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AV_RL32A
#define AV_RL32A(p)
Definition: intreadwrite.h:568
EBML_UINT
@ EBML_UINT
Definition: matroskadec.c:91
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1449
AVPacket::stream_index
int stream_index
Definition: packet.h:605
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:3702
MatroskaTrackVideoColor::max_fall
uint64_t max_fall
Definition: matroskadec.c:192
ITU_T_T35_COUNTRY_CODE_UK
#define ITU_T_T35_COUNTRY_CODE_UK
Definition: itut35.h:31
av_buffer_realloc
int av_buffer_realloc(AVBufferRef **pbuf, size_t size)
Reallocate a given buffer.
Definition: buffer.c:183
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:321
MatroskaTrackVideoProjection::private
EbmlBin private
Definition: matroskadec.c:198
MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
#define MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ
Definition: matroska.h:140
av_realloc
#define av_realloc(p, s)
Definition: ops_asmgen.c:46
MATROSKA_TRACK_ENCODING_COMP_LZO
@ MATROSKA_TRACK_ENCODING_COMP_LZO
Definition: matroska.h:293
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:184
ff_mpeg4audio_sample_rates
const int ff_mpeg4audio_sample_rates[16]
Definition: mpeg4audio_sample_rates.h:30
av_dict_set_int
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set() that converts the value to a string and stores it.
Definition: dict.c:177
CodecMime::id
enum AVCodecID id
Definition: internal.h:49
av_spherical_alloc
AVSphericalMapping * av_spherical_alloc(size_t *size)
Allocate a AVSphericalVideo structure and initialize its fields to default values.
Definition: spherical.c:26
AV_OPT_FLAG_DECODING_PARAM
#define AV_OPT_FLAG_DECODING_PARAM
A generic parameter which can be set by the user for demuxing or decoding.
Definition: opt.h:356
MATROSKA_ID_BLOCKREFERENCE
#define MATROSKA_ID_BLOCKREFERENCE
Definition: matroska.h:248
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
AV_CODEC_ID_PCM_S32LE
@ AV_CODEC_ID_PCM_S32LE
Definition: codec_id.h:347
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:113
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:378
packet_internal.h
bytestream2_get_bufferu
static av_always_inline unsigned int bytestream2_get_bufferu(GetByteContext *g, uint8_t *dst, unsigned int size)
Definition: bytestream.h:277
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:344
av_strdup
#define av_strdup(s)
Definition: ops_asmgen.c:47
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:32
EbmlSyntax::s
const char * s
Definition: matroskadec.c:123
AVSphericalMapping::bound_left
uint32_t bound_left
Distance from the left edge.
Definition: spherical.h:185
MatroskaTrack::has_palette
int has_palette
Definition: matroskadec.c:292
MatroskaTrackVideoProjection::roll
double roll
Definition: matroskadec.c:201
AVCOL_TRC_RESERVED
@ AVCOL_TRC_RESERVED
Definition: pixfmt.h:670
w
uint8_t w
Definition: llvidencdsp.c:39
MATROSKA_ID_TRACKVIDEO
#define MATROSKA_ID_TRACKVIDEO
Definition: matroska.h:80
av_dynamic_hdr_plus_alloc
AVDynamicHDRPlus * av_dynamic_hdr_plus_alloc(size_t *size)
Allocate an AVDynamicHDRPlus structure and set its fields to default values.
Definition: hdr_dynamic_metadata.c:36
MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
@ MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL
Definition: matroska.h:327
AVIOContext::buffer
unsigned char * buffer
Start of the buffer.
Definition: avio.h:225
avformat_stream_group_create
AVStreamGroup * avformat_stream_group_create(AVFormatContext *s, enum AVStreamGroupParamsType type, AVDictionary **options)
Add a new empty stream group to a media file.
Definition: options.c:472
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:362
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:34
AVDictionaryEntry
Definition: dict.h:90
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:3574
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:57
AV_PKT_DATA_HEVC_CONF
@ AV_PKT_DATA_HEVC_CONF
Dolby Vision enhancement-layer HEVC decoder configuration.
Definition: packet.h:384
MatroskaTrack::palette
uint32_t palette[AVPALETTE_COUNT]
Definition: matroskadec.c:291
AVPacket
This structure stores compressed data.
Definition: packet.h:580
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:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
riff.h
AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5
@ AV_PKT_DATA_DYNAMIC_HDR_SMPTE_2094_APP5
HDR dynamic metadata associated with a video frame.
Definition: packet.h:376
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:623
MATROSKA_ID_TRACKMINCACHE
#define MATROSKA_ID_TRACKMINCACHE
Definition: matroska.h:106
CountedElement::el
union CountedElement::@482 el
av_dynamic_hdr_plus_from_t35
int av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data, size_t size)
Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRPlus).
Definition: hdr_dynamic_metadata.c:61
MATROSKA_ID_CODECDELAY
#define MATROSKA_ID_CODECDELAY
Definition: matroska.h:93
FFInputFormat
Definition: demux.h:66
MatroskaMasteringMeta::g_y
double g_y
Definition: matroskadec.c: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:2252
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:592
MATROSKA_ID_ENCODINGCOMPRESSION
#define MATROSKA_ID_ENCODINGCOMPRESSION
Definition: matroska.h:179
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
MATROSKA_ID_TAGTARGETS_TRACKUID
#define MATROSKA_ID_TAGTARGETS_TRACKUID
Definition: matroska.h:223
MatroskaTrackVideoProjection::pitch
double pitch
Definition: matroskadec.c: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:360
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:99
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
ITU_T_T35_PROVIDER_CODE_SAMSUNG
#define ITU_T_T35_PROVIDER_CODE_SAMSUNG
Definition: itut35.h:47
MatroskaTrackVideo::stereo_mode
uint64_t stereo_mode
Definition: matroskadec.c:220
AV_CODEC_ID_WAVPACK
@ AV_CODEC_ID_WAVPACK
Definition: codec_id.h:486
UNKNOWN_EQUIV
#define UNKNOWN_EQUIV
Definition: matroskadec.c:87
AV_CODEC_ID_COOK
@ AV_CODEC_ID_COOK
Definition: codec_id.h:481
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
FLAC_METADATA_TYPE_VORBIS_COMMENT
@ FLAC_METADATA_TYPE_VORBIS_COMMENT
Definition: flac.h:50
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:1581
AV_CODEC_ID_TIFF
@ AV_CODEC_ID_TIFF
Definition: codec_id.h:148
AVStereo3D
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
Definition: stereo3d.h:203
AVDictionaryEntry::value
char * value
Definition: dict.h:92
EbmlSyntax::is_counted
uint8_t is_counted
Definition: matroskadec.c:116
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
avstring.h
ff_reduce_index
void ff_reduce_index(AVFormatContext *s, int stream_index)
Ensure the index uses less memory than the maximum specified in AVFormatContext.max_index_size by dis...
Definition: seek.c:50
MATROSKA_ID_ENCODINGCOMPSETTINGS
#define MATROSKA_ID_ENCODINGCOMPSETTINGS
Definition: matroska.h:181
flac.h
MatroskaDemuxContext::cues_parsing_deferred
int cues_parsing_deferred
Definition: matroskadec.c: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
AVStreamGroupLayeredVideo::el_index
unsigned int el_index
Index of the enhancement layer stream in AVStreamGroup.
Definition: avformat.h:1083
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:263
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
Number of padding audio samples at the start.
Definition: codec_par.h:239
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:352
MATROSKA_ID_BLOCKADDID
#define MATROSKA_ID_BLOCKADDID
Definition: matroska.h:241
AVSphericalMapping
This structure describes how to handle spherical videos, outlining information about projection,...
Definition: spherical.h:100
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:383
AV_RB64
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
Definition: bytestream.h:95
MatroskaBlockAdditionMapping::value
uint64_t value
Definition: matroskadec.c:253
MatroskaTrackAudio::out_samplerate
double out_samplerate
Definition: matroskadec.c:228
av_dynamic_hdr_smpte2094_app5_from_t35
int av_dynamic_hdr_smpte2094_app5_from_t35(AVDynamicHDRSmpte2094App5 *s, const uint8_t *data, size_t size)
Parse the user data formatted as ITU-T T.35 message to AVDynamicHDRSmpte2094App5.
Definition: hdr_dynamic_metadata.c:433
AVSphericalMapping::yaw
int32_t yaw
Rotation around the up vector [-180, 180].
Definition: spherical.h:144
src
#define src
Definition: vp8dsp.c:248
MATROSKA_ID_TAGTARGETS_CHAPTERUID
#define MATROSKA_ID_TAGTARGETS_CHAPTERUID
Definition: matroska.h:224
MatroskaTrackEncryption
Definition: matroskadec.c: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
duration
static int64_t duration
Definition: ffplay.c:329
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:239
MATROSKA_ID_TRACKTIMECODESCALE
#define MATROSKA_ID_TRACKTIMECODESCALE
Definition: matroska.h:111
matroska_chapter_entry
static EbmlSyntax matroska_chapter_entry[9]
Definition: matroskadec.c: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:2118
AV_CODEC_ID_MLP
@ AV_CODEC_ID_MLP
Definition: codec_id.h:490
is_keyframe
static int is_keyframe(NalUnitType naltype)
Definition: libx265.c:94
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
CountedElement
Definition: matroskadec.c:103
av_fourcc2str
#define av_fourcc2str(fourcc)
Definition: avutil.h:347
av_index_search_timestamp
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags)
Get the index for a specific timestamp.
Definition: seek.c:245
MatroskaMasteringMeta::r_y
double r_y
Definition: matroskadec.c:168
matroska_parse_flac
static int matroska_parse_flac(AVFormatContext *s, MatroskaTrack *track, int *offset)
Definition: matroskadec.c:2145
ff_alloc_extradata
int ff_alloc_extradata(AVCodecParameters *par, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0.
Definition: utils.c:237
AVDOVIDecoderConfigurationRecord
Definition: dovi_meta.h:55
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:349
MATROSKA_ID_BLOCKADDITIONS
#define MATROSKA_ID_BLOCKADDITIONS
Definition: matroska.h:239
MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
@ MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED
Definition: matroska.h:298
MatroskaDemuxContext::done
int done
Definition: matroskadec.c:414