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