Commit | Line | Data |
---|---|---|
67143c0f | 1 | /* |
8cf3bb26 | 2 | * Matroska muxer |
67143c0f DC |
3 | * Copyright (c) 2007 David Conrad |
4 | * | |
5 | * This file is part of FFmpeg. | |
6 | * | |
7 | * FFmpeg is free software; you can redistribute it and/or | |
8 | * modify it under the terms of the GNU Lesser General Public | |
9 | * License as published by the Free Software Foundation; either | |
10 | * version 2.1 of the License, or (at your option) any later version. | |
11 | * | |
12 | * FFmpeg is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 | * Lesser General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU Lesser General Public | |
18 | * License along with FFmpeg; if not, write to the Free Software | |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | */ | |
21 | ||
22 | #include "avformat.h" | |
23 | #include "riff.h" | |
f009e36f | 24 | #include "isom.h" |
67143c0f | 25 | #include "matroska.h" |
aacc5f22 | 26 | #include "avc.h" |
2578326f | 27 | #include "flacenc.h" |
6a5d31ac | 28 | #include "libavutil/intreadwrite.h" |
245976da DB |
29 | #include "libavutil/md5.h" |
30 | #include "libavcodec/xiph.h" | |
7bfacd4e | 31 | #include "libavcodec/mpeg4audio.h" |
67143c0f | 32 | |
baf71dca | 33 | typedef struct ebml_master { |
bc5c918e | 34 | int64_t pos; ///< absolute offset in the file where the master's elements start |
baf71dca DC |
35 | int sizebytes; ///< how many bytes were reserved for the size |
36 | } ebml_master; | |
37 | ||
967d815a DC |
38 | typedef struct mkv_seekhead_entry { |
39 | unsigned int elementid; | |
40 | uint64_t segmentpos; | |
41 | } mkv_seekhead_entry; | |
42 | ||
43 | typedef struct mkv_seekhead { | |
bc5c918e DB |
44 | int64_t filepos; |
45 | int64_t segment_offset; ///< the file offset to the beginning of the segment | |
1b66d314 | 46 | int reserved_size; ///< -1 if appending to file |
967d815a DC |
47 | int max_entries; |
48 | mkv_seekhead_entry *entries; | |
49 | int num_entries; | |
50 | } mkv_seekhead; | |
51 | ||
6364d534 DC |
52 | typedef struct { |
53 | uint64_t pts; | |
54 | int tracknum; | |
bc5c918e | 55 | int64_t cluster_pos; ///< file offset of the cluster containing the block |
6364d534 DC |
56 | } mkv_cuepoint; |
57 | ||
58 | typedef struct { | |
bc5c918e | 59 | int64_t segment_offset; |
6364d534 DC |
60 | mkv_cuepoint *entries; |
61 | int num_entries; | |
62 | } mkv_cues; | |
63 | ||
67143c0f | 64 | typedef struct MatroskaMuxContext { |
baf71dca | 65 | ebml_master segment; |
bc5c918e DB |
66 | int64_t segment_offset; |
67 | int64_t segment_uid; | |
baf71dca | 68 | ebml_master cluster; |
bc5c918e | 69 | int64_t cluster_pos; ///< file offset of the current cluster |
7973dd0b | 70 | uint64_t cluster_pts; |
bc5c918e | 71 | int64_t duration_offset; |
7973dd0b | 72 | uint64_t duration; |
967d815a DC |
73 | mkv_seekhead *main_seekhead; |
74 | mkv_seekhead *cluster_seekhead; | |
6364d534 | 75 | mkv_cues *cues; |
541d443c DC |
76 | |
77 | struct AVMD5 *md5_ctx; | |
67143c0f DC |
78 | } MatroskaMuxContext; |
79 | ||
baf71dca | 80 | |
e3cd80cd DC |
81 | /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit |
82 | * offset, 4 bytes for target EBML ID */ | |
baf71dca DC |
83 | #define MAX_SEEKENTRY_SIZE 21 |
84 | ||
e3cd80cd DC |
85 | /** per-cuepoint-track - 3 1-byte EBML IDs, 3 1-byte EBML sizes, 2 |
86 | * 8-byte uint max */ | |
baf71dca DC |
87 | #define MAX_CUETRACKPOS_SIZE 22 |
88 | ||
e3cd80cd | 89 | /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */ |
baf71dca DC |
90 | #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks |
91 | ||
92 | ||
22ccb69a DC |
93 | static int ebml_id_size(unsigned int id) |
94 | { | |
95 | return (av_log2(id+1)-1)/7+1; | |
96 | } | |
97 | ||
67143c0f DC |
98 | static void put_ebml_id(ByteIOContext *pb, unsigned int id) |
99 | { | |
432adc13 DC |
100 | int i = ebml_id_size(id); |
101 | while (i--) | |
102 | put_byte(pb, id >> (i*8)); | |
67143c0f DC |
103 | } |
104 | ||
ec8f4ad9 | 105 | /** |
bf898960 | 106 | * Write an EBML size meaning "unknown size". |
ec8f4ad9 | 107 | * |
bf898960 | 108 | * @param bytes The number of bytes the size should occupy (maximum: 8). |
ec8f4ad9 DC |
109 | */ |
110 | static void put_ebml_size_unknown(ByteIOContext *pb, int bytes) | |
111 | { | |
0580a122 | 112 | assert(bytes <= 8); |
203cce9a DC |
113 | put_byte(pb, 0x1ff >> bytes); |
114 | while (--bytes) | |
115 | put_byte(pb, 0xff); | |
ec8f4ad9 DC |
116 | } |
117 | ||
1c73478c | 118 | /** |
0f651e8c | 119 | * Calculate how many bytes are needed to represent a given number in EBML. |
1c73478c | 120 | */ |
0f651e8c | 121 | static int ebml_num_size(uint64_t num) |
1c73478c DC |
122 | { |
123 | int bytes = 1; | |
0f651e8c | 124 | while ((num+1) >> bytes*7) bytes++; |
1c73478c DC |
125 | return bytes; |
126 | } | |
127 | ||
f0e9f442 | 128 | /** |
0f651e8c | 129 | * Write a number in EBML variable length format. |
f0e9f442 | 130 | * |
0f651e8c | 131 | * @param bytes The number of bytes that need to be used to write the number. |
f0e9f442 DC |
132 | * If zero, any number of bytes can be used. |
133 | */ | |
0f651e8c | 134 | static void put_ebml_num(ByteIOContext *pb, uint64_t num, int bytes) |
67143c0f | 135 | { |
0f651e8c | 136 | int i, needed_bytes = ebml_num_size(num); |
67143c0f DC |
137 | |
138 | // sizes larger than this are currently undefined in EBML | |
0f651e8c | 139 | assert(num < (1ULL<<56)-1); |
ffb880c2 | 140 | |
f0e9f442 DC |
141 | if (bytes == 0) |
142 | // don't care how many bytes are used, so use the min | |
143 | bytes = needed_bytes; | |
47e08c58 DC |
144 | // the bytes needed to write the given size would exceed the bytes |
145 | // that we need to use, so write unknown size. This shouldn't happen. | |
0580a122 | 146 | assert(bytes >= needed_bytes); |
f0e9f442 | 147 | |
0f651e8c | 148 | num |= 1ULL << bytes*7; |
ddf16467 | 149 | for (i = bytes - 1; i >= 0; i--) |
0f651e8c | 150 | put_byte(pb, num >> i*8); |
67143c0f DC |
151 | } |
152 | ||
153 | static void put_ebml_uint(ByteIOContext *pb, unsigned int elementid, uint64_t val) | |
154 | { | |
9f38fd7e | 155 | int i, bytes = 1; |
73260a11 AJ |
156 | uint64_t tmp = val; |
157 | while (tmp>>=8) bytes++; | |
67143c0f DC |
158 | |
159 | put_ebml_id(pb, elementid); | |
0f651e8c | 160 | put_ebml_num(pb, bytes, 0); |
9f38fd7e DC |
161 | for (i = bytes - 1; i >= 0; i--) |
162 | put_byte(pb, val >> i*8); | |
67143c0f DC |
163 | } |
164 | ||
9b6b0c79 DC |
165 | static void put_ebml_float(ByteIOContext *pb, unsigned int elementid, double val) |
166 | { | |
9b6b0c79 | 167 | put_ebml_id(pb, elementid); |
0f651e8c | 168 | put_ebml_num(pb, 8, 0); |
9b6b0c79 DC |
169 | put_be64(pb, av_dbl2int(val)); |
170 | } | |
171 | ||
67143c0f | 172 | static void put_ebml_binary(ByteIOContext *pb, unsigned int elementid, |
1e18c4d0 | 173 | const uint8_t *buf, int size) |
67143c0f DC |
174 | { |
175 | put_ebml_id(pb, elementid); | |
0f651e8c | 176 | put_ebml_num(pb, size, 0); |
67143c0f DC |
177 | put_buffer(pb, buf, size); |
178 | } | |
179 | ||
1e18c4d0 | 180 | static void put_ebml_string(ByteIOContext *pb, unsigned int elementid, const char *str) |
67143c0f DC |
181 | { |
182 | put_ebml_binary(pb, elementid, str, strlen(str)); | |
183 | } | |
184 | ||
57848e9a | 185 | /** |
cfde5d18 DC |
186 | * Writes a void element of a given size. Useful for reserving space in |
187 | * the file to be written to later. | |
57848e9a | 188 | * |
5045da83 | 189 | * @param size The number of bytes to reserve, which must be at least 2. |
57848e9a | 190 | */ |
f57b85a5 DC |
191 | static void put_ebml_void(ByteIOContext *pb, uint64_t size) |
192 | { | |
bc5c918e | 193 | int64_t currentpos = url_ftell(pb); |
f57b85a5 | 194 | |
0580a122 | 195 | assert(size >= 2); |
f57b85a5 DC |
196 | |
197 | put_ebml_id(pb, EBML_ID_VOID); | |
cfde5d18 DC |
198 | // we need to subtract the length needed to store the size from the |
199 | // size we need to reserve so 2 cases, we use 8 bytes to store the | |
200 | // size if possible, 1 byte otherwise | |
f57b85a5 | 201 | if (size < 10) |
0f651e8c | 202 | put_ebml_num(pb, size-1, 0); |
f57b85a5 | 203 | else |
0f651e8c | 204 | put_ebml_num(pb, size-9, 8); |
2024c226 MN |
205 | while(url_ftell(pb) < currentpos + size) |
206 | put_byte(pb, 0); | |
f57b85a5 DC |
207 | } |
208 | ||
baf71dca | 209 | static ebml_master start_ebml_master(ByteIOContext *pb, unsigned int elementid, uint64_t expectedsize) |
67143c0f | 210 | { |
0f651e8c | 211 | int bytes = expectedsize ? ebml_num_size(expectedsize) : 8; |
67143c0f | 212 | put_ebml_id(pb, elementid); |
baf71dca DC |
213 | put_ebml_size_unknown(pb, bytes); |
214 | return (ebml_master){ url_ftell(pb), bytes }; | |
67143c0f DC |
215 | } |
216 | ||
baf71dca | 217 | static void end_ebml_master(ByteIOContext *pb, ebml_master master) |
67143c0f | 218 | { |
bc5c918e | 219 | int64_t pos = url_ftell(pb); |
67143c0f | 220 | |
ac9e1177 DC |
221 | // leave the unknown size for masters when streaming |
222 | if (url_is_streamed(pb)) | |
223 | return; | |
224 | ||
baf71dca | 225 | url_fseek(pb, master.pos - master.sizebytes, SEEK_SET); |
0f651e8c | 226 | put_ebml_num(pb, pos - master.pos, master.sizebytes); |
67143c0f DC |
227 | url_fseek(pb, pos, SEEK_SET); |
228 | } | |
229 | ||
86be6637 DC |
230 | static void put_xiph_size(ByteIOContext *pb, int size) |
231 | { | |
232 | int i; | |
233 | for (i = 0; i < size / 255; i++) | |
234 | put_byte(pb, 255); | |
235 | put_byte(pb, size % 255); | |
236 | } | |
237 | ||
57848e9a | 238 | /** |
cfde5d18 DC |
239 | * Initialize a mkv_seekhead element to be ready to index level 1 Matroska |
240 | * elements. If a maximum number of elements is specified, enough space | |
241 | * will be reserved at the current file location to write a seek head of | |
242 | * that size. | |
57848e9a | 243 | * |
cfde5d18 | 244 | * @param segment_offset The absolute offset to the position in the file |
ab332d01 DC |
245 | * where the segment begins. |
246 | * @param numelements The maximum number of elements that will be indexed | |
cfde5d18 | 247 | * by this seek head, 0 if unlimited. |
57848e9a | 248 | */ |
bc5c918e | 249 | static mkv_seekhead * mkv_start_seekhead(ByteIOContext *pb, int64_t segment_offset, int numelements) |
967d815a DC |
250 | { |
251 | mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead)); | |
252 | if (new_seekhead == NULL) | |
253 | return NULL; | |
254 | ||
255 | new_seekhead->segment_offset = segment_offset; | |
256 | ||
257 | if (numelements > 0) { | |
258 | new_seekhead->filepos = url_ftell(pb); | |
cfde5d18 DC |
259 | // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID |
260 | // and size, and 3 bytes to guarantee that an EBML void element | |
261 | // will fit afterwards | |
baf71dca | 262 | new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 13; |
967d815a DC |
263 | new_seekhead->max_entries = numelements; |
264 | put_ebml_void(pb, new_seekhead->reserved_size); | |
265 | } | |
266 | return new_seekhead; | |
267 | } | |
268 | ||
269 | static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos) | |
270 | { | |
271 | mkv_seekhead_entry *entries = seekhead->entries; | |
967d815a DC |
272 | |
273 | // don't store more elements than we reserved space for | |
274 | if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries) | |
275 | return -1; | |
276 | ||
277 | entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry)); | |
278 | if (entries == NULL) | |
0b38843a | 279 | return AVERROR(ENOMEM); |
967d815a | 280 | |
91ca9690 DC |
281 | entries[seekhead->num_entries ].elementid = elementid; |
282 | entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset; | |
967d815a DC |
283 | |
284 | seekhead->entries = entries; | |
967d815a DC |
285 | return 0; |
286 | } | |
287 | ||
57848e9a | 288 | /** |
cfde5d18 DC |
289 | * Write the seek head to the file and free it. If a maximum number of |
290 | * elements was specified to mkv_start_seekhead(), the seek head will | |
291 | * be written at the location reserved for it. Otherwise, it is written | |
292 | * at the current location in the file. | |
57848e9a | 293 | * |
ab332d01 | 294 | * @return The file offset where the seekhead was written. |
57848e9a | 295 | */ |
bc5c918e | 296 | static int64_t mkv_write_seekhead(ByteIOContext *pb, mkv_seekhead *seekhead) |
967d815a | 297 | { |
baf71dca | 298 | ebml_master metaseek, seekentry; |
bc5c918e | 299 | int64_t currentpos; |
967d815a DC |
300 | int i; |
301 | ||
302 | currentpos = url_ftell(pb); | |
303 | ||
304 | if (seekhead->reserved_size > 0) | |
305 | url_fseek(pb, seekhead->filepos, SEEK_SET); | |
306 | ||
baf71dca | 307 | metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size); |
967d815a DC |
308 | for (i = 0; i < seekhead->num_entries; i++) { |
309 | mkv_seekhead_entry *entry = &seekhead->entries[i]; | |
310 | ||
baf71dca | 311 | seekentry = start_ebml_master(pb, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE); |
967d815a DC |
312 | |
313 | put_ebml_id(pb, MATROSKA_ID_SEEKID); | |
0f651e8c | 314 | put_ebml_num(pb, ebml_id_size(entry->elementid), 0); |
967d815a DC |
315 | put_ebml_id(pb, entry->elementid); |
316 | ||
317 | put_ebml_uint(pb, MATROSKA_ID_SEEKPOSITION, entry->segmentpos); | |
318 | end_ebml_master(pb, seekentry); | |
319 | } | |
320 | end_ebml_master(pb, metaseek); | |
321 | ||
322 | if (seekhead->reserved_size > 0) { | |
323 | uint64_t remaining = seekhead->filepos + seekhead->reserved_size - url_ftell(pb); | |
324 | put_ebml_void(pb, remaining); | |
325 | url_fseek(pb, currentpos, SEEK_SET); | |
326 | ||
327 | currentpos = seekhead->filepos; | |
328 | } | |
329 | av_free(seekhead->entries); | |
330 | av_free(seekhead); | |
331 | ||
332 | return currentpos; | |
333 | } | |
334 | ||
bc5c918e | 335 | static mkv_cues * mkv_start_cues(int64_t segment_offset) |
6364d534 DC |
336 | { |
337 | mkv_cues *cues = av_mallocz(sizeof(mkv_cues)); | |
338 | if (cues == NULL) | |
339 | return NULL; | |
340 | ||
341 | cues->segment_offset = segment_offset; | |
342 | return cues; | |
343 | } | |
344 | ||
bc5c918e | 345 | static int mkv_add_cuepoint(mkv_cues *cues, AVPacket *pkt, int64_t cluster_pos) |
6364d534 DC |
346 | { |
347 | mkv_cuepoint *entries = cues->entries; | |
6364d534 DC |
348 | |
349 | entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint)); | |
350 | if (entries == NULL) | |
0b38843a | 351 | return AVERROR(ENOMEM); |
6364d534 | 352 | |
91ca9690 DC |
353 | entries[cues->num_entries ].pts = pkt->pts; |
354 | entries[cues->num_entries ].tracknum = pkt->stream_index + 1; | |
355 | entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset; | |
6364d534 DC |
356 | |
357 | cues->entries = entries; | |
6364d534 DC |
358 | return 0; |
359 | } | |
360 | ||
bc5c918e | 361 | static int64_t mkv_write_cues(ByteIOContext *pb, mkv_cues *cues, int num_tracks) |
6364d534 | 362 | { |
baf71dca | 363 | ebml_master cues_element; |
bc5c918e | 364 | int64_t currentpos; |
6364d534 DC |
365 | int i, j; |
366 | ||
367 | currentpos = url_ftell(pb); | |
baf71dca | 368 | cues_element = start_ebml_master(pb, MATROSKA_ID_CUES, 0); |
6364d534 DC |
369 | |
370 | for (i = 0; i < cues->num_entries; i++) { | |
baf71dca | 371 | ebml_master cuepoint, track_positions; |
6364d534 DC |
372 | mkv_cuepoint *entry = &cues->entries[i]; |
373 | uint64_t pts = entry->pts; | |
374 | ||
baf71dca | 375 | cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(num_tracks)); |
6364d534 DC |
376 | put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts); |
377 | ||
378 | // put all the entries from different tracks that have the exact same | |
379 | // timestamp into the same CuePoint | |
380 | for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) { | |
baf71dca | 381 | track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE); |
6364d534 DC |
382 | put_ebml_uint(pb, MATROSKA_ID_CUETRACK , entry[j].tracknum ); |
383 | put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos); | |
384 | end_ebml_master(pb, track_positions); | |
385 | } | |
386 | i += j - 1; | |
387 | end_ebml_master(pb, cuepoint); | |
388 | } | |
389 | end_ebml_master(pb, cues_element); | |
390 | ||
391 | av_free(cues->entries); | |
392 | av_free(cues); | |
393 | return currentpos; | |
394 | } | |
395 | ||
b62a33d0 | 396 | static int put_xiph_codecpriv(AVFormatContext *s, ByteIOContext *pb, AVCodecContext *codec) |
56d55a3b | 397 | { |
56d55a3b DC |
398 | uint8_t *header_start[3]; |
399 | int header_len[3]; | |
400 | int first_header_size; | |
86be6637 | 401 | int j; |
56d55a3b DC |
402 | |
403 | if (codec->codec_id == CODEC_ID_VORBIS) | |
404 | first_header_size = 30; | |
405 | else | |
406 | first_header_size = 42; | |
407 | ||
408 | if (ff_split_xiph_headers(codec->extradata, codec->extradata_size, | |
409 | first_header_size, header_start, header_len) < 0) { | |
b62a33d0 | 410 | av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n"); |
56d55a3b DC |
411 | return -1; |
412 | } | |
413 | ||
56d55a3b DC |
414 | put_byte(pb, 2); // number packets - 1 |
415 | for (j = 0; j < 2; j++) { | |
86be6637 | 416 | put_xiph_size(pb, header_len[j]); |
56d55a3b DC |
417 | } |
418 | for (j = 0; j < 3; j++) | |
419 | put_buffer(pb, header_start[j], header_len[j]); | |
801edb42 DC |
420 | |
421 | return 0; | |
56d55a3b | 422 | } |
67143c0f | 423 | |
b62a33d0 | 424 | static void get_aac_sample_rates(AVFormatContext *s, AVCodecContext *codec, int *sample_rate, int *output_sample_rate) |
07918a22 | 425 | { |
07918a22 DC |
426 | int sri; |
427 | ||
428 | if (codec->extradata_size < 2) { | |
ab332d01 | 429 | av_log(s, AV_LOG_WARNING, "No AAC extradata, unable to determine samplerate.\n"); |
07918a22 DC |
430 | return; |
431 | } | |
432 | ||
433 | sri = ((codec->extradata[0] << 1) & 0xE) | (codec->extradata[1] >> 7); | |
434 | if (sri > 12) { | |
b62a33d0 | 435 | av_log(s, AV_LOG_WARNING, "AAC samplerate index out of bounds\n"); |
07918a22 DC |
436 | return; |
437 | } | |
7bfacd4e | 438 | *sample_rate = ff_mpeg4audio_sample_rates[sri]; |
07918a22 DC |
439 | |
440 | // if sbr, get output sample rate as well | |
441 | if (codec->extradata_size == 5) { | |
442 | sri = (codec->extradata[4] >> 3) & 0xF; | |
443 | if (sri > 12) { | |
b62a33d0 | 444 | av_log(s, AV_LOG_WARNING, "AAC output samplerate index out of bounds\n"); |
07918a22 DC |
445 | return; |
446 | } | |
7bfacd4e | 447 | *output_sample_rate = ff_mpeg4audio_sample_rates[sri]; |
07918a22 DC |
448 | } |
449 | } | |
450 | ||
f009e36f | 451 | static int mkv_write_codecprivate(AVFormatContext *s, ByteIOContext *pb, AVCodecContext *codec, int native_id, int qt_id) |
5c559894 | 452 | { |
899681cd | 453 | ByteIOContext *dyn_cp; |
46d18a88 | 454 | uint8_t *codecpriv; |
899681cd | 455 | int ret, codecpriv_size; |
46d18a88 | 456 | |
899681cd BA |
457 | ret = url_open_dyn_buf(&dyn_cp); |
458 | if(ret < 0) | |
459 | return ret; | |
5c559894 DC |
460 | |
461 | if (native_id) { | |
c301d5ae | 462 | if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) |
899681cd | 463 | ret = put_xiph_codecpriv(s, dyn_cp, codec); |
c301d5ae | 464 | else if (codec->codec_id == CODEC_ID_FLAC) |
2578326f | 465 | ret = ff_flac_write_header(dyn_cp, codec); |
aacc5f22 | 466 | else if (codec->codec_id == CODEC_ID_H264) |
9ab3f71b | 467 | ret = ff_isom_write_avcc(dyn_cp, codec->extradata, codec->extradata_size); |
c301d5ae | 468 | else if (codec->extradata_size) |
899681cd | 469 | put_buffer(dyn_cp, codec->extradata, codec->extradata_size); |
5c559894 | 470 | } else if (codec->codec_type == CODEC_TYPE_VIDEO) { |
f009e36f AJ |
471 | if (qt_id) { |
472 | if (!codec->codec_tag) | |
1a40491e | 473 | codec->codec_tag = ff_codec_get_tag(codec_movvideo_tags, codec->codec_id); |
f009e36f AJ |
474 | if (codec->extradata_size) |
475 | put_buffer(dyn_cp, codec->extradata, codec->extradata_size); | |
476 | } else { | |
5c559894 | 477 | if (!codec->codec_tag) |
1a40491e | 478 | codec->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id); |
dc4a9f67 | 479 | if (!codec->codec_tag) { |
ab332d01 | 480 | av_log(s, AV_LOG_ERROR, "No bmp codec ID found."); |
dc4a9f67 DC |
481 | ret = -1; |
482 | } | |
5c559894 | 483 | |
1a40491e | 484 | ff_put_bmp_header(dyn_cp, codec, ff_codec_bmp_tags, 0); |
f009e36f | 485 | } |
5c559894 DC |
486 | |
487 | } else if (codec->codec_type == CODEC_TYPE_AUDIO) { | |
dc4a9f67 | 488 | if (!codec->codec_tag) |
1a40491e | 489 | codec->codec_tag = ff_codec_get_tag(ff_codec_wav_tags, codec->codec_id); |
5c559894 | 490 | if (!codec->codec_tag) { |
ab332d01 | 491 | av_log(s, AV_LOG_ERROR, "No wav codec ID found."); |
46d18a88 | 492 | ret = -1; |
5c559894 DC |
493 | } |
494 | ||
1a40491e | 495 | ff_put_wav_header(dyn_cp, codec); |
5c559894 | 496 | } |
46d18a88 | 497 | |
899681cd | 498 | codecpriv_size = url_close_dyn_buf(dyn_cp, &codecpriv); |
46d18a88 DC |
499 | if (codecpriv_size) |
500 | put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size); | |
501 | av_free(codecpriv); | |
502 | return ret; | |
5c559894 DC |
503 | } |
504 | ||
5034ab90 | 505 | static int mkv_write_tracks(AVFormatContext *s) |
67143c0f DC |
506 | { |
507 | MatroskaMuxContext *mkv = s->priv_data; | |
899681cd | 508 | ByteIOContext *pb = s->pb; |
baf71dca | 509 | ebml_master tracks; |
6d588ecd | 510 | int i, j, ret; |
67143c0f | 511 | |
6d588ecd DC |
512 | ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, url_ftell(pb)); |
513 | if (ret < 0) return ret; | |
967d815a | 514 | |
baf71dca | 515 | tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0); |
67143c0f DC |
516 | for (i = 0; i < s->nb_streams; i++) { |
517 | AVStream *st = s->streams[i]; | |
f622c4f4 | 518 | AVCodecContext *codec = st->codec; |
baf71dca | 519 | ebml_master subinfo, track; |
f622c4f4 | 520 | int native_id = 0; |
f009e36f | 521 | int qt_id = 0; |
d22f88cb | 522 | int bit_depth = av_get_bits_per_sample(codec->codec_id); |
07918a22 DC |
523 | int sample_rate = codec->sample_rate; |
524 | int output_sample_rate = 0; | |
5e565998 | 525 | AVMetadataTag *tag; |
07918a22 | 526 | |
a6da1aa0 DC |
527 | if (!bit_depth) |
528 | bit_depth = av_get_bits_per_sample_format(codec->sample_fmt); | |
529 | ||
07918a22 | 530 | if (codec->codec_id == CODEC_ID_AAC) |
b62a33d0 | 531 | get_aac_sample_rates(s, codec, &sample_rate, &output_sample_rate); |
f622c4f4 | 532 | |
baf71dca | 533 | track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0); |
815eb6a2 DC |
534 | put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER , i + 1); |
535 | put_ebml_uint (pb, MATROSKA_ID_TRACKUID , i + 1); | |
f622c4f4 | 536 | put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet) |
e380b918 | 537 | put_ebml_float(pb, MATROSKA_ID_TRACKTIMECODESCALE, 1.0); |
f622c4f4 | 538 | |
5e565998 AJ |
539 | if ((tag = av_metadata_get(st->metadata, "description", NULL, 0))) |
540 | put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value); | |
541 | tag = av_metadata_get(st->metadata, "language", NULL, 0); | |
542 | put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag ? tag->value:"und"); | |
f622c4f4 | 543 | |
1c3db2aa | 544 | if (st->disposition) |
3194b004 | 545 | put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT)); |
90c2295b | 546 | |
ab332d01 | 547 | // look for a codec ID string specific to mkv to use, |
cfde5d18 | 548 | // if none are found, use AVI codes |
f622c4f4 DC |
549 | for (j = 0; ff_mkv_codec_tags[j].id != CODEC_ID_NONE; j++) { |
550 | if (ff_mkv_codec_tags[j].id == codec->codec_id) { | |
551 | put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str); | |
552 | native_id = 1; | |
553 | break; | |
554 | } | |
555 | } | |
556 | ||
f622c4f4 DC |
557 | switch (codec->codec_type) { |
558 | case CODEC_TYPE_VIDEO: | |
559 | put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO); | |
560 | ||
f009e36f | 561 | if (!native_id && |
1a40491e DV |
562 | ff_codec_get_tag(codec_movvideo_tags, codec->codec_id) && |
563 | (!ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id) | |
f009e36f AJ |
564 | || codec->codec_id == CODEC_ID_SVQ1 |
565 | || codec->codec_id == CODEC_ID_SVQ3 | |
566 | || codec->codec_id == CODEC_ID_CINEPAK)) | |
567 | qt_id = 1; | |
568 | ||
569 | if (qt_id) | |
570 | put_ebml_string(pb, MATROSKA_ID_CODECID, "V_QUICKTIME"); | |
571 | else if (!native_id) | |
ab332d01 | 572 | // if there is no mkv-specific codec ID, use VFW mode |
cc8be506 | 573 | put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC"); |
c301d5ae | 574 | |
baf71dca | 575 | subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0); |
f622c4f4 DC |
576 | // XXX: interlace flag? |
577 | put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width); | |
578 | put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height); | |
59729451 AJ |
579 | if (st->sample_aspect_ratio.num) { |
580 | int d_width = codec->width*av_q2d(st->sample_aspect_ratio); | |
581 | put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width); | |
582 | put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height); | |
7332addd | 583 | } |
f622c4f4 DC |
584 | end_ebml_master(pb, subinfo); |
585 | break; | |
586 | ||
587 | case CODEC_TYPE_AUDIO: | |
588 | put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO); | |
589 | ||
c301d5ae | 590 | if (!native_id) |
1a302a5c | 591 | // no mkv-specific ID, use ACM mode |
cc8be506 | 592 | put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM"); |
c301d5ae | 593 | |
baf71dca | 594 | subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0); |
f622c4f4 | 595 | put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels); |
07918a22 DC |
596 | put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate); |
597 | if (output_sample_rate) | |
598 | put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate); | |
44008871 DC |
599 | if (bit_depth) |
600 | put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth); | |
f622c4f4 DC |
601 | end_ebml_master(pb, subinfo); |
602 | break; | |
603 | ||
47e08c58 DC |
604 | case CODEC_TYPE_SUBTITLE: |
605 | put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_SUBTITLE); | |
606 | break; | |
f622c4f4 | 607 | default: |
3967eb52 | 608 | av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska."); |
f622c4f4 DC |
609 | break; |
610 | } | |
f009e36f | 611 | ret = mkv_write_codecprivate(s, pb, codec, native_id, qt_id); |
5c559894 DC |
612 | if (ret < 0) return ret; |
613 | ||
67143c0f | 614 | end_ebml_master(pb, track); |
f622c4f4 DC |
615 | |
616 | // ms precision is the de-facto standard timescale for mkv files | |
617 | av_set_pts_info(st, 64, 1, 1000); | |
67143c0f DC |
618 | } |
619 | end_ebml_master(pb, tracks); | |
801edb42 | 620 | return 0; |
5034ab90 DC |
621 | } |
622 | ||
2bd0758e AK |
623 | static int mkv_write_chapters(AVFormatContext *s) |
624 | { | |
625 | MatroskaMuxContext *mkv = s->priv_data; | |
626 | ByteIOContext *pb = s->pb; | |
627 | ebml_master chapters, editionentry; | |
628 | AVRational scale = {1, 1E9}; | |
629 | int i, ret; | |
630 | ||
631 | if (!s->nb_chapters) | |
632 | return 0; | |
633 | ||
634 | ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, url_ftell(pb)); | |
635 | if (ret < 0) return ret; | |
636 | ||
637 | chapters = start_ebml_master(pb, MATROSKA_ID_CHAPTERS , 0); | |
638 | editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0); | |
639 | put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGDEFAULT, 1); | |
640 | put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGHIDDEN , 0); | |
641 | for (i = 0; i < s->nb_chapters; i++) { | |
642 | ebml_master chapteratom, chapterdisplay; | |
643 | AVChapter *c = s->chapters[i]; | |
644 | AVMetadataTag *t = NULL; | |
645 | ||
646 | chapteratom = start_ebml_master(pb, MATROSKA_ID_CHAPTERATOM, 0); | |
647 | put_ebml_uint(pb, MATROSKA_ID_CHAPTERUID, c->id); | |
648 | put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMESTART, | |
649 | av_rescale_q(c->start, c->time_base, scale)); | |
650 | put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMEEND, | |
651 | av_rescale_q(c->end, c->time_base, scale)); | |
652 | put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0); | |
653 | put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGENABLED, 1); | |
654 | if ((t = av_metadata_get(c->metadata, "title", NULL, 0))) { | |
655 | chapterdisplay = start_ebml_master(pb, MATROSKA_ID_CHAPTERDISPLAY, 0); | |
656 | put_ebml_string(pb, MATROSKA_ID_CHAPSTRING, t->value); | |
657 | put_ebml_string(pb, MATROSKA_ID_CHAPLANG , "und"); | |
658 | end_ebml_master(pb, chapterdisplay); | |
659 | } | |
660 | end_ebml_master(pb, chapteratom); | |
661 | } | |
662 | end_ebml_master(pb, editionentry); | |
663 | end_ebml_master(pb, chapters); | |
664 | return 0; | |
665 | } | |
666 | ||
5034ab90 DC |
667 | static int mkv_write_header(AVFormatContext *s) |
668 | { | |
669 | MatroskaMuxContext *mkv = s->priv_data; | |
899681cd | 670 | ByteIOContext *pb = s->pb; |
baf71dca | 671 | ebml_master ebml_header, segment_info; |
5e565998 | 672 | AVMetadataTag *tag; |
6d588ecd | 673 | int ret; |
5034ab90 | 674 | |
541d443c DC |
675 | mkv->md5_ctx = av_mallocz(av_md5_size); |
676 | av_md5_init(mkv->md5_ctx); | |
677 | ||
baf71dca | 678 | ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0); |
5034ab90 DC |
679 | put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1); |
680 | put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1); | |
681 | put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4); | |
682 | put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8); | |
683 | put_ebml_string (pb, EBML_ID_DOCTYPE , "matroska"); | |
684 | put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 2); | |
685 | put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2); | |
686 | end_ebml_master(pb, ebml_header); | |
687 | ||
baf71dca | 688 | mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0); |
967d815a DC |
689 | mkv->segment_offset = url_ftell(pb); |
690 | ||
cfde5d18 DC |
691 | // we write 2 seek heads - one at the end of the file to point to each |
692 | // cluster, and one at the beginning to point to all other level one | |
693 | // elements (including the seek head at the end of the file), which | |
694 | // isn't more than 10 elements if we only write one of each other | |
695 | // currently defined level 1 element | |
967d815a DC |
696 | mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10); |
697 | mkv->cluster_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 0); | |
c35de1a1 DC |
698 | if (mkv->main_seekhead == NULL || mkv->cluster_seekhead == NULL) |
699 | return AVERROR(ENOMEM); | |
967d815a | 700 | |
6d588ecd DC |
701 | ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, url_ftell(pb)); |
702 | if (ret < 0) return ret; | |
5034ab90 | 703 | |
baf71dca | 704 | segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0); |
5034ab90 | 705 | put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000); |
5e565998 AJ |
706 | if ((tag = av_metadata_get(s->metadata, "title", NULL, 0))) |
707 | put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value); | |
5034ab90 | 708 | if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) { |
5fd35c6e | 709 | put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT); |
5034ab90 | 710 | put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT); |
541d443c DC |
711 | |
712 | // reserve space to write the segment UID later | |
713 | mkv->segment_uid = url_ftell(pb); | |
714 | put_ebml_void(pb, 19); | |
5034ab90 | 715 | } |
4b8f58ee | 716 | |
5034ab90 DC |
717 | // reserve space for the duration |
718 | mkv->duration = 0; | |
719 | mkv->duration_offset = url_ftell(pb); | |
720 | put_ebml_void(pb, 11); // assumes double-precision float to be written | |
721 | end_ebml_master(pb, segment_info); | |
722 | ||
6d588ecd DC |
723 | ret = mkv_write_tracks(s); |
724 | if (ret < 0) return ret; | |
67143c0f | 725 | |
2bd0758e AK |
726 | ret = mkv_write_chapters(s); |
727 | if (ret < 0) return ret; | |
728 | ||
6d588ecd DC |
729 | ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); |
730 | if (ret < 0) return ret; | |
967d815a | 731 | |
6364d534 | 732 | mkv->cluster_pos = url_ftell(pb); |
baf71dca | 733 | mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); |
b1adb69c | 734 | put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0); |
98186e41 | 735 | mkv->cluster_pts = 0; |
b1adb69c | 736 | |
6364d534 DC |
737 | mkv->cues = mkv_start_cues(mkv->segment_offset); |
738 | if (mkv->cues == NULL) | |
0b38843a | 739 | return AVERROR(ENOMEM); |
6364d534 | 740 | |
8a86aaa3 | 741 | put_flush_packet(pb); |
67143c0f DC |
742 | return 0; |
743 | } | |
744 | ||
1bfbe8ff | 745 | static int mkv_blockgroup_size(int pkt_size) |
baf71dca | 746 | { |
1bfbe8ff | 747 | int size = pkt_size + 4; |
0f651e8c | 748 | size += ebml_num_size(size); |
baf71dca DC |
749 | size += 2; // EBML ID for block and block duration |
750 | size += 8; // max size of block duration | |
0f651e8c | 751 | size += ebml_num_size(size); |
baf71dca DC |
752 | size += 1; // blockgroup EBML ID |
753 | return size; | |
754 | } | |
755 | ||
b7f4e76d AJ |
756 | static int ass_get_duration(const uint8_t *p) |
757 | { | |
758 | int sh, sm, ss, sc, eh, em, es, ec; | |
759 | uint64_t start, end; | |
760 | ||
761 | if (sscanf(p, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d", | |
762 | &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8) | |
763 | return 0; | |
764 | start = 3600000*sh + 60000*sm + 1000*ss + 10*sc; | |
765 | end = 3600000*eh + 60000*em + 1000*es + 10*ec; | |
766 | return end - start; | |
767 | } | |
768 | ||
769 | static int mkv_write_ass_blocks(AVFormatContext *s, AVPacket *pkt) | |
770 | { | |
771 | MatroskaMuxContext *mkv = s->priv_data; | |
772 | ByteIOContext *pb = s->pb; | |
773 | int i, layer = 0, max_duration = 0, size, line_size, data_size = pkt->size; | |
774 | uint8_t *start, *end, *data = pkt->data; | |
775 | ebml_master blockgroup; | |
776 | char buffer[2048]; | |
777 | ||
778 | while (data_size) { | |
779 | int duration = ass_get_duration(data); | |
780 | max_duration = FFMAX(duration, max_duration); | |
781 | end = memchr(data, '\n', data_size); | |
782 | size = line_size = end ? end-data+1 : data_size; | |
783 | size -= end ? (end[-1]=='\r')+1 : 0; | |
784 | start = data; | |
785 | for (i=0; i<3; i++, start++) | |
786 | if (!(start = memchr(start, ',', size-(start-data)))) | |
787 | return max_duration; | |
788 | size -= start - data; | |
789 | sscanf(data, "Dialogue: %d,", &layer); | |
790 | i = snprintf(buffer, sizeof(buffer), "%"PRId64",%d,", | |
791 | s->streams[pkt->stream_index]->nb_frames++, layer); | |
792 | size = FFMIN(i+size, sizeof(buffer)); | |
793 | memcpy(buffer+i, start, size-i); | |
794 | ||
795 | av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, " | |
796 | "pts %" PRId64 ", duration %d\n", | |
797 | url_ftell(pb), size, pkt->pts, duration); | |
798 | blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size)); | |
799 | put_ebml_id(pb, MATROSKA_ID_BLOCK); | |
800 | put_ebml_num(pb, size+4, 0); | |
801 | put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 | |
802 | put_be16(pb, pkt->pts - mkv->cluster_pts); | |
803 | put_byte(pb, 0); | |
804 | put_buffer(pb, buffer, size); | |
805 | put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); | |
806 | end_ebml_master(pb, blockgroup); | |
807 | ||
808 | data += line_size; | |
809 | data_size -= line_size; | |
810 | } | |
811 | ||
812 | return max_duration; | |
813 | } | |
814 | ||
95527e06 DC |
815 | static void mkv_write_block(AVFormatContext *s, unsigned int blockid, AVPacket *pkt, int flags) |
816 | { | |
817 | MatroskaMuxContext *mkv = s->priv_data; | |
899681cd | 818 | ByteIOContext *pb = s->pb; |
0a63a676 | 819 | AVCodecContext *codec = s->streams[pkt->stream_index]->codec; |
5f8bae8d AJ |
820 | uint8_t *data = NULL; |
821 | int size = pkt->size; | |
95527e06 | 822 | |
8ffc5f9e DC |
823 | av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, " |
824 | "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n", | |
c1f5aa21 | 825 | url_ftell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags); |
5f8bae8d AJ |
826 | if (codec->codec_id == CODEC_ID_H264 && codec->extradata_size > 0 && |
827 | (AV_RB24(codec->extradata) == 1 || AV_RB32(codec->extradata) == 1)) | |
828 | ff_avc_parse_nal_units_buf(pkt->data, &data, &size); | |
829 | else | |
830 | data = pkt->data; | |
95527e06 | 831 | put_ebml_id(pb, blockid); |
5f8bae8d | 832 | put_ebml_num(pb, size+4, 0); |
95527e06 DC |
833 | put_byte(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126 |
834 | put_be16(pb, pkt->pts - mkv->cluster_pts); | |
835 | put_byte(pb, flags); | |
5f8bae8d AJ |
836 | put_buffer(pb, data, size); |
837 | if (data != pkt->data) | |
838 | av_free(data); | |
95527e06 DC |
839 | } |
840 | ||
67143c0f DC |
841 | static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) |
842 | { | |
98186e41 | 843 | MatroskaMuxContext *mkv = s->priv_data; |
899681cd | 844 | ByteIOContext *pb = s->pb; |
9245c5ca | 845 | AVCodecContext *codec = s->streams[pkt->stream_index]->codec; |
357eba6f | 846 | int keyframe = !!(pkt->flags & PKT_FLAG_KEY); |
62c24705 | 847 | int duration = pkt->duration; |
6d588ecd | 848 | int ret; |
b1adb69c | 849 | |
98186e41 | 850 | // start a new cluster every 5 MB or 5 sec |
cce800b4 | 851 | if (url_ftell(pb) > mkv->cluster_pos + 5*1024*1024 || pkt->pts > mkv->cluster_pts + 5000) { |
8ffc5f9e DC |
852 | av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64 |
853 | " bytes, pts %" PRIu64 "\n", url_ftell(pb), pkt->pts); | |
98186e41 | 854 | end_ebml_master(pb, mkv->cluster); |
967d815a | 855 | |
6d588ecd DC |
856 | ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)); |
857 | if (ret < 0) return ret; | |
967d815a | 858 | |
6364d534 | 859 | mkv->cluster_pos = url_ftell(pb); |
baf71dca | 860 | mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0); |
98186e41 DC |
861 | put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts); |
862 | mkv->cluster_pts = pkt->pts; | |
541d443c | 863 | av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size)); |
98186e41 DC |
864 | } |
865 | ||
9245c5ca | 866 | if (codec->codec_type != CODEC_TYPE_SUBTITLE) { |
56e4540d | 867 | mkv_write_block(s, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7); |
b7f4e76d AJ |
868 | } else if (codec->codec_id == CODEC_ID_SSA) { |
869 | duration = mkv_write_ass_blocks(s, pkt); | |
663a5d9d | 870 | } else { |
1bfbe8ff | 871 | ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size)); |
62c24705 | 872 | duration = pkt->convergence_duration; |
663a5d9d | 873 | mkv_write_block(s, MATROSKA_ID_BLOCK, pkt, 0); |
291902c2 | 874 | put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); |
663a5d9d DC |
875 | end_ebml_master(pb, blockgroup); |
876 | } | |
02f487fc | 877 | |
9245c5ca | 878 | if (codec->codec_type == CODEC_TYPE_VIDEO && keyframe) { |
6d588ecd DC |
879 | ret = mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos); |
880 | if (ret < 0) return ret; | |
6364d534 DC |
881 | } |
882 | ||
62c24705 | 883 | mkv->duration = FFMAX(mkv->duration, pkt->pts + duration); |
67143c0f DC |
884 | return 0; |
885 | } | |
886 | ||
887 | static int mkv_write_trailer(AVFormatContext *s) | |
888 | { | |
889 | MatroskaMuxContext *mkv = s->priv_data; | |
899681cd | 890 | ByteIOContext *pb = s->pb; |
bc5c918e | 891 | int64_t currentpos, second_seekhead, cuespos; |
9e2a3e22 | 892 | int ret; |
02f487fc | 893 | |
b1adb69c | 894 | end_ebml_master(pb, mkv->cluster); |
02f487fc | 895 | |
ac9e1177 | 896 | if (!url_is_streamed(pb)) { |
e5c29287 DC |
897 | cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams); |
898 | second_seekhead = mkv_write_seekhead(pb, mkv->cluster_seekhead); | |
6364d534 | 899 | |
e5c29287 DC |
900 | ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES , cuespos); |
901 | if (ret < 0) return ret; | |
902 | ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_SEEKHEAD, second_seekhead); | |
903 | if (ret < 0) return ret; | |
904 | mkv_write_seekhead(pb, mkv->main_seekhead); | |
905 | ||
906 | // update the duration | |
907 | av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration); | |
908 | currentpos = url_ftell(pb); | |
909 | url_fseek(pb, mkv->duration_offset, SEEK_SET); | |
910 | put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration); | |
911 | ||
912 | // write the md5sum of some frames as the segment UID | |
913 | if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) { | |
914 | uint8_t segment_uid[16]; | |
915 | av_md5_final(mkv->md5_ctx, segment_uid); | |
916 | url_fseek(pb, mkv->segment_uid, SEEK_SET); | |
917 | put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16); | |
918 | } | |
919 | url_fseek(pb, currentpos, SEEK_SET); | |
ac9e1177 | 920 | } |
02f487fc | 921 | |
67143c0f | 922 | end_ebml_master(pb, mkv->segment); |
541d443c | 923 | av_free(mkv->md5_ctx); |
8a86aaa3 | 924 | put_flush_packet(pb); |
67143c0f DC |
925 | return 0; |
926 | } | |
927 | ||
928 | AVOutputFormat matroska_muxer = { | |
929 | "matroska", | |
bde15e74 | 930 | NULL_IF_CONFIG_SMALL("Matroska file format"), |
67143c0f DC |
931 | "video/x-matroska", |
932 | "mkv", | |
933 | sizeof(MatroskaMuxContext), | |
934 | CODEC_ID_MP2, | |
935 | CODEC_ID_MPEG4, | |
936 | mkv_write_header, | |
937 | mkv_write_packet, | |
938 | mkv_write_trailer, | |
25918212 | 939 | .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS, |
1a40491e | 940 | .codec_tag = (const AVCodecTag* const []){ff_codec_bmp_tags, ff_codec_wav_tags, 0}, |
c635497c | 941 | .subtitle_codec = CODEC_ID_TEXT, |
67143c0f | 942 | }; |
55c151ef DC |
943 | |
944 | AVOutputFormat matroska_audio_muxer = { | |
945 | "matroska", | |
bde15e74 | 946 | NULL_IF_CONFIG_SMALL("Matroska file format"), |
55c151ef DC |
947 | "audio/x-matroska", |
948 | "mka", | |
949 | sizeof(MatroskaMuxContext), | |
950 | CODEC_ID_MP2, | |
951 | CODEC_ID_NONE, | |
952 | mkv_write_header, | |
953 | mkv_write_packet, | |
954 | mkv_write_trailer, | |
abce34d9 | 955 | .flags = AVFMT_GLOBALHEADER, |
1a40491e | 956 | .codec_tag = (const AVCodecTag* const []){ff_codec_wav_tags, 0}, |
55c151ef | 957 | }; |