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