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
27 #include "libavutil/intreadwrite.h"
28 #include "libavutil/md5.h"
29 #include "libavcodec/xiph.h"
30 #include "libavcodec/mpeg4audio.h"
32 typedef struct ebml_master
{
33 int64_t pos
; ///< absolute offset in the file where the master's elements start
34 int sizebytes
; ///< how many bytes were reserved for the size
37 typedef struct mkv_seekhead_entry
{
38 unsigned int elementid
;
42 typedef struct mkv_seekhead
{
44 int64_t segment_offset
; ///< the file offset to the beginning of the segment
45 int reserved_size
; ///< -1 if appending to file
47 mkv_seekhead_entry
*entries
;
54 int64_t cluster_pos
; ///< file offset of the cluster containing the block
58 int64_t segment_offset
;
59 mkv_cuepoint
*entries
;
63 typedef struct MatroskaMuxContext
{
65 int64_t segment_offset
;
68 int64_t cluster_pos
; ///< file offset of the current cluster
70 int64_t duration_offset
;
72 mkv_seekhead
*main_seekhead
;
73 mkv_seekhead
*cluster_seekhead
;
76 struct AVMD5
*md5_ctx
;
80 /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
81 * offset, 4 bytes for target EBML ID */
82 #define MAX_SEEKENTRY_SIZE 21
84 /** per-cuepoint-track - 3 1-byte EBML IDs, 3 1-byte EBML sizes, 2
86 #define MAX_CUETRACKPOS_SIZE 22
88 /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */
89 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
92 static int ebml_id_size(unsigned int id
)
94 return (av_log2(id
+1)-1)/7+1;
97 static void put_ebml_id(ByteIOContext
*pb
, unsigned int id
)
99 int i
= ebml_id_size(id
);
101 put_byte(pb
, id
>> (i
*8));
105 * Write an EBML size meaning "unknown size".
107 * @param bytes The number of bytes the size should occupy (maximum: 8).
109 static void put_ebml_size_unknown(ByteIOContext
*pb
, int bytes
)
112 put_byte(pb
, 0x1ff >> bytes
);
118 * Calculate how many bytes are needed to represent a given number in EBML.
120 static int ebml_num_size(uint64_t num
)
123 while ((num
+1) >> bytes
*7) bytes
++;
128 * Write a number in EBML variable length format.
130 * @param bytes The number of bytes that need to be used to write the number.
131 * If zero, any number of bytes can be used.
133 static void put_ebml_num(ByteIOContext
*pb
, uint64_t num
, int bytes
)
135 int i
, needed_bytes
= ebml_num_size(num
);
137 // sizes larger than this are currently undefined in EBML
138 assert(num
< (1ULL<<56)-1);
141 // don't care how many bytes are used, so use the min
142 bytes
= needed_bytes
;
143 // the bytes needed to write the given size would exceed the bytes
144 // that we need to use, so write unknown size. This shouldn't happen.
145 assert(bytes
>= needed_bytes
);
147 num
|= 1ULL << bytes
*7;
148 for (i
= bytes
- 1; i
>= 0; i
--)
149 put_byte(pb
, num
>> i
*8);
152 static void put_ebml_uint(ByteIOContext
*pb
, unsigned int elementid
, uint64_t val
)
156 while (tmp
>>=8) bytes
++;
158 put_ebml_id(pb
, elementid
);
159 put_ebml_num(pb
, bytes
, 0);
160 for (i
= bytes
- 1; i
>= 0; i
--)
161 put_byte(pb
, val
>> i
*8);
164 static void put_ebml_float(ByteIOContext
*pb
, unsigned int elementid
, double val
)
166 put_ebml_id(pb
, elementid
);
167 put_ebml_num(pb
, 8, 0);
168 put_be64(pb
, av_dbl2int(val
));
171 static void put_ebml_binary(ByteIOContext
*pb
, unsigned int elementid
,
172 const uint8_t *buf
, int size
)
174 put_ebml_id(pb
, elementid
);
175 put_ebml_num(pb
, size
, 0);
176 put_buffer(pb
, buf
, size
);
179 static void put_ebml_string(ByteIOContext
*pb
, unsigned int elementid
, const char *str
)
181 put_ebml_binary(pb
, elementid
, str
, strlen(str
));
185 * Writes a void element of a given size. Useful for reserving space in
186 * the file to be written to later.
188 * @param size The number of bytes to reserve, which must be at least 2.
190 static void put_ebml_void(ByteIOContext
*pb
, uint64_t size
)
192 int64_t currentpos
= url_ftell(pb
);
196 put_ebml_id(pb
, EBML_ID_VOID
);
197 // we need to subtract the length needed to store the size from the
198 // size we need to reserve so 2 cases, we use 8 bytes to store the
199 // size if possible, 1 byte otherwise
201 put_ebml_num(pb
, size
-1, 0);
203 put_ebml_num(pb
, size
-9, 8);
204 while(url_ftell(pb
) < currentpos
+ size
)
208 static ebml_master
start_ebml_master(ByteIOContext
*pb
, unsigned int elementid
, uint64_t expectedsize
)
210 int bytes
= expectedsize
? ebml_num_size(expectedsize
) : 8;
211 put_ebml_id(pb
, elementid
);
212 put_ebml_size_unknown(pb
, bytes
);
213 return (ebml_master
){ url_ftell(pb
), bytes
};
216 static void end_ebml_master(ByteIOContext
*pb
, ebml_master master
)
218 int64_t pos
= url_ftell(pb
);
220 // leave the unknown size for masters when streaming
221 if (url_is_streamed(pb
))
224 url_fseek(pb
, master
.pos
- master
.sizebytes
, SEEK_SET
);
225 put_ebml_num(pb
, pos
- master
.pos
, master
.sizebytes
);
226 url_fseek(pb
, pos
, SEEK_SET
);
229 static void put_xiph_size(ByteIOContext
*pb
, int size
)
232 for (i
= 0; i
< size
/ 255; i
++)
234 put_byte(pb
, size
% 255);
238 * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
239 * elements. If a maximum number of elements is specified, enough space
240 * will be reserved at the current file location to write a seek head of
243 * @param segment_offset The absolute offset to the position in the file
244 * where the segment begins.
245 * @param numelements The maximum number of elements that will be indexed
246 * by this seek head, 0 if unlimited.
248 static mkv_seekhead
* mkv_start_seekhead(ByteIOContext
*pb
, int64_t segment_offset
, int numelements
)
250 mkv_seekhead
*new_seekhead
= av_mallocz(sizeof(mkv_seekhead
));
251 if (new_seekhead
== NULL
)
254 new_seekhead
->segment_offset
= segment_offset
;
256 if (numelements
> 0) {
257 new_seekhead
->filepos
= url_ftell(pb
);
258 // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
259 // and size, and 3 bytes to guarantee that an EBML void element
260 // will fit afterwards
261 new_seekhead
->reserved_size
= numelements
* MAX_SEEKENTRY_SIZE
+ 13;
262 new_seekhead
->max_entries
= numelements
;
263 put_ebml_void(pb
, new_seekhead
->reserved_size
);
268 static int mkv_add_seekhead_entry(mkv_seekhead
*seekhead
, unsigned int elementid
, uint64_t filepos
)
270 mkv_seekhead_entry
*entries
= seekhead
->entries
;
272 // don't store more elements than we reserved space for
273 if (seekhead
->max_entries
> 0 && seekhead
->max_entries
<= seekhead
->num_entries
)
276 entries
= av_realloc(entries
, (seekhead
->num_entries
+ 1) * sizeof(mkv_seekhead_entry
));
278 return AVERROR(ENOMEM
);
280 entries
[seekhead
->num_entries
].elementid
= elementid
;
281 entries
[seekhead
->num_entries
++].segmentpos
= filepos
- seekhead
->segment_offset
;
283 seekhead
->entries
= entries
;
288 * Write the seek head to the file and free it. If a maximum number of
289 * elements was specified to mkv_start_seekhead(), the seek head will
290 * be written at the location reserved for it. Otherwise, it is written
291 * at the current location in the file.
293 * @return The file offset where the seekhead was written.
295 static int64_t mkv_write_seekhead(ByteIOContext
*pb
, mkv_seekhead
*seekhead
)
297 ebml_master metaseek
, seekentry
;
301 currentpos
= url_ftell(pb
);
303 if (seekhead
->reserved_size
> 0)
304 url_fseek(pb
, seekhead
->filepos
, SEEK_SET
);
306 metaseek
= start_ebml_master(pb
, MATROSKA_ID_SEEKHEAD
, seekhead
->reserved_size
);
307 for (i
= 0; i
< seekhead
->num_entries
; i
++) {
308 mkv_seekhead_entry
*entry
= &seekhead
->entries
[i
];
310 seekentry
= start_ebml_master(pb
, MATROSKA_ID_SEEKENTRY
, MAX_SEEKENTRY_SIZE
);
312 put_ebml_id(pb
, MATROSKA_ID_SEEKID
);
313 put_ebml_num(pb
, ebml_id_size(entry
->elementid
), 0);
314 put_ebml_id(pb
, entry
->elementid
);
316 put_ebml_uint(pb
, MATROSKA_ID_SEEKPOSITION
, entry
->segmentpos
);
317 end_ebml_master(pb
, seekentry
);
319 end_ebml_master(pb
, metaseek
);
321 if (seekhead
->reserved_size
> 0) {
322 uint64_t remaining
= seekhead
->filepos
+ seekhead
->reserved_size
- url_ftell(pb
);
323 put_ebml_void(pb
, remaining
);
324 url_fseek(pb
, currentpos
, SEEK_SET
);
326 currentpos
= seekhead
->filepos
;
328 av_free(seekhead
->entries
);
334 static mkv_cues
* mkv_start_cues(int64_t segment_offset
)
336 mkv_cues
*cues
= av_mallocz(sizeof(mkv_cues
));
340 cues
->segment_offset
= segment_offset
;
344 static int mkv_add_cuepoint(mkv_cues
*cues
, AVPacket
*pkt
, int64_t cluster_pos
)
346 mkv_cuepoint
*entries
= cues
->entries
;
348 entries
= av_realloc(entries
, (cues
->num_entries
+ 1) * sizeof(mkv_cuepoint
));
350 return AVERROR(ENOMEM
);
352 entries
[cues
->num_entries
].pts
= pkt
->pts
;
353 entries
[cues
->num_entries
].tracknum
= pkt
->stream_index
+ 1;
354 entries
[cues
->num_entries
++].cluster_pos
= cluster_pos
- cues
->segment_offset
;
356 cues
->entries
= entries
;
360 static int64_t mkv_write_cues(ByteIOContext
*pb
, mkv_cues
*cues
, int num_tracks
)
362 ebml_master cues_element
;
366 currentpos
= url_ftell(pb
);
367 cues_element
= start_ebml_master(pb
, MATROSKA_ID_CUES
, 0);
369 for (i
= 0; i
< cues
->num_entries
; i
++) {
370 ebml_master cuepoint
, track_positions
;
371 mkv_cuepoint
*entry
= &cues
->entries
[i
];
372 uint64_t pts
= entry
->pts
;
374 cuepoint
= start_ebml_master(pb
, MATROSKA_ID_POINTENTRY
, MAX_CUEPOINT_SIZE(num_tracks
));
375 put_ebml_uint(pb
, MATROSKA_ID_CUETIME
, pts
);
377 // put all the entries from different tracks that have the exact same
378 // timestamp into the same CuePoint
379 for (j
= 0; j
< cues
->num_entries
- i
&& entry
[j
].pts
== pts
; j
++) {
380 track_positions
= start_ebml_master(pb
, MATROSKA_ID_CUETRACKPOSITION
, MAX_CUETRACKPOS_SIZE
);
381 put_ebml_uint(pb
, MATROSKA_ID_CUETRACK
, entry
[j
].tracknum
);
382 put_ebml_uint(pb
, MATROSKA_ID_CUECLUSTERPOSITION
, entry
[j
].cluster_pos
);
383 end_ebml_master(pb
, track_positions
);
386 end_ebml_master(pb
, cuepoint
);
388 end_ebml_master(pb
, cues_element
);
390 av_free(cues
->entries
);
395 static int put_xiph_codecpriv(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
)
397 uint8_t *header_start
[3];
399 int first_header_size
;
402 if (codec
->codec_id
== CODEC_ID_VORBIS
)
403 first_header_size
= 30;
405 first_header_size
= 42;
407 if (ff_split_xiph_headers(codec
->extradata
, codec
->extradata_size
,
408 first_header_size
, header_start
, header_len
) < 0) {
409 av_log(s
, AV_LOG_ERROR
, "Extradata corrupt.\n");
413 put_byte(pb
, 2); // number packets - 1
414 for (j
= 0; j
< 2; j
++) {
415 put_xiph_size(pb
, header_len
[j
]);
417 for (j
= 0; j
< 3; j
++)
418 put_buffer(pb
, header_start
[j
], header_len
[j
]);
423 #define FLAC_STREAMINFO_SIZE 34
425 static int put_flac_codecpriv(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
)
427 // if the extradata_size is greater than FLAC_STREAMINFO_SIZE,
428 // assume that it's in Matroska format already
429 if (codec
->extradata_size
< FLAC_STREAMINFO_SIZE
) {
430 av_log(s
, AV_LOG_ERROR
, "Invalid FLAC extradata\n");
432 } else if (codec
->extradata_size
== FLAC_STREAMINFO_SIZE
) {
433 // only the streaminfo packet
434 put_buffer(pb
, "fLaC", 4);
436 put_be24(pb
, FLAC_STREAMINFO_SIZE
);
437 } else if(memcmp("fLaC", codec
->extradata
, 4)) {
438 av_log(s
, AV_LOG_ERROR
, "Invalid FLAC extradata\n");
441 put_buffer(pb
, codec
->extradata
, codec
->extradata_size
);
445 static void get_aac_sample_rates(AVFormatContext
*s
, AVCodecContext
*codec
, int *sample_rate
, int *output_sample_rate
)
449 if (codec
->extradata_size
< 2) {
450 av_log(s
, AV_LOG_WARNING
, "No AAC extradata, unable to determine samplerate.\n");
454 sri
= ((codec
->extradata
[0] << 1) & 0xE) | (codec
->extradata
[1] >> 7);
456 av_log(s
, AV_LOG_WARNING
, "AAC samplerate index out of bounds\n");
459 *sample_rate
= ff_mpeg4audio_sample_rates
[sri
];
461 // if sbr, get output sample rate as well
462 if (codec
->extradata_size
== 5) {
463 sri
= (codec
->extradata
[4] >> 3) & 0xF;
465 av_log(s
, AV_LOG_WARNING
, "AAC output samplerate index out of bounds\n");
468 *output_sample_rate
= ff_mpeg4audio_sample_rates
[sri
];
472 static int mkv_write_codecprivate(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
, int native_id
, int qt_id
)
474 ByteIOContext
*dyn_cp
;
476 int ret
, codecpriv_size
;
478 ret
= url_open_dyn_buf(&dyn_cp
);
483 if (codec
->codec_id
== CODEC_ID_VORBIS
|| codec
->codec_id
== CODEC_ID_THEORA
)
484 ret
= put_xiph_codecpriv(s
, dyn_cp
, codec
);
485 else if (codec
->codec_id
== CODEC_ID_FLAC
)
486 ret
= put_flac_codecpriv(s
, dyn_cp
, codec
);
487 else if (codec
->codec_id
== CODEC_ID_H264
)
488 ret
= ff_isom_write_avcc(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
489 else if (codec
->extradata_size
)
490 put_buffer(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
491 } else if (codec
->codec_type
== CODEC_TYPE_VIDEO
) {
493 if (!codec
->codec_tag
)
494 codec
->codec_tag
= codec_get_tag(codec_movvideo_tags
, codec
->codec_id
);
495 if (codec
->extradata_size
)
496 put_buffer(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
498 if (!codec
->codec_tag
)
499 codec
->codec_tag
= codec_get_tag(codec_bmp_tags
, codec
->codec_id
);
500 if (!codec
->codec_tag
) {
501 av_log(s
, AV_LOG_ERROR
, "No bmp codec ID found.");
505 put_bmp_header(dyn_cp
, codec
, codec_bmp_tags
, 0);
508 } else if (codec
->codec_type
== CODEC_TYPE_AUDIO
) {
509 if (!codec
->codec_tag
)
510 codec
->codec_tag
= codec_get_tag(codec_wav_tags
, codec
->codec_id
);
511 if (!codec
->codec_tag
) {
512 av_log(s
, AV_LOG_ERROR
, "No wav codec ID found.");
516 put_wav_header(dyn_cp
, codec
);
519 codecpriv_size
= url_close_dyn_buf(dyn_cp
, &codecpriv
);
521 put_ebml_binary(pb
, MATROSKA_ID_CODECPRIVATE
, codecpriv
, codecpriv_size
);
526 static int mkv_write_tracks(AVFormatContext
*s
)
528 MatroskaMuxContext
*mkv
= s
->priv_data
;
529 ByteIOContext
*pb
= s
->pb
;
533 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_TRACKS
, url_ftell(pb
));
534 if (ret
< 0) return ret
;
536 tracks
= start_ebml_master(pb
, MATROSKA_ID_TRACKS
, 0);
537 for (i
= 0; i
< s
->nb_streams
; i
++) {
538 AVStream
*st
= s
->streams
[i
];
539 AVCodecContext
*codec
= st
->codec
;
540 ebml_master subinfo
, track
;
543 int bit_depth
= av_get_bits_per_sample(codec
->codec_id
);
544 int sample_rate
= codec
->sample_rate
;
545 int output_sample_rate
= 0;
548 bit_depth
= av_get_bits_per_sample_format(codec
->sample_fmt
);
550 if (codec
->codec_id
== CODEC_ID_AAC
)
551 get_aac_sample_rates(s
, codec
, &sample_rate
, &output_sample_rate
);
553 track
= start_ebml_master(pb
, MATROSKA_ID_TRACKENTRY
, 0);
554 put_ebml_uint (pb
, MATROSKA_ID_TRACKNUMBER
, i
+ 1);
555 put_ebml_uint (pb
, MATROSKA_ID_TRACKUID
, i
+ 1);
556 put_ebml_uint (pb
, MATROSKA_ID_TRACKFLAGLACING
, 0); // no lacing (yet)
559 put_ebml_string(pb
, MATROSKA_ID_TRACKLANGUAGE
, st
->language
);
561 put_ebml_string(pb
, MATROSKA_ID_TRACKLANGUAGE
, "und");
563 put_ebml_uint(pb
, MATROSKA_ID_TRACKFLAGDEFAULT
, !!(st
->disposition
& AV_DISPOSITION_DEFAULT
));
565 // look for a codec ID string specific to mkv to use,
566 // if none are found, use AVI codes
567 for (j
= 0; ff_mkv_codec_tags
[j
].id
!= CODEC_ID_NONE
; j
++) {
568 if (ff_mkv_codec_tags
[j
].id
== codec
->codec_id
) {
569 put_ebml_string(pb
, MATROSKA_ID_CODECID
, ff_mkv_codec_tags
[j
].str
);
575 switch (codec
->codec_type
) {
576 case CODEC_TYPE_VIDEO
:
577 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_VIDEO
);
580 codec_get_tag(codec_movvideo_tags
, codec
->codec_id
) &&
581 (!codec_get_tag(codec_bmp_tags
, codec
->codec_id
)
582 || codec
->codec_id
== CODEC_ID_SVQ1
583 || codec
->codec_id
== CODEC_ID_SVQ3
584 || codec
->codec_id
== CODEC_ID_CINEPAK
))
588 put_ebml_string(pb
, MATROSKA_ID_CODECID
, "V_QUICKTIME");
590 // if there is no mkv-specific codec ID, use VFW mode
591 put_ebml_string(pb
, MATROSKA_ID_CODECID
, "V_MS/VFW/FOURCC");
593 subinfo
= start_ebml_master(pb
, MATROSKA_ID_TRACKVIDEO
, 0);
594 // XXX: interlace flag?
595 put_ebml_uint (pb
, MATROSKA_ID_VIDEOPIXELWIDTH
, codec
->width
);
596 put_ebml_uint (pb
, MATROSKA_ID_VIDEOPIXELHEIGHT
, codec
->height
);
597 if (st
->sample_aspect_ratio
.num
) {
598 int d_width
= codec
->width
*av_q2d(st
->sample_aspect_ratio
);
599 put_ebml_uint(pb
, MATROSKA_ID_VIDEODISPLAYWIDTH
, d_width
);
600 put_ebml_uint(pb
, MATROSKA_ID_VIDEODISPLAYHEIGHT
, codec
->height
);
602 end_ebml_master(pb
, subinfo
);
605 case CODEC_TYPE_AUDIO
:
606 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_AUDIO
);
609 // no mkv-specific ID, use ACM mode
610 put_ebml_string(pb
, MATROSKA_ID_CODECID
, "A_MS/ACM");
612 subinfo
= start_ebml_master(pb
, MATROSKA_ID_TRACKAUDIO
, 0);
613 put_ebml_uint (pb
, MATROSKA_ID_AUDIOCHANNELS
, codec
->channels
);
614 put_ebml_float (pb
, MATROSKA_ID_AUDIOSAMPLINGFREQ
, sample_rate
);
615 if (output_sample_rate
)
616 put_ebml_float(pb
, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
, output_sample_rate
);
618 put_ebml_uint(pb
, MATROSKA_ID_AUDIOBITDEPTH
, bit_depth
);
619 end_ebml_master(pb
, subinfo
);
622 case CODEC_TYPE_SUBTITLE
:
623 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_SUBTITLE
);
626 av_log(s
, AV_LOG_ERROR
, "Only audio, video, and subtitles are supported for Matroska.");
629 ret
= mkv_write_codecprivate(s
, pb
, codec
, native_id
, qt_id
);
630 if (ret
< 0) return ret
;
632 end_ebml_master(pb
, track
);
634 // ms precision is the de-facto standard timescale for mkv files
635 av_set_pts_info(st
, 64, 1, 1000);
637 end_ebml_master(pb
, tracks
);
641 static int mkv_write_header(AVFormatContext
*s
)
643 MatroskaMuxContext
*mkv
= s
->priv_data
;
644 ByteIOContext
*pb
= s
->pb
;
645 ebml_master ebml_header
, segment_info
;
648 mkv
->md5_ctx
= av_mallocz(av_md5_size
);
649 av_md5_init(mkv
->md5_ctx
);
651 ebml_header
= start_ebml_master(pb
, EBML_ID_HEADER
, 0);
652 put_ebml_uint (pb
, EBML_ID_EBMLVERSION
, 1);
653 put_ebml_uint (pb
, EBML_ID_EBMLREADVERSION
, 1);
654 put_ebml_uint (pb
, EBML_ID_EBMLMAXIDLENGTH
, 4);
655 put_ebml_uint (pb
, EBML_ID_EBMLMAXSIZELENGTH
, 8);
656 put_ebml_string (pb
, EBML_ID_DOCTYPE
, "matroska");
657 put_ebml_uint (pb
, EBML_ID_DOCTYPEVERSION
, 2);
658 put_ebml_uint (pb
, EBML_ID_DOCTYPEREADVERSION
, 2);
659 end_ebml_master(pb
, ebml_header
);
661 mkv
->segment
= start_ebml_master(pb
, MATROSKA_ID_SEGMENT
, 0);
662 mkv
->segment_offset
= url_ftell(pb
);
664 // we write 2 seek heads - one at the end of the file to point to each
665 // cluster, and one at the beginning to point to all other level one
666 // elements (including the seek head at the end of the file), which
667 // isn't more than 10 elements if we only write one of each other
668 // currently defined level 1 element
669 mkv
->main_seekhead
= mkv_start_seekhead(pb
, mkv
->segment_offset
, 10);
670 mkv
->cluster_seekhead
= mkv_start_seekhead(pb
, mkv
->segment_offset
, 0);
671 if (mkv
->main_seekhead
== NULL
|| mkv
->cluster_seekhead
== NULL
)
672 return AVERROR(ENOMEM
);
674 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_INFO
, url_ftell(pb
));
675 if (ret
< 0) return ret
;
677 segment_info
= start_ebml_master(pb
, MATROSKA_ID_INFO
, 0);
678 put_ebml_uint(pb
, MATROSKA_ID_TIMECODESCALE
, 1000000);
679 if (strlen(s
->title
))
680 put_ebml_string(pb
, MATROSKA_ID_TITLE
, s
->title
);
681 if (!(s
->streams
[0]->codec
->flags
& CODEC_FLAG_BITEXACT
)) {
682 put_ebml_string(pb
, MATROSKA_ID_MUXINGAPP
, LIBAVFORMAT_IDENT
);
683 put_ebml_string(pb
, MATROSKA_ID_WRITINGAPP
, LIBAVFORMAT_IDENT
);
685 // reserve space to write the segment UID later
686 mkv
->segment_uid
= url_ftell(pb
);
687 put_ebml_void(pb
, 19);
690 // reserve space for the duration
692 mkv
->duration_offset
= url_ftell(pb
);
693 put_ebml_void(pb
, 11); // assumes double-precision float to be written
694 end_ebml_master(pb
, segment_info
);
696 ret
= mkv_write_tracks(s
);
697 if (ret
< 0) return ret
;
699 ret
= mkv_add_seekhead_entry(mkv
->cluster_seekhead
, MATROSKA_ID_CLUSTER
, url_ftell(pb
));
700 if (ret
< 0) return ret
;
702 mkv
->cluster_pos
= url_ftell(pb
);
703 mkv
->cluster
= start_ebml_master(pb
, MATROSKA_ID_CLUSTER
, 0);
704 put_ebml_uint(pb
, MATROSKA_ID_CLUSTERTIMECODE
, 0);
705 mkv
->cluster_pts
= 0;
707 mkv
->cues
= mkv_start_cues(mkv
->segment_offset
);
708 if (mkv
->cues
== NULL
)
709 return AVERROR(ENOMEM
);
714 static int mkv_blockgroup_size(int pkt_size
)
716 int size
= pkt_size
+ 4;
717 size
+= ebml_num_size(size
);
718 size
+= 2; // EBML ID for block and block duration
719 size
+= 8; // max size of block duration
720 size
+= ebml_num_size(size
);
721 size
+= 1; // blockgroup EBML ID
725 static int ass_get_duration(const uint8_t *p
)
727 int sh
, sm
, ss
, sc
, eh
, em
, es
, ec
;
730 if (sscanf(p
, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d",
731 &sh
, &sm
, &ss
, &sc
, &eh
, &em
, &es
, &ec
) != 8)
733 start
= 3600000*sh
+ 60000*sm
+ 1000*ss
+ 10*sc
;
734 end
= 3600000*eh
+ 60000*em
+ 1000*es
+ 10*ec
;
738 static int mkv_write_ass_blocks(AVFormatContext
*s
, AVPacket
*pkt
)
740 MatroskaMuxContext
*mkv
= s
->priv_data
;
741 ByteIOContext
*pb
= s
->pb
;
742 int i
, layer
= 0, max_duration
= 0, size
, line_size
, data_size
= pkt
->size
;
743 uint8_t *start
, *end
, *data
= pkt
->data
;
744 ebml_master blockgroup
;
748 int duration
= ass_get_duration(data
);
749 max_duration
= FFMAX(duration
, max_duration
);
750 end
= memchr(data
, '\n', data_size
);
751 size
= line_size
= end
? end
-data
+1 : data_size
;
752 size
-= end
? (end
[-1]=='\r')+1 : 0;
754 for (i
=0; i
<3; i
++, start
++)
755 if (!(start
= memchr(start
, ',', size
-(start
-data
))))
757 size
-= start
- data
;
758 sscanf(data
, "Dialogue: %d,", &layer
);
759 i
= snprintf(buffer
, sizeof(buffer
), "%"PRId64
",%d,",
760 s
->streams
[pkt
->stream_index
]->nb_frames
++, layer
);
761 size
= FFMIN(i
+size
, sizeof(buffer
));
762 memcpy(buffer
+i
, start
, size
-i
);
764 av_log(s
, AV_LOG_DEBUG
, "Writing block at offset %" PRIu64
", size %d, "
765 "pts %" PRId64
", duration %d\n",
766 url_ftell(pb
), size
, pkt
->pts
, duration
);
767 blockgroup
= start_ebml_master(pb
, MATROSKA_ID_BLOCKGROUP
, mkv_blockgroup_size(size
));
768 put_ebml_id(pb
, MATROSKA_ID_BLOCK
);
769 put_ebml_num(pb
, size
+4, 0);
770 put_byte(pb
, 0x80 | (pkt
->stream_index
+ 1)); // this assumes stream_index is less than 126
771 put_be16(pb
, pkt
->pts
- mkv
->cluster_pts
);
773 put_buffer(pb
, buffer
, size
);
774 put_ebml_uint(pb
, MATROSKA_ID_BLOCKDURATION
, duration
);
775 end_ebml_master(pb
, blockgroup
);
778 data_size
-= line_size
;
784 static void mkv_write_block(AVFormatContext
*s
, unsigned int blockid
, AVPacket
*pkt
, int flags
)
786 MatroskaMuxContext
*mkv
= s
->priv_data
;
787 ByteIOContext
*pb
= s
->pb
;
788 AVCodecContext
*codec
= s
->streams
[pkt
->stream_index
]->codec
;
790 av_log(s
, AV_LOG_DEBUG
, "Writing block at offset %" PRIu64
", size %d, "
791 "pts %" PRId64
", dts %" PRId64
", duration %d, flags %d\n",
792 url_ftell(pb
), pkt
->size
, pkt
->pts
, pkt
->dts
, pkt
->duration
, flags
);
793 put_ebml_id(pb
, blockid
);
794 put_ebml_num(pb
, pkt
->size
+4, 0);
795 put_byte(pb
, 0x80 | (pkt
->stream_index
+ 1)); // this assumes stream_index is less than 126
796 put_be16(pb
, pkt
->pts
- mkv
->cluster_pts
);
798 if (codec
->codec_id
== CODEC_ID_H264
&&
799 codec
->extradata_size
> 0 && AV_RB32(codec
->extradata
) == 0x00000001) {
800 /* from x264 or from bytestream h264 */
801 /* nal reformating needed */
802 ff_avc_parse_nal_units(pb
, pkt
->data
, pkt
->size
);
804 put_buffer(pb
, pkt
->data
, pkt
->size
);
808 static int mkv_write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
810 MatroskaMuxContext
*mkv
= s
->priv_data
;
811 ByteIOContext
*pb
= s
->pb
;
812 AVCodecContext
*codec
= s
->streams
[pkt
->stream_index
]->codec
;
813 int keyframe
= !!(pkt
->flags
& PKT_FLAG_KEY
);
814 int duration
= pkt
->duration
;
817 // start a new cluster every 5 MB or 5 sec
818 if (url_ftell(pb
) > mkv
->cluster_pos
+ 5*1024*1024 || pkt
->pts
> mkv
->cluster_pts
+ 5000) {
819 av_log(s
, AV_LOG_DEBUG
, "Starting new cluster at offset %" PRIu64
820 " bytes, pts %" PRIu64
"\n", url_ftell(pb
), pkt
->pts
);
821 end_ebml_master(pb
, mkv
->cluster
);
823 ret
= mkv_add_seekhead_entry(mkv
->cluster_seekhead
, MATROSKA_ID_CLUSTER
, url_ftell(pb
));
824 if (ret
< 0) return ret
;
826 mkv
->cluster_pos
= url_ftell(pb
);
827 mkv
->cluster
= start_ebml_master(pb
, MATROSKA_ID_CLUSTER
, 0);
828 put_ebml_uint(pb
, MATROSKA_ID_CLUSTERTIMECODE
, pkt
->pts
);
829 mkv
->cluster_pts
= pkt
->pts
;
830 av_md5_update(mkv
->md5_ctx
, pkt
->data
, FFMIN(200, pkt
->size
));
833 if (codec
->codec_type
!= CODEC_TYPE_SUBTITLE
) {
834 mkv_write_block(s
, MATROSKA_ID_SIMPLEBLOCK
, pkt
, keyframe
<< 7);
835 } else if (codec
->codec_id
== CODEC_ID_SSA
) {
836 duration
= mkv_write_ass_blocks(s
, pkt
);
838 ebml_master blockgroup
= start_ebml_master(pb
, MATROSKA_ID_BLOCKGROUP
, mkv_blockgroup_size(pkt
->size
));
839 duration
= pkt
->convergence_duration
;
840 mkv_write_block(s
, MATROSKA_ID_BLOCK
, pkt
, 0);
841 put_ebml_uint(pb
, MATROSKA_ID_BLOCKDURATION
, duration
);
842 end_ebml_master(pb
, blockgroup
);
845 if (codec
->codec_type
== CODEC_TYPE_VIDEO
&& keyframe
) {
846 ret
= mkv_add_cuepoint(mkv
->cues
, pkt
, mkv
->cluster_pos
);
847 if (ret
< 0) return ret
;
850 mkv
->duration
= FFMAX(mkv
->duration
, pkt
->pts
+ duration
);
854 static int mkv_write_trailer(AVFormatContext
*s
)
856 MatroskaMuxContext
*mkv
= s
->priv_data
;
857 ByteIOContext
*pb
= s
->pb
;
858 int64_t currentpos
, second_seekhead
, cuespos
;
861 end_ebml_master(pb
, mkv
->cluster
);
863 if (!url_is_streamed(pb
)) {
864 cuespos
= mkv_write_cues(pb
, mkv
->cues
, s
->nb_streams
);
865 second_seekhead
= mkv_write_seekhead(pb
, mkv
->cluster_seekhead
);
867 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_CUES
, cuespos
);
868 if (ret
< 0) return ret
;
869 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_SEEKHEAD
, second_seekhead
);
870 if (ret
< 0) return ret
;
871 mkv_write_seekhead(pb
, mkv
->main_seekhead
);
873 // update the duration
874 av_log(s
, AV_LOG_DEBUG
, "end duration = %" PRIu64
"\n", mkv
->duration
);
875 currentpos
= url_ftell(pb
);
876 url_fseek(pb
, mkv
->duration_offset
, SEEK_SET
);
877 put_ebml_float(pb
, MATROSKA_ID_DURATION
, mkv
->duration
);
879 // write the md5sum of some frames as the segment UID
880 if (!(s
->streams
[0]->codec
->flags
& CODEC_FLAG_BITEXACT
)) {
881 uint8_t segment_uid
[16];
882 av_md5_final(mkv
->md5_ctx
, segment_uid
);
883 url_fseek(pb
, mkv
->segment_uid
, SEEK_SET
);
884 put_ebml_binary(pb
, MATROSKA_ID_SEGMENTUID
, segment_uid
, 16);
886 url_fseek(pb
, currentpos
, SEEK_SET
);
889 end_ebml_master(pb
, mkv
->segment
);
890 av_free(mkv
->md5_ctx
);
894 AVOutputFormat matroska_muxer
= {
896 NULL_IF_CONFIG_SMALL("Matroska file format"),
899 sizeof(MatroskaMuxContext
),
905 .flags
= AVFMT_GLOBALHEADER
,
906 .codec_tag
= (const AVCodecTag
* const []){codec_bmp_tags
, codec_wav_tags
, 0},
907 .subtitle_codec
= CODEC_ID_TEXT
,
910 AVOutputFormat matroska_audio_muxer
= {
912 NULL_IF_CONFIG_SMALL("Matroska file format"),
915 sizeof(MatroskaMuxContext
),
921 .flags
= AVFMT_GLOBALHEADER
,
922 .codec_tag
= (const AVCodecTag
* const []){codec_wav_tags
, 0},