annotate ffmpeg/libavformat/matroskadec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * Matroska file demuxer
yading@11 3 * Copyright (c) 2003-2008 The FFmpeg Project
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 /**
yading@11 23 * @file
yading@11 24 * Matroska file demuxer
yading@11 25 * @author Ronald Bultje <rbultje@ronald.bitfreak.net>
yading@11 26 * @author with a little help from Moritz Bunkus <moritz@bunkus.org>
yading@11 27 * @author totally reworked by Aurelien Jacobs <aurel@gnuage.org>
yading@11 28 * @see specs available on the Matroska project page: http://www.matroska.org/
yading@11 29 */
yading@11 30
yading@11 31 #include <stdio.h>
yading@11 32 #include "avformat.h"
yading@11 33 #include "internal.h"
yading@11 34 #include "avio_internal.h"
yading@11 35 /* For ff_codec_get_id(). */
yading@11 36 #include "riff.h"
yading@11 37 #include "isom.h"
yading@11 38 #include "rmsipr.h"
yading@11 39 #include "matroska.h"
yading@11 40 #include "libavcodec/bytestream.h"
yading@11 41 #include "libavcodec/mpeg4audio.h"
yading@11 42 #include "libavutil/base64.h"
yading@11 43 #include "libavutil/intfloat.h"
yading@11 44 #include "libavutil/intreadwrite.h"
yading@11 45 #include "libavutil/avstring.h"
yading@11 46 #include "libavutil/lzo.h"
yading@11 47 #include "libavutil/dict.h"
yading@11 48 #if CONFIG_ZLIB
yading@11 49 #include <zlib.h>
yading@11 50 #endif
yading@11 51 #if CONFIG_BZLIB
yading@11 52 #include <bzlib.h>
yading@11 53 #endif
yading@11 54
yading@11 55 typedef enum {
yading@11 56 EBML_NONE,
yading@11 57 EBML_UINT,
yading@11 58 EBML_FLOAT,
yading@11 59 EBML_STR,
yading@11 60 EBML_UTF8,
yading@11 61 EBML_BIN,
yading@11 62 EBML_NEST,
yading@11 63 EBML_PASS,
yading@11 64 EBML_STOP,
yading@11 65 EBML_TYPE_COUNT
yading@11 66 } EbmlType;
yading@11 67
yading@11 68 typedef const struct EbmlSyntax {
yading@11 69 uint32_t id;
yading@11 70 EbmlType type;
yading@11 71 int list_elem_size;
yading@11 72 int data_offset;
yading@11 73 union {
yading@11 74 uint64_t u;
yading@11 75 double f;
yading@11 76 const char *s;
yading@11 77 const struct EbmlSyntax *n;
yading@11 78 } def;
yading@11 79 } EbmlSyntax;
yading@11 80
yading@11 81 typedef struct {
yading@11 82 int nb_elem;
yading@11 83 void *elem;
yading@11 84 } EbmlList;
yading@11 85
yading@11 86 typedef struct {
yading@11 87 int size;
yading@11 88 uint8_t *data;
yading@11 89 int64_t pos;
yading@11 90 } EbmlBin;
yading@11 91
yading@11 92 typedef struct {
yading@11 93 uint64_t version;
yading@11 94 uint64_t max_size;
yading@11 95 uint64_t id_length;
yading@11 96 char *doctype;
yading@11 97 uint64_t doctype_version;
yading@11 98 } Ebml;
yading@11 99
yading@11 100 typedef struct {
yading@11 101 uint64_t algo;
yading@11 102 EbmlBin settings;
yading@11 103 } MatroskaTrackCompression;
yading@11 104
yading@11 105 typedef struct {
yading@11 106 uint64_t algo;
yading@11 107 EbmlBin key_id;
yading@11 108 } MatroskaTrackEncryption;
yading@11 109
yading@11 110 typedef struct {
yading@11 111 uint64_t scope;
yading@11 112 uint64_t type;
yading@11 113 MatroskaTrackCompression compression;
yading@11 114 MatroskaTrackEncryption encryption;
yading@11 115 } MatroskaTrackEncoding;
yading@11 116
yading@11 117 typedef struct {
yading@11 118 double frame_rate;
yading@11 119 uint64_t display_width;
yading@11 120 uint64_t display_height;
yading@11 121 uint64_t pixel_width;
yading@11 122 uint64_t pixel_height;
yading@11 123 EbmlBin color_space;
yading@11 124 uint64_t stereo_mode;
yading@11 125 uint64_t alpha_mode;
yading@11 126 } MatroskaTrackVideo;
yading@11 127
yading@11 128 typedef struct {
yading@11 129 double samplerate;
yading@11 130 double out_samplerate;
yading@11 131 uint64_t bitdepth;
yading@11 132 uint64_t channels;
yading@11 133
yading@11 134 /* real audio header (extracted from extradata) */
yading@11 135 int coded_framesize;
yading@11 136 int sub_packet_h;
yading@11 137 int frame_size;
yading@11 138 int sub_packet_size;
yading@11 139 int sub_packet_cnt;
yading@11 140 int pkt_cnt;
yading@11 141 uint64_t buf_timecode;
yading@11 142 uint8_t *buf;
yading@11 143 } MatroskaTrackAudio;
yading@11 144
yading@11 145 typedef struct {
yading@11 146 uint64_t uid;
yading@11 147 uint64_t type;
yading@11 148 } MatroskaTrackPlane;
yading@11 149
yading@11 150 typedef struct {
yading@11 151 EbmlList combine_planes;
yading@11 152 } MatroskaTrackOperation;
yading@11 153
yading@11 154 typedef struct {
yading@11 155 uint64_t num;
yading@11 156 uint64_t uid;
yading@11 157 uint64_t type;
yading@11 158 char *name;
yading@11 159 char *codec_id;
yading@11 160 EbmlBin codec_priv;
yading@11 161 char *language;
yading@11 162 double time_scale;
yading@11 163 uint64_t default_duration;
yading@11 164 uint64_t flag_default;
yading@11 165 uint64_t flag_forced;
yading@11 166 MatroskaTrackVideo video;
yading@11 167 MatroskaTrackAudio audio;
yading@11 168 MatroskaTrackOperation operation;
yading@11 169 EbmlList encodings;
yading@11 170
yading@11 171 AVStream *stream;
yading@11 172 int64_t end_timecode;
yading@11 173 int ms_compat;
yading@11 174 uint64_t max_block_additional_id;
yading@11 175 } MatroskaTrack;
yading@11 176
yading@11 177 typedef struct {
yading@11 178 uint64_t uid;
yading@11 179 char *filename;
yading@11 180 char *mime;
yading@11 181 EbmlBin bin;
yading@11 182
yading@11 183 AVStream *stream;
yading@11 184 } MatroskaAttachement;
yading@11 185
yading@11 186 typedef struct {
yading@11 187 uint64_t start;
yading@11 188 uint64_t end;
yading@11 189 uint64_t uid;
yading@11 190 char *title;
yading@11 191
yading@11 192 AVChapter *chapter;
yading@11 193 } MatroskaChapter;
yading@11 194
yading@11 195 typedef struct {
yading@11 196 uint64_t track;
yading@11 197 uint64_t pos;
yading@11 198 } MatroskaIndexPos;
yading@11 199
yading@11 200 typedef struct {
yading@11 201 uint64_t time;
yading@11 202 EbmlList pos;
yading@11 203 } MatroskaIndex;
yading@11 204
yading@11 205 typedef struct {
yading@11 206 char *name;
yading@11 207 char *string;
yading@11 208 char *lang;
yading@11 209 uint64_t def;
yading@11 210 EbmlList sub;
yading@11 211 } MatroskaTag;
yading@11 212
yading@11 213 typedef struct {
yading@11 214 char *type;
yading@11 215 uint64_t typevalue;
yading@11 216 uint64_t trackuid;
yading@11 217 uint64_t chapteruid;
yading@11 218 uint64_t attachuid;
yading@11 219 } MatroskaTagTarget;
yading@11 220
yading@11 221 typedef struct {
yading@11 222 MatroskaTagTarget target;
yading@11 223 EbmlList tag;
yading@11 224 } MatroskaTags;
yading@11 225
yading@11 226 typedef struct {
yading@11 227 uint64_t id;
yading@11 228 uint64_t pos;
yading@11 229 } MatroskaSeekhead;
yading@11 230
yading@11 231 typedef struct {
yading@11 232 uint64_t start;
yading@11 233 uint64_t length;
yading@11 234 } MatroskaLevel;
yading@11 235
yading@11 236 typedef struct {
yading@11 237 uint64_t timecode;
yading@11 238 EbmlList blocks;
yading@11 239 } MatroskaCluster;
yading@11 240
yading@11 241 typedef struct {
yading@11 242 AVFormatContext *ctx;
yading@11 243
yading@11 244 /* EBML stuff */
yading@11 245 int num_levels;
yading@11 246 MatroskaLevel levels[EBML_MAX_DEPTH];
yading@11 247 int level_up;
yading@11 248 uint32_t current_id;
yading@11 249
yading@11 250 uint64_t time_scale;
yading@11 251 double duration;
yading@11 252 char *title;
yading@11 253 EbmlBin date_utc;
yading@11 254 EbmlList tracks;
yading@11 255 EbmlList attachments;
yading@11 256 EbmlList chapters;
yading@11 257 EbmlList index;
yading@11 258 EbmlList tags;
yading@11 259 EbmlList seekhead;
yading@11 260
yading@11 261 /* byte position of the segment inside the stream */
yading@11 262 int64_t segment_start;
yading@11 263
yading@11 264 /* the packet queue */
yading@11 265 AVPacket **packets;
yading@11 266 int num_packets;
yading@11 267 AVPacket *prev_pkt;
yading@11 268
yading@11 269 int done;
yading@11 270
yading@11 271 /* What to skip before effectively reading a packet. */
yading@11 272 int skip_to_keyframe;
yading@11 273 uint64_t skip_to_timecode;
yading@11 274
yading@11 275 /* File has a CUES element, but we defer parsing until it is needed. */
yading@11 276 int cues_parsing_deferred;
yading@11 277
yading@11 278 int current_cluster_num_blocks;
yading@11 279 int64_t current_cluster_pos;
yading@11 280 MatroskaCluster current_cluster;
yading@11 281
yading@11 282 /* File has SSA subtitles which prevent incremental cluster parsing. */
yading@11 283 int contains_ssa;
yading@11 284 } MatroskaDemuxContext;
yading@11 285
yading@11 286 typedef struct {
yading@11 287 uint64_t duration;
yading@11 288 int64_t reference;
yading@11 289 uint64_t non_simple;
yading@11 290 EbmlBin bin;
yading@11 291 uint64_t additional_id;
yading@11 292 EbmlBin additional;
yading@11 293 } MatroskaBlock;
yading@11 294
yading@11 295 static EbmlSyntax ebml_header[] = {
yading@11 296 { EBML_ID_EBMLREADVERSION, EBML_UINT, 0, offsetof(Ebml,version), {.u=EBML_VERSION} },
yading@11 297 { EBML_ID_EBMLMAXSIZELENGTH, EBML_UINT, 0, offsetof(Ebml,max_size), {.u=8} },
yading@11 298 { EBML_ID_EBMLMAXIDLENGTH, EBML_UINT, 0, offsetof(Ebml,id_length), {.u=4} },
yading@11 299 { EBML_ID_DOCTYPE, EBML_STR, 0, offsetof(Ebml,doctype), {.s="(none)"} },
yading@11 300 { EBML_ID_DOCTYPEREADVERSION, EBML_UINT, 0, offsetof(Ebml,doctype_version), {.u=1} },
yading@11 301 { EBML_ID_EBMLVERSION, EBML_NONE },
yading@11 302 { EBML_ID_DOCTYPEVERSION, EBML_NONE },
yading@11 303 { 0 }
yading@11 304 };
yading@11 305
yading@11 306 static EbmlSyntax ebml_syntax[] = {
yading@11 307 { EBML_ID_HEADER, EBML_NEST, 0, 0, {.n=ebml_header} },
yading@11 308 { 0 }
yading@11 309 };
yading@11 310
yading@11 311 static EbmlSyntax matroska_info[] = {
yading@11 312 { MATROSKA_ID_TIMECODESCALE, EBML_UINT, 0, offsetof(MatroskaDemuxContext,time_scale), {.u=1000000} },
yading@11 313 { MATROSKA_ID_DURATION, EBML_FLOAT, 0, offsetof(MatroskaDemuxContext,duration) },
yading@11 314 { MATROSKA_ID_TITLE, EBML_UTF8, 0, offsetof(MatroskaDemuxContext,title) },
yading@11 315 { MATROSKA_ID_WRITINGAPP, EBML_NONE },
yading@11 316 { MATROSKA_ID_MUXINGAPP, EBML_NONE },
yading@11 317 { MATROSKA_ID_DATEUTC, EBML_BIN, 0, offsetof(MatroskaDemuxContext,date_utc) },
yading@11 318 { MATROSKA_ID_SEGMENTUID, EBML_NONE },
yading@11 319 { 0 }
yading@11 320 };
yading@11 321
yading@11 322 static EbmlSyntax matroska_track_video[] = {
yading@11 323 { MATROSKA_ID_VIDEOFRAMERATE, EBML_FLOAT,0, offsetof(MatroskaTrackVideo,frame_rate) },
yading@11 324 { MATROSKA_ID_VIDEODISPLAYWIDTH, EBML_UINT, 0, offsetof(MatroskaTrackVideo,display_width), {.u=-1} },
yading@11 325 { MATROSKA_ID_VIDEODISPLAYHEIGHT, EBML_UINT, 0, offsetof(MatroskaTrackVideo,display_height), {.u=-1} },
yading@11 326 { MATROSKA_ID_VIDEOPIXELWIDTH, EBML_UINT, 0, offsetof(MatroskaTrackVideo,pixel_width) },
yading@11 327 { MATROSKA_ID_VIDEOPIXELHEIGHT, EBML_UINT, 0, offsetof(MatroskaTrackVideo,pixel_height) },
yading@11 328 { MATROSKA_ID_VIDEOCOLORSPACE, EBML_BIN, 0, offsetof(MatroskaTrackVideo,color_space) },
yading@11 329 { MATROSKA_ID_VIDEOSTEREOMODE, EBML_UINT, 0, offsetof(MatroskaTrackVideo,stereo_mode) },
yading@11 330 { MATROSKA_ID_VIDEOALPHAMODE, EBML_UINT, 0, offsetof(MatroskaTrackVideo,alpha_mode) },
yading@11 331 { MATROSKA_ID_VIDEOPIXELCROPB, EBML_NONE },
yading@11 332 { MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE },
yading@11 333 { MATROSKA_ID_VIDEOPIXELCROPL, EBML_NONE },
yading@11 334 { MATROSKA_ID_VIDEOPIXELCROPR, EBML_NONE },
yading@11 335 { MATROSKA_ID_VIDEODISPLAYUNIT, EBML_NONE },
yading@11 336 { MATROSKA_ID_VIDEOFLAGINTERLACED,EBML_NONE },
yading@11 337 { MATROSKA_ID_VIDEOASPECTRATIO, EBML_NONE },
yading@11 338 { 0 }
yading@11 339 };
yading@11 340
yading@11 341 static EbmlSyntax matroska_track_audio[] = {
yading@11 342 { MATROSKA_ID_AUDIOSAMPLINGFREQ, EBML_FLOAT,0, offsetof(MatroskaTrackAudio,samplerate), {.f=8000.0} },
yading@11 343 { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ,EBML_FLOAT,0,offsetof(MatroskaTrackAudio,out_samplerate) },
yading@11 344 { MATROSKA_ID_AUDIOBITDEPTH, EBML_UINT, 0, offsetof(MatroskaTrackAudio,bitdepth) },
yading@11 345 { MATROSKA_ID_AUDIOCHANNELS, EBML_UINT, 0, offsetof(MatroskaTrackAudio,channels), {.u=1} },
yading@11 346 { 0 }
yading@11 347 };
yading@11 348
yading@11 349 static EbmlSyntax matroska_track_encoding_compression[] = {
yading@11 350 { MATROSKA_ID_ENCODINGCOMPALGO, EBML_UINT, 0, offsetof(MatroskaTrackCompression,algo), {.u=0} },
yading@11 351 { MATROSKA_ID_ENCODINGCOMPSETTINGS,EBML_BIN, 0, offsetof(MatroskaTrackCompression,settings) },
yading@11 352 { 0 }
yading@11 353 };
yading@11 354
yading@11 355 static EbmlSyntax matroska_track_encoding_encryption[] = {
yading@11 356 { MATROSKA_ID_ENCODINGENCALGO, EBML_UINT, 0, offsetof(MatroskaTrackEncryption,algo), {.u=0} },
yading@11 357 { MATROSKA_ID_ENCODINGENCKEYID, EBML_BIN, 0, offsetof(MatroskaTrackEncryption,key_id) },
yading@11 358 { MATROSKA_ID_ENCODINGENCAESSETTINGS, EBML_NONE },
yading@11 359 { MATROSKA_ID_ENCODINGSIGALGO, EBML_NONE },
yading@11 360 { MATROSKA_ID_ENCODINGSIGHASHALGO, EBML_NONE },
yading@11 361 { MATROSKA_ID_ENCODINGSIGKEYID, EBML_NONE },
yading@11 362 { MATROSKA_ID_ENCODINGSIGNATURE, EBML_NONE },
yading@11 363 { 0 }
yading@11 364 };
yading@11 365 static EbmlSyntax matroska_track_encoding[] = {
yading@11 366 { MATROSKA_ID_ENCODINGSCOPE, EBML_UINT, 0, offsetof(MatroskaTrackEncoding,scope), {.u=1} },
yading@11 367 { MATROSKA_ID_ENCODINGTYPE, EBML_UINT, 0, offsetof(MatroskaTrackEncoding,type), {.u=0} },
yading@11 368 { MATROSKA_ID_ENCODINGCOMPRESSION,EBML_NEST, 0, offsetof(MatroskaTrackEncoding,compression), {.n=matroska_track_encoding_compression} },
yading@11 369 { MATROSKA_ID_ENCODINGENCRYPTION, EBML_NEST, 0, offsetof(MatroskaTrackEncoding,encryption), {.n=matroska_track_encoding_encryption} },
yading@11 370 { MATROSKA_ID_ENCODINGORDER, EBML_NONE },
yading@11 371 { 0 }
yading@11 372 };
yading@11 373
yading@11 374 static EbmlSyntax matroska_track_encodings[] = {
yading@11 375 { MATROSKA_ID_TRACKCONTENTENCODING, EBML_NEST, sizeof(MatroskaTrackEncoding), offsetof(MatroskaTrack,encodings), {.n=matroska_track_encoding} },
yading@11 376 { 0 }
yading@11 377 };
yading@11 378
yading@11 379 static EbmlSyntax matroska_track_plane[] = {
yading@11 380 { MATROSKA_ID_TRACKPLANEUID, EBML_UINT, 0, offsetof(MatroskaTrackPlane,uid) },
yading@11 381 { MATROSKA_ID_TRACKPLANETYPE, EBML_UINT, 0, offsetof(MatroskaTrackPlane,type) },
yading@11 382 { 0 }
yading@11 383 };
yading@11 384
yading@11 385 static EbmlSyntax matroska_track_combine_planes[] = {
yading@11 386 { MATROSKA_ID_TRACKPLANE, EBML_NEST, sizeof(MatroskaTrackPlane), offsetof(MatroskaTrackOperation,combine_planes), {.n=matroska_track_plane} },
yading@11 387 { 0 }
yading@11 388 };
yading@11 389
yading@11 390 static EbmlSyntax matroska_track_operation[] = {
yading@11 391 { MATROSKA_ID_TRACKCOMBINEPLANES, EBML_NEST, 0, 0, {.n=matroska_track_combine_planes} },
yading@11 392 { 0 }
yading@11 393 };
yading@11 394
yading@11 395 static EbmlSyntax matroska_track[] = {
yading@11 396 { MATROSKA_ID_TRACKNUMBER, EBML_UINT, 0, offsetof(MatroskaTrack,num) },
yading@11 397 { MATROSKA_ID_TRACKNAME, EBML_UTF8, 0, offsetof(MatroskaTrack,name) },
yading@11 398 { MATROSKA_ID_TRACKUID, EBML_UINT, 0, offsetof(MatroskaTrack,uid) },
yading@11 399 { MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, offsetof(MatroskaTrack,type) },
yading@11 400 { MATROSKA_ID_CODECID, EBML_STR, 0, offsetof(MatroskaTrack,codec_id) },
yading@11 401 { MATROSKA_ID_CODECPRIVATE, EBML_BIN, 0, offsetof(MatroskaTrack,codec_priv) },
yading@11 402 { MATROSKA_ID_TRACKLANGUAGE, EBML_UTF8, 0, offsetof(MatroskaTrack,language), {.s="eng"} },
yading@11 403 { MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, offsetof(MatroskaTrack,default_duration) },
yading@11 404 { MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT,0, offsetof(MatroskaTrack,time_scale), {.f=1.0} },
yading@11 405 { MATROSKA_ID_TRACKFLAGDEFAULT, EBML_UINT, 0, offsetof(MatroskaTrack,flag_default), {.u=1} },
yading@11 406 { MATROSKA_ID_TRACKFLAGFORCED, EBML_UINT, 0, offsetof(MatroskaTrack,flag_forced), {.u=0} },
yading@11 407 { MATROSKA_ID_TRACKVIDEO, EBML_NEST, 0, offsetof(MatroskaTrack,video), {.n=matroska_track_video} },
yading@11 408 { MATROSKA_ID_TRACKAUDIO, EBML_NEST, 0, offsetof(MatroskaTrack,audio), {.n=matroska_track_audio} },
yading@11 409 { MATROSKA_ID_TRACKOPERATION, EBML_NEST, 0, offsetof(MatroskaTrack,operation), {.n=matroska_track_operation} },
yading@11 410 { MATROSKA_ID_TRACKCONTENTENCODINGS,EBML_NEST, 0, 0, {.n=matroska_track_encodings} },
yading@11 411 { MATROSKA_ID_TRACKMAXBLKADDID, EBML_UINT, 0, offsetof(MatroskaTrack,max_block_additional_id) },
yading@11 412 { MATROSKA_ID_TRACKFLAGENABLED, EBML_NONE },
yading@11 413 { MATROSKA_ID_TRACKFLAGLACING, EBML_NONE },
yading@11 414 { MATROSKA_ID_CODECNAME, EBML_NONE },
yading@11 415 { MATROSKA_ID_CODECDECODEALL, EBML_NONE },
yading@11 416 { MATROSKA_ID_CODECINFOURL, EBML_NONE },
yading@11 417 { MATROSKA_ID_CODECDOWNLOADURL, EBML_NONE },
yading@11 418 { MATROSKA_ID_TRACKMINCACHE, EBML_NONE },
yading@11 419 { MATROSKA_ID_TRACKMAXCACHE, EBML_NONE },
yading@11 420 { 0 }
yading@11 421 };
yading@11 422
yading@11 423 static EbmlSyntax matroska_tracks[] = {
yading@11 424 { MATROSKA_ID_TRACKENTRY, EBML_NEST, sizeof(MatroskaTrack), offsetof(MatroskaDemuxContext,tracks), {.n=matroska_track} },
yading@11 425 { 0 }
yading@11 426 };
yading@11 427
yading@11 428 static EbmlSyntax matroska_attachment[] = {
yading@11 429 { MATROSKA_ID_FILEUID, EBML_UINT, 0, offsetof(MatroskaAttachement,uid) },
yading@11 430 { MATROSKA_ID_FILENAME, EBML_UTF8, 0, offsetof(MatroskaAttachement,filename) },
yading@11 431 { MATROSKA_ID_FILEMIMETYPE, EBML_STR, 0, offsetof(MatroskaAttachement,mime) },
yading@11 432 { MATROSKA_ID_FILEDATA, EBML_BIN, 0, offsetof(MatroskaAttachement,bin) },
yading@11 433 { MATROSKA_ID_FILEDESC, EBML_NONE },
yading@11 434 { 0 }
yading@11 435 };
yading@11 436
yading@11 437 static EbmlSyntax matroska_attachments[] = {
yading@11 438 { MATROSKA_ID_ATTACHEDFILE, EBML_NEST, sizeof(MatroskaAttachement), offsetof(MatroskaDemuxContext,attachments), {.n=matroska_attachment} },
yading@11 439 { 0 }
yading@11 440 };
yading@11 441
yading@11 442 static EbmlSyntax matroska_chapter_display[] = {
yading@11 443 { MATROSKA_ID_CHAPSTRING, EBML_UTF8, 0, offsetof(MatroskaChapter,title) },
yading@11 444 { MATROSKA_ID_CHAPLANG, EBML_NONE },
yading@11 445 { 0 }
yading@11 446 };
yading@11 447
yading@11 448 static EbmlSyntax matroska_chapter_entry[] = {
yading@11 449 { MATROSKA_ID_CHAPTERTIMESTART, EBML_UINT, 0, offsetof(MatroskaChapter,start), {.u=AV_NOPTS_VALUE} },
yading@11 450 { MATROSKA_ID_CHAPTERTIMEEND, EBML_UINT, 0, offsetof(MatroskaChapter,end), {.u=AV_NOPTS_VALUE} },
yading@11 451 { MATROSKA_ID_CHAPTERUID, EBML_UINT, 0, offsetof(MatroskaChapter,uid) },
yading@11 452 { MATROSKA_ID_CHAPTERDISPLAY, EBML_NEST, 0, 0, {.n=matroska_chapter_display} },
yading@11 453 { MATROSKA_ID_CHAPTERFLAGHIDDEN, EBML_NONE },
yading@11 454 { MATROSKA_ID_CHAPTERFLAGENABLED, EBML_NONE },
yading@11 455 { MATROSKA_ID_CHAPTERPHYSEQUIV, EBML_NONE },
yading@11 456 { MATROSKA_ID_CHAPTERATOM, EBML_NONE },
yading@11 457 { 0 }
yading@11 458 };
yading@11 459
yading@11 460 static EbmlSyntax matroska_chapter[] = {
yading@11 461 { MATROSKA_ID_CHAPTERATOM, EBML_NEST, sizeof(MatroskaChapter), offsetof(MatroskaDemuxContext,chapters), {.n=matroska_chapter_entry} },
yading@11 462 { MATROSKA_ID_EDITIONUID, EBML_NONE },
yading@11 463 { MATROSKA_ID_EDITIONFLAGHIDDEN, EBML_NONE },
yading@11 464 { MATROSKA_ID_EDITIONFLAGDEFAULT, EBML_NONE },
yading@11 465 { MATROSKA_ID_EDITIONFLAGORDERED, EBML_NONE },
yading@11 466 { 0 }
yading@11 467 };
yading@11 468
yading@11 469 static EbmlSyntax matroska_chapters[] = {
yading@11 470 { MATROSKA_ID_EDITIONENTRY, EBML_NEST, 0, 0, {.n=matroska_chapter} },
yading@11 471 { 0 }
yading@11 472 };
yading@11 473
yading@11 474 static EbmlSyntax matroska_index_pos[] = {
yading@11 475 { MATROSKA_ID_CUETRACK, EBML_UINT, 0, offsetof(MatroskaIndexPos,track) },
yading@11 476 { MATROSKA_ID_CUECLUSTERPOSITION, EBML_UINT, 0, offsetof(MatroskaIndexPos,pos) },
yading@11 477 { MATROSKA_ID_CUEBLOCKNUMBER, EBML_NONE },
yading@11 478 { 0 }
yading@11 479 };
yading@11 480
yading@11 481 static EbmlSyntax matroska_index_entry[] = {
yading@11 482 { MATROSKA_ID_CUETIME, EBML_UINT, 0, offsetof(MatroskaIndex,time) },
yading@11 483 { MATROSKA_ID_CUETRACKPOSITION, EBML_NEST, sizeof(MatroskaIndexPos), offsetof(MatroskaIndex,pos), {.n=matroska_index_pos} },
yading@11 484 { 0 }
yading@11 485 };
yading@11 486
yading@11 487 static EbmlSyntax matroska_index[] = {
yading@11 488 { MATROSKA_ID_POINTENTRY, EBML_NEST, sizeof(MatroskaIndex), offsetof(MatroskaDemuxContext,index), {.n=matroska_index_entry} },
yading@11 489 { 0 }
yading@11 490 };
yading@11 491
yading@11 492 static EbmlSyntax matroska_simpletag[] = {
yading@11 493 { MATROSKA_ID_TAGNAME, EBML_UTF8, 0, offsetof(MatroskaTag,name) },
yading@11 494 { MATROSKA_ID_TAGSTRING, EBML_UTF8, 0, offsetof(MatroskaTag,string) },
yading@11 495 { MATROSKA_ID_TAGLANG, EBML_STR, 0, offsetof(MatroskaTag,lang), {.s="und"} },
yading@11 496 { MATROSKA_ID_TAGDEFAULT, EBML_UINT, 0, offsetof(MatroskaTag,def) },
yading@11 497 { MATROSKA_ID_TAGDEFAULT_BUG, EBML_UINT, 0, offsetof(MatroskaTag,def) },
yading@11 498 { MATROSKA_ID_SIMPLETAG, EBML_NEST, sizeof(MatroskaTag), offsetof(MatroskaTag,sub), {.n=matroska_simpletag} },
yading@11 499 { 0 }
yading@11 500 };
yading@11 501
yading@11 502 static EbmlSyntax matroska_tagtargets[] = {
yading@11 503 { MATROSKA_ID_TAGTARGETS_TYPE, EBML_STR, 0, offsetof(MatroskaTagTarget,type) },
yading@11 504 { MATROSKA_ID_TAGTARGETS_TYPEVALUE, EBML_UINT, 0, offsetof(MatroskaTagTarget,typevalue), {.u=50} },
yading@11 505 { MATROSKA_ID_TAGTARGETS_TRACKUID, EBML_UINT, 0, offsetof(MatroskaTagTarget,trackuid) },
yading@11 506 { MATROSKA_ID_TAGTARGETS_CHAPTERUID,EBML_UINT, 0, offsetof(MatroskaTagTarget,chapteruid) },
yading@11 507 { MATROSKA_ID_TAGTARGETS_ATTACHUID, EBML_UINT, 0, offsetof(MatroskaTagTarget,attachuid) },
yading@11 508 { 0 }
yading@11 509 };
yading@11 510
yading@11 511 static EbmlSyntax matroska_tag[] = {
yading@11 512 { MATROSKA_ID_SIMPLETAG, EBML_NEST, sizeof(MatroskaTag), offsetof(MatroskaTags,tag), {.n=matroska_simpletag} },
yading@11 513 { MATROSKA_ID_TAGTARGETS, EBML_NEST, 0, offsetof(MatroskaTags,target), {.n=matroska_tagtargets} },
yading@11 514 { 0 }
yading@11 515 };
yading@11 516
yading@11 517 static EbmlSyntax matroska_tags[] = {
yading@11 518 { MATROSKA_ID_TAG, EBML_NEST, sizeof(MatroskaTags), offsetof(MatroskaDemuxContext,tags), {.n=matroska_tag} },
yading@11 519 { 0 }
yading@11 520 };
yading@11 521
yading@11 522 static EbmlSyntax matroska_seekhead_entry[] = {
yading@11 523 { MATROSKA_ID_SEEKID, EBML_UINT, 0, offsetof(MatroskaSeekhead,id) },
yading@11 524 { MATROSKA_ID_SEEKPOSITION, EBML_UINT, 0, offsetof(MatroskaSeekhead,pos), {.u=-1} },
yading@11 525 { 0 }
yading@11 526 };
yading@11 527
yading@11 528 static EbmlSyntax matroska_seekhead[] = {
yading@11 529 { MATROSKA_ID_SEEKENTRY, EBML_NEST, sizeof(MatroskaSeekhead), offsetof(MatroskaDemuxContext,seekhead), {.n=matroska_seekhead_entry} },
yading@11 530 { 0 }
yading@11 531 };
yading@11 532
yading@11 533 static EbmlSyntax matroska_segment[] = {
yading@11 534 { MATROSKA_ID_INFO, EBML_NEST, 0, 0, {.n=matroska_info } },
yading@11 535 { MATROSKA_ID_TRACKS, EBML_NEST, 0, 0, {.n=matroska_tracks } },
yading@11 536 { MATROSKA_ID_ATTACHMENTS, EBML_NEST, 0, 0, {.n=matroska_attachments} },
yading@11 537 { MATROSKA_ID_CHAPTERS, EBML_NEST, 0, 0, {.n=matroska_chapters } },
yading@11 538 { MATROSKA_ID_CUES, EBML_NEST, 0, 0, {.n=matroska_index } },
yading@11 539 { MATROSKA_ID_TAGS, EBML_NEST, 0, 0, {.n=matroska_tags } },
yading@11 540 { MATROSKA_ID_SEEKHEAD, EBML_NEST, 0, 0, {.n=matroska_seekhead } },
yading@11 541 { MATROSKA_ID_CLUSTER, EBML_STOP },
yading@11 542 { 0 }
yading@11 543 };
yading@11 544
yading@11 545 static EbmlSyntax matroska_segments[] = {
yading@11 546 { MATROSKA_ID_SEGMENT, EBML_NEST, 0, 0, {.n=matroska_segment } },
yading@11 547 { 0 }
yading@11 548 };
yading@11 549
yading@11 550 static EbmlSyntax matroska_blockmore[] = {
yading@11 551 { MATROSKA_ID_BLOCKADDID, EBML_UINT, 0, offsetof(MatroskaBlock,additional_id) },
yading@11 552 { MATROSKA_ID_BLOCKADDITIONAL, EBML_BIN, 0, offsetof(MatroskaBlock,additional) },
yading@11 553 { 0 }
yading@11 554 };
yading@11 555
yading@11 556 static EbmlSyntax matroska_blockadditions[] = {
yading@11 557 { MATROSKA_ID_BLOCKMORE, EBML_NEST, 0, 0, {.n=matroska_blockmore} },
yading@11 558 { 0 }
yading@11 559 };
yading@11 560
yading@11 561 static EbmlSyntax matroska_blockgroup[] = {
yading@11 562 { MATROSKA_ID_BLOCK, EBML_BIN, 0, offsetof(MatroskaBlock,bin) },
yading@11 563 { MATROSKA_ID_BLOCKADDITIONS, EBML_NEST, 0, 0, {.n=matroska_blockadditions} },
yading@11 564 { MATROSKA_ID_SIMPLEBLOCK, EBML_BIN, 0, offsetof(MatroskaBlock,bin) },
yading@11 565 { MATROSKA_ID_BLOCKDURATION, EBML_UINT, 0, offsetof(MatroskaBlock,duration) },
yading@11 566 { MATROSKA_ID_BLOCKREFERENCE, EBML_UINT, 0, offsetof(MatroskaBlock,reference) },
yading@11 567 { 1, EBML_UINT, 0, offsetof(MatroskaBlock,non_simple), {.u=1} },
yading@11 568 { 0 }
yading@11 569 };
yading@11 570
yading@11 571 static EbmlSyntax matroska_cluster[] = {
yading@11 572 { MATROSKA_ID_CLUSTERTIMECODE,EBML_UINT,0, offsetof(MatroskaCluster,timecode) },
yading@11 573 { MATROSKA_ID_BLOCKGROUP, EBML_NEST, sizeof(MatroskaBlock), offsetof(MatroskaCluster,blocks), {.n=matroska_blockgroup} },
yading@11 574 { MATROSKA_ID_SIMPLEBLOCK, EBML_PASS, sizeof(MatroskaBlock), offsetof(MatroskaCluster,blocks), {.n=matroska_blockgroup} },
yading@11 575 { MATROSKA_ID_CLUSTERPOSITION,EBML_NONE },
yading@11 576 { MATROSKA_ID_CLUSTERPREVSIZE,EBML_NONE },
yading@11 577 { 0 }
yading@11 578 };
yading@11 579
yading@11 580 static EbmlSyntax matroska_clusters[] = {
yading@11 581 { MATROSKA_ID_CLUSTER, EBML_NEST, 0, 0, {.n=matroska_cluster} },
yading@11 582 { MATROSKA_ID_INFO, EBML_NONE },
yading@11 583 { MATROSKA_ID_CUES, EBML_NONE },
yading@11 584 { MATROSKA_ID_TAGS, EBML_NONE },
yading@11 585 { MATROSKA_ID_SEEKHEAD, EBML_NONE },
yading@11 586 { 0 }
yading@11 587 };
yading@11 588
yading@11 589 static EbmlSyntax matroska_cluster_incremental_parsing[] = {
yading@11 590 { MATROSKA_ID_CLUSTERTIMECODE,EBML_UINT,0, offsetof(MatroskaCluster,timecode) },
yading@11 591 { MATROSKA_ID_BLOCKGROUP, EBML_NEST, sizeof(MatroskaBlock), offsetof(MatroskaCluster,blocks), {.n=matroska_blockgroup} },
yading@11 592 { MATROSKA_ID_SIMPLEBLOCK, EBML_PASS, sizeof(MatroskaBlock), offsetof(MatroskaCluster,blocks), {.n=matroska_blockgroup} },
yading@11 593 { MATROSKA_ID_CLUSTERPOSITION,EBML_NONE },
yading@11 594 { MATROSKA_ID_CLUSTERPREVSIZE,EBML_NONE },
yading@11 595 { MATROSKA_ID_INFO, EBML_NONE },
yading@11 596 { MATROSKA_ID_CUES, EBML_NONE },
yading@11 597 { MATROSKA_ID_TAGS, EBML_NONE },
yading@11 598 { MATROSKA_ID_SEEKHEAD, EBML_NONE },
yading@11 599 { MATROSKA_ID_CLUSTER, EBML_STOP },
yading@11 600 { 0 }
yading@11 601 };
yading@11 602
yading@11 603 static EbmlSyntax matroska_cluster_incremental[] = {
yading@11 604 { MATROSKA_ID_CLUSTERTIMECODE,EBML_UINT,0, offsetof(MatroskaCluster,timecode) },
yading@11 605 { MATROSKA_ID_BLOCKGROUP, EBML_STOP },
yading@11 606 { MATROSKA_ID_SIMPLEBLOCK, EBML_STOP },
yading@11 607 { MATROSKA_ID_CLUSTERPOSITION,EBML_NONE },
yading@11 608 { MATROSKA_ID_CLUSTERPREVSIZE,EBML_NONE },
yading@11 609 { 0 }
yading@11 610 };
yading@11 611
yading@11 612 static EbmlSyntax matroska_clusters_incremental[] = {
yading@11 613 { MATROSKA_ID_CLUSTER, EBML_NEST, 0, 0, {.n=matroska_cluster_incremental} },
yading@11 614 { MATROSKA_ID_INFO, EBML_NONE },
yading@11 615 { MATROSKA_ID_CUES, EBML_NONE },
yading@11 616 { MATROSKA_ID_TAGS, EBML_NONE },
yading@11 617 { MATROSKA_ID_SEEKHEAD, EBML_NONE },
yading@11 618 { 0 }
yading@11 619 };
yading@11 620
yading@11 621 static const char *const matroska_doctypes[] = { "matroska", "webm" };
yading@11 622
yading@11 623 static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
yading@11 624 {
yading@11 625 AVIOContext *pb = matroska->ctx->pb;
yading@11 626 uint32_t id;
yading@11 627 matroska->current_id = 0;
yading@11 628 matroska->num_levels = 0;
yading@11 629
yading@11 630 // seek to next position to resync from
yading@11 631 if (avio_seek(pb, last_pos + 1, SEEK_SET) < 0 || avio_tell(pb) <= last_pos)
yading@11 632 goto eof;
yading@11 633
yading@11 634 id = avio_rb32(pb);
yading@11 635
yading@11 636 // try to find a toplevel element
yading@11 637 while (!url_feof(pb)) {
yading@11 638 if (id == MATROSKA_ID_INFO || id == MATROSKA_ID_TRACKS ||
yading@11 639 id == MATROSKA_ID_CUES || id == MATROSKA_ID_TAGS ||
yading@11 640 id == MATROSKA_ID_SEEKHEAD || id == MATROSKA_ID_ATTACHMENTS ||
yading@11 641 id == MATROSKA_ID_CLUSTER || id == MATROSKA_ID_CHAPTERS)
yading@11 642 {
yading@11 643 matroska->current_id = id;
yading@11 644 return 0;
yading@11 645 }
yading@11 646 id = (id << 8) | avio_r8(pb);
yading@11 647 }
yading@11 648 eof:
yading@11 649 matroska->done = 1;
yading@11 650 return AVERROR_EOF;
yading@11 651 }
yading@11 652
yading@11 653 /*
yading@11 654 * Return: Whether we reached the end of a level in the hierarchy or not.
yading@11 655 */
yading@11 656 static int ebml_level_end(MatroskaDemuxContext *matroska)
yading@11 657 {
yading@11 658 AVIOContext *pb = matroska->ctx->pb;
yading@11 659 int64_t pos = avio_tell(pb);
yading@11 660
yading@11 661 if (matroska->num_levels > 0) {
yading@11 662 MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1];
yading@11 663 if (pos - level->start >= level->length || matroska->current_id) {
yading@11 664 matroska->num_levels--;
yading@11 665 return 1;
yading@11 666 }
yading@11 667 }
yading@11 668 return 0;
yading@11 669 }
yading@11 670
yading@11 671 /*
yading@11 672 * Read: an "EBML number", which is defined as a variable-length
yading@11 673 * array of bytes. The first byte indicates the length by giving a
yading@11 674 * number of 0-bits followed by a one. The position of the first
yading@11 675 * "one" bit inside the first byte indicates the length of this
yading@11 676 * number.
yading@11 677 * Returns: number of bytes read, < 0 on error
yading@11 678 */
yading@11 679 static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb,
yading@11 680 int max_size, uint64_t *number)
yading@11 681 {
yading@11 682 int read = 1, n = 1;
yading@11 683 uint64_t total = 0;
yading@11 684
yading@11 685 /* The first byte tells us the length in bytes - avio_r8() can normally
yading@11 686 * return 0, but since that's not a valid first ebmlID byte, we can
yading@11 687 * use it safely here to catch EOS. */
yading@11 688 if (!(total = avio_r8(pb))) {
yading@11 689 /* we might encounter EOS here */
yading@11 690 if (!url_feof(pb)) {
yading@11 691 int64_t pos = avio_tell(pb);
yading@11 692 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 693 "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
yading@11 694 pos, pos);
yading@11 695 return pb->error ? pb->error : AVERROR(EIO);
yading@11 696 }
yading@11 697 return AVERROR_EOF;
yading@11 698 }
yading@11 699
yading@11 700 /* get the length of the EBML number */
yading@11 701 read = 8 - ff_log2_tab[total];
yading@11 702 if (read > max_size) {
yading@11 703 int64_t pos = avio_tell(pb) - 1;
yading@11 704 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 705 "Invalid EBML number size tag 0x%02x at pos %"PRIu64" (0x%"PRIx64")\n",
yading@11 706 (uint8_t) total, pos, pos);
yading@11 707 return AVERROR_INVALIDDATA;
yading@11 708 }
yading@11 709
yading@11 710 /* read out length */
yading@11 711 total ^= 1 << ff_log2_tab[total];
yading@11 712 while (n++ < read)
yading@11 713 total = (total << 8) | avio_r8(pb);
yading@11 714
yading@11 715 *number = total;
yading@11 716
yading@11 717 return read;
yading@11 718 }
yading@11 719
yading@11 720 /**
yading@11 721 * Read a EBML length value.
yading@11 722 * This needs special handling for the "unknown length" case which has multiple
yading@11 723 * encodings.
yading@11 724 */
yading@11 725 static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb,
yading@11 726 uint64_t *number)
yading@11 727 {
yading@11 728 int res = ebml_read_num(matroska, pb, 8, number);
yading@11 729 if (res > 0 && *number + 1 == 1ULL << (7 * res))
yading@11 730 *number = 0xffffffffffffffULL;
yading@11 731 return res;
yading@11 732 }
yading@11 733
yading@11 734 /*
yading@11 735 * Read the next element as an unsigned int.
yading@11 736 * 0 is success, < 0 is failure.
yading@11 737 */
yading@11 738 static int ebml_read_uint(AVIOContext *pb, int size, uint64_t *num)
yading@11 739 {
yading@11 740 int n = 0;
yading@11 741
yading@11 742 if (size > 8)
yading@11 743 return AVERROR_INVALIDDATA;
yading@11 744
yading@11 745 /* big-endian ordering; build up number */
yading@11 746 *num = 0;
yading@11 747 while (n++ < size)
yading@11 748 *num = (*num << 8) | avio_r8(pb);
yading@11 749
yading@11 750 return 0;
yading@11 751 }
yading@11 752
yading@11 753 /*
yading@11 754 * Read the next element as a float.
yading@11 755 * 0 is success, < 0 is failure.
yading@11 756 */
yading@11 757 static int ebml_read_float(AVIOContext *pb, int size, double *num)
yading@11 758 {
yading@11 759 if (size == 0) {
yading@11 760 *num = 0;
yading@11 761 } else if (size == 4) {
yading@11 762 *num = av_int2float(avio_rb32(pb));
yading@11 763 } else if (size == 8){
yading@11 764 *num = av_int2double(avio_rb64(pb));
yading@11 765 } else
yading@11 766 return AVERROR_INVALIDDATA;
yading@11 767
yading@11 768 return 0;
yading@11 769 }
yading@11 770
yading@11 771 /*
yading@11 772 * Read the next element as an ASCII string.
yading@11 773 * 0 is success, < 0 is failure.
yading@11 774 */
yading@11 775 static int ebml_read_ascii(AVIOContext *pb, int size, char **str)
yading@11 776 {
yading@11 777 char *res;
yading@11 778
yading@11 779 /* EBML strings are usually not 0-terminated, so we allocate one
yading@11 780 * byte more, read the string and NULL-terminate it ourselves. */
yading@11 781 if (!(res = av_malloc(size + 1)))
yading@11 782 return AVERROR(ENOMEM);
yading@11 783 if (avio_read(pb, (uint8_t *) res, size) != size) {
yading@11 784 av_free(res);
yading@11 785 return AVERROR(EIO);
yading@11 786 }
yading@11 787 (res)[size] = '\0';
yading@11 788 av_free(*str);
yading@11 789 *str = res;
yading@11 790
yading@11 791 return 0;
yading@11 792 }
yading@11 793
yading@11 794 /*
yading@11 795 * Read the next element as binary data.
yading@11 796 * 0 is success, < 0 is failure.
yading@11 797 */
yading@11 798 static int ebml_read_binary(AVIOContext *pb, int length, EbmlBin *bin)
yading@11 799 {
yading@11 800 av_fast_padded_malloc(&bin->data, &bin->size, length);
yading@11 801 if (!bin->data)
yading@11 802 return AVERROR(ENOMEM);
yading@11 803
yading@11 804 bin->size = length;
yading@11 805 bin->pos = avio_tell(pb);
yading@11 806 if (avio_read(pb, bin->data, length) != length) {
yading@11 807 av_freep(&bin->data);
yading@11 808 bin->size = 0;
yading@11 809 return AVERROR(EIO);
yading@11 810 }
yading@11 811
yading@11 812 return 0;
yading@11 813 }
yading@11 814
yading@11 815 /*
yading@11 816 * Read the next element, but only the header. The contents
yading@11 817 * are supposed to be sub-elements which can be read separately.
yading@11 818 * 0 is success, < 0 is failure.
yading@11 819 */
yading@11 820 static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length)
yading@11 821 {
yading@11 822 AVIOContext *pb = matroska->ctx->pb;
yading@11 823 MatroskaLevel *level;
yading@11 824
yading@11 825 if (matroska->num_levels >= EBML_MAX_DEPTH) {
yading@11 826 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 827 "File moves beyond max. allowed depth (%d)\n", EBML_MAX_DEPTH);
yading@11 828 return AVERROR(ENOSYS);
yading@11 829 }
yading@11 830
yading@11 831 level = &matroska->levels[matroska->num_levels++];
yading@11 832 level->start = avio_tell(pb);
yading@11 833 level->length = length;
yading@11 834
yading@11 835 return 0;
yading@11 836 }
yading@11 837
yading@11 838 /*
yading@11 839 * Read signed/unsigned "EBML" numbers.
yading@11 840 * Return: number of bytes processed, < 0 on error
yading@11 841 */
yading@11 842 static int matroska_ebmlnum_uint(MatroskaDemuxContext *matroska,
yading@11 843 uint8_t *data, uint32_t size, uint64_t *num)
yading@11 844 {
yading@11 845 AVIOContext pb;
yading@11 846 ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL);
yading@11 847 return ebml_read_num(matroska, &pb, FFMIN(size, 8), num);
yading@11 848 }
yading@11 849
yading@11 850 /*
yading@11 851 * Same as above, but signed.
yading@11 852 */
yading@11 853 static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska,
yading@11 854 uint8_t *data, uint32_t size, int64_t *num)
yading@11 855 {
yading@11 856 uint64_t unum;
yading@11 857 int res;
yading@11 858
yading@11 859 /* read as unsigned number first */
yading@11 860 if ((res = matroska_ebmlnum_uint(matroska, data, size, &unum)) < 0)
yading@11 861 return res;
yading@11 862
yading@11 863 /* make signed (weird way) */
yading@11 864 *num = unum - ((1LL << (7*res - 1)) - 1);
yading@11 865
yading@11 866 return res;
yading@11 867 }
yading@11 868
yading@11 869 static int ebml_parse_elem(MatroskaDemuxContext *matroska,
yading@11 870 EbmlSyntax *syntax, void *data);
yading@11 871
yading@11 872 static int ebml_parse_id(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
yading@11 873 uint32_t id, void *data)
yading@11 874 {
yading@11 875 int i;
yading@11 876 for (i=0; syntax[i].id; i++)
yading@11 877 if (id == syntax[i].id)
yading@11 878 break;
yading@11 879 if (!syntax[i].id && id == MATROSKA_ID_CLUSTER &&
yading@11 880 matroska->num_levels > 0 &&
yading@11 881 matroska->levels[matroska->num_levels-1].length == 0xffffffffffffff)
yading@11 882 return 0; // we reached the end of an unknown size cluster
yading@11 883 if (!syntax[i].id && id != EBML_ID_VOID && id != EBML_ID_CRC32) {
yading@11 884 av_log(matroska->ctx, AV_LOG_INFO, "Unknown entry 0x%X\n", id);
yading@11 885 if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
yading@11 886 return AVERROR_INVALIDDATA;
yading@11 887 }
yading@11 888 return ebml_parse_elem(matroska, &syntax[i], data);
yading@11 889 }
yading@11 890
yading@11 891 static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
yading@11 892 void *data)
yading@11 893 {
yading@11 894 if (!matroska->current_id) {
yading@11 895 uint64_t id;
yading@11 896 int res = ebml_read_num(matroska, matroska->ctx->pb, 4, &id);
yading@11 897 if (res < 0)
yading@11 898 return res;
yading@11 899 matroska->current_id = id | 1 << 7*res;
yading@11 900 }
yading@11 901 return ebml_parse_id(matroska, syntax, matroska->current_id, data);
yading@11 902 }
yading@11 903
yading@11 904 static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
yading@11 905 void *data)
yading@11 906 {
yading@11 907 int i, res = 0;
yading@11 908
yading@11 909 for (i=0; syntax[i].id; i++)
yading@11 910 switch (syntax[i].type) {
yading@11 911 case EBML_UINT:
yading@11 912 *(uint64_t *)((char *)data+syntax[i].data_offset) = syntax[i].def.u;
yading@11 913 break;
yading@11 914 case EBML_FLOAT:
yading@11 915 *(double *)((char *)data+syntax[i].data_offset) = syntax[i].def.f;
yading@11 916 break;
yading@11 917 case EBML_STR:
yading@11 918 case EBML_UTF8:
yading@11 919 *(char **)((char *)data+syntax[i].data_offset) = av_strdup(syntax[i].def.s);
yading@11 920 break;
yading@11 921 }
yading@11 922
yading@11 923 while (!res && !ebml_level_end(matroska))
yading@11 924 res = ebml_parse(matroska, syntax, data);
yading@11 925
yading@11 926 return res;
yading@11 927 }
yading@11 928
yading@11 929 static int ebml_parse_elem(MatroskaDemuxContext *matroska,
yading@11 930 EbmlSyntax *syntax, void *data)
yading@11 931 {
yading@11 932 static const uint64_t max_lengths[EBML_TYPE_COUNT] = {
yading@11 933 [EBML_UINT] = 8,
yading@11 934 [EBML_FLOAT] = 8,
yading@11 935 // max. 16 MB for strings
yading@11 936 [EBML_STR] = 0x1000000,
yading@11 937 [EBML_UTF8] = 0x1000000,
yading@11 938 // max. 256 MB for binary data
yading@11 939 [EBML_BIN] = 0x10000000,
yading@11 940 // no limits for anything else
yading@11 941 };
yading@11 942 AVIOContext *pb = matroska->ctx->pb;
yading@11 943 uint32_t id = syntax->id;
yading@11 944 uint64_t length;
yading@11 945 int res;
yading@11 946 void *newelem;
yading@11 947
yading@11 948 data = (char *)data + syntax->data_offset;
yading@11 949 if (syntax->list_elem_size) {
yading@11 950 EbmlList *list = data;
yading@11 951 newelem = av_realloc(list->elem, (list->nb_elem+1)*syntax->list_elem_size);
yading@11 952 if (!newelem)
yading@11 953 return AVERROR(ENOMEM);
yading@11 954 list->elem = newelem;
yading@11 955 data = (char*)list->elem + list->nb_elem*syntax->list_elem_size;
yading@11 956 memset(data, 0, syntax->list_elem_size);
yading@11 957 list->nb_elem++;
yading@11 958 }
yading@11 959
yading@11 960 if (syntax->type != EBML_PASS && syntax->type != EBML_STOP) {
yading@11 961 matroska->current_id = 0;
yading@11 962 if ((res = ebml_read_length(matroska, pb, &length)) < 0)
yading@11 963 return res;
yading@11 964 if (max_lengths[syntax->type] && length > max_lengths[syntax->type]) {
yading@11 965 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 966 "Invalid length 0x%"PRIx64" > 0x%"PRIx64" for syntax element %i\n",
yading@11 967 length, max_lengths[syntax->type], syntax->type);
yading@11 968 return AVERROR_INVALIDDATA;
yading@11 969 }
yading@11 970 }
yading@11 971
yading@11 972 switch (syntax->type) {
yading@11 973 case EBML_UINT: res = ebml_read_uint (pb, length, data); break;
yading@11 974 case EBML_FLOAT: res = ebml_read_float (pb, length, data); break;
yading@11 975 case EBML_STR:
yading@11 976 case EBML_UTF8: res = ebml_read_ascii (pb, length, data); break;
yading@11 977 case EBML_BIN: res = ebml_read_binary(pb, length, data); break;
yading@11 978 case EBML_NEST: if ((res=ebml_read_master(matroska, length)) < 0)
yading@11 979 return res;
yading@11 980 if (id == MATROSKA_ID_SEGMENT)
yading@11 981 matroska->segment_start = avio_tell(matroska->ctx->pb);
yading@11 982 return ebml_parse_nest(matroska, syntax->def.n, data);
yading@11 983 case EBML_PASS: return ebml_parse_id(matroska, syntax->def.n, id, data);
yading@11 984 case EBML_STOP: return 1;
yading@11 985 default:
yading@11 986 if(ffio_limit(pb, length) != length)
yading@11 987 return AVERROR(EIO);
yading@11 988 return avio_skip(pb,length)<0 ? AVERROR(EIO) : 0;
yading@11 989 }
yading@11 990 if (res == AVERROR_INVALIDDATA)
yading@11 991 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
yading@11 992 else if (res == AVERROR(EIO))
yading@11 993 av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
yading@11 994 return res;
yading@11 995 }
yading@11 996
yading@11 997 static void ebml_free(EbmlSyntax *syntax, void *data)
yading@11 998 {
yading@11 999 int i, j;
yading@11 1000 for (i=0; syntax[i].id; i++) {
yading@11 1001 void *data_off = (char *)data + syntax[i].data_offset;
yading@11 1002 switch (syntax[i].type) {
yading@11 1003 case EBML_STR:
yading@11 1004 case EBML_UTF8: av_freep(data_off); break;
yading@11 1005 case EBML_BIN: av_freep(&((EbmlBin *)data_off)->data); break;
yading@11 1006 case EBML_NEST:
yading@11 1007 if (syntax[i].list_elem_size) {
yading@11 1008 EbmlList *list = data_off;
yading@11 1009 char *ptr = list->elem;
yading@11 1010 for (j=0; j<list->nb_elem; j++, ptr+=syntax[i].list_elem_size)
yading@11 1011 ebml_free(syntax[i].def.n, ptr);
yading@11 1012 av_free(list->elem);
yading@11 1013 } else
yading@11 1014 ebml_free(syntax[i].def.n, data_off);
yading@11 1015 default: break;
yading@11 1016 }
yading@11 1017 }
yading@11 1018 }
yading@11 1019
yading@11 1020
yading@11 1021 /*
yading@11 1022 * Autodetecting...
yading@11 1023 */
yading@11 1024 static int matroska_probe(AVProbeData *p)
yading@11 1025 {
yading@11 1026 uint64_t total = 0;
yading@11 1027 int len_mask = 0x80, size = 1, n = 1, i;
yading@11 1028
yading@11 1029 /* EBML header? */
yading@11 1030 if (AV_RB32(p->buf) != EBML_ID_HEADER)
yading@11 1031 return 0;
yading@11 1032
yading@11 1033 /* length of header */
yading@11 1034 total = p->buf[4];
yading@11 1035 while (size <= 8 && !(total & len_mask)) {
yading@11 1036 size++;
yading@11 1037 len_mask >>= 1;
yading@11 1038 }
yading@11 1039 if (size > 8)
yading@11 1040 return 0;
yading@11 1041 total &= (len_mask - 1);
yading@11 1042 while (n < size)
yading@11 1043 total = (total << 8) | p->buf[4 + n++];
yading@11 1044
yading@11 1045 /* Does the probe data contain the whole header? */
yading@11 1046 if (p->buf_size < 4 + size + total)
yading@11 1047 return 0;
yading@11 1048
yading@11 1049 /* The header should contain a known document type. For now,
yading@11 1050 * we don't parse the whole header but simply check for the
yading@11 1051 * availability of that array of characters inside the header.
yading@11 1052 * Not fully fool-proof, but good enough. */
yading@11 1053 for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++) {
yading@11 1054 int probelen = strlen(matroska_doctypes[i]);
yading@11 1055 if (total < probelen)
yading@11 1056 continue;
yading@11 1057 for (n = 4+size; n <= 4+size+total-probelen; n++)
yading@11 1058 if (!memcmp(p->buf+n, matroska_doctypes[i], probelen))
yading@11 1059 return AVPROBE_SCORE_MAX;
yading@11 1060 }
yading@11 1061
yading@11 1062 // probably valid EBML header but no recognized doctype
yading@11 1063 return AVPROBE_SCORE_MAX/2;
yading@11 1064 }
yading@11 1065
yading@11 1066 static MatroskaTrack *matroska_find_track_by_num(MatroskaDemuxContext *matroska,
yading@11 1067 int num)
yading@11 1068 {
yading@11 1069 MatroskaTrack *tracks = matroska->tracks.elem;
yading@11 1070 int i;
yading@11 1071
yading@11 1072 for (i=0; i < matroska->tracks.nb_elem; i++)
yading@11 1073 if (tracks[i].num == num)
yading@11 1074 return &tracks[i];
yading@11 1075
yading@11 1076 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %d\n", num);
yading@11 1077 return NULL;
yading@11 1078 }
yading@11 1079
yading@11 1080 static int matroska_decode_buffer(uint8_t** buf, int* buf_size,
yading@11 1081 MatroskaTrack *track)
yading@11 1082 {
yading@11 1083 MatroskaTrackEncoding *encodings = track->encodings.elem;
yading@11 1084 uint8_t* data = *buf;
yading@11 1085 int isize = *buf_size;
yading@11 1086 uint8_t* pkt_data = NULL;
yading@11 1087 uint8_t av_unused *newpktdata;
yading@11 1088 int pkt_size = isize;
yading@11 1089 int result = 0;
yading@11 1090 int olen;
yading@11 1091
yading@11 1092 if (pkt_size >= 10000000U)
yading@11 1093 return AVERROR_INVALIDDATA;
yading@11 1094
yading@11 1095 switch (encodings[0].compression.algo) {
yading@11 1096 case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP: {
yading@11 1097 int header_size = encodings[0].compression.settings.size;
yading@11 1098 uint8_t *header = encodings[0].compression.settings.data;
yading@11 1099
yading@11 1100 if (header_size && !header) {
yading@11 1101 av_log(NULL, AV_LOG_ERROR, "Compression size but no data in headerstrip\n");
yading@11 1102 return -1;
yading@11 1103 }
yading@11 1104
yading@11 1105 if (!header_size)
yading@11 1106 return 0;
yading@11 1107
yading@11 1108 pkt_size = isize + header_size;
yading@11 1109 pkt_data = av_malloc(pkt_size);
yading@11 1110 if (!pkt_data)
yading@11 1111 return AVERROR(ENOMEM);
yading@11 1112
yading@11 1113 memcpy(pkt_data, header, header_size);
yading@11 1114 memcpy(pkt_data + header_size, data, isize);
yading@11 1115 break;
yading@11 1116 }
yading@11 1117 #if CONFIG_LZO
yading@11 1118 case MATROSKA_TRACK_ENCODING_COMP_LZO:
yading@11 1119 do {
yading@11 1120 olen = pkt_size *= 3;
yading@11 1121 newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING);
yading@11 1122 if (!newpktdata) {
yading@11 1123 result = AVERROR(ENOMEM);
yading@11 1124 goto failed;
yading@11 1125 }
yading@11 1126 pkt_data = newpktdata;
yading@11 1127 result = av_lzo1x_decode(pkt_data, &olen, data, &isize);
yading@11 1128 } while (result==AV_LZO_OUTPUT_FULL && pkt_size<10000000);
yading@11 1129 if (result) {
yading@11 1130 result = AVERROR_INVALIDDATA;
yading@11 1131 goto failed;
yading@11 1132 }
yading@11 1133 pkt_size -= olen;
yading@11 1134 break;
yading@11 1135 #endif
yading@11 1136 #if CONFIG_ZLIB
yading@11 1137 case MATROSKA_TRACK_ENCODING_COMP_ZLIB: {
yading@11 1138 z_stream zstream = {0};
yading@11 1139 if (inflateInit(&zstream) != Z_OK)
yading@11 1140 return -1;
yading@11 1141 zstream.next_in = data;
yading@11 1142 zstream.avail_in = isize;
yading@11 1143 do {
yading@11 1144 pkt_size *= 3;
yading@11 1145 newpktdata = av_realloc(pkt_data, pkt_size);
yading@11 1146 if (!newpktdata) {
yading@11 1147 inflateEnd(&zstream);
yading@11 1148 goto failed;
yading@11 1149 }
yading@11 1150 pkt_data = newpktdata;
yading@11 1151 zstream.avail_out = pkt_size - zstream.total_out;
yading@11 1152 zstream.next_out = pkt_data + zstream.total_out;
yading@11 1153 if (pkt_data) {
yading@11 1154 result = inflate(&zstream, Z_NO_FLUSH);
yading@11 1155 } else
yading@11 1156 result = Z_MEM_ERROR;
yading@11 1157 } while (result==Z_OK && pkt_size<10000000);
yading@11 1158 pkt_size = zstream.total_out;
yading@11 1159 inflateEnd(&zstream);
yading@11 1160 if (result != Z_STREAM_END) {
yading@11 1161 if (result == Z_MEM_ERROR)
yading@11 1162 result = AVERROR(ENOMEM);
yading@11 1163 else
yading@11 1164 result = AVERROR_INVALIDDATA;
yading@11 1165 goto failed;
yading@11 1166 }
yading@11 1167 break;
yading@11 1168 }
yading@11 1169 #endif
yading@11 1170 #if CONFIG_BZLIB
yading@11 1171 case MATROSKA_TRACK_ENCODING_COMP_BZLIB: {
yading@11 1172 bz_stream bzstream = {0};
yading@11 1173 if (BZ2_bzDecompressInit(&bzstream, 0, 0) != BZ_OK)
yading@11 1174 return -1;
yading@11 1175 bzstream.next_in = data;
yading@11 1176 bzstream.avail_in = isize;
yading@11 1177 do {
yading@11 1178 pkt_size *= 3;
yading@11 1179 newpktdata = av_realloc(pkt_data, pkt_size);
yading@11 1180 if (!newpktdata) {
yading@11 1181 BZ2_bzDecompressEnd(&bzstream);
yading@11 1182 goto failed;
yading@11 1183 }
yading@11 1184 pkt_data = newpktdata;
yading@11 1185 bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
yading@11 1186 bzstream.next_out = pkt_data + bzstream.total_out_lo32;
yading@11 1187 if (pkt_data) {
yading@11 1188 result = BZ2_bzDecompress(&bzstream);
yading@11 1189 } else
yading@11 1190 result = BZ_MEM_ERROR;
yading@11 1191 } while (result==BZ_OK && pkt_size<10000000);
yading@11 1192 pkt_size = bzstream.total_out_lo32;
yading@11 1193 BZ2_bzDecompressEnd(&bzstream);
yading@11 1194 if (result != BZ_STREAM_END) {
yading@11 1195 if (result == BZ_MEM_ERROR)
yading@11 1196 result = AVERROR(ENOMEM);
yading@11 1197 else
yading@11 1198 result = AVERROR_INVALIDDATA;
yading@11 1199 goto failed;
yading@11 1200 }
yading@11 1201 break;
yading@11 1202 }
yading@11 1203 #endif
yading@11 1204 default:
yading@11 1205 return AVERROR_INVALIDDATA;
yading@11 1206 }
yading@11 1207
yading@11 1208 *buf = pkt_data;
yading@11 1209 *buf_size = pkt_size;
yading@11 1210 return 0;
yading@11 1211 failed:
yading@11 1212 av_free(pkt_data);
yading@11 1213 return result;
yading@11 1214 }
yading@11 1215
yading@11 1216 #if FF_API_ASS_SSA
yading@11 1217 static void matroska_fix_ass_packet(MatroskaDemuxContext *matroska,
yading@11 1218 AVPacket *pkt, uint64_t display_duration)
yading@11 1219 {
yading@11 1220 AVBufferRef *line;
yading@11 1221 char *layer, *ptr = pkt->data, *end = ptr+pkt->size;
yading@11 1222 for (; *ptr!=',' && ptr<end-1; ptr++);
yading@11 1223 if (*ptr == ',')
yading@11 1224 ptr++;
yading@11 1225 layer = ptr;
yading@11 1226 for (; *ptr!=',' && ptr<end-1; ptr++);
yading@11 1227 if (*ptr == ',') {
yading@11 1228 int64_t end_pts = pkt->pts + display_duration;
yading@11 1229 int sc = matroska->time_scale * pkt->pts / 10000000;
yading@11 1230 int ec = matroska->time_scale * end_pts / 10000000;
yading@11 1231 int sh, sm, ss, eh, em, es, len;
yading@11 1232 sh = sc/360000; sc -= 360000*sh;
yading@11 1233 sm = sc/ 6000; sc -= 6000*sm;
yading@11 1234 ss = sc/ 100; sc -= 100*ss;
yading@11 1235 eh = ec/360000; ec -= 360000*eh;
yading@11 1236 em = ec/ 6000; ec -= 6000*em;
yading@11 1237 es = ec/ 100; ec -= 100*es;
yading@11 1238 *ptr++ = '\0';
yading@11 1239 len = 50 + end-ptr + FF_INPUT_BUFFER_PADDING_SIZE;
yading@11 1240 if (!(line = av_buffer_alloc(len)))
yading@11 1241 return;
yading@11 1242 snprintf(line->data, len,"Dialogue: %s,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s\r\n",
yading@11 1243 layer, sh, sm, ss, sc, eh, em, es, ec, ptr);
yading@11 1244 av_buffer_unref(&pkt->buf);
yading@11 1245 pkt->buf = line;
yading@11 1246 pkt->data = line->data;
yading@11 1247 pkt->size = strlen(line->data);
yading@11 1248 }
yading@11 1249 }
yading@11 1250
yading@11 1251 static int matroska_merge_packets(AVPacket *out, AVPacket *in)
yading@11 1252 {
yading@11 1253 int ret = av_grow_packet(out, in->size);
yading@11 1254 if (ret < 0)
yading@11 1255 return ret;
yading@11 1256
yading@11 1257 memcpy(out->data + out->size - in->size, in->data, in->size);
yading@11 1258
yading@11 1259 av_free_packet(in);
yading@11 1260 av_free(in);
yading@11 1261 return 0;
yading@11 1262 }
yading@11 1263 #endif
yading@11 1264
yading@11 1265 static void matroska_convert_tag(AVFormatContext *s, EbmlList *list,
yading@11 1266 AVDictionary **metadata, char *prefix)
yading@11 1267 {
yading@11 1268 MatroskaTag *tags = list->elem;
yading@11 1269 char key[1024];
yading@11 1270 int i;
yading@11 1271
yading@11 1272 for (i=0; i < list->nb_elem; i++) {
yading@11 1273 const char *lang= (tags[i].lang && strcmp(tags[i].lang, "und")) ? tags[i].lang : NULL;
yading@11 1274
yading@11 1275 if (!tags[i].name) {
yading@11 1276 av_log(s, AV_LOG_WARNING, "Skipping invalid tag with no TagName.\n");
yading@11 1277 continue;
yading@11 1278 }
yading@11 1279 if (prefix) snprintf(key, sizeof(key), "%s/%s", prefix, tags[i].name);
yading@11 1280 else av_strlcpy(key, tags[i].name, sizeof(key));
yading@11 1281 if (tags[i].def || !lang) {
yading@11 1282 av_dict_set(metadata, key, tags[i].string, 0);
yading@11 1283 if (tags[i].sub.nb_elem)
yading@11 1284 matroska_convert_tag(s, &tags[i].sub, metadata, key);
yading@11 1285 }
yading@11 1286 if (lang) {
yading@11 1287 av_strlcat(key, "-", sizeof(key));
yading@11 1288 av_strlcat(key, lang, sizeof(key));
yading@11 1289 av_dict_set(metadata, key, tags[i].string, 0);
yading@11 1290 if (tags[i].sub.nb_elem)
yading@11 1291 matroska_convert_tag(s, &tags[i].sub, metadata, key);
yading@11 1292 }
yading@11 1293 }
yading@11 1294 ff_metadata_conv(metadata, NULL, ff_mkv_metadata_conv);
yading@11 1295 }
yading@11 1296
yading@11 1297 static void matroska_convert_tags(AVFormatContext *s)
yading@11 1298 {
yading@11 1299 MatroskaDemuxContext *matroska = s->priv_data;
yading@11 1300 MatroskaTags *tags = matroska->tags.elem;
yading@11 1301 int i, j;
yading@11 1302
yading@11 1303 for (i=0; i < matroska->tags.nb_elem; i++) {
yading@11 1304 if (tags[i].target.attachuid) {
yading@11 1305 MatroskaAttachement *attachment = matroska->attachments.elem;
yading@11 1306 for (j=0; j<matroska->attachments.nb_elem; j++)
yading@11 1307 if (attachment[j].uid == tags[i].target.attachuid
yading@11 1308 && attachment[j].stream)
yading@11 1309 matroska_convert_tag(s, &tags[i].tag,
yading@11 1310 &attachment[j].stream->metadata, NULL);
yading@11 1311 } else if (tags[i].target.chapteruid) {
yading@11 1312 MatroskaChapter *chapter = matroska->chapters.elem;
yading@11 1313 for (j=0; j<matroska->chapters.nb_elem; j++)
yading@11 1314 if (chapter[j].uid == tags[i].target.chapteruid
yading@11 1315 && chapter[j].chapter)
yading@11 1316 matroska_convert_tag(s, &tags[i].tag,
yading@11 1317 &chapter[j].chapter->metadata, NULL);
yading@11 1318 } else if (tags[i].target.trackuid) {
yading@11 1319 MatroskaTrack *track = matroska->tracks.elem;
yading@11 1320 for (j=0; j<matroska->tracks.nb_elem; j++)
yading@11 1321 if (track[j].uid == tags[i].target.trackuid && track[j].stream)
yading@11 1322 matroska_convert_tag(s, &tags[i].tag,
yading@11 1323 &track[j].stream->metadata, NULL);
yading@11 1324 } else {
yading@11 1325 matroska_convert_tag(s, &tags[i].tag, &s->metadata,
yading@11 1326 tags[i].target.type);
yading@11 1327 }
yading@11 1328 }
yading@11 1329 }
yading@11 1330
yading@11 1331 static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska, int idx)
yading@11 1332 {
yading@11 1333 EbmlList *seekhead_list = &matroska->seekhead;
yading@11 1334 MatroskaSeekhead *seekhead = seekhead_list->elem;
yading@11 1335 uint32_t level_up = matroska->level_up;
yading@11 1336 int64_t before_pos = avio_tell(matroska->ctx->pb);
yading@11 1337 uint32_t saved_id = matroska->current_id;
yading@11 1338 MatroskaLevel level;
yading@11 1339 int64_t offset;
yading@11 1340 int ret = 0;
yading@11 1341
yading@11 1342 if (idx >= seekhead_list->nb_elem
yading@11 1343 || seekhead[idx].id == MATROSKA_ID_SEEKHEAD
yading@11 1344 || seekhead[idx].id == MATROSKA_ID_CLUSTER)
yading@11 1345 return 0;
yading@11 1346
yading@11 1347 /* seek */
yading@11 1348 offset = seekhead[idx].pos + matroska->segment_start;
yading@11 1349 if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) == offset) {
yading@11 1350 /* We don't want to lose our seekhead level, so we add
yading@11 1351 * a dummy. This is a crude hack. */
yading@11 1352 if (matroska->num_levels == EBML_MAX_DEPTH) {
yading@11 1353 av_log(matroska->ctx, AV_LOG_INFO,
yading@11 1354 "Max EBML element depth (%d) reached, "
yading@11 1355 "cannot parse further.\n", EBML_MAX_DEPTH);
yading@11 1356 ret = AVERROR_INVALIDDATA;
yading@11 1357 } else {
yading@11 1358 level.start = 0;
yading@11 1359 level.length = (uint64_t)-1;
yading@11 1360 matroska->levels[matroska->num_levels] = level;
yading@11 1361 matroska->num_levels++;
yading@11 1362 matroska->current_id = 0;
yading@11 1363
yading@11 1364 ret = ebml_parse(matroska, matroska_segment, matroska);
yading@11 1365
yading@11 1366 /* remove dummy level */
yading@11 1367 while (matroska->num_levels) {
yading@11 1368 uint64_t length = matroska->levels[--matroska->num_levels].length;
yading@11 1369 if (length == (uint64_t)-1)
yading@11 1370 break;
yading@11 1371 }
yading@11 1372 }
yading@11 1373 }
yading@11 1374 /* seek back */
yading@11 1375 avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
yading@11 1376 matroska->level_up = level_up;
yading@11 1377 matroska->current_id = saved_id;
yading@11 1378
yading@11 1379 return ret;
yading@11 1380 }
yading@11 1381
yading@11 1382 static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
yading@11 1383 {
yading@11 1384 EbmlList *seekhead_list = &matroska->seekhead;
yading@11 1385 int64_t before_pos = avio_tell(matroska->ctx->pb);
yading@11 1386 int i;
yading@11 1387
yading@11 1388 // we should not do any seeking in the streaming case
yading@11 1389 if (!matroska->ctx->pb->seekable ||
yading@11 1390 (matroska->ctx->flags & AVFMT_FLAG_IGNIDX))
yading@11 1391 return;
yading@11 1392
yading@11 1393 for (i = 0; i < seekhead_list->nb_elem; i++) {
yading@11 1394 MatroskaSeekhead *seekhead = seekhead_list->elem;
yading@11 1395 if (seekhead[i].pos <= before_pos)
yading@11 1396 continue;
yading@11 1397
yading@11 1398 // defer cues parsing until we actually need cue data.
yading@11 1399 if (seekhead[i].id == MATROSKA_ID_CUES) {
yading@11 1400 matroska->cues_parsing_deferred = 1;
yading@11 1401 continue;
yading@11 1402 }
yading@11 1403
yading@11 1404 if (matroska_parse_seekhead_entry(matroska, i) < 0) {
yading@11 1405 // mark index as broken
yading@11 1406 matroska->cues_parsing_deferred = -1;
yading@11 1407 break;
yading@11 1408 }
yading@11 1409 }
yading@11 1410 }
yading@11 1411
yading@11 1412 static void matroska_add_index_entries(MatroskaDemuxContext *matroska) {
yading@11 1413 EbmlList *index_list;
yading@11 1414 MatroskaIndex *index;
yading@11 1415 int index_scale = 1;
yading@11 1416 int i, j;
yading@11 1417
yading@11 1418 index_list = &matroska->index;
yading@11 1419 index = index_list->elem;
yading@11 1420 if (index_list->nb_elem
yading@11 1421 && index[0].time > 1E14/matroska->time_scale) {
yading@11 1422 av_log(matroska->ctx, AV_LOG_WARNING, "Working around broken index.\n");
yading@11 1423 index_scale = matroska->time_scale;
yading@11 1424 }
yading@11 1425 for (i = 0; i < index_list->nb_elem; i++) {
yading@11 1426 EbmlList *pos_list = &index[i].pos;
yading@11 1427 MatroskaIndexPos *pos = pos_list->elem;
yading@11 1428 for (j = 0; j < pos_list->nb_elem; j++) {
yading@11 1429 MatroskaTrack *track = matroska_find_track_by_num(matroska, pos[j].track);
yading@11 1430 if (track && track->stream)
yading@11 1431 av_add_index_entry(track->stream,
yading@11 1432 pos[j].pos + matroska->segment_start,
yading@11 1433 index[i].time/index_scale, 0, 0,
yading@11 1434 AVINDEX_KEYFRAME);
yading@11 1435 }
yading@11 1436 }
yading@11 1437 }
yading@11 1438
yading@11 1439 static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
yading@11 1440 EbmlList *seekhead_list = &matroska->seekhead;
yading@11 1441 MatroskaSeekhead *seekhead = seekhead_list->elem;
yading@11 1442 int i;
yading@11 1443
yading@11 1444 for (i = 0; i < seekhead_list->nb_elem; i++)
yading@11 1445 if (seekhead[i].id == MATROSKA_ID_CUES)
yading@11 1446 break;
yading@11 1447 av_assert1(i <= seekhead_list->nb_elem);
yading@11 1448
yading@11 1449 if (matroska_parse_seekhead_entry(matroska, i) < 0)
yading@11 1450 matroska->cues_parsing_deferred = -1;
yading@11 1451 matroska_add_index_entries(matroska);
yading@11 1452 }
yading@11 1453
yading@11 1454 static int matroska_aac_profile(char *codec_id)
yading@11 1455 {
yading@11 1456 static const char * const aac_profiles[] = { "MAIN", "LC", "SSR" };
yading@11 1457 int profile;
yading@11 1458
yading@11 1459 for (profile=0; profile<FF_ARRAY_ELEMS(aac_profiles); profile++)
yading@11 1460 if (strstr(codec_id, aac_profiles[profile]))
yading@11 1461 break;
yading@11 1462 return profile + 1;
yading@11 1463 }
yading@11 1464
yading@11 1465 static int matroska_aac_sri(int samplerate)
yading@11 1466 {
yading@11 1467 int sri;
yading@11 1468
yading@11 1469 for (sri=0; sri<FF_ARRAY_ELEMS(avpriv_mpeg4audio_sample_rates); sri++)
yading@11 1470 if (avpriv_mpeg4audio_sample_rates[sri] == samplerate)
yading@11 1471 break;
yading@11 1472 return sri;
yading@11 1473 }
yading@11 1474
yading@11 1475 static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
yading@11 1476 {
yading@11 1477 char buffer[32];
yading@11 1478 /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */
yading@11 1479 time_t creation_time = date_utc / 1000000000 + 978307200;
yading@11 1480 struct tm *ptm = gmtime(&creation_time);
yading@11 1481 if (!ptm) return;
yading@11 1482 strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm);
yading@11 1483 av_dict_set(metadata, "creation_time", buffer, 0);
yading@11 1484 }
yading@11 1485
yading@11 1486 static int matroska_read_header(AVFormatContext *s)
yading@11 1487 {
yading@11 1488 MatroskaDemuxContext *matroska = s->priv_data;
yading@11 1489 EbmlList *attachements_list = &matroska->attachments;
yading@11 1490 MatroskaAttachement *attachements;
yading@11 1491 EbmlList *chapters_list = &matroska->chapters;
yading@11 1492 MatroskaChapter *chapters;
yading@11 1493 MatroskaTrack *tracks;
yading@11 1494 uint64_t max_start = 0;
yading@11 1495 int64_t pos;
yading@11 1496 Ebml ebml = { 0 };
yading@11 1497 AVStream *st;
yading@11 1498 int i, j, k, res;
yading@11 1499
yading@11 1500 matroska->ctx = s;
yading@11 1501
yading@11 1502 /* First read the EBML header. */
yading@11 1503 if (ebml_parse(matroska, ebml_syntax, &ebml)
yading@11 1504 || ebml.version > EBML_VERSION || ebml.max_size > sizeof(uint64_t)
yading@11 1505 || ebml.id_length > sizeof(uint32_t) || ebml.doctype_version > 3 || !ebml.doctype) {
yading@11 1506 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 1507 "EBML header using unsupported features\n"
yading@11 1508 "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
yading@11 1509 ebml.version, ebml.doctype, ebml.doctype_version);
yading@11 1510 ebml_free(ebml_syntax, &ebml);
yading@11 1511 return AVERROR_PATCHWELCOME;
yading@11 1512 } else if (ebml.doctype_version == 3) {
yading@11 1513 av_log(matroska->ctx, AV_LOG_WARNING,
yading@11 1514 "EBML header using unsupported features\n"
yading@11 1515 "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
yading@11 1516 ebml.version, ebml.doctype, ebml.doctype_version);
yading@11 1517 }
yading@11 1518 for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++)
yading@11 1519 if (!strcmp(ebml.doctype, matroska_doctypes[i]))
yading@11 1520 break;
yading@11 1521 if (i >= FF_ARRAY_ELEMS(matroska_doctypes)) {
yading@11 1522 av_log(s, AV_LOG_WARNING, "Unknown EBML doctype '%s'\n", ebml.doctype);
yading@11 1523 if (matroska->ctx->error_recognition & AV_EF_EXPLODE) {
yading@11 1524 ebml_free(ebml_syntax, &ebml);
yading@11 1525 return AVERROR_INVALIDDATA;
yading@11 1526 }
yading@11 1527 }
yading@11 1528 ebml_free(ebml_syntax, &ebml);
yading@11 1529
yading@11 1530 /* The next thing is a segment. */
yading@11 1531 pos = avio_tell(matroska->ctx->pb);
yading@11 1532 res = ebml_parse(matroska, matroska_segments, matroska);
yading@11 1533 // try resyncing until we find a EBML_STOP type element.
yading@11 1534 while (res != 1) {
yading@11 1535 res = matroska_resync(matroska, pos);
yading@11 1536 if (res < 0)
yading@11 1537 return res;
yading@11 1538 pos = avio_tell(matroska->ctx->pb);
yading@11 1539 res = ebml_parse(matroska, matroska_segment, matroska);
yading@11 1540 }
yading@11 1541 matroska_execute_seekhead(matroska);
yading@11 1542
yading@11 1543 if (!matroska->time_scale)
yading@11 1544 matroska->time_scale = 1000000;
yading@11 1545 if (matroska->duration)
yading@11 1546 matroska->ctx->duration = matroska->duration * matroska->time_scale
yading@11 1547 * 1000 / AV_TIME_BASE;
yading@11 1548 av_dict_set(&s->metadata, "title", matroska->title, 0);
yading@11 1549
yading@11 1550 if (matroska->date_utc.size == 8)
yading@11 1551 matroska_metadata_creation_time(&s->metadata, AV_RB64(matroska->date_utc.data));
yading@11 1552
yading@11 1553 tracks = matroska->tracks.elem;
yading@11 1554 for (i=0; i < matroska->tracks.nb_elem; i++) {
yading@11 1555 MatroskaTrack *track = &tracks[i];
yading@11 1556 enum AVCodecID codec_id = AV_CODEC_ID_NONE;
yading@11 1557 EbmlList *encodings_list = &track->encodings;
yading@11 1558 MatroskaTrackEncoding *encodings = encodings_list->elem;
yading@11 1559 uint8_t *extradata = NULL;
yading@11 1560 int extradata_size = 0;
yading@11 1561 int extradata_offset = 0;
yading@11 1562 uint32_t fourcc = 0;
yading@11 1563 AVIOContext b;
yading@11 1564 char* key_id_base64 = NULL;
yading@11 1565
yading@11 1566 /* Apply some sanity checks. */
yading@11 1567 if (track->type != MATROSKA_TRACK_TYPE_VIDEO &&
yading@11 1568 track->type != MATROSKA_TRACK_TYPE_AUDIO &&
yading@11 1569 track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
yading@11 1570 av_log(matroska->ctx, AV_LOG_INFO,
yading@11 1571 "Unknown or unsupported track type %"PRIu64"\n",
yading@11 1572 track->type);
yading@11 1573 continue;
yading@11 1574 }
yading@11 1575 if (track->codec_id == NULL)
yading@11 1576 continue;
yading@11 1577
yading@11 1578 if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
yading@11 1579 if (!track->default_duration && track->video.frame_rate > 0)
yading@11 1580 track->default_duration = 1000000000/track->video.frame_rate;
yading@11 1581 if (track->video.display_width == -1)
yading@11 1582 track->video.display_width = track->video.pixel_width;
yading@11 1583 if (track->video.display_height == -1)
yading@11 1584 track->video.display_height = track->video.pixel_height;
yading@11 1585 if (track->video.color_space.size == 4)
yading@11 1586 fourcc = AV_RL32(track->video.color_space.data);
yading@11 1587 } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
yading@11 1588 if (!track->audio.out_samplerate)
yading@11 1589 track->audio.out_samplerate = track->audio.samplerate;
yading@11 1590 }
yading@11 1591 if (encodings_list->nb_elem > 1) {
yading@11 1592 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 1593 "Multiple combined encodings not supported");
yading@11 1594 } else if (encodings_list->nb_elem == 1) {
yading@11 1595 if (encodings[0].type) {
yading@11 1596 if (encodings[0].encryption.key_id.size > 0) {
yading@11 1597 /* Save the encryption key id to be stored later as a
yading@11 1598 metadata tag. */
yading@11 1599 const int b64_size = AV_BASE64_SIZE(encodings[0].encryption.key_id.size);
yading@11 1600 key_id_base64 = av_malloc(b64_size);
yading@11 1601 if (key_id_base64 == NULL)
yading@11 1602 return AVERROR(ENOMEM);
yading@11 1603
yading@11 1604 av_base64_encode(key_id_base64, b64_size,
yading@11 1605 encodings[0].encryption.key_id.data,
yading@11 1606 encodings[0].encryption.key_id.size);
yading@11 1607 } else {
yading@11 1608 encodings[0].scope = 0;
yading@11 1609 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 1610 "Unsupported encoding type");
yading@11 1611 }
yading@11 1612 } else if (
yading@11 1613 #if CONFIG_ZLIB
yading@11 1614 encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_ZLIB &&
yading@11 1615 #endif
yading@11 1616 #if CONFIG_BZLIB
yading@11 1617 encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_BZLIB &&
yading@11 1618 #endif
yading@11 1619 #if CONFIG_LZO
yading@11 1620 encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO &&
yading@11 1621 #endif
yading@11 1622 encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP) {
yading@11 1623 encodings[0].scope = 0;
yading@11 1624 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 1625 "Unsupported encoding type");
yading@11 1626 } else if (track->codec_priv.size && encodings[0].scope&2) {
yading@11 1627 uint8_t *codec_priv = track->codec_priv.data;
yading@11 1628 int ret = matroska_decode_buffer(&track->codec_priv.data,
yading@11 1629 &track->codec_priv.size,
yading@11 1630 track);
yading@11 1631 if (ret < 0) {
yading@11 1632 track->codec_priv.data = NULL;
yading@11 1633 track->codec_priv.size = 0;
yading@11 1634 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 1635 "Failed to decode codec private data\n");
yading@11 1636 }
yading@11 1637
yading@11 1638 if (codec_priv != track->codec_priv.data)
yading@11 1639 av_free(codec_priv);
yading@11 1640 }
yading@11 1641 }
yading@11 1642
yading@11 1643 for(j=0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++){
yading@11 1644 if(!strncmp(ff_mkv_codec_tags[j].str, track->codec_id,
yading@11 1645 strlen(ff_mkv_codec_tags[j].str))){
yading@11 1646 codec_id= ff_mkv_codec_tags[j].id;
yading@11 1647 break;
yading@11 1648 }
yading@11 1649 }
yading@11 1650
yading@11 1651 st = track->stream = avformat_new_stream(s, NULL);
yading@11 1652 if (st == NULL) {
yading@11 1653 av_free(key_id_base64);
yading@11 1654 return AVERROR(ENOMEM);
yading@11 1655 }
yading@11 1656
yading@11 1657 if (key_id_base64) {
yading@11 1658 /* export encryption key id as base64 metadata tag */
yading@11 1659 av_dict_set(&st->metadata, "enc_key_id", key_id_base64, 0);
yading@11 1660 av_freep(&key_id_base64);
yading@11 1661 }
yading@11 1662
yading@11 1663 if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC")
yading@11 1664 && track->codec_priv.size >= 40
yading@11 1665 && track->codec_priv.data != NULL) {
yading@11 1666 track->ms_compat = 1;
yading@11 1667 fourcc = AV_RL32(track->codec_priv.data + 16);
yading@11 1668 codec_id = ff_codec_get_id(ff_codec_bmp_tags, fourcc);
yading@11 1669 extradata_offset = 40;
yading@11 1670 } else if (!strcmp(track->codec_id, "A_MS/ACM")
yading@11 1671 && track->codec_priv.size >= 14
yading@11 1672 && track->codec_priv.data != NULL) {
yading@11 1673 int ret;
yading@11 1674 ffio_init_context(&b, track->codec_priv.data, track->codec_priv.size,
yading@11 1675 0, NULL, NULL, NULL, NULL);
yading@11 1676 ret = ff_get_wav_header(&b, st->codec, track->codec_priv.size);
yading@11 1677 if (ret < 0)
yading@11 1678 return ret;
yading@11 1679 codec_id = st->codec->codec_id;
yading@11 1680 extradata_offset = FFMIN(track->codec_priv.size, 18);
yading@11 1681 } else if (!strcmp(track->codec_id, "V_QUICKTIME")
yading@11 1682 && (track->codec_priv.size >= 86)
yading@11 1683 && (track->codec_priv.data != NULL)) {
yading@11 1684 fourcc = AV_RL32(track->codec_priv.data);
yading@11 1685 codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
yading@11 1686 } else if (codec_id == AV_CODEC_ID_ALAC && track->codec_priv.size && track->codec_priv.size < INT_MAX - 12 - FF_INPUT_BUFFER_PADDING_SIZE) {
yading@11 1687 /* Only ALAC's magic cookie is stored in Matroska's track headers.
yading@11 1688 Create the "atom size", "tag", and "tag version" fields the
yading@11 1689 decoder expects manually. */
yading@11 1690 extradata_size = 12 + track->codec_priv.size;
yading@11 1691 extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 1692 if (extradata == NULL)
yading@11 1693 return AVERROR(ENOMEM);
yading@11 1694 AV_WB32(extradata, extradata_size);
yading@11 1695 memcpy(&extradata[4], "alac", 4);
yading@11 1696 AV_WB32(&extradata[8], 0);
yading@11 1697 memcpy(&extradata[12], track->codec_priv.data, track->codec_priv.size);
yading@11 1698 } else if (codec_id == AV_CODEC_ID_PCM_S16BE) {
yading@11 1699 switch (track->audio.bitdepth) {
yading@11 1700 case 8: codec_id = AV_CODEC_ID_PCM_U8; break;
yading@11 1701 case 24: codec_id = AV_CODEC_ID_PCM_S24BE; break;
yading@11 1702 case 32: codec_id = AV_CODEC_ID_PCM_S32BE; break;
yading@11 1703 }
yading@11 1704 } else if (codec_id == AV_CODEC_ID_PCM_S16LE) {
yading@11 1705 switch (track->audio.bitdepth) {
yading@11 1706 case 8: codec_id = AV_CODEC_ID_PCM_U8; break;
yading@11 1707 case 24: codec_id = AV_CODEC_ID_PCM_S24LE; break;
yading@11 1708 case 32: codec_id = AV_CODEC_ID_PCM_S32LE; break;
yading@11 1709 }
yading@11 1710 } else if (codec_id==AV_CODEC_ID_PCM_F32LE && track->audio.bitdepth==64) {
yading@11 1711 codec_id = AV_CODEC_ID_PCM_F64LE;
yading@11 1712 } else if (codec_id == AV_CODEC_ID_AAC && !track->codec_priv.size) {
yading@11 1713 int profile = matroska_aac_profile(track->codec_id);
yading@11 1714 int sri = matroska_aac_sri(track->audio.samplerate);
yading@11 1715 extradata = av_mallocz(5 + FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 1716 if (extradata == NULL)
yading@11 1717 return AVERROR(ENOMEM);
yading@11 1718 extradata[0] = (profile << 3) | ((sri&0x0E) >> 1);
yading@11 1719 extradata[1] = ((sri&0x01) << 7) | (track->audio.channels<<3);
yading@11 1720 if (strstr(track->codec_id, "SBR")) {
yading@11 1721 sri = matroska_aac_sri(track->audio.out_samplerate);
yading@11 1722 extradata[2] = 0x56;
yading@11 1723 extradata[3] = 0xE5;
yading@11 1724 extradata[4] = 0x80 | (sri<<3);
yading@11 1725 extradata_size = 5;
yading@11 1726 } else
yading@11 1727 extradata_size = 2;
yading@11 1728 } else if (codec_id == AV_CODEC_ID_TTA) {
yading@11 1729 extradata_size = 30;
yading@11 1730 extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 1731 if (extradata == NULL)
yading@11 1732 return AVERROR(ENOMEM);
yading@11 1733 ffio_init_context(&b, extradata, extradata_size, 1,
yading@11 1734 NULL, NULL, NULL, NULL);
yading@11 1735 avio_write(&b, "TTA1", 4);
yading@11 1736 avio_wl16(&b, 1);
yading@11 1737 avio_wl16(&b, track->audio.channels);
yading@11 1738 avio_wl16(&b, track->audio.bitdepth);
yading@11 1739 avio_wl32(&b, track->audio.out_samplerate);
yading@11 1740 avio_wl32(&b, matroska->ctx->duration * track->audio.out_samplerate);
yading@11 1741 } else if (codec_id == AV_CODEC_ID_RV10 || codec_id == AV_CODEC_ID_RV20 ||
yading@11 1742 codec_id == AV_CODEC_ID_RV30 || codec_id == AV_CODEC_ID_RV40) {
yading@11 1743 extradata_offset = 26;
yading@11 1744 } else if (codec_id == AV_CODEC_ID_RA_144) {
yading@11 1745 track->audio.out_samplerate = 8000;
yading@11 1746 track->audio.channels = 1;
yading@11 1747 } else if ((codec_id == AV_CODEC_ID_RA_288 || codec_id == AV_CODEC_ID_COOK ||
yading@11 1748 codec_id == AV_CODEC_ID_ATRAC3 || codec_id == AV_CODEC_ID_SIPR)
yading@11 1749 && track->codec_priv.data) {
yading@11 1750 int flavor;
yading@11 1751
yading@11 1752 ffio_init_context(&b, track->codec_priv.data,track->codec_priv.size,
yading@11 1753 0, NULL, NULL, NULL, NULL);
yading@11 1754 avio_skip(&b, 22);
yading@11 1755 flavor = avio_rb16(&b);
yading@11 1756 track->audio.coded_framesize = avio_rb32(&b);
yading@11 1757 avio_skip(&b, 12);
yading@11 1758 track->audio.sub_packet_h = avio_rb16(&b);
yading@11 1759 track->audio.frame_size = avio_rb16(&b);
yading@11 1760 track->audio.sub_packet_size = avio_rb16(&b);
yading@11 1761 track->audio.buf = av_malloc(track->audio.frame_size * track->audio.sub_packet_h);
yading@11 1762 if (codec_id == AV_CODEC_ID_RA_288) {
yading@11 1763 st->codec->block_align = track->audio.coded_framesize;
yading@11 1764 track->codec_priv.size = 0;
yading@11 1765 } else {
yading@11 1766 if (codec_id == AV_CODEC_ID_SIPR && flavor < 4) {
yading@11 1767 const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
yading@11 1768 track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
yading@11 1769 st->codec->bit_rate = sipr_bit_rate[flavor];
yading@11 1770 }
yading@11 1771 st->codec->block_align = track->audio.sub_packet_size;
yading@11 1772 extradata_offset = 78;
yading@11 1773 }
yading@11 1774 }
yading@11 1775 track->codec_priv.size -= extradata_offset;
yading@11 1776
yading@11 1777 if (codec_id == AV_CODEC_ID_NONE)
yading@11 1778 av_log(matroska->ctx, AV_LOG_INFO,
yading@11 1779 "Unknown/unsupported AVCodecID %s.\n", track->codec_id);
yading@11 1780
yading@11 1781 if (track->time_scale < 0.01)
yading@11 1782 track->time_scale = 1.0;
yading@11 1783 avpriv_set_pts_info(st, 64, matroska->time_scale*track->time_scale, 1000*1000*1000); /* 64 bit pts in ns */
yading@11 1784
yading@11 1785 st->codec->codec_id = codec_id;
yading@11 1786 st->start_time = 0;
yading@11 1787 if (strcmp(track->language, "und"))
yading@11 1788 av_dict_set(&st->metadata, "language", track->language, 0);
yading@11 1789 av_dict_set(&st->metadata, "title", track->name, 0);
yading@11 1790
yading@11 1791 if (track->flag_default)
yading@11 1792 st->disposition |= AV_DISPOSITION_DEFAULT;
yading@11 1793 if (track->flag_forced)
yading@11 1794 st->disposition |= AV_DISPOSITION_FORCED;
yading@11 1795
yading@11 1796 if (!st->codec->extradata) {
yading@11 1797 if(extradata){
yading@11 1798 st->codec->extradata = extradata;
yading@11 1799 st->codec->extradata_size = extradata_size;
yading@11 1800 } else if(track->codec_priv.data && track->codec_priv.size > 0){
yading@11 1801 st->codec->extradata = av_mallocz(track->codec_priv.size +
yading@11 1802 FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 1803 if(st->codec->extradata == NULL)
yading@11 1804 return AVERROR(ENOMEM);
yading@11 1805 st->codec->extradata_size = track->codec_priv.size;
yading@11 1806 memcpy(st->codec->extradata,
yading@11 1807 track->codec_priv.data + extradata_offset,
yading@11 1808 track->codec_priv.size);
yading@11 1809 }
yading@11 1810 }
yading@11 1811
yading@11 1812 if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
yading@11 1813 MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
yading@11 1814
yading@11 1815 st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
yading@11 1816 st->codec->codec_tag = fourcc;
yading@11 1817 st->codec->width = track->video.pixel_width;
yading@11 1818 st->codec->height = track->video.pixel_height;
yading@11 1819 av_reduce(&st->sample_aspect_ratio.num,
yading@11 1820 &st->sample_aspect_ratio.den,
yading@11 1821 st->codec->height * track->video.display_width,
yading@11 1822 st->codec-> width * track->video.display_height,
yading@11 1823 255);
yading@11 1824 st->need_parsing = AVSTREAM_PARSE_HEADERS;
yading@11 1825 if (track->default_duration) {
yading@11 1826 av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
yading@11 1827 1000000000, track->default_duration, 30000);
yading@11 1828 #if FF_API_R_FRAME_RATE
yading@11 1829 st->r_frame_rate = st->avg_frame_rate;
yading@11 1830 #endif
yading@11 1831 }
yading@11 1832
yading@11 1833 /* export stereo mode flag as metadata tag */
yading@11 1834 if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREO_MODE_COUNT)
yading@11 1835 av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0);
yading@11 1836
yading@11 1837 /* export alpha mode flag as metadata tag */
yading@11 1838 if (track->video.alpha_mode)
yading@11 1839 av_dict_set(&st->metadata, "alpha_mode", "1", 0);
yading@11 1840
yading@11 1841 /* if we have virtual track, mark the real tracks */
yading@11 1842 for (j=0; j < track->operation.combine_planes.nb_elem; j++) {
yading@11 1843 char buf[32];
yading@11 1844 if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
yading@11 1845 continue;
yading@11 1846 snprintf(buf, sizeof(buf), "%s_%d",
yading@11 1847 ff_matroska_video_stereo_plane[planes[j].type], i);
yading@11 1848 for (k=0; k < matroska->tracks.nb_elem; k++)
yading@11 1849 if (planes[j].uid == tracks[k].uid) {
yading@11 1850 av_dict_set(&s->streams[k]->metadata,
yading@11 1851 "stereo_mode", buf, 0);
yading@11 1852 break;
yading@11 1853 }
yading@11 1854 }
yading@11 1855 } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
yading@11 1856 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
yading@11 1857 st->codec->sample_rate = track->audio.out_samplerate;
yading@11 1858 st->codec->channels = track->audio.channels;
yading@11 1859 st->codec->bits_per_coded_sample = track->audio.bitdepth;
yading@11 1860 if (st->codec->codec_id != AV_CODEC_ID_AAC)
yading@11 1861 st->need_parsing = AVSTREAM_PARSE_HEADERS;
yading@11 1862 } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
yading@11 1863 st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
yading@11 1864 #if FF_API_ASS_SSA
yading@11 1865 if (st->codec->codec_id == AV_CODEC_ID_SSA ||
yading@11 1866 st->codec->codec_id == AV_CODEC_ID_ASS)
yading@11 1867 #else
yading@11 1868 if (st->codec->codec_id == AV_CODEC_ID_ASS)
yading@11 1869 #endif
yading@11 1870 matroska->contains_ssa = 1;
yading@11 1871 }
yading@11 1872 }
yading@11 1873
yading@11 1874 attachements = attachements_list->elem;
yading@11 1875 for (j=0; j<attachements_list->nb_elem; j++) {
yading@11 1876 if (!(attachements[j].filename && attachements[j].mime &&
yading@11 1877 attachements[j].bin.data && attachements[j].bin.size > 0)) {
yading@11 1878 av_log(matroska->ctx, AV_LOG_ERROR, "incomplete attachment\n");
yading@11 1879 } else {
yading@11 1880 AVStream *st = avformat_new_stream(s, NULL);
yading@11 1881 if (st == NULL)
yading@11 1882 break;
yading@11 1883 av_dict_set(&st->metadata, "filename",attachements[j].filename, 0);
yading@11 1884 av_dict_set(&st->metadata, "mimetype", attachements[j].mime, 0);
yading@11 1885 st->codec->codec_id = AV_CODEC_ID_NONE;
yading@11 1886 st->codec->codec_type = AVMEDIA_TYPE_ATTACHMENT;
yading@11 1887 st->codec->extradata = av_malloc(attachements[j].bin.size + FF_INPUT_BUFFER_PADDING_SIZE);
yading@11 1888 if(st->codec->extradata == NULL)
yading@11 1889 break;
yading@11 1890 st->codec->extradata_size = attachements[j].bin.size;
yading@11 1891 memcpy(st->codec->extradata, attachements[j].bin.data, attachements[j].bin.size);
yading@11 1892
yading@11 1893 for (i=0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
yading@11 1894 if (!strncmp(ff_mkv_mime_tags[i].str, attachements[j].mime,
yading@11 1895 strlen(ff_mkv_mime_tags[i].str))) {
yading@11 1896 st->codec->codec_id = ff_mkv_mime_tags[i].id;
yading@11 1897 break;
yading@11 1898 }
yading@11 1899 }
yading@11 1900 attachements[j].stream = st;
yading@11 1901 }
yading@11 1902 }
yading@11 1903
yading@11 1904 chapters = chapters_list->elem;
yading@11 1905 for (i=0; i<chapters_list->nb_elem; i++)
yading@11 1906 if (chapters[i].start != AV_NOPTS_VALUE && chapters[i].uid
yading@11 1907 && (max_start==0 || chapters[i].start > max_start)) {
yading@11 1908 chapters[i].chapter =
yading@11 1909 avpriv_new_chapter(s, chapters[i].uid, (AVRational){1, 1000000000},
yading@11 1910 chapters[i].start, chapters[i].end,
yading@11 1911 chapters[i].title);
yading@11 1912 av_dict_set(&chapters[i].chapter->metadata,
yading@11 1913 "title", chapters[i].title, 0);
yading@11 1914 max_start = chapters[i].start;
yading@11 1915 }
yading@11 1916
yading@11 1917 matroska_add_index_entries(matroska);
yading@11 1918
yading@11 1919 matroska_convert_tags(s);
yading@11 1920
yading@11 1921 return 0;
yading@11 1922 }
yading@11 1923
yading@11 1924 /*
yading@11 1925 * Put one packet in an application-supplied AVPacket struct.
yading@11 1926 * Returns 0 on success or -1 on failure.
yading@11 1927 */
yading@11 1928 static int matroska_deliver_packet(MatroskaDemuxContext *matroska,
yading@11 1929 AVPacket *pkt)
yading@11 1930 {
yading@11 1931 if (matroska->num_packets > 0) {
yading@11 1932 memcpy(pkt, matroska->packets[0], sizeof(AVPacket));
yading@11 1933 av_free(matroska->packets[0]);
yading@11 1934 if (matroska->num_packets > 1) {
yading@11 1935 void *newpackets;
yading@11 1936 memmove(&matroska->packets[0], &matroska->packets[1],
yading@11 1937 (matroska->num_packets - 1) * sizeof(AVPacket *));
yading@11 1938 newpackets = av_realloc(matroska->packets,
yading@11 1939 (matroska->num_packets - 1) * sizeof(AVPacket *));
yading@11 1940 if (newpackets)
yading@11 1941 matroska->packets = newpackets;
yading@11 1942 } else {
yading@11 1943 av_freep(&matroska->packets);
yading@11 1944 matroska->prev_pkt = NULL;
yading@11 1945 }
yading@11 1946 matroska->num_packets--;
yading@11 1947 return 0;
yading@11 1948 }
yading@11 1949
yading@11 1950 return -1;
yading@11 1951 }
yading@11 1952
yading@11 1953 /*
yading@11 1954 * Free all packets in our internal queue.
yading@11 1955 */
yading@11 1956 static void matroska_clear_queue(MatroskaDemuxContext *matroska)
yading@11 1957 {
yading@11 1958 matroska->prev_pkt = NULL;
yading@11 1959 if (matroska->packets) {
yading@11 1960 int n;
yading@11 1961 for (n = 0; n < matroska->num_packets; n++) {
yading@11 1962 av_free_packet(matroska->packets[n]);
yading@11 1963 av_free(matroska->packets[n]);
yading@11 1964 }
yading@11 1965 av_freep(&matroska->packets);
yading@11 1966 matroska->num_packets = 0;
yading@11 1967 }
yading@11 1968 }
yading@11 1969
yading@11 1970 static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf,
yading@11 1971 int* buf_size, int type,
yading@11 1972 uint32_t **lace_buf, int *laces)
yading@11 1973 {
yading@11 1974 int res = 0, n, size = *buf_size;
yading@11 1975 uint8_t *data = *buf;
yading@11 1976 uint32_t *lace_size;
yading@11 1977
yading@11 1978 if (!type) {
yading@11 1979 *laces = 1;
yading@11 1980 *lace_buf = av_mallocz(sizeof(int));
yading@11 1981 if (!*lace_buf)
yading@11 1982 return AVERROR(ENOMEM);
yading@11 1983
yading@11 1984 *lace_buf[0] = size;
yading@11 1985 return 0;
yading@11 1986 }
yading@11 1987
yading@11 1988 av_assert0(size > 0);
yading@11 1989 *laces = *data + 1;
yading@11 1990 data += 1;
yading@11 1991 size -= 1;
yading@11 1992 lace_size = av_mallocz(*laces * sizeof(int));
yading@11 1993 if (!lace_size)
yading@11 1994 return AVERROR(ENOMEM);
yading@11 1995
yading@11 1996 switch (type) {
yading@11 1997 case 0x1: /* Xiph lacing */ {
yading@11 1998 uint8_t temp;
yading@11 1999 uint32_t total = 0;
yading@11 2000 for (n = 0; res == 0 && n < *laces - 1; n++) {
yading@11 2001 while (1) {
yading@11 2002 if (size <= total) {
yading@11 2003 res = AVERROR_INVALIDDATA;
yading@11 2004 break;
yading@11 2005 }
yading@11 2006 temp = *data;
yading@11 2007 total += temp;
yading@11 2008 lace_size[n] += temp;
yading@11 2009 data += 1;
yading@11 2010 size -= 1;
yading@11 2011 if (temp != 0xff)
yading@11 2012 break;
yading@11 2013 }
yading@11 2014 }
yading@11 2015 if (size <= total) {
yading@11 2016 res = AVERROR_INVALIDDATA;
yading@11 2017 break;
yading@11 2018 }
yading@11 2019
yading@11 2020 lace_size[n] = size - total;
yading@11 2021 break;
yading@11 2022 }
yading@11 2023
yading@11 2024 case 0x2: /* fixed-size lacing */
yading@11 2025 if (size % (*laces)) {
yading@11 2026 res = AVERROR_INVALIDDATA;
yading@11 2027 break;
yading@11 2028 }
yading@11 2029 for (n = 0; n < *laces; n++)
yading@11 2030 lace_size[n] = size / *laces;
yading@11 2031 break;
yading@11 2032
yading@11 2033 case 0x3: /* EBML lacing */ {
yading@11 2034 uint64_t num;
yading@11 2035 uint64_t total;
yading@11 2036 n = matroska_ebmlnum_uint(matroska, data, size, &num);
yading@11 2037 if (n < 0 || num > INT_MAX) {
yading@11 2038 av_log(matroska->ctx, AV_LOG_INFO,
yading@11 2039 "EBML block data error\n");
yading@11 2040 res = n<0 ? n : AVERROR_INVALIDDATA;
yading@11 2041 break;
yading@11 2042 }
yading@11 2043 data += n;
yading@11 2044 size -= n;
yading@11 2045 total = lace_size[0] = num;
yading@11 2046 for (n = 1; res == 0 && n < *laces - 1; n++) {
yading@11 2047 int64_t snum;
yading@11 2048 int r;
yading@11 2049 r = matroska_ebmlnum_sint(matroska, data, size, &snum);
yading@11 2050 if (r < 0 || lace_size[n - 1] + snum > (uint64_t)INT_MAX) {
yading@11 2051 av_log(matroska->ctx, AV_LOG_INFO,
yading@11 2052 "EBML block data error\n");
yading@11 2053 res = r<0 ? r : AVERROR_INVALIDDATA;
yading@11 2054 break;
yading@11 2055 }
yading@11 2056 data += r;
yading@11 2057 size -= r;
yading@11 2058 lace_size[n] = lace_size[n - 1] + snum;
yading@11 2059 total += lace_size[n];
yading@11 2060 }
yading@11 2061 if (size <= total) {
yading@11 2062 res = AVERROR_INVALIDDATA;
yading@11 2063 break;
yading@11 2064 }
yading@11 2065 lace_size[*laces - 1] = size - total;
yading@11 2066 break;
yading@11 2067 }
yading@11 2068 }
yading@11 2069
yading@11 2070 *buf = data;
yading@11 2071 *lace_buf = lace_size;
yading@11 2072 *buf_size = size;
yading@11 2073
yading@11 2074 return res;
yading@11 2075 }
yading@11 2076
yading@11 2077 static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
yading@11 2078 MatroskaTrack *track,
yading@11 2079 AVStream *st,
yading@11 2080 uint8_t *data, int size,
yading@11 2081 uint64_t timecode,
yading@11 2082 int64_t pos)
yading@11 2083 {
yading@11 2084 int a = st->codec->block_align;
yading@11 2085 int sps = track->audio.sub_packet_size;
yading@11 2086 int cfs = track->audio.coded_framesize;
yading@11 2087 int h = track->audio.sub_packet_h;
yading@11 2088 int y = track->audio.sub_packet_cnt;
yading@11 2089 int w = track->audio.frame_size;
yading@11 2090 int x;
yading@11 2091
yading@11 2092 if (!track->audio.pkt_cnt) {
yading@11 2093 if (track->audio.sub_packet_cnt == 0)
yading@11 2094 track->audio.buf_timecode = timecode;
yading@11 2095 if (st->codec->codec_id == AV_CODEC_ID_RA_288) {
yading@11 2096 if (size < cfs * h / 2) {
yading@11 2097 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 2098 "Corrupt int4 RM-style audio packet size\n");
yading@11 2099 return AVERROR_INVALIDDATA;
yading@11 2100 }
yading@11 2101 for (x=0; x<h/2; x++)
yading@11 2102 memcpy(track->audio.buf+x*2*w+y*cfs,
yading@11 2103 data+x*cfs, cfs);
yading@11 2104 } else if (st->codec->codec_id == AV_CODEC_ID_SIPR) {
yading@11 2105 if (size < w) {
yading@11 2106 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 2107 "Corrupt sipr RM-style audio packet size\n");
yading@11 2108 return AVERROR_INVALIDDATA;
yading@11 2109 }
yading@11 2110 memcpy(track->audio.buf + y*w, data, w);
yading@11 2111 } else {
yading@11 2112 if (size < sps * w / sps || h<=0) {
yading@11 2113 av_log(matroska->ctx, AV_LOG_ERROR,
yading@11 2114 "Corrupt generic RM-style audio packet size\n");
yading@11 2115 return AVERROR_INVALIDDATA;
yading@11 2116 }
yading@11 2117 for (x=0; x<w/sps; x++)
yading@11 2118 memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps);
yading@11 2119 }
yading@11 2120
yading@11 2121 if (++track->audio.sub_packet_cnt >= h) {
yading@11 2122 if (st->codec->codec_id == AV_CODEC_ID_SIPR)
yading@11 2123 ff_rm_reorder_sipr_data(track->audio.buf, h, w);
yading@11 2124 track->audio.sub_packet_cnt = 0;
yading@11 2125 track->audio.pkt_cnt = h*w / a;
yading@11 2126 }
yading@11 2127 }
yading@11 2128
yading@11 2129 while (track->audio.pkt_cnt) {
yading@11 2130 AVPacket *pkt = NULL;
yading@11 2131 if (!(pkt = av_mallocz(sizeof(AVPacket))) || av_new_packet(pkt, a) < 0){
yading@11 2132 av_free(pkt);
yading@11 2133 return AVERROR(ENOMEM);
yading@11 2134 }
yading@11 2135 memcpy(pkt->data, track->audio.buf
yading@11 2136 + a * (h*w / a - track->audio.pkt_cnt--), a);
yading@11 2137 pkt->pts = track->audio.buf_timecode;
yading@11 2138 track->audio.buf_timecode = AV_NOPTS_VALUE;
yading@11 2139 pkt->pos = pos;
yading@11 2140 pkt->stream_index = st->index;
yading@11 2141 dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
yading@11 2142 }
yading@11 2143
yading@11 2144 return 0;
yading@11 2145 }
yading@11 2146 static int matroska_parse_frame(MatroskaDemuxContext *matroska,
yading@11 2147 MatroskaTrack *track,
yading@11 2148 AVStream *st,
yading@11 2149 uint8_t *data, int pkt_size,
yading@11 2150 uint64_t timecode, uint64_t lace_duration,
yading@11 2151 int64_t pos, int is_keyframe,
yading@11 2152 uint8_t *additional, uint64_t additional_id, int additional_size)
yading@11 2153 {
yading@11 2154 MatroskaTrackEncoding *encodings = track->encodings.elem;
yading@11 2155 uint8_t *pkt_data = data;
yading@11 2156 int offset = 0, res;
yading@11 2157 AVPacket *pkt;
yading@11 2158
yading@11 2159 if (encodings && !encodings->type && encodings->scope & 1) {
yading@11 2160 res = matroska_decode_buffer(&pkt_data, &pkt_size, track);
yading@11 2161 if (res < 0)
yading@11 2162 return res;
yading@11 2163 }
yading@11 2164
yading@11 2165 if (st->codec->codec_id == AV_CODEC_ID_PRORES)
yading@11 2166 offset = 8;
yading@11 2167
yading@11 2168 pkt = av_mallocz(sizeof(AVPacket));
yading@11 2169 /* XXX: prevent data copy... */
yading@11 2170 if (av_new_packet(pkt, pkt_size + offset) < 0) {
yading@11 2171 av_free(pkt);
yading@11 2172 return AVERROR(ENOMEM);
yading@11 2173 }
yading@11 2174
yading@11 2175 if (st->codec->codec_id == AV_CODEC_ID_PRORES) {
yading@11 2176 uint8_t *buf = pkt->data;
yading@11 2177 bytestream_put_be32(&buf, pkt_size);
yading@11 2178 bytestream_put_be32(&buf, MKBETAG('i', 'c', 'p', 'f'));
yading@11 2179 }
yading@11 2180
yading@11 2181 memcpy(pkt->data + offset, pkt_data, pkt_size);
yading@11 2182
yading@11 2183 if (pkt_data != data)
yading@11 2184 av_free(pkt_data);
yading@11 2185
yading@11 2186 pkt->flags = is_keyframe;
yading@11 2187 pkt->stream_index = st->index;
yading@11 2188
yading@11 2189 if (additional_size > 0) {
yading@11 2190 uint8_t *side_data = av_packet_new_side_data(pkt,
yading@11 2191 AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
yading@11 2192 additional_size + 8);
yading@11 2193 if(side_data == NULL) {
yading@11 2194 av_free_packet(pkt);
yading@11 2195 av_free(pkt);
yading@11 2196 return AVERROR(ENOMEM);
yading@11 2197 }
yading@11 2198 AV_WB64(side_data, additional_id);
yading@11 2199 memcpy(side_data + 8, additional, additional_size);
yading@11 2200 }
yading@11 2201
yading@11 2202 if (track->ms_compat)
yading@11 2203 pkt->dts = timecode;
yading@11 2204 else
yading@11 2205 pkt->pts = timecode;
yading@11 2206 pkt->pos = pos;
yading@11 2207 if (st->codec->codec_id == AV_CODEC_ID_SUBRIP) {
yading@11 2208 /*
yading@11 2209 * For backward compatibility.
yading@11 2210 * Historically, we have put subtitle duration
yading@11 2211 * in convergence_duration, on the off chance
yading@11 2212 * that the time_scale is less than 1us, which
yading@11 2213 * could result in a 32bit overflow on the
yading@11 2214 * normal duration field.
yading@11 2215 */
yading@11 2216 pkt->convergence_duration = lace_duration;
yading@11 2217 }
yading@11 2218
yading@11 2219 if (track->type != MATROSKA_TRACK_TYPE_SUBTITLE ||
yading@11 2220 lace_duration <= INT_MAX) {
yading@11 2221 /*
yading@11 2222 * For non subtitle tracks, just store the duration
yading@11 2223 * as normal.
yading@11 2224 *
yading@11 2225 * If it's a subtitle track and duration value does
yading@11 2226 * not overflow a uint32, then also store it normally.
yading@11 2227 */
yading@11 2228 pkt->duration = lace_duration;
yading@11 2229 }
yading@11 2230
yading@11 2231 #if FF_API_ASS_SSA
yading@11 2232 if (st->codec->codec_id == AV_CODEC_ID_SSA)
yading@11 2233 matroska_fix_ass_packet(matroska, pkt, lace_duration);
yading@11 2234
yading@11 2235 if (matroska->prev_pkt &&
yading@11 2236 timecode != AV_NOPTS_VALUE &&
yading@11 2237 matroska->prev_pkt->pts == timecode &&
yading@11 2238 matroska->prev_pkt->stream_index == st->index &&
yading@11 2239 st->codec->codec_id == AV_CODEC_ID_SSA)
yading@11 2240 matroska_merge_packets(matroska->prev_pkt, pkt);
yading@11 2241 else {
yading@11 2242 dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
yading@11 2243 matroska->prev_pkt = pkt;
yading@11 2244 }
yading@11 2245 #else
yading@11 2246 dynarray_add(&matroska->packets, &matroska->num_packets, pkt);
yading@11 2247 matroska->prev_pkt = pkt;
yading@11 2248 #endif
yading@11 2249
yading@11 2250 return 0;
yading@11 2251 }
yading@11 2252
yading@11 2253 static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
yading@11 2254 int size, int64_t pos, uint64_t cluster_time,
yading@11 2255 uint64_t block_duration, int is_keyframe,
yading@11 2256 uint8_t *additional, uint64_t additional_id, int additional_size,
yading@11 2257 int64_t cluster_pos)
yading@11 2258 {
yading@11 2259 uint64_t timecode = AV_NOPTS_VALUE;
yading@11 2260 MatroskaTrack *track;
yading@11 2261 int res = 0;
yading@11 2262 AVStream *st;
yading@11 2263 int16_t block_time;
yading@11 2264 uint32_t *lace_size = NULL;
yading@11 2265 int n, flags, laces = 0;
yading@11 2266 uint64_t num;
yading@11 2267
yading@11 2268 if ((n = matroska_ebmlnum_uint(matroska, data, size, &num)) < 0) {
yading@11 2269 av_log(matroska->ctx, AV_LOG_ERROR, "EBML block data error\n");
yading@11 2270 return n;
yading@11 2271 }
yading@11 2272 data += n;
yading@11 2273 size -= n;
yading@11 2274
yading@11 2275 track = matroska_find_track_by_num(matroska, num);
yading@11 2276 if (!track || !track->stream) {
yading@11 2277 av_log(matroska->ctx, AV_LOG_INFO,
yading@11 2278 "Invalid stream %"PRIu64" or size %u\n", num, size);
yading@11 2279 return AVERROR_INVALIDDATA;
yading@11 2280 } else if (size <= 3)
yading@11 2281 return 0;
yading@11 2282 st = track->stream;
yading@11 2283 if (st->discard >= AVDISCARD_ALL)
yading@11 2284 return res;
yading@11 2285 av_assert1(block_duration != AV_NOPTS_VALUE);
yading@11 2286
yading@11 2287 block_time = AV_RB16(data);
yading@11 2288 data += 2;
yading@11 2289 flags = *data++;
yading@11 2290 size -= 3;
yading@11 2291 if (is_keyframe == -1)
yading@11 2292 is_keyframe = flags & 0x80 ? AV_PKT_FLAG_KEY : 0;
yading@11 2293
yading@11 2294 if (cluster_time != (uint64_t)-1
yading@11 2295 && (block_time >= 0 || cluster_time >= -block_time)) {
yading@11 2296 timecode = cluster_time + block_time;
yading@11 2297 if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE
yading@11 2298 && timecode < track->end_timecode)
yading@11 2299 is_keyframe = 0; /* overlapping subtitles are not key frame */
yading@11 2300 if (is_keyframe)
yading@11 2301 av_add_index_entry(st, cluster_pos, timecode, 0,0,AVINDEX_KEYFRAME);
yading@11 2302 }
yading@11 2303
yading@11 2304 if (matroska->skip_to_keyframe && track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
yading@11 2305 if (timecode < matroska->skip_to_timecode)
yading@11 2306 return res;
yading@11 2307 if (!st->skip_to_keyframe) {
yading@11 2308 av_log(matroska->ctx, AV_LOG_ERROR, "File is broken, keyframes not correctly marked!\n");
yading@11 2309 matroska->skip_to_keyframe = 0;
yading@11 2310 }
yading@11 2311 if (is_keyframe)
yading@11 2312 matroska->skip_to_keyframe = 0;
yading@11 2313 }
yading@11 2314
yading@11 2315 res = matroska_parse_laces(matroska, &data, &size, (flags & 0x06) >> 1,
yading@11 2316 &lace_size, &laces);
yading@11 2317
yading@11 2318 if (res)
yading@11 2319 goto end;
yading@11 2320
yading@11 2321 if (!block_duration)
yading@11 2322 block_duration = track->default_duration * laces / matroska->time_scale;
yading@11 2323
yading@11 2324 if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time))
yading@11 2325 track->end_timecode =
yading@11 2326 FFMAX(track->end_timecode, timecode + block_duration);
yading@11 2327
yading@11 2328 for (n = 0; n < laces; n++) {
yading@11 2329 int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
yading@11 2330
yading@11 2331 if (lace_size[n] > size) {
yading@11 2332 av_log(matroska->ctx, AV_LOG_ERROR, "Invalid packet size\n");
yading@11 2333 break;
yading@11 2334 }
yading@11 2335
yading@11 2336 if ((st->codec->codec_id == AV_CODEC_ID_RA_288 ||
yading@11 2337 st->codec->codec_id == AV_CODEC_ID_COOK ||
yading@11 2338 st->codec->codec_id == AV_CODEC_ID_SIPR ||
yading@11 2339 st->codec->codec_id == AV_CODEC_ID_ATRAC3) &&
yading@11 2340 st->codec->block_align && track->audio.sub_packet_size) {
yading@11 2341
yading@11 2342 res = matroska_parse_rm_audio(matroska, track, st, data,
yading@11 2343 lace_size[n],
yading@11 2344 timecode, pos);
yading@11 2345 if (res)
yading@11 2346 goto end;
yading@11 2347
yading@11 2348 } else {
yading@11 2349 res = matroska_parse_frame(matroska, track, st, data, lace_size[n],
yading@11 2350 timecode, lace_duration,
yading@11 2351 pos, !n? is_keyframe : 0,
yading@11 2352 additional, additional_id, additional_size);
yading@11 2353 if (res)
yading@11 2354 goto end;
yading@11 2355 }
yading@11 2356
yading@11 2357 if (timecode != AV_NOPTS_VALUE)
yading@11 2358 timecode = lace_duration ? timecode + lace_duration : AV_NOPTS_VALUE;
yading@11 2359 data += lace_size[n];
yading@11 2360 size -= lace_size[n];
yading@11 2361 }
yading@11 2362
yading@11 2363 end:
yading@11 2364 av_free(lace_size);
yading@11 2365 return res;
yading@11 2366 }
yading@11 2367
yading@11 2368 static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
yading@11 2369 {
yading@11 2370 EbmlList *blocks_list;
yading@11 2371 MatroskaBlock *blocks;
yading@11 2372 int i, res;
yading@11 2373 res = ebml_parse(matroska,
yading@11 2374 matroska_cluster_incremental_parsing,
yading@11 2375 &matroska->current_cluster);
yading@11 2376 if (res == 1) {
yading@11 2377 /* New Cluster */
yading@11 2378 if (matroska->current_cluster_pos)
yading@11 2379 ebml_level_end(matroska);
yading@11 2380 ebml_free(matroska_cluster, &matroska->current_cluster);
yading@11 2381 memset(&matroska->current_cluster, 0, sizeof(MatroskaCluster));
yading@11 2382 matroska->current_cluster_num_blocks = 0;
yading@11 2383 matroska->current_cluster_pos = avio_tell(matroska->ctx->pb);
yading@11 2384 matroska->prev_pkt = NULL;
yading@11 2385 /* sizeof the ID which was already read */
yading@11 2386 if (matroska->current_id)
yading@11 2387 matroska->current_cluster_pos -= 4;
yading@11 2388 res = ebml_parse(matroska,
yading@11 2389 matroska_clusters_incremental,
yading@11 2390 &matroska->current_cluster);
yading@11 2391 /* Try parsing the block again. */
yading@11 2392 if (res == 1)
yading@11 2393 res = ebml_parse(matroska,
yading@11 2394 matroska_cluster_incremental_parsing,
yading@11 2395 &matroska->current_cluster);
yading@11 2396 }
yading@11 2397
yading@11 2398 if (!res &&
yading@11 2399 matroska->current_cluster_num_blocks <
yading@11 2400 matroska->current_cluster.blocks.nb_elem) {
yading@11 2401 blocks_list = &matroska->current_cluster.blocks;
yading@11 2402 blocks = blocks_list->elem;
yading@11 2403
yading@11 2404 matroska->current_cluster_num_blocks = blocks_list->nb_elem;
yading@11 2405 i = blocks_list->nb_elem - 1;
yading@11 2406 if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
yading@11 2407 int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
yading@11 2408 uint8_t* additional = blocks[i].additional.size > 0 ?
yading@11 2409 blocks[i].additional.data : NULL;
yading@11 2410 if (!blocks[i].non_simple)
yading@11 2411 blocks[i].duration = 0;
yading@11 2412 res = matroska_parse_block(matroska,
yading@11 2413 blocks[i].bin.data, blocks[i].bin.size,
yading@11 2414 blocks[i].bin.pos,
yading@11 2415 matroska->current_cluster.timecode,
yading@11 2416 blocks[i].duration, is_keyframe,
yading@11 2417 additional, blocks[i].additional_id,
yading@11 2418 blocks[i].additional.size,
yading@11 2419 matroska->current_cluster_pos);
yading@11 2420 }
yading@11 2421 }
yading@11 2422
yading@11 2423 if (res < 0) matroska->done = 1;
yading@11 2424 return res;
yading@11 2425 }
yading@11 2426
yading@11 2427 static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
yading@11 2428 {
yading@11 2429 MatroskaCluster cluster = { 0 };
yading@11 2430 EbmlList *blocks_list;
yading@11 2431 MatroskaBlock *blocks;
yading@11 2432 int i, res;
yading@11 2433 int64_t pos;
yading@11 2434 if (!matroska->contains_ssa)
yading@11 2435 return matroska_parse_cluster_incremental(matroska);
yading@11 2436 pos = avio_tell(matroska->ctx->pb);
yading@11 2437 matroska->prev_pkt = NULL;
yading@11 2438 if (matroska->current_id)
yading@11 2439 pos -= 4; /* sizeof the ID which was already read */
yading@11 2440 res = ebml_parse(matroska, matroska_clusters, &cluster);
yading@11 2441 blocks_list = &cluster.blocks;
yading@11 2442 blocks = blocks_list->elem;
yading@11 2443 for (i=0; i<blocks_list->nb_elem; i++)
yading@11 2444 if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
yading@11 2445 int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
yading@11 2446 res=matroska_parse_block(matroska,
yading@11 2447 blocks[i].bin.data, blocks[i].bin.size,
yading@11 2448 blocks[i].bin.pos, cluster.timecode,
yading@11 2449 blocks[i].duration, is_keyframe, NULL, 0, 0,
yading@11 2450 pos);
yading@11 2451 }
yading@11 2452 ebml_free(matroska_cluster, &cluster);
yading@11 2453 return res;
yading@11 2454 }
yading@11 2455
yading@11 2456 static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
yading@11 2457 {
yading@11 2458 MatroskaDemuxContext *matroska = s->priv_data;
yading@11 2459
yading@11 2460 while (matroska_deliver_packet(matroska, pkt)) {
yading@11 2461 int64_t pos = avio_tell(matroska->ctx->pb);
yading@11 2462 if (matroska->done)
yading@11 2463 return AVERROR_EOF;
yading@11 2464 if (matroska_parse_cluster(matroska) < 0)
yading@11 2465 matroska_resync(matroska, pos);
yading@11 2466 }
yading@11 2467
yading@11 2468 return 0;
yading@11 2469 }
yading@11 2470
yading@11 2471 static int matroska_read_seek(AVFormatContext *s, int stream_index,
yading@11 2472 int64_t timestamp, int flags)
yading@11 2473 {
yading@11 2474 MatroskaDemuxContext *matroska = s->priv_data;
yading@11 2475 MatroskaTrack *tracks = matroska->tracks.elem;
yading@11 2476 AVStream *st = s->streams[stream_index];
yading@11 2477 int i, index, index_sub, index_min;
yading@11 2478
yading@11 2479 /* Parse the CUES now since we need the index data to seek. */
yading@11 2480 if (matroska->cues_parsing_deferred > 0) {
yading@11 2481 matroska->cues_parsing_deferred = 0;
yading@11 2482 matroska_parse_cues(matroska);
yading@11 2483 }
yading@11 2484
yading@11 2485 if (!st->nb_index_entries)
yading@11 2486 goto err;
yading@11 2487 timestamp = FFMAX(timestamp, st->index_entries[0].timestamp);
yading@11 2488
yading@11 2489 if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
yading@11 2490 avio_seek(s->pb, st->index_entries[st->nb_index_entries-1].pos, SEEK_SET);
yading@11 2491 matroska->current_id = 0;
yading@11 2492 while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
yading@11 2493 matroska_clear_queue(matroska);
yading@11 2494 if (matroska_parse_cluster(matroska) < 0)
yading@11 2495 break;
yading@11 2496 }
yading@11 2497 }
yading@11 2498
yading@11 2499 matroska_clear_queue(matroska);
yading@11 2500 if (index < 0 || (matroska->cues_parsing_deferred < 0 && index == st->nb_index_entries - 1))
yading@11 2501 goto err;
yading@11 2502
yading@11 2503 index_min = index;
yading@11 2504 for (i=0; i < matroska->tracks.nb_elem; i++) {
yading@11 2505 tracks[i].audio.pkt_cnt = 0;
yading@11 2506 tracks[i].audio.sub_packet_cnt = 0;
yading@11 2507 tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
yading@11 2508 tracks[i].end_timecode = 0;
yading@11 2509 if (tracks[i].type == MATROSKA_TRACK_TYPE_SUBTITLE
yading@11 2510 && tracks[i].stream->discard != AVDISCARD_ALL) {
yading@11 2511 index_sub = av_index_search_timestamp(tracks[i].stream, st->index_entries[index].timestamp, AVSEEK_FLAG_BACKWARD);
yading@11 2512 if (index_sub >= 0
yading@11 2513 && st->index_entries[index_sub].pos < st->index_entries[index_min].pos
yading@11 2514 && st->index_entries[index].timestamp - st->index_entries[index_sub].timestamp < 30000000000/matroska->time_scale)
yading@11 2515 index_min = index_sub;
yading@11 2516 }
yading@11 2517 }
yading@11 2518
yading@11 2519 avio_seek(s->pb, st->index_entries[index_min].pos, SEEK_SET);
yading@11 2520 matroska->current_id = 0;
yading@11 2521 if (flags & AVSEEK_FLAG_ANY) {
yading@11 2522 st->skip_to_keyframe = 0;
yading@11 2523 matroska->skip_to_timecode = timestamp;
yading@11 2524 } else {
yading@11 2525 st->skip_to_keyframe = 1;
yading@11 2526 matroska->skip_to_timecode = st->index_entries[index].timestamp;
yading@11 2527 }
yading@11 2528 matroska->skip_to_keyframe = 1;
yading@11 2529 matroska->done = 0;
yading@11 2530 matroska->num_levels = 0;
yading@11 2531 ff_update_cur_dts(s, st, st->index_entries[index].timestamp);
yading@11 2532 return 0;
yading@11 2533 err:
yading@11 2534 // slightly hackish but allows proper fallback to
yading@11 2535 // the generic seeking code.
yading@11 2536 matroska_clear_queue(matroska);
yading@11 2537 matroska->current_id = 0;
yading@11 2538 st->skip_to_keyframe =
yading@11 2539 matroska->skip_to_keyframe = 0;
yading@11 2540 matroska->done = 0;
yading@11 2541 matroska->num_levels = 0;
yading@11 2542 return -1;
yading@11 2543 }
yading@11 2544
yading@11 2545 static int matroska_read_close(AVFormatContext *s)
yading@11 2546 {
yading@11 2547 MatroskaDemuxContext *matroska = s->priv_data;
yading@11 2548 MatroskaTrack *tracks = matroska->tracks.elem;
yading@11 2549 int n;
yading@11 2550
yading@11 2551 matroska_clear_queue(matroska);
yading@11 2552
yading@11 2553 for (n=0; n < matroska->tracks.nb_elem; n++)
yading@11 2554 if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
yading@11 2555 av_free(tracks[n].audio.buf);
yading@11 2556 ebml_free(matroska_cluster, &matroska->current_cluster);
yading@11 2557 ebml_free(matroska_segment, matroska);
yading@11 2558
yading@11 2559 return 0;
yading@11 2560 }
yading@11 2561
yading@11 2562 AVInputFormat ff_matroska_demuxer = {
yading@11 2563 .name = "matroska,webm",
yading@11 2564 .long_name = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
yading@11 2565 .priv_data_size = sizeof(MatroskaDemuxContext),
yading@11 2566 .read_probe = matroska_probe,
yading@11 2567 .read_header = matroska_read_header,
yading@11 2568 .read_packet = matroska_read_packet,
yading@11 2569 .read_close = matroska_read_close,
yading@11 2570 .read_seek = matroska_read_seek,
yading@11 2571 };