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 };
|