3 * Copyright (c) 2007 David Conrad
5 * This file is part of FFmpeg.
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.
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.
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
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/random_seed.h"
30 #include "libavutil/lfg.h"
31 #include "libavcodec/xiph.h"
32 #include "libavcodec/mpeg4audio.h"
34 typedef struct ebml_master
{
35 int64_t pos
; ///< absolute offset in the file where the master's elements start
36 int sizebytes
; ///< how many bytes were reserved for the size
39 typedef struct mkv_seekhead_entry
{
40 unsigned int elementid
;
44 typedef struct mkv_seekhead
{
46 int64_t segment_offset
; ///< the file offset to the beginning of the segment
47 int reserved_size
; ///< -1 if appending to file
49 mkv_seekhead_entry
*entries
;
56 int64_t cluster_pos
; ///< file offset of the cluster containing the block
60 int64_t segment_offset
;
61 mkv_cuepoint
*entries
;
69 #define MODE_MATROSKAv2 0x01
70 #define MODE_WEBM 0x02
72 typedef struct MatroskaMuxContext
{
74 ByteIOContext
*dyn_bc
;
76 int64_t segment_offset
;
78 int64_t cluster_pos
; ///< file offset of the current cluster
80 int64_t duration_offset
;
82 mkv_seekhead
*main_seekhead
;
87 unsigned int audio_buffer_size
;
88 AVPacket cur_audio_pkt
;
92 /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
93 * offset, 4 bytes for target EBML ID */
94 #define MAX_SEEKENTRY_SIZE 21
96 /** per-cuepoint-track - 3 1-byte EBML IDs, 3 1-byte EBML sizes, 2
98 #define MAX_CUETRACKPOS_SIZE 22
100 /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */
101 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
104 static int ebml_id_size(unsigned int id
)
106 return (av_log2(id
+1)-1)/7+1;
109 static void put_ebml_id(ByteIOContext
*pb
, unsigned int id
)
111 int i
= ebml_id_size(id
);
113 put_byte(pb
, id
>> (i
*8));
117 * Write an EBML size meaning "unknown size".
119 * @param bytes The number of bytes the size should occupy (maximum: 8).
121 static void put_ebml_size_unknown(ByteIOContext
*pb
, int bytes
)
124 put_byte(pb
, 0x1ff >> bytes
);
130 * Calculate how many bytes are needed to represent a given number in EBML.
132 static int ebml_num_size(uint64_t num
)
135 while ((num
+1) >> bytes
*7) bytes
++;
140 * Write a number in EBML variable length format.
142 * @param bytes The number of bytes that need to be used to write the number.
143 * If zero, any number of bytes can be used.
145 static void put_ebml_num(ByteIOContext
*pb
, uint64_t num
, int bytes
)
147 int i
, needed_bytes
= ebml_num_size(num
);
149 // sizes larger than this are currently undefined in EBML
150 assert(num
< (1ULL<<56)-1);
153 // don't care how many bytes are used, so use the min
154 bytes
= needed_bytes
;
155 // the bytes needed to write the given size would exceed the bytes
156 // that we need to use, so write unknown size. This shouldn't happen.
157 assert(bytes
>= needed_bytes
);
159 num
|= 1ULL << bytes
*7;
160 for (i
= bytes
- 1; i
>= 0; i
--)
161 put_byte(pb
, num
>> i
*8);
164 static void put_ebml_uint(ByteIOContext
*pb
, unsigned int elementid
, uint64_t val
)
168 while (tmp
>>=8) bytes
++;
170 put_ebml_id(pb
, elementid
);
171 put_ebml_num(pb
, bytes
, 0);
172 for (i
= bytes
- 1; i
>= 0; i
--)
173 put_byte(pb
, val
>> i
*8);
176 static void put_ebml_float(ByteIOContext
*pb
, unsigned int elementid
, double val
)
178 put_ebml_id(pb
, elementid
);
179 put_ebml_num(pb
, 8, 0);
180 put_be64(pb
, av_dbl2int(val
));
183 static void put_ebml_binary(ByteIOContext
*pb
, unsigned int elementid
,
184 const void *buf
, int size
)
186 put_ebml_id(pb
, elementid
);
187 put_ebml_num(pb
, size
, 0);
188 put_buffer(pb
, buf
, size
);
191 static void put_ebml_string(ByteIOContext
*pb
, unsigned int elementid
, const char *str
)
193 put_ebml_binary(pb
, elementid
, str
, strlen(str
));
197 * Writes a void element of a given size. Useful for reserving space in
198 * the file to be written to later.
200 * @param size The number of bytes to reserve, which must be at least 2.
202 static void put_ebml_void(ByteIOContext
*pb
, uint64_t size
)
204 int64_t currentpos
= url_ftell(pb
);
208 put_ebml_id(pb
, EBML_ID_VOID
);
209 // we need to subtract the length needed to store the size from the
210 // size we need to reserve so 2 cases, we use 8 bytes to store the
211 // size if possible, 1 byte otherwise
213 put_ebml_num(pb
, size
-1, 0);
215 put_ebml_num(pb
, size
-9, 8);
216 while(url_ftell(pb
) < currentpos
+ size
)
220 static ebml_master
start_ebml_master(ByteIOContext
*pb
, unsigned int elementid
, uint64_t expectedsize
)
222 int bytes
= expectedsize ?
ebml_num_size(expectedsize
) : 8;
223 put_ebml_id(pb
, elementid
);
224 put_ebml_size_unknown(pb
, bytes
);
225 return (ebml_master
){ url_ftell(pb
), bytes
};
228 static void end_ebml_master(ByteIOContext
*pb
, ebml_master master
)
230 int64_t pos
= url_ftell(pb
);
232 if (url_fseek(pb
, master
.pos
- master
.sizebytes
, SEEK_SET
) < 0)
234 put_ebml_num(pb
, pos
- master
.pos
, master
.sizebytes
);
235 url_fseek(pb
, pos
, SEEK_SET
);
238 static void put_xiph_size(ByteIOContext
*pb
, int size
)
241 for (i
= 0; i
< size
/ 255; i
++)
243 put_byte(pb
, size
% 255);
247 * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
248 * elements. If a maximum number of elements is specified, enough space
249 * will be reserved at the current file location to write a seek head of
252 * @param segment_offset The absolute offset to the position in the file
253 * where the segment begins.
254 * @param numelements The maximum number of elements that will be indexed
255 * by this seek head, 0 if unlimited.
257 static mkv_seekhead
* mkv_start_seekhead(ByteIOContext
*pb
, int64_t segment_offset
, int numelements
)
259 mkv_seekhead
*new_seekhead
= av_mallocz(sizeof(mkv_seekhead
));
260 if (new_seekhead
== NULL
)
263 new_seekhead
->segment_offset
= segment_offset
;
265 if (numelements
> 0) {
266 new_seekhead
->filepos
= url_ftell(pb
);
267 // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
268 // and size, and 3 bytes to guarantee that an EBML void element
269 // will fit afterwards
270 new_seekhead
->reserved_size
= numelements
* MAX_SEEKENTRY_SIZE
+ 13;
271 new_seekhead
->max_entries
= numelements
;
272 put_ebml_void(pb
, new_seekhead
->reserved_size
);
277 static int mkv_add_seekhead_entry(mkv_seekhead
*seekhead
, unsigned int elementid
, uint64_t filepos
)
279 mkv_seekhead_entry
*entries
= seekhead
->entries
;
281 // don't store more elements than we reserved space for
282 if (seekhead
->max_entries
> 0 && seekhead
->max_entries
<= seekhead
->num_entries
)
285 entries
= av_realloc(entries
, (seekhead
->num_entries
+ 1) * sizeof(mkv_seekhead_entry
));
287 return AVERROR(ENOMEM
);
289 entries
[seekhead
->num_entries
].elementid
= elementid
;
290 entries
[seekhead
->num_entries
++].segmentpos
= filepos
- seekhead
->segment_offset
;
292 seekhead
->entries
= entries
;
297 * Write the seek head to the file and free it. If a maximum number of
298 * elements was specified to mkv_start_seekhead(), the seek head will
299 * be written at the location reserved for it. Otherwise, it is written
300 * at the current location in the file.
302 * @return The file offset where the seekhead was written,
303 * -1 if an error occurred.
305 static int64_t mkv_write_seekhead(ByteIOContext
*pb
, mkv_seekhead
*seekhead
)
307 ebml_master metaseek
, seekentry
;
311 currentpos
= url_ftell(pb
);
313 if (seekhead
->reserved_size
> 0)
314 if (url_fseek(pb
, seekhead
->filepos
, SEEK_SET
) < 0)
317 metaseek
= start_ebml_master(pb
, MATROSKA_ID_SEEKHEAD
, seekhead
->reserved_size
);
318 for (i
= 0; i
< seekhead
->num_entries
; i
++) {
319 mkv_seekhead_entry
*entry
= &seekhead
->entries
[i
];
321 seekentry
= start_ebml_master(pb
, MATROSKA_ID_SEEKENTRY
, MAX_SEEKENTRY_SIZE
);
323 put_ebml_id(pb
, MATROSKA_ID_SEEKID
);
324 put_ebml_num(pb
, ebml_id_size(entry
->elementid
), 0);
325 put_ebml_id(pb
, entry
->elementid
);
327 put_ebml_uint(pb
, MATROSKA_ID_SEEKPOSITION
, entry
->segmentpos
);
328 end_ebml_master(pb
, seekentry
);
330 end_ebml_master(pb
, metaseek
);
332 if (seekhead
->reserved_size
> 0) {
333 uint64_t remaining
= seekhead
->filepos
+ seekhead
->reserved_size
- url_ftell(pb
);
334 put_ebml_void(pb
, remaining
);
335 url_fseek(pb
, currentpos
, SEEK_SET
);
337 currentpos
= seekhead
->filepos
;
339 av_free(seekhead
->entries
);
345 static mkv_cues
* mkv_start_cues(int64_t segment_offset
)
347 mkv_cues
*cues
= av_mallocz(sizeof(mkv_cues
));
351 cues
->segment_offset
= segment_offset
;
355 static int mkv_add_cuepoint(mkv_cues
*cues
, int stream
, int64_t ts
, int64_t cluster_pos
)
357 mkv_cuepoint
*entries
= cues
->entries
;
359 entries
= av_realloc(entries
, (cues
->num_entries
+ 1) * sizeof(mkv_cuepoint
));
361 return AVERROR(ENOMEM
);
366 entries
[cues
->num_entries
].pts
= ts
;
367 entries
[cues
->num_entries
].tracknum
= stream
+ 1;
368 entries
[cues
->num_entries
++].cluster_pos
= cluster_pos
- cues
->segment_offset
;
370 cues
->entries
= entries
;
374 static int64_t mkv_write_cues(ByteIOContext
*pb
, mkv_cues
*cues
, int num_tracks
)
376 ebml_master cues_element
;
380 currentpos
= url_ftell(pb
);
381 cues_element
= start_ebml_master(pb
, MATROSKA_ID_CUES
, 0);
383 for (i
= 0; i
< cues
->num_entries
; i
++) {
384 ebml_master cuepoint
, track_positions
;
385 mkv_cuepoint
*entry
= &cues
->entries
[i
];
386 uint64_t pts
= entry
->pts
;
388 cuepoint
= start_ebml_master(pb
, MATROSKA_ID_POINTENTRY
, MAX_CUEPOINT_SIZE(num_tracks
));
389 put_ebml_uint(pb
, MATROSKA_ID_CUETIME
, pts
);
391 // put all the entries from different tracks that have the exact same
392 // timestamp into the same CuePoint
393 for (j
= 0; j
< cues
->num_entries
- i
&& entry
[j
].pts
== pts
; j
++) {
394 track_positions
= start_ebml_master(pb
, MATROSKA_ID_CUETRACKPOSITION
, MAX_CUETRACKPOS_SIZE
);
395 put_ebml_uint(pb
, MATROSKA_ID_CUETRACK
, entry
[j
].tracknum
);
396 put_ebml_uint(pb
, MATROSKA_ID_CUECLUSTERPOSITION
, entry
[j
].cluster_pos
);
397 end_ebml_master(pb
, track_positions
);
400 end_ebml_master(pb
, cuepoint
);
402 end_ebml_master(pb
, cues_element
);
404 av_free(cues
->entries
);
409 static int put_xiph_codecpriv(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
)
411 uint8_t *header_start
[3];
413 int first_header_size
;
416 if (codec
->codec_id
== CODEC_ID_VORBIS
)
417 first_header_size
= 30;
419 first_header_size
= 42;
421 if (ff_split_xiph_headers(codec
->extradata
, codec
->extradata_size
,
422 first_header_size
, header_start
, header_len
) < 0) {
423 av_log(s
, AV_LOG_ERROR
, "Extradata corrupt.\n");
427 put_byte(pb
, 2); // number packets - 1
428 for (j
= 0; j
< 2; j
++) {
429 put_xiph_size(pb
, header_len
[j
]);
431 for (j
= 0; j
< 3; j
++)
432 put_buffer(pb
, header_start
[j
], header_len
[j
]);
437 static void get_aac_sample_rates(AVFormatContext
*s
, AVCodecContext
*codec
, int *sample_rate
, int *output_sample_rate
)
441 if (codec
->extradata_size
< 2) {
442 av_log(s
, AV_LOG_WARNING
, "No AAC extradata, unable to determine samplerate.\n");
446 sri
= ((codec
->extradata
[0] << 1) & 0xE) | (codec
->extradata
[1] >> 7);
448 av_log(s
, AV_LOG_WARNING
, "AAC samplerate index out of bounds\n");
451 *sample_rate
= ff_mpeg4audio_sample_rates
[sri
];
453 // if sbr, get output sample rate as well
454 if (codec
->extradata_size
== 5) {
455 sri
= (codec
->extradata
[4] >> 3) & 0xF;
457 av_log(s
, AV_LOG_WARNING
, "AAC output samplerate index out of bounds\n");
460 *output_sample_rate
= ff_mpeg4audio_sample_rates
[sri
];
464 static int mkv_write_codecprivate(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
, int native_id
, int qt_id
)
466 ByteIOContext
*dyn_cp
;
468 int ret
, codecpriv_size
;
470 ret
= url_open_dyn_buf(&dyn_cp
);
475 if (codec
->codec_id
== CODEC_ID_VORBIS
|| codec
->codec_id
== CODEC_ID_THEORA
)
476 ret
= put_xiph_codecpriv(s
, dyn_cp
, codec
);
477 else if (codec
->codec_id
== CODEC_ID_FLAC
)
478 ret
= ff_flac_write_header(dyn_cp
, codec
, 1);
479 else if (codec
->codec_id
== CODEC_ID_H264
)
480 ret
= ff_isom_write_avcc(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
481 else if (codec
->extradata_size
)
482 put_buffer(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
483 } else if (codec
->codec_type
== AVMEDIA_TYPE_VIDEO
) {
485 if (!codec
->codec_tag
)
486 codec
->codec_tag
= ff_codec_get_tag(codec_movvideo_tags
, codec
->codec_id
);
487 if (codec
->extradata_size
)
488 put_buffer(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
490 if (!codec
->codec_tag
)
491 codec
->codec_tag
= ff_codec_get_tag(ff_codec_bmp_tags
, codec
->codec_id
);
492 if (!codec
->codec_tag
) {
493 av_log(s
, AV_LOG_ERROR
, "No bmp codec ID found.\n");
497 ff_put_bmp_header(dyn_cp
, codec
, ff_codec_bmp_tags
, 0);
500 } else if (codec
->codec_type
== AVMEDIA_TYPE_AUDIO
) {
502 tag
= ff_codec_get_tag(ff_codec_wav_tags
, codec
->codec_id
);
504 av_log(s
, AV_LOG_ERROR
, "No wav codec ID found.\n");
507 if (!codec
->codec_tag
)
508 codec
->codec_tag
= tag
;
510 ff_put_wav_header(dyn_cp
, codec
);
513 codecpriv_size
= url_close_dyn_buf(dyn_cp
, &codecpriv
);
515 put_ebml_binary(pb
, MATROSKA_ID_CODECPRIVATE
, codecpriv
, codecpriv_size
);
520 static int mkv_write_tracks(AVFormatContext
*s
)
522 MatroskaMuxContext
*mkv
= s
->priv_data
;
523 ByteIOContext
*pb
= s
->pb
;
527 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_TRACKS
, url_ftell(pb
));
528 if (ret
< 0) return ret
;
530 tracks
= start_ebml_master(pb
, MATROSKA_ID_TRACKS
, 0);
531 for (i
= 0; i
< s
->nb_streams
; i
++) {
532 AVStream
*st
= s
->streams
[i
];
533 AVCodecContext
*codec
= st
->codec
;
534 ebml_master subinfo
, track
;
537 int bit_depth
= av_get_bits_per_sample(codec
->codec_id
);
538 int sample_rate
= codec
->sample_rate
;
539 int output_sample_rate
= 0;
543 bit_depth
= av_get_bits_per_sample_format(codec
->sample_fmt
);
545 if (codec
->codec_id
== CODEC_ID_AAC
)
546 get_aac_sample_rates(s
, codec
, &sample_rate
, &output_sample_rate
);
548 track
= start_ebml_master(pb
, MATROSKA_ID_TRACKENTRY
, 0);
549 put_ebml_uint (pb
, MATROSKA_ID_TRACKNUMBER
, i
+ 1);
550 put_ebml_uint (pb
, MATROSKA_ID_TRACKUID
, i
+ 1);
551 put_ebml_uint (pb
, MATROSKA_ID_TRACKFLAGLACING
, 0); // no lacing (yet)
553 if ((tag
= av_metadata_get(st
->metadata
, "title", NULL
, 0)))
554 put_ebml_string(pb
, MATROSKA_ID_TRACKNAME
, tag
->value
);
555 tag
= av_metadata_get(st
->metadata
, "language", NULL
, 0);
556 put_ebml_string(pb
, MATROSKA_ID_TRACKLANGUAGE
, tag ? tag
->value
:"und");
559 put_ebml_uint(pb
, MATROSKA_ID_TRACKFLAGDEFAULT
, !!(st
->disposition
& AV_DISPOSITION_DEFAULT
));
561 // look for a codec ID string specific to mkv to use,
562 // if none are found, use AVI codes
563 for (j
= 0; ff_mkv_codec_tags
[j
].id
!= CODEC_ID_NONE
; j
++) {
564 if (ff_mkv_codec_tags
[j
].id
== codec
->codec_id
) {
565 put_ebml_string(pb
, MATROSKA_ID_CODECID
, ff_mkv_codec_tags
[j
].str
);
571 if (mkv
->mode
== MODE_WEBM
&& !(codec
->codec_id
== CODEC_ID_VP8
||
572 codec
->codec_id
== CODEC_ID_VORBIS
)) {
573 av_log(s
, AV_LOG_ERROR
,
574 "Only VP8 video and Vorbis audio are supported for WebM.\n");
575 return AVERROR(EINVAL
);
578 switch (codec
->codec_type
) {
579 case AVMEDIA_TYPE_VIDEO
:
580 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_VIDEO
);
581 put_ebml_uint(pb
, MATROSKA_ID_TRACKDEFAULTDURATION
, av_q2d(codec
->time_base
)*1E9
);
584 ff_codec_get_tag(codec_movvideo_tags
, codec
->codec_id
) &&
585 (!ff_codec_get_tag(ff_codec_bmp_tags
, codec
->codec_id
)
586 || codec
->codec_id
== CODEC_ID_SVQ1
587 || codec
->codec_id
== CODEC_ID_SVQ3
588 || codec
->codec_id
== CODEC_ID_CINEPAK
))
592 put_ebml_string(pb
, MATROSKA_ID_CODECID
, "V_QUICKTIME");
593 else if (!native_id
) {
594 // if there is no mkv-specific codec ID, use VFW mode
595 put_ebml_string(pb
, MATROSKA_ID_CODECID
, "V_MS/VFW/FOURCC");
596 mkv
->tracks
[i
].write_dts
= 1;
599 subinfo
= start_ebml_master(pb
, MATROSKA_ID_TRACKVIDEO
, 0);
600 // XXX: interlace flag?
601 put_ebml_uint (pb
, MATROSKA_ID_VIDEOPIXELWIDTH
, codec
->width
);
602 put_ebml_uint (pb
, MATROSKA_ID_VIDEOPIXELHEIGHT
, codec
->height
);
603 if (st
->sample_aspect_ratio
.num
) {
604 int d_width
= codec
->width
*av_q2d(st
->sample_aspect_ratio
);
605 put_ebml_uint(pb
, MATROSKA_ID_VIDEODISPLAYWIDTH
, d_width
);
606 put_ebml_uint(pb
, MATROSKA_ID_VIDEODISPLAYHEIGHT
, codec
->height
);
608 end_ebml_master(pb
, subinfo
);
611 case AVMEDIA_TYPE_AUDIO
:
612 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_AUDIO
);
615 // no mkv-specific ID, use ACM mode
616 put_ebml_string(pb
, MATROSKA_ID_CODECID
, "A_MS/ACM");
618 subinfo
= start_ebml_master(pb
, MATROSKA_ID_TRACKAUDIO
, 0);
619 put_ebml_uint (pb
, MATROSKA_ID_AUDIOCHANNELS
, codec
->channels
);
620 put_ebml_float (pb
, MATROSKA_ID_AUDIOSAMPLINGFREQ
, sample_rate
);
621 if (output_sample_rate
)
622 put_ebml_float(pb
, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
, output_sample_rate
);
624 put_ebml_uint(pb
, MATROSKA_ID_AUDIOBITDEPTH
, bit_depth
);
625 end_ebml_master(pb
, subinfo
);
628 case AVMEDIA_TYPE_SUBTITLE
:
629 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_SUBTITLE
);
632 av_log(s
, AV_LOG_ERROR
, "Only audio, video, and subtitles are supported for Matroska.");
635 ret
= mkv_write_codecprivate(s
, pb
, codec
, native_id
, qt_id
);
636 if (ret
< 0) return ret
;
638 end_ebml_master(pb
, track
);
640 // ms precision is the de-facto standard timescale for mkv files
641 av_set_pts_info(st
, 64, 1, 1000);
643 end_ebml_master(pb
, tracks
);
647 static int mkv_write_chapters(AVFormatContext
*s
)
649 MatroskaMuxContext
*mkv
= s
->priv_data
;
650 ByteIOContext
*pb
= s
->pb
;
651 ebml_master chapters
, editionentry
;
652 AVRational scale
= {1, 1E9
};
658 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_CHAPTERS
, url_ftell(pb
));
659 if (ret
< 0) return ret
;
661 chapters
= start_ebml_master(pb
, MATROSKA_ID_CHAPTERS
, 0);
662 editionentry
= start_ebml_master(pb
, MATROSKA_ID_EDITIONENTRY
, 0);
663 put_ebml_uint(pb
, MATROSKA_ID_EDITIONFLAGDEFAULT
, 1);
664 put_ebml_uint(pb
, MATROSKA_ID_EDITIONFLAGHIDDEN
, 0);
665 for (i
= 0; i
< s
->nb_chapters
; i
++) {
666 ebml_master chapteratom
, chapterdisplay
;
667 AVChapter
*c
= s
->chapters
[i
];
668 AVMetadataTag
*t
= NULL
;
670 chapteratom
= start_ebml_master(pb
, MATROSKA_ID_CHAPTERATOM
, 0);
671 put_ebml_uint(pb
, MATROSKA_ID_CHAPTERUID
, c
->id
);
672 put_ebml_uint(pb
, MATROSKA_ID_CHAPTERTIMESTART
,
673 av_rescale_q(c
->start
, c
->time_base
, scale
));
674 put_ebml_uint(pb
, MATROSKA_ID_CHAPTERTIMEEND
,
675 av_rescale_q(c
->end
, c
->time_base
, scale
));
676 put_ebml_uint(pb
, MATROSKA_ID_CHAPTERFLAGHIDDEN
, 0);
677 put_ebml_uint(pb
, MATROSKA_ID_CHAPTERFLAGENABLED
, 1);
678 if ((t
= av_metadata_get(c
->metadata
, "title", NULL
, 0))) {
679 chapterdisplay
= start_ebml_master(pb
, MATROSKA_ID_CHAPTERDISPLAY
, 0);
680 put_ebml_string(pb
, MATROSKA_ID_CHAPSTRING
, t
->value
);
681 put_ebml_string(pb
, MATROSKA_ID_CHAPLANG
, "und");
682 end_ebml_master(pb
, chapterdisplay
);
684 end_ebml_master(pb
, chapteratom
);
686 end_ebml_master(pb
, editionentry
);
687 end_ebml_master(pb
, chapters
);
691 static int mkv_write_header(AVFormatContext
*s
)
693 MatroskaMuxContext
*mkv
= s
->priv_data
;
694 ByteIOContext
*pb
= s
->pb
;
695 ebml_master ebml_header
, segment_info
;
699 if (!strcmp(s
->oformat
->name
, "webm")) mkv
->mode
= MODE_WEBM
;
700 else mkv
->mode
= MODE_MATROSKAv2
;
702 av_lfg_init(&mkv
->lfg
, av_get_random_seed());
704 mkv
->tracks
= av_mallocz(s
->nb_streams
* sizeof(*mkv
->tracks
));
706 return AVERROR(ENOMEM
);
708 ebml_header
= start_ebml_master(pb
, EBML_ID_HEADER
, 0);
709 put_ebml_uint (pb
, EBML_ID_EBMLVERSION
, 1);
710 put_ebml_uint (pb
, EBML_ID_EBMLREADVERSION
, 1);
711 put_ebml_uint (pb
, EBML_ID_EBMLMAXIDLENGTH
, 4);
712 put_ebml_uint (pb
, EBML_ID_EBMLMAXSIZELENGTH
, 8);
713 put_ebml_string (pb
, EBML_ID_DOCTYPE
, s
->oformat
->name
);
714 put_ebml_uint (pb
, EBML_ID_DOCTYPEVERSION
, 2);
715 put_ebml_uint (pb
, EBML_ID_DOCTYPEREADVERSION
, 2);
716 end_ebml_master(pb
, ebml_header
);
718 mkv
->segment
= start_ebml_master(pb
, MATROSKA_ID_SEGMENT
, 0);
719 mkv
->segment_offset
= url_ftell(pb
);
721 // we write 2 seek heads - one at the end of the file to point to each
722 // cluster, and one at the beginning to point to all other level one
723 // elements (including the seek head at the end of the file), which
724 // isn't more than 10 elements if we only write one of each other
725 // currently defined level 1 element
726 mkv
->main_seekhead
= mkv_start_seekhead(pb
, mkv
->segment_offset
, 10);
727 if (!mkv
->main_seekhead
)
728 return AVERROR(ENOMEM
);
730 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_INFO
, url_ftell(pb
));
731 if (ret
< 0) return ret
;
733 segment_info
= start_ebml_master(pb
, MATROSKA_ID_INFO
, 0);
734 put_ebml_uint(pb
, MATROSKA_ID_TIMECODESCALE
, 1000000);
735 if ((tag
= av_metadata_get(s
->metadata
, "title", NULL
, 0)))
736 put_ebml_string(pb
, MATROSKA_ID_TITLE
, tag
->value
);
737 if (!(s
->streams
[0]->codec
->flags
& CODEC_FLAG_BITEXACT
)) {
738 uint32_t segment_uid
[4];
739 for (i
= 0; i
< 4; i
++)
740 segment_uid
[i
] = av_lfg_get(&mkv
->lfg
);
742 put_ebml_string(pb
, MATROSKA_ID_MUXINGAPP
, LIBAVFORMAT_IDENT
);
743 put_ebml_string(pb
, MATROSKA_ID_WRITINGAPP
, LIBAVFORMAT_IDENT
);
744 put_ebml_binary(pb
, MATROSKA_ID_SEGMENTUID
, segment_uid
, 16);
747 // reserve space for the duration
749 mkv
->duration_offset
= url_ftell(pb
);
750 put_ebml_void(pb
, 11); // assumes double-precision float to be written
751 end_ebml_master(pb
, segment_info
);
753 ret
= mkv_write_tracks(s
);
754 if (ret
< 0) return ret
;
756 if (mkv
->mode
!= MODE_WEBM
) {
757 ret
= mkv_write_chapters(s
);
758 if (ret
< 0) return ret
;
761 if (url_is_streamed(s
->pb
))
762 mkv_write_seekhead(pb
, mkv
->main_seekhead
);
764 mkv
->cues
= mkv_start_cues(mkv
->segment_offset
);
765 if (mkv
->cues
== NULL
)
766 return AVERROR(ENOMEM
);
768 av_init_packet(&mkv
->cur_audio_pkt
);
769 mkv
->cur_audio_pkt
.size
= 0;
770 mkv
->audio_buffer_size
= 0;
772 put_flush_packet(pb
);
776 static int mkv_blockgroup_size(int pkt_size
)
778 int size
= pkt_size
+ 4;
779 size
+= ebml_num_size(size
);
780 size
+= 2; // EBML ID for block and block duration
781 size
+= 8; // max size of block duration
782 size
+= ebml_num_size(size
);
783 size
+= 1; // blockgroup EBML ID
787 static int ass_get_duration(const uint8_t *p
)
789 int sh
, sm
, ss
, sc
, eh
, em
, es
, ec
;
792 if (sscanf(p
, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d",
793 &sh
, &sm
, &ss
, &sc
, &eh
, &em
, &es
, &ec
) != 8)
795 start
= 3600000*sh
+ 60000*sm
+ 1000*ss
+ 10*sc
;
796 end
= 3600000*eh
+ 60000*em
+ 1000*es
+ 10*ec
;
800 static int mkv_write_ass_blocks(AVFormatContext
*s
, ByteIOContext
*pb
, AVPacket
*pkt
)
802 MatroskaMuxContext
*mkv
= s
->priv_data
;
803 int i
, layer
= 0, max_duration
= 0, size
, line_size
, data_size
= pkt
->size
;
804 uint8_t *start
, *end
, *data
= pkt
->data
;
805 ebml_master blockgroup
;
809 int duration
= ass_get_duration(data
);
810 max_duration
= FFMAX(duration
, max_duration
);
811 end
= memchr(data
, '\n', data_size
);
812 size
= line_size
= end ? end
-data
+1 : data_size
;
813 size
-= end ?
(end
[-1]=='\r')+1 : 0;
815 for (i
=0; i
<3; i
++, start
++)
816 if (!(start
= memchr(start
, ',', size
-(start
-data
))))
818 size
-= start
- data
;
819 sscanf(data
, "Dialogue: %d,", &layer
);
820 i
= snprintf(buffer
, sizeof(buffer
), "%"PRId64
",%d,",
821 s
->streams
[pkt
->stream_index
]->nb_frames
++, layer
);
822 size
= FFMIN(i
+size
, sizeof(buffer
));
823 memcpy(buffer
+i
, start
, size
-i
);
825 av_log(s
, AV_LOG_DEBUG
, "Writing block at offset %" PRIu64
", size %d, "
826 "pts %" PRId64
", duration %d\n",
827 url_ftell(pb
), size
, pkt
->pts
, duration
);
828 blockgroup
= start_ebml_master(pb
, MATROSKA_ID_BLOCKGROUP
, mkv_blockgroup_size(size
));
829 put_ebml_id(pb
, MATROSKA_ID_BLOCK
);
830 put_ebml_num(pb
, size
+4, 0);
831 put_byte(pb
, 0x80 | (pkt
->stream_index
+ 1)); // this assumes stream_index is less than 126
832 put_be16(pb
, pkt
->pts
- mkv
->cluster_pts
);
834 put_buffer(pb
, buffer
, size
);
835 put_ebml_uint(pb
, MATROSKA_ID_BLOCKDURATION
, duration
);
836 end_ebml_master(pb
, blockgroup
);
839 data_size
-= line_size
;
845 static void mkv_write_block(AVFormatContext
*s
, ByteIOContext
*pb
,
846 unsigned int blockid
, AVPacket
*pkt
, int flags
)
848 MatroskaMuxContext
*mkv
= s
->priv_data
;
849 AVCodecContext
*codec
= s
->streams
[pkt
->stream_index
]->codec
;
850 uint8_t *data
= NULL
;
851 int size
= pkt
->size
;
852 int64_t ts
= mkv
->tracks
[pkt
->stream_index
].write_dts ? pkt
->dts
: pkt
->pts
;
854 av_log(s
, AV_LOG_DEBUG
, "Writing block at offset %" PRIu64
", size %d, "
855 "pts %" PRId64
", dts %" PRId64
", duration %d, flags %d\n",
856 url_ftell(pb
), pkt
->size
, pkt
->pts
, pkt
->dts
, pkt
->duration
, flags
);
857 if (codec
->codec_id
== CODEC_ID_H264
&& codec
->extradata_size
> 0 &&
858 (AV_RB24(codec
->extradata
) == 1 || AV_RB32(codec
->extradata
) == 1))
859 ff_avc_parse_nal_units_buf(pkt
->data
, &data
, &size
);
862 put_ebml_id(pb
, blockid
);
863 put_ebml_num(pb
, size
+4, 0);
864 put_byte(pb
, 0x80 | (pkt
->stream_index
+ 1)); // this assumes stream_index is less than 126
865 put_be16(pb
, ts
- mkv
->cluster_pts
);
867 put_buffer(pb
, data
, size
);
868 if (data
!= pkt
->data
)
872 static void mkv_flush_dynbuf(AVFormatContext
*s
)
874 MatroskaMuxContext
*mkv
= s
->priv_data
;
881 bufsize
= url_close_dyn_buf(mkv
->dyn_bc
, &dyn_buf
);
882 put_buffer(s
->pb
, dyn_buf
, bufsize
);
887 static int mkv_write_packet_internal(AVFormatContext
*s
, AVPacket
*pkt
)
889 MatroskaMuxContext
*mkv
= s
->priv_data
;
890 ByteIOContext
*pb
= s
->pb
;
891 AVCodecContext
*codec
= s
->streams
[pkt
->stream_index
]->codec
;
892 int keyframe
= !!(pkt
->flags
& AV_PKT_FLAG_KEY
);
893 int duration
= pkt
->duration
;
895 int64_t ts
= mkv
->tracks
[pkt
->stream_index
].write_dts ? pkt
->dts
: pkt
->pts
;
897 if (ts
== AV_NOPTS_VALUE
) {
898 av_log(s
, AV_LOG_ERROR
, "Can't write packet with unknown timestamp\n");
899 return AVERROR(EINVAL
);
902 if (url_is_streamed(s
->pb
)) {
904 url_open_dyn_buf(&mkv
->dyn_bc
);
908 if (!mkv
->cluster_pos
) {
909 mkv
->cluster_pos
= url_ftell(s
->pb
);
910 mkv
->cluster
= start_ebml_master(pb
, MATROSKA_ID_CLUSTER
, 0);
911 put_ebml_uint(pb
, MATROSKA_ID_CLUSTERTIMECODE
, FFMAX(0, ts
));
912 mkv
->cluster_pts
= FFMAX(0, ts
);
915 if (codec
->codec_type
!= AVMEDIA_TYPE_SUBTITLE
) {
916 mkv_write_block(s
, pb
, MATROSKA_ID_SIMPLEBLOCK
, pkt
, keyframe
<< 7);
917 } else if (codec
->codec_id
== CODEC_ID_SSA
) {
918 duration
= mkv_write_ass_blocks(s
, pb
, pkt
);
920 ebml_master blockgroup
= start_ebml_master(pb
, MATROSKA_ID_BLOCKGROUP
, mkv_blockgroup_size(pkt
->size
));
921 duration
= pkt
->convergence_duration
;
922 mkv_write_block(s
, pb
, MATROSKA_ID_BLOCK
, pkt
, 0);
923 put_ebml_uint(pb
, MATROSKA_ID_BLOCKDURATION
, duration
);
924 end_ebml_master(pb
, blockgroup
);
927 if (codec
->codec_type
== AVMEDIA_TYPE_VIDEO
&& keyframe
) {
928 ret
= mkv_add_cuepoint(mkv
->cues
, pkt
->stream_index
, ts
, mkv
->cluster_pos
);
929 if (ret
< 0) return ret
;
932 mkv
->duration
= FFMAX(mkv
->duration
, ts
+ duration
);
936 static int mkv_copy_packet(MatroskaMuxContext
*mkv
, const AVPacket
*pkt
)
938 uint8_t *data
= mkv
->cur_audio_pkt
.data
;
939 mkv
->cur_audio_pkt
= *pkt
;
940 mkv
->cur_audio_pkt
.data
= av_fast_realloc(data
, &mkv
->audio_buffer_size
, pkt
->size
);
941 if (!mkv
->cur_audio_pkt
.data
)
942 return AVERROR(ENOMEM
);
944 memcpy(mkv
->cur_audio_pkt
.data
, pkt
->data
, pkt
->size
);
945 mkv
->cur_audio_pkt
.size
= pkt
->size
;
949 static int mkv_write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
951 MatroskaMuxContext
*mkv
= s
->priv_data
;
952 ByteIOContext
*pb
= url_is_streamed(s
->pb
) ? mkv
->dyn_bc
: s
->pb
;
953 AVCodecContext
*codec
= s
->streams
[pkt
->stream_index
]->codec
;
954 int ret
, keyframe
= !!(pkt
->flags
& AV_PKT_FLAG_KEY
);
955 int64_t ts
= mkv
->tracks
[pkt
->stream_index
].write_dts ? pkt
->dts
: pkt
->pts
;
956 int cluster_size
= url_ftell(pb
) - (url_is_streamed(s
->pb
) ?
0 : mkv
->cluster_pos
);
958 // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
959 // after 4k and on a keyframe
960 if (mkv
->cluster_pos
&&
961 ((url_is_streamed(s
->pb
) && (cluster_size
> 32*1024 || ts
> mkv
->cluster_pts
+ 1000))
962 || cluster_size
> 5*1024*1024 || ts
> mkv
->cluster_pts
+ 5000
963 || (codec
->codec_type
== AVMEDIA_TYPE_VIDEO
&& keyframe
&& cluster_size
> 4*1024))) {
964 av_log(s
, AV_LOG_DEBUG
, "Starting new cluster at offset %" PRIu64
965 " bytes, pts %" PRIu64
"\n", url_ftell(pb
), ts
);
966 end_ebml_master(pb
, mkv
->cluster
);
967 mkv
->cluster_pos
= 0;
972 // check if we have an audio packet cached
973 if (mkv
->cur_audio_pkt
.size
> 0) {
974 ret
= mkv_write_packet_internal(s
, &mkv
->cur_audio_pkt
);
975 mkv
->cur_audio_pkt
.size
= 0;
977 av_log(s
, AV_LOG_ERROR
, "Could not write cached audio packet ret:%d\n", ret
);
982 // buffer an audio packet to ensure the packet containing the video
983 // keyframe's timecode is contained in the same cluster for WebM
984 if (codec
->codec_type
== AVMEDIA_TYPE_AUDIO
)
985 ret
= mkv_copy_packet(mkv
, pkt
);
987 ret
= mkv_write_packet_internal(s
, pkt
);
991 static int mkv_write_trailer(AVFormatContext
*s
)
993 MatroskaMuxContext
*mkv
= s
->priv_data
;
994 ByteIOContext
*pb
= s
->pb
;
995 int64_t currentpos
, cuespos
;
998 // check if we have an audio packet cached
999 if (mkv
->cur_audio_pkt
.size
> 0) {
1000 ret
= mkv_write_packet_internal(s
, &mkv
->cur_audio_pkt
);
1001 mkv
->cur_audio_pkt
.size
= 0;
1003 av_log(s
, AV_LOG_ERROR
, "Could not write cached audio packet ret:%d\n", ret
);
1009 end_ebml_master(mkv
->dyn_bc
, mkv
->cluster
);
1010 mkv_flush_dynbuf(s
);
1011 } else if (mkv
->cluster_pos
) {
1012 end_ebml_master(pb
, mkv
->cluster
);
1015 if (!url_is_streamed(pb
)) {
1016 cuespos
= mkv_write_cues(pb
, mkv
->cues
, s
->nb_streams
);
1018 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_CUES
, cuespos
);
1019 if (ret
< 0) return ret
;
1020 mkv_write_seekhead(pb
, mkv
->main_seekhead
);
1022 // update the duration
1023 av_log(s
, AV_LOG_DEBUG
, "end duration = %" PRIu64
"\n", mkv
->duration
);
1024 currentpos
= url_ftell(pb
);
1025 url_fseek(pb
, mkv
->duration_offset
, SEEK_SET
);
1026 put_ebml_float(pb
, MATROSKA_ID_DURATION
, mkv
->duration
);
1028 url_fseek(pb
, currentpos
, SEEK_SET
);
1031 end_ebml_master(pb
, mkv
->segment
);
1032 av_free(mkv
->tracks
);
1033 av_destruct_packet(&mkv
->cur_audio_pkt
);
1034 put_flush_packet(pb
);
1038 #if CONFIG_MATROSKA_MUXER
1039 AVOutputFormat matroska_muxer
= {
1041 NULL_IF_CONFIG_SMALL("Matroska file format"),
1044 sizeof(MatroskaMuxContext
),
1050 .flags
= AVFMT_GLOBALHEADER
| AVFMT_VARIABLE_FPS
,
1051 .codec_tag
= (const AVCodecTag
* const []){ff_codec_bmp_tags
, ff_codec_wav_tags
, 0},
1052 .subtitle_codec
= CODEC_ID_TEXT
,
1056 #if CONFIG_WEBM_MUXER
1057 AVOutputFormat webm_muxer
= {
1059 NULL_IF_CONFIG_SMALL("WebM file format"),
1062 sizeof(MatroskaMuxContext
),
1068 .flags
= AVFMT_GLOBALHEADER
| AVFMT_VARIABLE_FPS
,
1072 #if CONFIG_MATROSKA_AUDIO_MUXER
1073 AVOutputFormat matroska_audio_muxer
= {
1075 NULL_IF_CONFIG_SMALL("Matroska file format"),
1078 sizeof(MatroskaMuxContext
),
1084 .flags
= AVFMT_GLOBALHEADER
,
1085 .codec_tag
= (const AVCodecTag
* const []){ff_codec_wav_tags
, 0},