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