yading@11
|
1 /*
|
yading@11
|
2 * Matroska muxer
|
yading@11
|
3 * Copyright (c) 2007 David Conrad
|
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 #include "avformat.h"
|
yading@11
|
23 #include "internal.h"
|
yading@11
|
24 #include "riff.h"
|
yading@11
|
25 #include "isom.h"
|
yading@11
|
26 #include "matroska.h"
|
yading@11
|
27 #include "avc.h"
|
yading@11
|
28 #include "flacenc.h"
|
yading@11
|
29 #include "avlanguage.h"
|
yading@11
|
30 #include "libavutil/samplefmt.h"
|
yading@11
|
31 #include "libavutil/sha.h"
|
yading@11
|
32 #include "libavutil/intreadwrite.h"
|
yading@11
|
33 #include "libavutil/intfloat.h"
|
yading@11
|
34 #include "libavutil/mathematics.h"
|
yading@11
|
35 #include "libavutil/random_seed.h"
|
yading@11
|
36 #include "libavutil/lfg.h"
|
yading@11
|
37 #include "libavutil/dict.h"
|
yading@11
|
38 #include "libavutil/avstring.h"
|
yading@11
|
39 #include "libavcodec/xiph.h"
|
yading@11
|
40 #include "libavcodec/mpeg4audio.h"
|
yading@11
|
41
|
yading@11
|
42 typedef struct ebml_master {
|
yading@11
|
43 int64_t pos; ///< absolute offset in the file where the master's elements start
|
yading@11
|
44 int sizebytes; ///< how many bytes were reserved for the size
|
yading@11
|
45 } ebml_master;
|
yading@11
|
46
|
yading@11
|
47 typedef struct mkv_seekhead_entry {
|
yading@11
|
48 unsigned int elementid;
|
yading@11
|
49 uint64_t segmentpos;
|
yading@11
|
50 } mkv_seekhead_entry;
|
yading@11
|
51
|
yading@11
|
52 typedef struct mkv_seekhead {
|
yading@11
|
53 int64_t filepos;
|
yading@11
|
54 int64_t segment_offset; ///< the file offset to the beginning of the segment
|
yading@11
|
55 int reserved_size; ///< -1 if appending to file
|
yading@11
|
56 int max_entries;
|
yading@11
|
57 mkv_seekhead_entry *entries;
|
yading@11
|
58 int num_entries;
|
yading@11
|
59 } mkv_seekhead;
|
yading@11
|
60
|
yading@11
|
61 typedef struct {
|
yading@11
|
62 uint64_t pts;
|
yading@11
|
63 int tracknum;
|
yading@11
|
64 int64_t cluster_pos; ///< file offset of the cluster containing the block
|
yading@11
|
65 } mkv_cuepoint;
|
yading@11
|
66
|
yading@11
|
67 typedef struct {
|
yading@11
|
68 int64_t segment_offset;
|
yading@11
|
69 mkv_cuepoint *entries;
|
yading@11
|
70 int num_entries;
|
yading@11
|
71 } mkv_cues;
|
yading@11
|
72
|
yading@11
|
73 typedef struct {
|
yading@11
|
74 int write_dts;
|
yading@11
|
75 int has_cue;
|
yading@11
|
76 } mkv_track;
|
yading@11
|
77
|
yading@11
|
78 #define MODE_MATROSKAv2 0x01
|
yading@11
|
79 #define MODE_WEBM 0x02
|
yading@11
|
80
|
yading@11
|
81 typedef struct MatroskaMuxContext {
|
yading@11
|
82 int mode;
|
yading@11
|
83 AVIOContext *dyn_bc;
|
yading@11
|
84 ebml_master segment;
|
yading@11
|
85 int64_t segment_offset;
|
yading@11
|
86 ebml_master cluster;
|
yading@11
|
87 int64_t cluster_pos; ///< file offset of the current cluster
|
yading@11
|
88 int64_t cluster_pts;
|
yading@11
|
89 int64_t duration_offset;
|
yading@11
|
90 int64_t duration;
|
yading@11
|
91 mkv_seekhead *main_seekhead;
|
yading@11
|
92 mkv_cues *cues;
|
yading@11
|
93 mkv_track *tracks;
|
yading@11
|
94
|
yading@11
|
95 AVPacket cur_audio_pkt;
|
yading@11
|
96
|
yading@11
|
97 int have_attachments;
|
yading@11
|
98 } MatroskaMuxContext;
|
yading@11
|
99
|
yading@11
|
100
|
yading@11
|
101 /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
|
yading@11
|
102 * offset, 4 bytes for target EBML ID */
|
yading@11
|
103 #define MAX_SEEKENTRY_SIZE 21
|
yading@11
|
104
|
yading@11
|
105 /** per-cuepoint-track - 3 1-byte EBML IDs, 3 1-byte EBML sizes, 2
|
yading@11
|
106 * 8-byte uint max */
|
yading@11
|
107 #define MAX_CUETRACKPOS_SIZE 22
|
yading@11
|
108
|
yading@11
|
109 /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */
|
yading@11
|
110 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
|
yading@11
|
111
|
yading@11
|
112
|
yading@11
|
113 static int ebml_id_size(unsigned int id)
|
yading@11
|
114 {
|
yading@11
|
115 return (av_log2(id+1)-1)/7+1;
|
yading@11
|
116 }
|
yading@11
|
117
|
yading@11
|
118 static void put_ebml_id(AVIOContext *pb, unsigned int id)
|
yading@11
|
119 {
|
yading@11
|
120 int i = ebml_id_size(id);
|
yading@11
|
121 while (i--)
|
yading@11
|
122 avio_w8(pb, (uint8_t)(id >> (i*8)));
|
yading@11
|
123 }
|
yading@11
|
124
|
yading@11
|
125 /**
|
yading@11
|
126 * Write an EBML size meaning "unknown size".
|
yading@11
|
127 *
|
yading@11
|
128 * @param bytes The number of bytes the size should occupy (maximum: 8).
|
yading@11
|
129 */
|
yading@11
|
130 static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
|
yading@11
|
131 {
|
yading@11
|
132 av_assert0(bytes <= 8);
|
yading@11
|
133 avio_w8(pb, 0x1ff >> bytes);
|
yading@11
|
134 while (--bytes)
|
yading@11
|
135 avio_w8(pb, 0xff);
|
yading@11
|
136 }
|
yading@11
|
137
|
yading@11
|
138 /**
|
yading@11
|
139 * Calculate how many bytes are needed to represent a given number in EBML.
|
yading@11
|
140 */
|
yading@11
|
141 static int ebml_num_size(uint64_t num)
|
yading@11
|
142 {
|
yading@11
|
143 int bytes = 1;
|
yading@11
|
144 while ((num+1) >> bytes*7) bytes++;
|
yading@11
|
145 return bytes;
|
yading@11
|
146 }
|
yading@11
|
147
|
yading@11
|
148 /**
|
yading@11
|
149 * Write a number in EBML variable length format.
|
yading@11
|
150 *
|
yading@11
|
151 * @param bytes The number of bytes that need to be used to write the number.
|
yading@11
|
152 * If zero, any number of bytes can be used.
|
yading@11
|
153 */
|
yading@11
|
154 static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
|
yading@11
|
155 {
|
yading@11
|
156 int i, needed_bytes = ebml_num_size(num);
|
yading@11
|
157
|
yading@11
|
158 // sizes larger than this are currently undefined in EBML
|
yading@11
|
159 av_assert0(num < (1ULL<<56)-1);
|
yading@11
|
160
|
yading@11
|
161 if (bytes == 0)
|
yading@11
|
162 // don't care how many bytes are used, so use the min
|
yading@11
|
163 bytes = needed_bytes;
|
yading@11
|
164 // the bytes needed to write the given size would exceed the bytes
|
yading@11
|
165 // that we need to use, so write unknown size. This shouldn't happen.
|
yading@11
|
166 av_assert0(bytes >= needed_bytes);
|
yading@11
|
167
|
yading@11
|
168 num |= 1ULL << bytes*7;
|
yading@11
|
169 for (i = bytes - 1; i >= 0; i--)
|
yading@11
|
170 avio_w8(pb, (uint8_t)(num >> i*8));
|
yading@11
|
171 }
|
yading@11
|
172
|
yading@11
|
173 static void put_ebml_uint(AVIOContext *pb, unsigned int elementid, uint64_t val)
|
yading@11
|
174 {
|
yading@11
|
175 int i, bytes = 1;
|
yading@11
|
176 uint64_t tmp = val;
|
yading@11
|
177 while (tmp>>=8) bytes++;
|
yading@11
|
178
|
yading@11
|
179 put_ebml_id(pb, elementid);
|
yading@11
|
180 put_ebml_num(pb, bytes, 0);
|
yading@11
|
181 for (i = bytes - 1; i >= 0; i--)
|
yading@11
|
182 avio_w8(pb, (uint8_t)(val >> i*8));
|
yading@11
|
183 }
|
yading@11
|
184
|
yading@11
|
185 static void put_ebml_float(AVIOContext *pb, unsigned int elementid, double val)
|
yading@11
|
186 {
|
yading@11
|
187 put_ebml_id(pb, elementid);
|
yading@11
|
188 put_ebml_num(pb, 8, 0);
|
yading@11
|
189 avio_wb64(pb, av_double2int(val));
|
yading@11
|
190 }
|
yading@11
|
191
|
yading@11
|
192 static void put_ebml_binary(AVIOContext *pb, unsigned int elementid,
|
yading@11
|
193 const void *buf, int size)
|
yading@11
|
194 {
|
yading@11
|
195 put_ebml_id(pb, elementid);
|
yading@11
|
196 put_ebml_num(pb, size, 0);
|
yading@11
|
197 avio_write(pb, buf, size);
|
yading@11
|
198 }
|
yading@11
|
199
|
yading@11
|
200 static void put_ebml_string(AVIOContext *pb, unsigned int elementid, const char *str)
|
yading@11
|
201 {
|
yading@11
|
202 put_ebml_binary(pb, elementid, str, strlen(str));
|
yading@11
|
203 }
|
yading@11
|
204
|
yading@11
|
205 /**
|
yading@11
|
206 * Write a void element of a given size. Useful for reserving space in
|
yading@11
|
207 * the file to be written to later.
|
yading@11
|
208 *
|
yading@11
|
209 * @param size The number of bytes to reserve, which must be at least 2.
|
yading@11
|
210 */
|
yading@11
|
211 static void put_ebml_void(AVIOContext *pb, uint64_t size)
|
yading@11
|
212 {
|
yading@11
|
213 int64_t currentpos = avio_tell(pb);
|
yading@11
|
214
|
yading@11
|
215 av_assert0(size >= 2);
|
yading@11
|
216
|
yading@11
|
217 put_ebml_id(pb, EBML_ID_VOID);
|
yading@11
|
218 // we need to subtract the length needed to store the size from the
|
yading@11
|
219 // size we need to reserve so 2 cases, we use 8 bytes to store the
|
yading@11
|
220 // size if possible, 1 byte otherwise
|
yading@11
|
221 if (size < 10)
|
yading@11
|
222 put_ebml_num(pb, size-1, 0);
|
yading@11
|
223 else
|
yading@11
|
224 put_ebml_num(pb, size-9, 8);
|
yading@11
|
225 while(avio_tell(pb) < currentpos + size)
|
yading@11
|
226 avio_w8(pb, 0);
|
yading@11
|
227 }
|
yading@11
|
228
|
yading@11
|
229 static ebml_master start_ebml_master(AVIOContext *pb, unsigned int elementid, uint64_t expectedsize)
|
yading@11
|
230 {
|
yading@11
|
231 int bytes = expectedsize ? ebml_num_size(expectedsize) : 8;
|
yading@11
|
232 put_ebml_id(pb, elementid);
|
yading@11
|
233 put_ebml_size_unknown(pb, bytes);
|
yading@11
|
234 return (ebml_master){ avio_tell(pb), bytes };
|
yading@11
|
235 }
|
yading@11
|
236
|
yading@11
|
237 static void end_ebml_master(AVIOContext *pb, ebml_master master)
|
yading@11
|
238 {
|
yading@11
|
239 int64_t pos = avio_tell(pb);
|
yading@11
|
240
|
yading@11
|
241 if (avio_seek(pb, master.pos - master.sizebytes, SEEK_SET) < 0)
|
yading@11
|
242 return;
|
yading@11
|
243 put_ebml_num(pb, pos - master.pos, master.sizebytes);
|
yading@11
|
244 avio_seek(pb, pos, SEEK_SET);
|
yading@11
|
245 }
|
yading@11
|
246
|
yading@11
|
247 static void put_xiph_size(AVIOContext *pb, int size)
|
yading@11
|
248 {
|
yading@11
|
249 int i;
|
yading@11
|
250 for (i = 0; i < size / 255; i++)
|
yading@11
|
251 avio_w8(pb, 255);
|
yading@11
|
252 avio_w8(pb, size % 255);
|
yading@11
|
253 }
|
yading@11
|
254
|
yading@11
|
255 /**
|
yading@11
|
256 * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
|
yading@11
|
257 * elements. If a maximum number of elements is specified, enough space
|
yading@11
|
258 * will be reserved at the current file location to write a seek head of
|
yading@11
|
259 * that size.
|
yading@11
|
260 *
|
yading@11
|
261 * @param segment_offset The absolute offset to the position in the file
|
yading@11
|
262 * where the segment begins.
|
yading@11
|
263 * @param numelements The maximum number of elements that will be indexed
|
yading@11
|
264 * by this seek head, 0 if unlimited.
|
yading@11
|
265 */
|
yading@11
|
266 static mkv_seekhead * mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset, int numelements)
|
yading@11
|
267 {
|
yading@11
|
268 mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
|
yading@11
|
269 if (new_seekhead == NULL)
|
yading@11
|
270 return NULL;
|
yading@11
|
271
|
yading@11
|
272 new_seekhead->segment_offset = segment_offset;
|
yading@11
|
273
|
yading@11
|
274 if (numelements > 0) {
|
yading@11
|
275 new_seekhead->filepos = avio_tell(pb);
|
yading@11
|
276 // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
|
yading@11
|
277 // and size, and 3 bytes to guarantee that an EBML void element
|
yading@11
|
278 // will fit afterwards
|
yading@11
|
279 new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 13;
|
yading@11
|
280 new_seekhead->max_entries = numelements;
|
yading@11
|
281 put_ebml_void(pb, new_seekhead->reserved_size);
|
yading@11
|
282 }
|
yading@11
|
283 return new_seekhead;
|
yading@11
|
284 }
|
yading@11
|
285
|
yading@11
|
286 static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
|
yading@11
|
287 {
|
yading@11
|
288 mkv_seekhead_entry *entries = seekhead->entries;
|
yading@11
|
289
|
yading@11
|
290 // don't store more elements than we reserved space for
|
yading@11
|
291 if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
|
yading@11
|
292 return -1;
|
yading@11
|
293
|
yading@11
|
294 entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry));
|
yading@11
|
295 if (entries == NULL)
|
yading@11
|
296 return AVERROR(ENOMEM);
|
yading@11
|
297
|
yading@11
|
298 entries[seekhead->num_entries ].elementid = elementid;
|
yading@11
|
299 entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
|
yading@11
|
300
|
yading@11
|
301 seekhead->entries = entries;
|
yading@11
|
302 return 0;
|
yading@11
|
303 }
|
yading@11
|
304
|
yading@11
|
305 /**
|
yading@11
|
306 * Write the seek head to the file and free it. If a maximum number of
|
yading@11
|
307 * elements was specified to mkv_start_seekhead(), the seek head will
|
yading@11
|
308 * be written at the location reserved for it. Otherwise, it is written
|
yading@11
|
309 * at the current location in the file.
|
yading@11
|
310 *
|
yading@11
|
311 * @return The file offset where the seekhead was written,
|
yading@11
|
312 * -1 if an error occurred.
|
yading@11
|
313 */
|
yading@11
|
314 static int64_t mkv_write_seekhead(AVIOContext *pb, mkv_seekhead *seekhead)
|
yading@11
|
315 {
|
yading@11
|
316 ebml_master metaseek, seekentry;
|
yading@11
|
317 int64_t currentpos;
|
yading@11
|
318 int i;
|
yading@11
|
319
|
yading@11
|
320 currentpos = avio_tell(pb);
|
yading@11
|
321
|
yading@11
|
322 if (seekhead->reserved_size > 0) {
|
yading@11
|
323 if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) {
|
yading@11
|
324 currentpos = -1;
|
yading@11
|
325 goto fail;
|
yading@11
|
326 }
|
yading@11
|
327 }
|
yading@11
|
328
|
yading@11
|
329 metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size);
|
yading@11
|
330 for (i = 0; i < seekhead->num_entries; i++) {
|
yading@11
|
331 mkv_seekhead_entry *entry = &seekhead->entries[i];
|
yading@11
|
332
|
yading@11
|
333 seekentry = start_ebml_master(pb, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE);
|
yading@11
|
334
|
yading@11
|
335 put_ebml_id(pb, MATROSKA_ID_SEEKID);
|
yading@11
|
336 put_ebml_num(pb, ebml_id_size(entry->elementid), 0);
|
yading@11
|
337 put_ebml_id(pb, entry->elementid);
|
yading@11
|
338
|
yading@11
|
339 put_ebml_uint(pb, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
|
yading@11
|
340 end_ebml_master(pb, seekentry);
|
yading@11
|
341 }
|
yading@11
|
342 end_ebml_master(pb, metaseek);
|
yading@11
|
343
|
yading@11
|
344 if (seekhead->reserved_size > 0) {
|
yading@11
|
345 uint64_t remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
|
yading@11
|
346 put_ebml_void(pb, remaining);
|
yading@11
|
347 avio_seek(pb, currentpos, SEEK_SET);
|
yading@11
|
348
|
yading@11
|
349 currentpos = seekhead->filepos;
|
yading@11
|
350 }
|
yading@11
|
351 fail:
|
yading@11
|
352 av_free(seekhead->entries);
|
yading@11
|
353 av_free(seekhead);
|
yading@11
|
354
|
yading@11
|
355 return currentpos;
|
yading@11
|
356 }
|
yading@11
|
357
|
yading@11
|
358 static mkv_cues * mkv_start_cues(int64_t segment_offset)
|
yading@11
|
359 {
|
yading@11
|
360 mkv_cues *cues = av_mallocz(sizeof(mkv_cues));
|
yading@11
|
361 if (cues == NULL)
|
yading@11
|
362 return NULL;
|
yading@11
|
363
|
yading@11
|
364 cues->segment_offset = segment_offset;
|
yading@11
|
365 return cues;
|
yading@11
|
366 }
|
yading@11
|
367
|
yading@11
|
368 static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos)
|
yading@11
|
369 {
|
yading@11
|
370 mkv_cuepoint *entries = cues->entries;
|
yading@11
|
371
|
yading@11
|
372 if (ts < 0)
|
yading@11
|
373 return 0;
|
yading@11
|
374
|
yading@11
|
375 entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint));
|
yading@11
|
376 if (entries == NULL)
|
yading@11
|
377 return AVERROR(ENOMEM);
|
yading@11
|
378
|
yading@11
|
379 entries[cues->num_entries ].pts = ts;
|
yading@11
|
380 entries[cues->num_entries ].tracknum = stream + 1;
|
yading@11
|
381 entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset;
|
yading@11
|
382
|
yading@11
|
383 cues->entries = entries;
|
yading@11
|
384 return 0;
|
yading@11
|
385 }
|
yading@11
|
386
|
yading@11
|
387 static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, mkv_track *tracks, int num_tracks)
|
yading@11
|
388 {
|
yading@11
|
389 ebml_master cues_element;
|
yading@11
|
390 int64_t currentpos;
|
yading@11
|
391 int i, j;
|
yading@11
|
392
|
yading@11
|
393 currentpos = avio_tell(pb);
|
yading@11
|
394 cues_element = start_ebml_master(pb, MATROSKA_ID_CUES, 0);
|
yading@11
|
395
|
yading@11
|
396 for (i = 0; i < cues->num_entries; i++) {
|
yading@11
|
397 ebml_master cuepoint, track_positions;
|
yading@11
|
398 mkv_cuepoint *entry = &cues->entries[i];
|
yading@11
|
399 uint64_t pts = entry->pts;
|
yading@11
|
400
|
yading@11
|
401 cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(num_tracks));
|
yading@11
|
402 put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts);
|
yading@11
|
403
|
yading@11
|
404 // put all the entries from different tracks that have the exact same
|
yading@11
|
405 // timestamp into the same CuePoint
|
yading@11
|
406 for (j = 0; j < num_tracks; j++)
|
yading@11
|
407 tracks[j].has_cue = 0;
|
yading@11
|
408 for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
|
yading@11
|
409 int tracknum = entry[j].tracknum - 1;
|
yading@11
|
410 av_assert0(tracknum>=0 && tracknum<num_tracks);
|
yading@11
|
411 if (tracks[tracknum].has_cue)
|
yading@11
|
412 continue;
|
yading@11
|
413 tracks[tracknum].has_cue = 1;
|
yading@11
|
414 track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
|
yading@11
|
415 put_ebml_uint(pb, MATROSKA_ID_CUETRACK , entry[j].tracknum );
|
yading@11
|
416 put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos);
|
yading@11
|
417 end_ebml_master(pb, track_positions);
|
yading@11
|
418 }
|
yading@11
|
419 i += j - 1;
|
yading@11
|
420 end_ebml_master(pb, cuepoint);
|
yading@11
|
421 }
|
yading@11
|
422 end_ebml_master(pb, cues_element);
|
yading@11
|
423
|
yading@11
|
424 return currentpos;
|
yading@11
|
425 }
|
yading@11
|
426
|
yading@11
|
427 static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecContext *codec)
|
yading@11
|
428 {
|
yading@11
|
429 uint8_t *header_start[3];
|
yading@11
|
430 int header_len[3];
|
yading@11
|
431 int first_header_size;
|
yading@11
|
432 int j;
|
yading@11
|
433
|
yading@11
|
434 if (codec->codec_id == AV_CODEC_ID_VORBIS)
|
yading@11
|
435 first_header_size = 30;
|
yading@11
|
436 else
|
yading@11
|
437 first_header_size = 42;
|
yading@11
|
438
|
yading@11
|
439 if (avpriv_split_xiph_headers(codec->extradata, codec->extradata_size,
|
yading@11
|
440 first_header_size, header_start, header_len) < 0) {
|
yading@11
|
441 av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
|
yading@11
|
442 return -1;
|
yading@11
|
443 }
|
yading@11
|
444
|
yading@11
|
445 avio_w8(pb, 2); // number packets - 1
|
yading@11
|
446 for (j = 0; j < 2; j++) {
|
yading@11
|
447 put_xiph_size(pb, header_len[j]);
|
yading@11
|
448 }
|
yading@11
|
449 for (j = 0; j < 3; j++)
|
yading@11
|
450 avio_write(pb, header_start[j], header_len[j]);
|
yading@11
|
451
|
yading@11
|
452 return 0;
|
yading@11
|
453 }
|
yading@11
|
454
|
yading@11
|
455 static void get_aac_sample_rates(AVFormatContext *s, AVCodecContext *codec, int *sample_rate, int *output_sample_rate)
|
yading@11
|
456 {
|
yading@11
|
457 MPEG4AudioConfig mp4ac;
|
yading@11
|
458
|
yading@11
|
459 if (avpriv_mpeg4audio_get_config(&mp4ac, codec->extradata,
|
yading@11
|
460 codec->extradata_size * 8, 1) < 0) {
|
yading@11
|
461 av_log(s, AV_LOG_WARNING, "Error parsing AAC extradata, unable to determine samplerate.\n");
|
yading@11
|
462 return;
|
yading@11
|
463 }
|
yading@11
|
464
|
yading@11
|
465 *sample_rate = mp4ac.sample_rate;
|
yading@11
|
466 *output_sample_rate = mp4ac.ext_sample_rate;
|
yading@11
|
467 }
|
yading@11
|
468
|
yading@11
|
469 static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, AVCodecContext *codec, int native_id, int qt_id)
|
yading@11
|
470 {
|
yading@11
|
471 AVIOContext *dyn_cp;
|
yading@11
|
472 uint8_t *codecpriv;
|
yading@11
|
473 int ret, codecpriv_size;
|
yading@11
|
474
|
yading@11
|
475 ret = avio_open_dyn_buf(&dyn_cp);
|
yading@11
|
476 if(ret < 0)
|
yading@11
|
477 return ret;
|
yading@11
|
478
|
yading@11
|
479 if (native_id) {
|
yading@11
|
480 if (codec->codec_id == AV_CODEC_ID_VORBIS || codec->codec_id == AV_CODEC_ID_THEORA)
|
yading@11
|
481 ret = put_xiph_codecpriv(s, dyn_cp, codec);
|
yading@11
|
482 else if (codec->codec_id == AV_CODEC_ID_FLAC)
|
yading@11
|
483 ret = ff_flac_write_header(dyn_cp, codec, 1);
|
yading@11
|
484 else if (codec->codec_id == AV_CODEC_ID_H264)
|
yading@11
|
485 ret = ff_isom_write_avcc(dyn_cp, codec->extradata, codec->extradata_size);
|
yading@11
|
486 else if (codec->codec_id == AV_CODEC_ID_ALAC) {
|
yading@11
|
487 if (codec->extradata_size < 36) {
|
yading@11
|
488 av_log(s, AV_LOG_ERROR,
|
yading@11
|
489 "Invalid extradata found, ALAC expects a 36-byte "
|
yading@11
|
490 "QuickTime atom.");
|
yading@11
|
491 ret = AVERROR_INVALIDDATA;
|
yading@11
|
492 } else
|
yading@11
|
493 avio_write(dyn_cp, codec->extradata + 12,
|
yading@11
|
494 codec->extradata_size - 12);
|
yading@11
|
495 }
|
yading@11
|
496 else if (codec->extradata_size && codec->codec_id != AV_CODEC_ID_TTA)
|
yading@11
|
497 avio_write(dyn_cp, codec->extradata, codec->extradata_size);
|
yading@11
|
498 } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
|
yading@11
|
499 if (qt_id) {
|
yading@11
|
500 if (!codec->codec_tag)
|
yading@11
|
501 codec->codec_tag = ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id);
|
yading@11
|
502 if (codec->extradata_size)
|
yading@11
|
503 avio_write(dyn_cp, codec->extradata, codec->extradata_size);
|
yading@11
|
504 } else {
|
yading@11
|
505 if (!codec->codec_tag)
|
yading@11
|
506 codec->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id);
|
yading@11
|
507 if (!codec->codec_tag) {
|
yading@11
|
508 av_log(s, AV_LOG_ERROR, "No bmp codec tag found for codec %s\n",
|
yading@11
|
509 avcodec_get_name(codec->codec_id));
|
yading@11
|
510 ret = AVERROR(EINVAL);
|
yading@11
|
511 }
|
yading@11
|
512
|
yading@11
|
513 ff_put_bmp_header(dyn_cp, codec, ff_codec_bmp_tags, 0);
|
yading@11
|
514 }
|
yading@11
|
515
|
yading@11
|
516 } else if (codec->codec_type == AVMEDIA_TYPE_AUDIO) {
|
yading@11
|
517 unsigned int tag;
|
yading@11
|
518 tag = ff_codec_get_tag(ff_codec_wav_tags, codec->codec_id);
|
yading@11
|
519 if (!tag) {
|
yading@11
|
520 av_log(s, AV_LOG_ERROR, "No wav codec tag found for codec %s\n",
|
yading@11
|
521 avcodec_get_name(codec->codec_id));
|
yading@11
|
522 ret = AVERROR(EINVAL);
|
yading@11
|
523 }
|
yading@11
|
524 if (!codec->codec_tag)
|
yading@11
|
525 codec->codec_tag = tag;
|
yading@11
|
526
|
yading@11
|
527 ff_put_wav_header(dyn_cp, codec);
|
yading@11
|
528 }
|
yading@11
|
529
|
yading@11
|
530 codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv);
|
yading@11
|
531 if (codecpriv_size)
|
yading@11
|
532 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size);
|
yading@11
|
533 av_free(codecpriv);
|
yading@11
|
534 return ret;
|
yading@11
|
535 }
|
yading@11
|
536
|
yading@11
|
537 static int mkv_write_tracks(AVFormatContext *s)
|
yading@11
|
538 {
|
yading@11
|
539 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
540 AVIOContext *pb = s->pb;
|
yading@11
|
541 ebml_master tracks;
|
yading@11
|
542 int i, j, ret, default_stream_exists = 0;
|
yading@11
|
543
|
yading@11
|
544 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
|
yading@11
|
545 if (ret < 0) return ret;
|
yading@11
|
546
|
yading@11
|
547 tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0);
|
yading@11
|
548 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
549 AVStream *st = s->streams[i];
|
yading@11
|
550 default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT;
|
yading@11
|
551 }
|
yading@11
|
552 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
553 AVStream *st = s->streams[i];
|
yading@11
|
554 AVCodecContext *codec = st->codec;
|
yading@11
|
555 ebml_master subinfo, track;
|
yading@11
|
556 int native_id = 0;
|
yading@11
|
557 int qt_id = 0;
|
yading@11
|
558 int bit_depth = av_get_bits_per_sample(codec->codec_id);
|
yading@11
|
559 int sample_rate = codec->sample_rate;
|
yading@11
|
560 int output_sample_rate = 0;
|
yading@11
|
561 AVDictionaryEntry *tag;
|
yading@11
|
562
|
yading@11
|
563 if (codec->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
|
yading@11
|
564 mkv->have_attachments = 1;
|
yading@11
|
565 continue;
|
yading@11
|
566 }
|
yading@11
|
567
|
yading@11
|
568 if (!bit_depth)
|
yading@11
|
569 bit_depth = av_get_bytes_per_sample(codec->sample_fmt) << 3;
|
yading@11
|
570 if (!bit_depth)
|
yading@11
|
571 bit_depth = codec->bits_per_coded_sample;
|
yading@11
|
572
|
yading@11
|
573 if (codec->codec_id == AV_CODEC_ID_AAC)
|
yading@11
|
574 get_aac_sample_rates(s, codec, &sample_rate, &output_sample_rate);
|
yading@11
|
575
|
yading@11
|
576 track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
|
yading@11
|
577 put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER , i + 1);
|
yading@11
|
578 put_ebml_uint (pb, MATROSKA_ID_TRACKUID , i + 1);
|
yading@11
|
579 put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet)
|
yading@11
|
580
|
yading@11
|
581 if ((tag = av_dict_get(st->metadata, "title", NULL, 0)))
|
yading@11
|
582 put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value);
|
yading@11
|
583 tag = av_dict_get(st->metadata, "language", NULL, 0);
|
yading@11
|
584 put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag ? tag->value:"und");
|
yading@11
|
585
|
yading@11
|
586 if (default_stream_exists) {
|
yading@11
|
587 put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT));
|
yading@11
|
588 }
|
yading@11
|
589 if (st->disposition & AV_DISPOSITION_FORCED)
|
yading@11
|
590 put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1);
|
yading@11
|
591
|
yading@11
|
592 // look for a codec ID string specific to mkv to use,
|
yading@11
|
593 // if none are found, use AVI codes
|
yading@11
|
594 for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
|
yading@11
|
595 if (ff_mkv_codec_tags[j].id == codec->codec_id) {
|
yading@11
|
596 put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str);
|
yading@11
|
597 native_id = 1;
|
yading@11
|
598 break;
|
yading@11
|
599 }
|
yading@11
|
600 }
|
yading@11
|
601
|
yading@11
|
602 if (mkv->mode == MODE_WEBM && !(codec->codec_id == AV_CODEC_ID_VP8 ||
|
yading@11
|
603 codec->codec_id == AV_CODEC_ID_VORBIS)) {
|
yading@11
|
604 av_log(s, AV_LOG_ERROR,
|
yading@11
|
605 "Only VP8 video and Vorbis audio are supported for WebM.\n");
|
yading@11
|
606 return AVERROR(EINVAL);
|
yading@11
|
607 }
|
yading@11
|
608
|
yading@11
|
609 switch (codec->codec_type) {
|
yading@11
|
610 case AVMEDIA_TYPE_VIDEO:
|
yading@11
|
611 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
|
yading@11
|
612 if(st->avg_frame_rate.num && st->avg_frame_rate.den && 1.0/av_q2d(st->avg_frame_rate) > av_q2d(codec->time_base))
|
yading@11
|
613 put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1E9/av_q2d(st->avg_frame_rate));
|
yading@11
|
614 else
|
yading@11
|
615 put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9);
|
yading@11
|
616
|
yading@11
|
617 if (!native_id &&
|
yading@11
|
618 ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id) &&
|
yading@11
|
619 (!ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id)
|
yading@11
|
620 || codec->codec_id == AV_CODEC_ID_SVQ1
|
yading@11
|
621 || codec->codec_id == AV_CODEC_ID_SVQ3
|
yading@11
|
622 || codec->codec_id == AV_CODEC_ID_CINEPAK))
|
yading@11
|
623 qt_id = 1;
|
yading@11
|
624
|
yading@11
|
625 if (qt_id)
|
yading@11
|
626 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_QUICKTIME");
|
yading@11
|
627 else if (!native_id) {
|
yading@11
|
628 // if there is no mkv-specific codec ID, use VFW mode
|
yading@11
|
629 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC");
|
yading@11
|
630 mkv->tracks[i].write_dts = 1;
|
yading@11
|
631 }
|
yading@11
|
632
|
yading@11
|
633 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0);
|
yading@11
|
634 // XXX: interlace flag?
|
yading@11
|
635 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
|
yading@11
|
636 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
|
yading@11
|
637
|
yading@11
|
638 if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
|
yading@11
|
639 (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
|
yading@11
|
640 // save stereo mode flag
|
yading@11
|
641 uint64_t st_mode = MATROSKA_VIDEO_STEREO_MODE_COUNT;
|
yading@11
|
642
|
yading@11
|
643 for (j=0; j<MATROSKA_VIDEO_STEREO_MODE_COUNT; j++)
|
yading@11
|
644 if (!strcmp(tag->value, ff_matroska_video_stereo_mode[j])){
|
yading@11
|
645 st_mode = j;
|
yading@11
|
646 break;
|
yading@11
|
647 }
|
yading@11
|
648
|
yading@11
|
649 if ((mkv->mode == MODE_WEBM && st_mode > 3 && st_mode != 11)
|
yading@11
|
650 || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
|
yading@11
|
651 av_log(s, AV_LOG_ERROR,
|
yading@11
|
652 "The specified stereo mode is not valid.\n");
|
yading@11
|
653 return AVERROR(EINVAL);
|
yading@11
|
654 } else
|
yading@11
|
655 put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, st_mode);
|
yading@11
|
656 }
|
yading@11
|
657
|
yading@11
|
658 if (st->sample_aspect_ratio.num) {
|
yading@11
|
659 int64_t d_width = av_rescale(codec->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
|
yading@11
|
660 if (d_width > INT_MAX) {
|
yading@11
|
661 av_log(s, AV_LOG_ERROR, "Overflow in display width\n");
|
yading@11
|
662 return AVERROR(EINVAL);
|
yading@11
|
663 }
|
yading@11
|
664 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width);
|
yading@11
|
665 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height);
|
yading@11
|
666 }
|
yading@11
|
667
|
yading@11
|
668 if (codec->codec_id == AV_CODEC_ID_RAWVIDEO) {
|
yading@11
|
669 uint32_t color_space = av_le2ne32(codec->codec_tag);
|
yading@11
|
670 put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space));
|
yading@11
|
671 }
|
yading@11
|
672 end_ebml_master(pb, subinfo);
|
yading@11
|
673 break;
|
yading@11
|
674
|
yading@11
|
675 case AVMEDIA_TYPE_AUDIO:
|
yading@11
|
676 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
|
yading@11
|
677
|
yading@11
|
678 if (!native_id)
|
yading@11
|
679 // no mkv-specific ID, use ACM mode
|
yading@11
|
680 put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM");
|
yading@11
|
681
|
yading@11
|
682 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0);
|
yading@11
|
683 put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels);
|
yading@11
|
684 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
|
yading@11
|
685 if (output_sample_rate)
|
yading@11
|
686 put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
|
yading@11
|
687 if (bit_depth)
|
yading@11
|
688 put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
|
yading@11
|
689 end_ebml_master(pb, subinfo);
|
yading@11
|
690 break;
|
yading@11
|
691
|
yading@11
|
692 case AVMEDIA_TYPE_SUBTITLE:
|
yading@11
|
693 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_SUBTITLE);
|
yading@11
|
694 if (!native_id) {
|
yading@11
|
695 av_log(s, AV_LOG_ERROR, "Subtitle codec %d is not supported.\n", codec->codec_id);
|
yading@11
|
696 return AVERROR(ENOSYS);
|
yading@11
|
697 }
|
yading@11
|
698 break;
|
yading@11
|
699 default:
|
yading@11
|
700 av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.\n");
|
yading@11
|
701 break;
|
yading@11
|
702 }
|
yading@11
|
703 ret = mkv_write_codecprivate(s, pb, codec, native_id, qt_id);
|
yading@11
|
704 if (ret < 0) return ret;
|
yading@11
|
705
|
yading@11
|
706 end_ebml_master(pb, track);
|
yading@11
|
707
|
yading@11
|
708 // ms precision is the de-facto standard timescale for mkv files
|
yading@11
|
709 avpriv_set_pts_info(st, 64, 1, 1000);
|
yading@11
|
710 }
|
yading@11
|
711 end_ebml_master(pb, tracks);
|
yading@11
|
712 return 0;
|
yading@11
|
713 }
|
yading@11
|
714
|
yading@11
|
715 static int mkv_write_chapters(AVFormatContext *s)
|
yading@11
|
716 {
|
yading@11
|
717 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
718 AVIOContext *pb = s->pb;
|
yading@11
|
719 ebml_master chapters, editionentry;
|
yading@11
|
720 AVRational scale = {1, 1E9};
|
yading@11
|
721 int i, ret;
|
yading@11
|
722
|
yading@11
|
723 if (!s->nb_chapters)
|
yading@11
|
724 return 0;
|
yading@11
|
725
|
yading@11
|
726 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
|
yading@11
|
727 if (ret < 0) return ret;
|
yading@11
|
728
|
yading@11
|
729 chapters = start_ebml_master(pb, MATROSKA_ID_CHAPTERS , 0);
|
yading@11
|
730 editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0);
|
yading@11
|
731 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGDEFAULT, 1);
|
yading@11
|
732 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGHIDDEN , 0);
|
yading@11
|
733 for (i = 0; i < s->nb_chapters; i++) {
|
yading@11
|
734 ebml_master chapteratom, chapterdisplay;
|
yading@11
|
735 AVChapter *c = s->chapters[i];
|
yading@11
|
736 AVDictionaryEntry *t = NULL;
|
yading@11
|
737
|
yading@11
|
738 chapteratom = start_ebml_master(pb, MATROSKA_ID_CHAPTERATOM, 0);
|
yading@11
|
739 put_ebml_uint(pb, MATROSKA_ID_CHAPTERUID, c->id);
|
yading@11
|
740 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMESTART,
|
yading@11
|
741 av_rescale_q(c->start, c->time_base, scale));
|
yading@11
|
742 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMEEND,
|
yading@11
|
743 av_rescale_q(c->end, c->time_base, scale));
|
yading@11
|
744 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0);
|
yading@11
|
745 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGENABLED, 1);
|
yading@11
|
746 if ((t = av_dict_get(c->metadata, "title", NULL, 0))) {
|
yading@11
|
747 chapterdisplay = start_ebml_master(pb, MATROSKA_ID_CHAPTERDISPLAY, 0);
|
yading@11
|
748 put_ebml_string(pb, MATROSKA_ID_CHAPSTRING, t->value);
|
yading@11
|
749 put_ebml_string(pb, MATROSKA_ID_CHAPLANG , "und");
|
yading@11
|
750 end_ebml_master(pb, chapterdisplay);
|
yading@11
|
751 }
|
yading@11
|
752 end_ebml_master(pb, chapteratom);
|
yading@11
|
753 }
|
yading@11
|
754 end_ebml_master(pb, editionentry);
|
yading@11
|
755 end_ebml_master(pb, chapters);
|
yading@11
|
756 return 0;
|
yading@11
|
757 }
|
yading@11
|
758
|
yading@11
|
759 static void mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t)
|
yading@11
|
760 {
|
yading@11
|
761 uint8_t *key = av_strdup(t->key);
|
yading@11
|
762 uint8_t *p = key;
|
yading@11
|
763 const uint8_t *lang = NULL;
|
yading@11
|
764 ebml_master tag;
|
yading@11
|
765
|
yading@11
|
766 if ((p = strrchr(p, '-')) &&
|
yading@11
|
767 (lang = av_convert_lang_to(p + 1, AV_LANG_ISO639_2_BIBL)))
|
yading@11
|
768 *p = 0;
|
yading@11
|
769
|
yading@11
|
770 p = key;
|
yading@11
|
771 while (*p) {
|
yading@11
|
772 if (*p == ' ')
|
yading@11
|
773 *p = '_';
|
yading@11
|
774 else if (*p >= 'a' && *p <= 'z')
|
yading@11
|
775 *p -= 'a' - 'A';
|
yading@11
|
776 p++;
|
yading@11
|
777 }
|
yading@11
|
778
|
yading@11
|
779 tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0);
|
yading@11
|
780 put_ebml_string(pb, MATROSKA_ID_TAGNAME, key);
|
yading@11
|
781 if (lang)
|
yading@11
|
782 put_ebml_string(pb, MATROSKA_ID_TAGLANG, lang);
|
yading@11
|
783 put_ebml_string(pb, MATROSKA_ID_TAGSTRING, t->value);
|
yading@11
|
784 end_ebml_master(pb, tag);
|
yading@11
|
785
|
yading@11
|
786 av_freep(&key);
|
yading@11
|
787 }
|
yading@11
|
788
|
yading@11
|
789 static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int elementid,
|
yading@11
|
790 unsigned int uid, ebml_master *tags)
|
yading@11
|
791 {
|
yading@11
|
792 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
793 ebml_master tag, targets;
|
yading@11
|
794 AVDictionaryEntry *t = NULL;
|
yading@11
|
795 int ret;
|
yading@11
|
796
|
yading@11
|
797 if (!tags->pos) {
|
yading@11
|
798 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
|
yading@11
|
799 if (ret < 0) return ret;
|
yading@11
|
800
|
yading@11
|
801 *tags = start_ebml_master(s->pb, MATROSKA_ID_TAGS, 0);
|
yading@11
|
802 }
|
yading@11
|
803
|
yading@11
|
804 tag = start_ebml_master(s->pb, MATROSKA_ID_TAG, 0);
|
yading@11
|
805 targets = start_ebml_master(s->pb, MATROSKA_ID_TAGTARGETS, 0);
|
yading@11
|
806 if (elementid)
|
yading@11
|
807 put_ebml_uint(s->pb, elementid, uid);
|
yading@11
|
808 end_ebml_master(s->pb, targets);
|
yading@11
|
809
|
yading@11
|
810 while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
|
yading@11
|
811 if (av_strcasecmp(t->key, "title") && av_strcasecmp(t->key, "stereo_mode"))
|
yading@11
|
812 mkv_write_simpletag(s->pb, t);
|
yading@11
|
813
|
yading@11
|
814 end_ebml_master(s->pb, tag);
|
yading@11
|
815 return 0;
|
yading@11
|
816 }
|
yading@11
|
817
|
yading@11
|
818 static int mkv_write_tags(AVFormatContext *s)
|
yading@11
|
819 {
|
yading@11
|
820 ebml_master tags = {0};
|
yading@11
|
821 int i, ret;
|
yading@11
|
822
|
yading@11
|
823 ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL);
|
yading@11
|
824
|
yading@11
|
825 if (av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
|
yading@11
|
826 ret = mkv_write_tag(s, s->metadata, 0, 0, &tags);
|
yading@11
|
827 if (ret < 0) return ret;
|
yading@11
|
828 }
|
yading@11
|
829
|
yading@11
|
830 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
831 AVStream *st = s->streams[i];
|
yading@11
|
832
|
yading@11
|
833 if (!av_dict_get(st->metadata, "", 0, AV_DICT_IGNORE_SUFFIX))
|
yading@11
|
834 continue;
|
yading@11
|
835
|
yading@11
|
836 ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &tags);
|
yading@11
|
837 if (ret < 0) return ret;
|
yading@11
|
838 }
|
yading@11
|
839
|
yading@11
|
840 for (i = 0; i < s->nb_chapters; i++) {
|
yading@11
|
841 AVChapter *ch = s->chapters[i];
|
yading@11
|
842
|
yading@11
|
843 if (!av_dict_get(ch->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
|
yading@11
|
844 continue;
|
yading@11
|
845
|
yading@11
|
846 ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, ch->id, &tags);
|
yading@11
|
847 if (ret < 0) return ret;
|
yading@11
|
848 }
|
yading@11
|
849
|
yading@11
|
850 if (tags.pos)
|
yading@11
|
851 end_ebml_master(s->pb, tags);
|
yading@11
|
852 return 0;
|
yading@11
|
853 }
|
yading@11
|
854
|
yading@11
|
855 static int mkv_write_attachments(AVFormatContext *s)
|
yading@11
|
856 {
|
yading@11
|
857 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
858 AVIOContext *pb = s->pb;
|
yading@11
|
859 ebml_master attachments;
|
yading@11
|
860 AVLFG c;
|
yading@11
|
861 int i, ret;
|
yading@11
|
862
|
yading@11
|
863 if (!mkv->have_attachments)
|
yading@11
|
864 return 0;
|
yading@11
|
865
|
yading@11
|
866 av_lfg_init(&c, av_get_random_seed());
|
yading@11
|
867
|
yading@11
|
868 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
|
yading@11
|
869 if (ret < 0) return ret;
|
yading@11
|
870
|
yading@11
|
871 attachments = start_ebml_master(pb, MATROSKA_ID_ATTACHMENTS, 0);
|
yading@11
|
872
|
yading@11
|
873 for (i = 0; i < s->nb_streams; i++) {
|
yading@11
|
874 AVStream *st = s->streams[i];
|
yading@11
|
875 ebml_master attached_file;
|
yading@11
|
876 AVDictionaryEntry *t;
|
yading@11
|
877 const char *mimetype = NULL;
|
yading@11
|
878 uint64_t fileuid;
|
yading@11
|
879
|
yading@11
|
880 if (st->codec->codec_type != AVMEDIA_TYPE_ATTACHMENT)
|
yading@11
|
881 continue;
|
yading@11
|
882
|
yading@11
|
883 attached_file = start_ebml_master(pb, MATROSKA_ID_ATTACHEDFILE, 0);
|
yading@11
|
884
|
yading@11
|
885 if (t = av_dict_get(st->metadata, "title", NULL, 0))
|
yading@11
|
886 put_ebml_string(pb, MATROSKA_ID_FILEDESC, t->value);
|
yading@11
|
887 if (!(t = av_dict_get(st->metadata, "filename", NULL, 0))) {
|
yading@11
|
888 av_log(s, AV_LOG_ERROR, "Attachment stream %d has no filename tag.\n", i);
|
yading@11
|
889 return AVERROR(EINVAL);
|
yading@11
|
890 }
|
yading@11
|
891 put_ebml_string(pb, MATROSKA_ID_FILENAME, t->value);
|
yading@11
|
892 if (t = av_dict_get(st->metadata, "mimetype", NULL, 0))
|
yading@11
|
893 mimetype = t->value;
|
yading@11
|
894 else if (st->codec->codec_id != AV_CODEC_ID_NONE ) {
|
yading@11
|
895 int i;
|
yading@11
|
896 for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++)
|
yading@11
|
897 if (ff_mkv_mime_tags[i].id == st->codec->codec_id) {
|
yading@11
|
898 mimetype = ff_mkv_mime_tags[i].str;
|
yading@11
|
899 break;
|
yading@11
|
900 }
|
yading@11
|
901 }
|
yading@11
|
902 if (!mimetype) {
|
yading@11
|
903 av_log(s, AV_LOG_ERROR, "Attachment stream %d has no mimetype tag and "
|
yading@11
|
904 "it cannot be deduced from the codec id.\n", i);
|
yading@11
|
905 return AVERROR(EINVAL);
|
yading@11
|
906 }
|
yading@11
|
907
|
yading@11
|
908 if (st->codec->flags & CODEC_FLAG_BITEXACT) {
|
yading@11
|
909 struct AVSHA *sha = av_sha_alloc();
|
yading@11
|
910 uint8_t digest[20];
|
yading@11
|
911 if (!sha)
|
yading@11
|
912 return AVERROR(ENOMEM);
|
yading@11
|
913 av_sha_init(sha, 160);
|
yading@11
|
914 av_sha_update(sha, st->codec->extradata, st->codec->extradata_size);
|
yading@11
|
915 av_sha_final(sha, digest);
|
yading@11
|
916 av_free(sha);
|
yading@11
|
917 fileuid = AV_RL64(digest);
|
yading@11
|
918 } else {
|
yading@11
|
919 fileuid = av_lfg_get(&c);
|
yading@11
|
920 }
|
yading@11
|
921 av_log(s, AV_LOG_VERBOSE, "Using %.16"PRIx64" for attachment %d\n",
|
yading@11
|
922 fileuid, i);
|
yading@11
|
923
|
yading@11
|
924 put_ebml_string(pb, MATROSKA_ID_FILEMIMETYPE, mimetype);
|
yading@11
|
925 put_ebml_binary(pb, MATROSKA_ID_FILEDATA, st->codec->extradata, st->codec->extradata_size);
|
yading@11
|
926 put_ebml_uint(pb, MATROSKA_ID_FILEUID, fileuid);
|
yading@11
|
927 end_ebml_master(pb, attached_file);
|
yading@11
|
928 }
|
yading@11
|
929 end_ebml_master(pb, attachments);
|
yading@11
|
930
|
yading@11
|
931 return 0;
|
yading@11
|
932 }
|
yading@11
|
933
|
yading@11
|
934 static int mkv_write_header(AVFormatContext *s)
|
yading@11
|
935 {
|
yading@11
|
936 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
937 AVIOContext *pb = s->pb;
|
yading@11
|
938 ebml_master ebml_header, segment_info;
|
yading@11
|
939 AVDictionaryEntry *tag;
|
yading@11
|
940 int ret, i;
|
yading@11
|
941
|
yading@11
|
942 if (!strcmp(s->oformat->name, "webm")) mkv->mode = MODE_WEBM;
|
yading@11
|
943 else mkv->mode = MODE_MATROSKAv2;
|
yading@11
|
944
|
yading@11
|
945 if (s->avoid_negative_ts < 0)
|
yading@11
|
946 s->avoid_negative_ts = 1;
|
yading@11
|
947
|
yading@11
|
948 for (i = 0; i < s->nb_streams; i++)
|
yading@11
|
949 if (s->streams[i]->codec->codec_id == AV_CODEC_ID_ATRAC3 ||
|
yading@11
|
950 s->streams[i]->codec->codec_id == AV_CODEC_ID_COOK ||
|
yading@11
|
951 s->streams[i]->codec->codec_id == AV_CODEC_ID_RA_288 ||
|
yading@11
|
952 s->streams[i]->codec->codec_id == AV_CODEC_ID_SIPR ||
|
yading@11
|
953 s->streams[i]->codec->codec_id == AV_CODEC_ID_RV10 ||
|
yading@11
|
954 s->streams[i]->codec->codec_id == AV_CODEC_ID_RV20) {
|
yading@11
|
955 av_log(s, AV_LOG_ERROR,
|
yading@11
|
956 "The Matroska muxer does not yet support muxing %s\n",
|
yading@11
|
957 avcodec_get_name(s->streams[i]->codec->codec_id));
|
yading@11
|
958 return AVERROR_PATCHWELCOME;
|
yading@11
|
959 }
|
yading@11
|
960
|
yading@11
|
961 mkv->tracks = av_mallocz(s->nb_streams * sizeof(*mkv->tracks));
|
yading@11
|
962 if (!mkv->tracks)
|
yading@11
|
963 return AVERROR(ENOMEM);
|
yading@11
|
964
|
yading@11
|
965 ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0);
|
yading@11
|
966 put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1);
|
yading@11
|
967 put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1);
|
yading@11
|
968 put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4);
|
yading@11
|
969 put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8);
|
yading@11
|
970 put_ebml_string (pb, EBML_ID_DOCTYPE , s->oformat->name);
|
yading@11
|
971 put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 2);
|
yading@11
|
972 put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2);
|
yading@11
|
973 end_ebml_master(pb, ebml_header);
|
yading@11
|
974
|
yading@11
|
975 mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0);
|
yading@11
|
976 mkv->segment_offset = avio_tell(pb);
|
yading@11
|
977
|
yading@11
|
978 // we write 2 seek heads - one at the end of the file to point to each
|
yading@11
|
979 // cluster, and one at the beginning to point to all other level one
|
yading@11
|
980 // elements (including the seek head at the end of the file), which
|
yading@11
|
981 // isn't more than 10 elements if we only write one of each other
|
yading@11
|
982 // currently defined level 1 element
|
yading@11
|
983 mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10);
|
yading@11
|
984 if (!mkv->main_seekhead)
|
yading@11
|
985 return AVERROR(ENOMEM);
|
yading@11
|
986
|
yading@11
|
987 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, avio_tell(pb));
|
yading@11
|
988 if (ret < 0) return ret;
|
yading@11
|
989
|
yading@11
|
990 segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0);
|
yading@11
|
991 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
|
yading@11
|
992 if ((tag = av_dict_get(s->metadata, "title", NULL, 0)))
|
yading@11
|
993 put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value);
|
yading@11
|
994 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
|
yading@11
|
995 uint32_t segment_uid[4];
|
yading@11
|
996 AVLFG lfg;
|
yading@11
|
997
|
yading@11
|
998 av_lfg_init(&lfg, av_get_random_seed());
|
yading@11
|
999
|
yading@11
|
1000 for (i = 0; i < 4; i++)
|
yading@11
|
1001 segment_uid[i] = av_lfg_get(&lfg);
|
yading@11
|
1002
|
yading@11
|
1003 put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT);
|
yading@11
|
1004 put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
|
yading@11
|
1005 put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
|
yading@11
|
1006 }
|
yading@11
|
1007
|
yading@11
|
1008 if (tag = av_dict_get(s->metadata, "creation_time", NULL, 0)) {
|
yading@11
|
1009 // Adjust time so it's relative to 2001-01-01 and convert to nanoseconds.
|
yading@11
|
1010 int64_t date_utc = (ff_iso8601_to_unix_time(tag->value) - 978307200) * 1000000000;
|
yading@11
|
1011 uint8_t date_utc_buf[8];
|
yading@11
|
1012 AV_WB64(date_utc_buf, date_utc);
|
yading@11
|
1013 put_ebml_binary(pb, MATROSKA_ID_DATEUTC, date_utc_buf, 8);
|
yading@11
|
1014 }
|
yading@11
|
1015
|
yading@11
|
1016 // reserve space for the duration
|
yading@11
|
1017 mkv->duration = 0;
|
yading@11
|
1018 mkv->duration_offset = avio_tell(pb);
|
yading@11
|
1019 put_ebml_void(pb, 11); // assumes double-precision float to be written
|
yading@11
|
1020 end_ebml_master(pb, segment_info);
|
yading@11
|
1021
|
yading@11
|
1022 ret = mkv_write_tracks(s);
|
yading@11
|
1023 if (ret < 0) return ret;
|
yading@11
|
1024
|
yading@11
|
1025 if (mkv->mode != MODE_WEBM) {
|
yading@11
|
1026 ret = mkv_write_chapters(s);
|
yading@11
|
1027 if (ret < 0) return ret;
|
yading@11
|
1028
|
yading@11
|
1029 ret = mkv_write_tags(s);
|
yading@11
|
1030 if (ret < 0) return ret;
|
yading@11
|
1031
|
yading@11
|
1032 ret = mkv_write_attachments(s);
|
yading@11
|
1033 if (ret < 0) return ret;
|
yading@11
|
1034 }
|
yading@11
|
1035
|
yading@11
|
1036 if (!s->pb->seekable)
|
yading@11
|
1037 mkv_write_seekhead(pb, mkv->main_seekhead);
|
yading@11
|
1038
|
yading@11
|
1039 mkv->cues = mkv_start_cues(mkv->segment_offset);
|
yading@11
|
1040 if (mkv->cues == NULL)
|
yading@11
|
1041 return AVERROR(ENOMEM);
|
yading@11
|
1042
|
yading@11
|
1043 av_init_packet(&mkv->cur_audio_pkt);
|
yading@11
|
1044 mkv->cur_audio_pkt.size = 0;
|
yading@11
|
1045 mkv->cluster_pos = -1;
|
yading@11
|
1046
|
yading@11
|
1047 avio_flush(pb);
|
yading@11
|
1048 return 0;
|
yading@11
|
1049 }
|
yading@11
|
1050
|
yading@11
|
1051 static int mkv_blockgroup_size(int pkt_size)
|
yading@11
|
1052 {
|
yading@11
|
1053 int size = pkt_size + 4;
|
yading@11
|
1054 size += ebml_num_size(size);
|
yading@11
|
1055 size += 2; // EBML ID for block and block duration
|
yading@11
|
1056 size += 8; // max size of block duration
|
yading@11
|
1057 size += ebml_num_size(size);
|
yading@11
|
1058 size += 1; // blockgroup EBML ID
|
yading@11
|
1059 return size;
|
yading@11
|
1060 }
|
yading@11
|
1061
|
yading@11
|
1062 static int ass_get_duration(const uint8_t *p)
|
yading@11
|
1063 {
|
yading@11
|
1064 int sh, sm, ss, sc, eh, em, es, ec;
|
yading@11
|
1065 uint64_t start, end;
|
yading@11
|
1066
|
yading@11
|
1067 if (sscanf(p, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d",
|
yading@11
|
1068 &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8)
|
yading@11
|
1069 return 0;
|
yading@11
|
1070 start = 3600000LL*sh + 60000LL*sm + 1000LL*ss + 10LL*sc;
|
yading@11
|
1071 end = 3600000LL*eh + 60000LL*em + 1000LL*es + 10LL*ec;
|
yading@11
|
1072 return end - start;
|
yading@11
|
1073 }
|
yading@11
|
1074
|
yading@11
|
1075 #if FF_API_ASS_SSA
|
yading@11
|
1076 static int mkv_write_ass_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
|
yading@11
|
1077 {
|
yading@11
|
1078 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
1079 int i, layer = 0, max_duration = 0, size, line_size, data_size = pkt->size;
|
yading@11
|
1080 uint8_t *start, *end, *data = pkt->data;
|
yading@11
|
1081 ebml_master blockgroup;
|
yading@11
|
1082 char buffer[2048];
|
yading@11
|
1083
|
yading@11
|
1084 while (data_size) {
|
yading@11
|
1085 int duration = ass_get_duration(data);
|
yading@11
|
1086 max_duration = FFMAX(duration, max_duration);
|
yading@11
|
1087 end = memchr(data, '\n', data_size);
|
yading@11
|
1088 size = line_size = end ? end-data+1 : data_size;
|
yading@11
|
1089 size -= end ? (end[-1]=='\r')+1 : 0;
|
yading@11
|
1090 start = data;
|
yading@11
|
1091 for (i=0; i<3; i++, start++)
|
yading@11
|
1092 if (!(start = memchr(start, ',', size-(start-data))))
|
yading@11
|
1093 return max_duration;
|
yading@11
|
1094 size -= start - data;
|
yading@11
|
1095 sscanf(data, "Dialogue: %d,", &layer);
|
yading@11
|
1096 i = snprintf(buffer, sizeof(buffer), "%"PRId64",%d,",
|
yading@11
|
1097 s->streams[pkt->stream_index]->nb_frames, layer);
|
yading@11
|
1098 size = FFMIN(i+size, sizeof(buffer));
|
yading@11
|
1099 memcpy(buffer+i, start, size-i);
|
yading@11
|
1100
|
yading@11
|
1101 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
|
yading@11
|
1102 "pts %" PRId64 ", duration %d\n",
|
yading@11
|
1103 avio_tell(pb), size, pkt->pts, duration);
|
yading@11
|
1104 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size));
|
yading@11
|
1105 put_ebml_id(pb, MATROSKA_ID_BLOCK);
|
yading@11
|
1106 put_ebml_num(pb, size+4, 0);
|
yading@11
|
1107 avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126
|
yading@11
|
1108 avio_wb16(pb, pkt->pts - mkv->cluster_pts);
|
yading@11
|
1109 avio_w8(pb, 0);
|
yading@11
|
1110 avio_write(pb, buffer, size);
|
yading@11
|
1111 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
|
yading@11
|
1112 end_ebml_master(pb, blockgroup);
|
yading@11
|
1113
|
yading@11
|
1114 data += line_size;
|
yading@11
|
1115 data_size -= line_size;
|
yading@11
|
1116 }
|
yading@11
|
1117
|
yading@11
|
1118 return max_duration;
|
yading@11
|
1119 }
|
yading@11
|
1120 #endif
|
yading@11
|
1121
|
yading@11
|
1122 static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
|
yading@11
|
1123 unsigned int blockid, AVPacket *pkt, int flags)
|
yading@11
|
1124 {
|
yading@11
|
1125 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
1126 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
|
yading@11
|
1127 uint8_t *data = NULL;
|
yading@11
|
1128 int offset = 0, size = pkt->size;
|
yading@11
|
1129 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
|
yading@11
|
1130
|
yading@11
|
1131 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
|
yading@11
|
1132 "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n",
|
yading@11
|
1133 avio_tell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags);
|
yading@11
|
1134 if (codec->codec_id == AV_CODEC_ID_H264 && codec->extradata_size > 0 &&
|
yading@11
|
1135 (AV_RB24(codec->extradata) == 1 || AV_RB32(codec->extradata) == 1))
|
yading@11
|
1136 ff_avc_parse_nal_units_buf(pkt->data, &data, &size);
|
yading@11
|
1137 else
|
yading@11
|
1138 data = pkt->data;
|
yading@11
|
1139
|
yading@11
|
1140 if (codec->codec_id == AV_CODEC_ID_PRORES) {
|
yading@11
|
1141 /* Matroska specification requires to remove the first QuickTime atom
|
yading@11
|
1142 */
|
yading@11
|
1143 size -= 8;
|
yading@11
|
1144 offset = 8;
|
yading@11
|
1145 }
|
yading@11
|
1146
|
yading@11
|
1147 put_ebml_id(pb, blockid);
|
yading@11
|
1148 put_ebml_num(pb, size+4, 0);
|
yading@11
|
1149 avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126
|
yading@11
|
1150 avio_wb16(pb, ts - mkv->cluster_pts);
|
yading@11
|
1151 avio_w8(pb, flags);
|
yading@11
|
1152 avio_write(pb, data + offset, size);
|
yading@11
|
1153 if (data != pkt->data)
|
yading@11
|
1154 av_free(data);
|
yading@11
|
1155 }
|
yading@11
|
1156
|
yading@11
|
1157 static int srt_get_duration(uint8_t **buf)
|
yading@11
|
1158 {
|
yading@11
|
1159 int i, duration = 0;
|
yading@11
|
1160
|
yading@11
|
1161 for (i=0; i<2 && !duration; i++) {
|
yading@11
|
1162 int s_hour, s_min, s_sec, s_hsec, e_hour, e_min, e_sec, e_hsec;
|
yading@11
|
1163 if (sscanf(*buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d",
|
yading@11
|
1164 &s_hour, &s_min, &s_sec, &s_hsec,
|
yading@11
|
1165 &e_hour, &e_min, &e_sec, &e_hsec) == 8) {
|
yading@11
|
1166 s_min += 60*s_hour; e_min += 60*e_hour;
|
yading@11
|
1167 s_sec += 60*s_min; e_sec += 60*e_min;
|
yading@11
|
1168 s_hsec += 1000*s_sec; e_hsec += 1000*e_sec;
|
yading@11
|
1169 duration = e_hsec - s_hsec;
|
yading@11
|
1170 }
|
yading@11
|
1171 *buf += strcspn(*buf, "\n") + 1;
|
yading@11
|
1172 }
|
yading@11
|
1173 return duration;
|
yading@11
|
1174 }
|
yading@11
|
1175
|
yading@11
|
1176 static int mkv_write_srt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
|
yading@11
|
1177 {
|
yading@11
|
1178 ebml_master blockgroup;
|
yading@11
|
1179 AVPacket pkt2 = *pkt;
|
yading@11
|
1180 int64_t duration = srt_get_duration(&pkt2.data);
|
yading@11
|
1181 pkt2.size -= pkt2.data - pkt->data;
|
yading@11
|
1182
|
yading@11
|
1183 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP,
|
yading@11
|
1184 mkv_blockgroup_size(pkt2.size));
|
yading@11
|
1185 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, &pkt2, 0);
|
yading@11
|
1186 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
|
yading@11
|
1187 end_ebml_master(pb, blockgroup);
|
yading@11
|
1188
|
yading@11
|
1189 return duration;
|
yading@11
|
1190 }
|
yading@11
|
1191
|
yading@11
|
1192 static void mkv_flush_dynbuf(AVFormatContext *s)
|
yading@11
|
1193 {
|
yading@11
|
1194 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
1195 int bufsize;
|
yading@11
|
1196 uint8_t *dyn_buf;
|
yading@11
|
1197
|
yading@11
|
1198 if (!mkv->dyn_bc)
|
yading@11
|
1199 return;
|
yading@11
|
1200
|
yading@11
|
1201 bufsize = avio_close_dyn_buf(mkv->dyn_bc, &dyn_buf);
|
yading@11
|
1202 avio_write(s->pb, dyn_buf, bufsize);
|
yading@11
|
1203 av_free(dyn_buf);
|
yading@11
|
1204 mkv->dyn_bc = NULL;
|
yading@11
|
1205 }
|
yading@11
|
1206
|
yading@11
|
1207 static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
1208 {
|
yading@11
|
1209 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
1210 AVIOContext *pb = s->pb;
|
yading@11
|
1211 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
|
yading@11
|
1212 int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
|
yading@11
|
1213 int duration = pkt->duration;
|
yading@11
|
1214 int ret;
|
yading@11
|
1215 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
|
yading@11
|
1216
|
yading@11
|
1217 if (ts == AV_NOPTS_VALUE) {
|
yading@11
|
1218 av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n");
|
yading@11
|
1219 return AVERROR(EINVAL);
|
yading@11
|
1220 }
|
yading@11
|
1221
|
yading@11
|
1222 if (!s->pb->seekable) {
|
yading@11
|
1223 if (!mkv->dyn_bc) {
|
yading@11
|
1224 if ((ret = avio_open_dyn_buf(&mkv->dyn_bc)) < 0) {
|
yading@11
|
1225 av_log(s, AV_LOG_ERROR, "Failed to open dynamic buffer\n");
|
yading@11
|
1226 return ret;
|
yading@11
|
1227 }
|
yading@11
|
1228 }
|
yading@11
|
1229 pb = mkv->dyn_bc;
|
yading@11
|
1230 }
|
yading@11
|
1231
|
yading@11
|
1232 if (mkv->cluster_pos == -1) {
|
yading@11
|
1233 mkv->cluster_pos = avio_tell(s->pb);
|
yading@11
|
1234 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
|
yading@11
|
1235 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
|
yading@11
|
1236 mkv->cluster_pts = FFMAX(0, ts);
|
yading@11
|
1237 }
|
yading@11
|
1238
|
yading@11
|
1239 if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) {
|
yading@11
|
1240 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);
|
yading@11
|
1241 #if FF_API_ASS_SSA
|
yading@11
|
1242 } else if (codec->codec_id == AV_CODEC_ID_SSA) {
|
yading@11
|
1243 duration = mkv_write_ass_blocks(s, pb, pkt);
|
yading@11
|
1244 #endif
|
yading@11
|
1245 } else if (codec->codec_id == AV_CODEC_ID_SRT) {
|
yading@11
|
1246 duration = mkv_write_srt_blocks(s, pb, pkt);
|
yading@11
|
1247 } else {
|
yading@11
|
1248 ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size));
|
yading@11
|
1249 /* For backward compatibility, prefer convergence_duration. */
|
yading@11
|
1250 if (pkt->convergence_duration > 0) {
|
yading@11
|
1251 duration = pkt->convergence_duration;
|
yading@11
|
1252 }
|
yading@11
|
1253 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 0);
|
yading@11
|
1254 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
|
yading@11
|
1255 end_ebml_master(pb, blockgroup);
|
yading@11
|
1256 }
|
yading@11
|
1257
|
yading@11
|
1258 if (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe) {
|
yading@11
|
1259 ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, ts, mkv->cluster_pos);
|
yading@11
|
1260 if (ret < 0) return ret;
|
yading@11
|
1261 }
|
yading@11
|
1262
|
yading@11
|
1263 mkv->duration = FFMAX(mkv->duration, ts + duration);
|
yading@11
|
1264 return 0;
|
yading@11
|
1265 }
|
yading@11
|
1266
|
yading@11
|
1267 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
|
yading@11
|
1268 {
|
yading@11
|
1269 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
1270 AVIOContext *pb = s->pb->seekable ? s->pb : mkv->dyn_bc;
|
yading@11
|
1271 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
|
yading@11
|
1272 int ret, keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
|
yading@11
|
1273 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
|
yading@11
|
1274 int cluster_size = avio_tell(pb) - (s->pb->seekable ? mkv->cluster_pos : 0);
|
yading@11
|
1275
|
yading@11
|
1276 // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
|
yading@11
|
1277 // after 4k and on a keyframe
|
yading@11
|
1278 if (mkv->cluster_pos != -1 &&
|
yading@11
|
1279 ((!s->pb->seekable && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000))
|
yading@11
|
1280 || cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000
|
yading@11
|
1281 || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) {
|
yading@11
|
1282 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64
|
yading@11
|
1283 " bytes, pts %" PRIu64 "\n", avio_tell(pb), ts);
|
yading@11
|
1284 end_ebml_master(pb, mkv->cluster);
|
yading@11
|
1285 mkv->cluster_pos = -1;
|
yading@11
|
1286 if (mkv->dyn_bc)
|
yading@11
|
1287 mkv_flush_dynbuf(s);
|
yading@11
|
1288 }
|
yading@11
|
1289
|
yading@11
|
1290 // check if we have an audio packet cached
|
yading@11
|
1291 if (mkv->cur_audio_pkt.size > 0) {
|
yading@11
|
1292 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
|
yading@11
|
1293 av_free_packet(&mkv->cur_audio_pkt);
|
yading@11
|
1294 if (ret < 0) {
|
yading@11
|
1295 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
|
yading@11
|
1296 return ret;
|
yading@11
|
1297 }
|
yading@11
|
1298 }
|
yading@11
|
1299
|
yading@11
|
1300 // buffer an audio packet to ensure the packet containing the video
|
yading@11
|
1301 // keyframe's timecode is contained in the same cluster for WebM
|
yading@11
|
1302 if (codec->codec_type == AVMEDIA_TYPE_AUDIO) {
|
yading@11
|
1303 mkv->cur_audio_pkt = *pkt;
|
yading@11
|
1304 mkv->cur_audio_pkt.buf = av_buffer_ref(pkt->buf);
|
yading@11
|
1305 ret = mkv->cur_audio_pkt.buf ? 0 : AVERROR(ENOMEM);
|
yading@11
|
1306 } else
|
yading@11
|
1307 ret = mkv_write_packet_internal(s, pkt);
|
yading@11
|
1308 return ret;
|
yading@11
|
1309 }
|
yading@11
|
1310
|
yading@11
|
1311 static int mkv_write_trailer(AVFormatContext *s)
|
yading@11
|
1312 {
|
yading@11
|
1313 MatroskaMuxContext *mkv = s->priv_data;
|
yading@11
|
1314 AVIOContext *pb = s->pb;
|
yading@11
|
1315 int64_t currentpos, cuespos;
|
yading@11
|
1316 int ret;
|
yading@11
|
1317
|
yading@11
|
1318 // check if we have an audio packet cached
|
yading@11
|
1319 if (mkv->cur_audio_pkt.size > 0) {
|
yading@11
|
1320 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
|
yading@11
|
1321 av_free_packet(&mkv->cur_audio_pkt);
|
yading@11
|
1322 if (ret < 0) {
|
yading@11
|
1323 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
|
yading@11
|
1324 return ret;
|
yading@11
|
1325 }
|
yading@11
|
1326 }
|
yading@11
|
1327
|
yading@11
|
1328 if (mkv->dyn_bc) {
|
yading@11
|
1329 end_ebml_master(mkv->dyn_bc, mkv->cluster);
|
yading@11
|
1330 mkv_flush_dynbuf(s);
|
yading@11
|
1331 } else if (mkv->cluster_pos != -1) {
|
yading@11
|
1332 end_ebml_master(pb, mkv->cluster);
|
yading@11
|
1333 }
|
yading@11
|
1334
|
yading@11
|
1335 if (pb->seekable) {
|
yading@11
|
1336 if (mkv->cues->num_entries) {
|
yading@11
|
1337 cuespos = mkv_write_cues(pb, mkv->cues, mkv->tracks, s->nb_streams);
|
yading@11
|
1338
|
yading@11
|
1339 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES, cuespos);
|
yading@11
|
1340 if (ret < 0) return ret;
|
yading@11
|
1341 }
|
yading@11
|
1342
|
yading@11
|
1343 mkv_write_seekhead(pb, mkv->main_seekhead);
|
yading@11
|
1344
|
yading@11
|
1345 // update the duration
|
yading@11
|
1346 av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
|
yading@11
|
1347 currentpos = avio_tell(pb);
|
yading@11
|
1348 avio_seek(pb, mkv->duration_offset, SEEK_SET);
|
yading@11
|
1349 put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration);
|
yading@11
|
1350
|
yading@11
|
1351 avio_seek(pb, currentpos, SEEK_SET);
|
yading@11
|
1352 }
|
yading@11
|
1353
|
yading@11
|
1354 end_ebml_master(pb, mkv->segment);
|
yading@11
|
1355 av_free(mkv->tracks);
|
yading@11
|
1356 av_freep(&mkv->cues->entries);
|
yading@11
|
1357 av_freep(&mkv->cues);
|
yading@11
|
1358
|
yading@11
|
1359 return 0;
|
yading@11
|
1360 }
|
yading@11
|
1361
|
yading@11
|
1362 static int mkv_query_codec(enum AVCodecID codec_id, int std_compliance)
|
yading@11
|
1363 {
|
yading@11
|
1364 int i;
|
yading@11
|
1365 for (i = 0; ff_mkv_codec_tags[i].id != AV_CODEC_ID_NONE; i++)
|
yading@11
|
1366 if (ff_mkv_codec_tags[i].id == codec_id)
|
yading@11
|
1367 return 1;
|
yading@11
|
1368
|
yading@11
|
1369 if (std_compliance < FF_COMPLIANCE_NORMAL) { // mkv theoretically supports any
|
yading@11
|
1370 enum AVMediaType type = avcodec_get_type(codec_id); // video/audio through VFW/ACM
|
yading@11
|
1371 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO)
|
yading@11
|
1372 return 1;
|
yading@11
|
1373 }
|
yading@11
|
1374
|
yading@11
|
1375 return 0;
|
yading@11
|
1376 }
|
yading@11
|
1377
|
yading@11
|
1378 const AVCodecTag additional_audio_tags[] = {
|
yading@11
|
1379 { AV_CODEC_ID_ALAC, 0XFFFFFFFF },
|
yading@11
|
1380 { AV_CODEC_ID_EAC3, 0XFFFFFFFF },
|
yading@11
|
1381 { AV_CODEC_ID_MLP, 0xFFFFFFFF },
|
yading@11
|
1382 { AV_CODEC_ID_OPUS, 0xFFFFFFFF },
|
yading@11
|
1383 { AV_CODEC_ID_PCM_S16BE, 0xFFFFFFFF },
|
yading@11
|
1384 { AV_CODEC_ID_PCM_S24BE, 0xFFFFFFFF },
|
yading@11
|
1385 { AV_CODEC_ID_PCM_S32BE, 0xFFFFFFFF },
|
yading@11
|
1386 { AV_CODEC_ID_QDM2, 0xFFFFFFFF },
|
yading@11
|
1387 { AV_CODEC_ID_RA_144, 0xFFFFFFFF },
|
yading@11
|
1388 { AV_CODEC_ID_RA_288, 0xFFFFFFFF },
|
yading@11
|
1389 { AV_CODEC_ID_COOK, 0xFFFFFFFF },
|
yading@11
|
1390 { AV_CODEC_ID_TRUEHD, 0xFFFFFFFF },
|
yading@11
|
1391 { AV_CODEC_ID_WAVPACK, 0xFFFFFFFF },
|
yading@11
|
1392 { AV_CODEC_ID_NONE, 0xFFFFFFFF }
|
yading@11
|
1393 };
|
yading@11
|
1394
|
yading@11
|
1395 const AVCodecTag additional_video_tags[] = {
|
yading@11
|
1396 { AV_CODEC_ID_PRORES, 0xFFFFFFFF },
|
yading@11
|
1397 { AV_CODEC_ID_RV10, 0xFFFFFFFF },
|
yading@11
|
1398 { AV_CODEC_ID_RV20, 0xFFFFFFFF },
|
yading@11
|
1399 { AV_CODEC_ID_RV30, 0xFFFFFFFF },
|
yading@11
|
1400 { AV_CODEC_ID_RV40, 0xFFFFFFFF },
|
yading@11
|
1401 { AV_CODEC_ID_VP9, 0xFFFFFFFF },
|
yading@11
|
1402 { AV_CODEC_ID_NONE, 0xFFFFFFFF }
|
yading@11
|
1403 };
|
yading@11
|
1404
|
yading@11
|
1405 #if CONFIG_MATROSKA_MUXER
|
yading@11
|
1406 AVOutputFormat ff_matroska_muxer = {
|
yading@11
|
1407 .name = "matroska",
|
yading@11
|
1408 .long_name = NULL_IF_CONFIG_SMALL("Matroska"),
|
yading@11
|
1409 .mime_type = "video/x-matroska",
|
yading@11
|
1410 .extensions = "mkv",
|
yading@11
|
1411 .priv_data_size = sizeof(MatroskaMuxContext),
|
yading@11
|
1412 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
|
yading@11
|
1413 AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
|
yading@11
|
1414 .video_codec = CONFIG_LIBX264_ENCODER ?
|
yading@11
|
1415 AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4,
|
yading@11
|
1416 .write_header = mkv_write_header,
|
yading@11
|
1417 .write_packet = mkv_write_packet,
|
yading@11
|
1418 .write_trailer = mkv_write_trailer,
|
yading@11
|
1419 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
|
yading@11
|
1420 AVFMT_TS_NONSTRICT,
|
yading@11
|
1421 .codec_tag = (const AVCodecTag* const []){
|
yading@11
|
1422 ff_codec_bmp_tags, ff_codec_wav_tags,
|
yading@11
|
1423 additional_audio_tags, additional_video_tags, 0
|
yading@11
|
1424 },
|
yading@11
|
1425 #if FF_API_ASS_SSA
|
yading@11
|
1426 .subtitle_codec = AV_CODEC_ID_SSA,
|
yading@11
|
1427 #else
|
yading@11
|
1428 .subtitle_codec = AV_CODEC_ID_ASS,
|
yading@11
|
1429 #endif
|
yading@11
|
1430 .query_codec = mkv_query_codec,
|
yading@11
|
1431 };
|
yading@11
|
1432 #endif
|
yading@11
|
1433
|
yading@11
|
1434 #if CONFIG_WEBM_MUXER
|
yading@11
|
1435 AVOutputFormat ff_webm_muxer = {
|
yading@11
|
1436 .name = "webm",
|
yading@11
|
1437 .long_name = NULL_IF_CONFIG_SMALL("WebM"),
|
yading@11
|
1438 .mime_type = "video/webm",
|
yading@11
|
1439 .extensions = "webm",
|
yading@11
|
1440 .priv_data_size = sizeof(MatroskaMuxContext),
|
yading@11
|
1441 .audio_codec = AV_CODEC_ID_VORBIS,
|
yading@11
|
1442 .video_codec = AV_CODEC_ID_VP8,
|
yading@11
|
1443 .write_header = mkv_write_header,
|
yading@11
|
1444 .write_packet = mkv_write_packet,
|
yading@11
|
1445 .write_trailer = mkv_write_trailer,
|
yading@11
|
1446 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
|
yading@11
|
1447 AVFMT_TS_NONSTRICT,
|
yading@11
|
1448 };
|
yading@11
|
1449 #endif
|
yading@11
|
1450
|
yading@11
|
1451 #if CONFIG_MATROSKA_AUDIO_MUXER
|
yading@11
|
1452 AVOutputFormat ff_matroska_audio_muxer = {
|
yading@11
|
1453 .name = "matroska",
|
yading@11
|
1454 .long_name = NULL_IF_CONFIG_SMALL("Matroska"),
|
yading@11
|
1455 .mime_type = "audio/x-matroska",
|
yading@11
|
1456 .extensions = "mka",
|
yading@11
|
1457 .priv_data_size = sizeof(MatroskaMuxContext),
|
yading@11
|
1458 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
|
yading@11
|
1459 AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
|
yading@11
|
1460 .video_codec = AV_CODEC_ID_NONE,
|
yading@11
|
1461 .write_header = mkv_write_header,
|
yading@11
|
1462 .write_packet = mkv_write_packet,
|
yading@11
|
1463 .write_trailer = mkv_write_trailer,
|
yading@11
|
1464 .flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
|
yading@11
|
1465 .codec_tag = (const AVCodecTag* const []){
|
yading@11
|
1466 ff_codec_wav_tags, additional_audio_tags, 0
|
yading@11
|
1467 },
|
yading@11
|
1468 };
|
yading@11
|
1469 #endif
|