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
26 #include "libavutil/md5.h"
27 #include "libavcodec/xiph.h"
28 #include "libavcodec/mpeg4audio.h"
30 typedef struct ebml_master
{
31 offset_t pos
; ///< absolute offset in the file where the master's elements start
32 int sizebytes
; ///< how many bytes were reserved for the size
35 typedef struct mkv_seekhead_entry
{
36 unsigned int elementid
;
40 typedef struct mkv_seekhead
{
42 offset_t segment_offset
; ///< the file offset to the beginning of the segment
43 int reserved_size
; ///< -1 if appending to file
45 mkv_seekhead_entry
*entries
;
52 offset_t cluster_pos
; ///< file offset of the cluster containing the block
56 offset_t segment_offset
;
57 mkv_cuepoint
*entries
;
61 typedef struct MatroskaMuxContext
{
63 offset_t segment_offset
;
66 offset_t cluster_pos
; ///< file offset of the current cluster
68 offset_t duration_offset
;
70 mkv_seekhead
*main_seekhead
;
71 mkv_seekhead
*cluster_seekhead
;
74 struct AVMD5
*md5_ctx
;
78 /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
79 * offset, 4 bytes for target EBML ID */
80 #define MAX_SEEKENTRY_SIZE 21
82 /** per-cuepoint-track - 3 1-byte EBML IDs, 3 1-byte EBML sizes, 2
84 #define MAX_CUETRACKPOS_SIZE 22
86 /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */
87 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
90 static int ebml_id_size(unsigned int id
)
92 return (av_log2(id
+1)-1)/7+1;
95 static void put_ebml_id(ByteIOContext
*pb
, unsigned int id
)
97 int i
= ebml_id_size(id
);
99 put_byte(pb
, id
>> (i
*8));
103 * Write an EBML size meaning "unknown size".
105 * @param bytes The number of bytes the size should occupy (maximum: 8).
107 static void put_ebml_size_unknown(ByteIOContext
*pb
, int bytes
)
110 put_byte(pb
, 0x1ff >> bytes
);
116 * Calculate how many bytes are needed to represent a given number in EBML.
118 static int ebml_num_size(uint64_t num
)
121 while ((num
+1) >> bytes
*7) bytes
++;
126 * Write a number in EBML variable length format.
128 * @param bytes The number of bytes that need to be used to write the number.
129 * If zero, any number of bytes can be used.
131 static void put_ebml_num(ByteIOContext
*pb
, uint64_t num
, int bytes
)
133 int i
, needed_bytes
= ebml_num_size(num
);
135 // sizes larger than this are currently undefined in EBML
136 assert(num
< (1ULL<<56)-1);
139 // don't care how many bytes are used, so use the min
140 bytes
= needed_bytes
;
141 // the bytes needed to write the given size would exceed the bytes
142 // that we need to use, so write unknown size. This shouldn't happen.
143 assert(bytes
>= needed_bytes
);
145 num
|= 1ULL << bytes
*7;
146 for (i
= bytes
- 1; i
>= 0; i
--)
147 put_byte(pb
, num
>> i
*8);
150 static void put_ebml_uint(ByteIOContext
*pb
, unsigned int elementid
, uint64_t val
)
154 while (tmp
>>=8) bytes
++;
156 put_ebml_id(pb
, elementid
);
157 put_ebml_num(pb
, bytes
, 0);
158 for (i
= bytes
- 1; i
>= 0; i
--)
159 put_byte(pb
, val
>> i
*8);
162 static void put_ebml_float(ByteIOContext
*pb
, unsigned int elementid
, double val
)
164 put_ebml_id(pb
, elementid
);
165 put_ebml_num(pb
, 8, 0);
166 put_be64(pb
, av_dbl2int(val
));
169 static void put_ebml_binary(ByteIOContext
*pb
, unsigned int elementid
,
170 const uint8_t *buf
, int size
)
172 put_ebml_id(pb
, elementid
);
173 put_ebml_num(pb
, size
, 0);
174 put_buffer(pb
, buf
, size
);
177 static void put_ebml_string(ByteIOContext
*pb
, unsigned int elementid
, const char *str
)
179 put_ebml_binary(pb
, elementid
, str
, strlen(str
));
183 * Writes a void element of a given size. Useful for reserving space in
184 * the file to be written to later.
186 * @param size The number of bytes to reserve, which must be at least 2.
188 static void put_ebml_void(ByteIOContext
*pb
, uint64_t size
)
190 offset_t currentpos
= url_ftell(pb
);
194 put_ebml_id(pb
, EBML_ID_VOID
);
195 // we need to subtract the length needed to store the size from the
196 // size we need to reserve so 2 cases, we use 8 bytes to store the
197 // size if possible, 1 byte otherwise
199 put_ebml_num(pb
, size
-1, 0);
201 put_ebml_num(pb
, size
-9, 8);
202 while(url_ftell(pb
) < currentpos
+ size
)
206 static ebml_master
start_ebml_master(ByteIOContext
*pb
, unsigned int elementid
, uint64_t expectedsize
)
208 int bytes
= expectedsize
? ebml_num_size(expectedsize
) : 8;
209 put_ebml_id(pb
, elementid
);
210 put_ebml_size_unknown(pb
, bytes
);
211 return (ebml_master
){ url_ftell(pb
), bytes
};
214 static void end_ebml_master(ByteIOContext
*pb
, ebml_master master
)
216 offset_t pos
= url_ftell(pb
);
218 // leave the unknown size for masters when streaming
219 if (url_is_streamed(pb
))
222 url_fseek(pb
, master
.pos
- master
.sizebytes
, SEEK_SET
);
223 put_ebml_num(pb
, pos
- master
.pos
, master
.sizebytes
);
224 url_fseek(pb
, pos
, SEEK_SET
);
227 static void put_xiph_size(ByteIOContext
*pb
, int size
)
230 for (i
= 0; i
< size
/ 255; i
++)
232 put_byte(pb
, size
% 255);
236 * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
237 * elements. If a maximum number of elements is specified, enough space
238 * will be reserved at the current file location to write a seek head of
241 * @param segment_offset The absolute offset to the position in the file
242 * where the segment begins.
243 * @param numelements The maximum number of elements that will be indexed
244 * by this seek head, 0 if unlimited.
246 static mkv_seekhead
* mkv_start_seekhead(ByteIOContext
*pb
, offset_t segment_offset
, int numelements
)
248 mkv_seekhead
*new_seekhead
= av_mallocz(sizeof(mkv_seekhead
));
249 if (new_seekhead
== NULL
)
252 new_seekhead
->segment_offset
= segment_offset
;
254 if (numelements
> 0) {
255 new_seekhead
->filepos
= url_ftell(pb
);
256 // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
257 // and size, and 3 bytes to guarantee that an EBML void element
258 // will fit afterwards
259 new_seekhead
->reserved_size
= numelements
* MAX_SEEKENTRY_SIZE
+ 13;
260 new_seekhead
->max_entries
= numelements
;
261 put_ebml_void(pb
, new_seekhead
->reserved_size
);
266 static int mkv_add_seekhead_entry(mkv_seekhead
*seekhead
, unsigned int elementid
, uint64_t filepos
)
268 mkv_seekhead_entry
*entries
= seekhead
->entries
;
270 // don't store more elements than we reserved space for
271 if (seekhead
->max_entries
> 0 && seekhead
->max_entries
<= seekhead
->num_entries
)
274 entries
= av_realloc(entries
, (seekhead
->num_entries
+ 1) * sizeof(mkv_seekhead_entry
));
276 return AVERROR(ENOMEM
);
278 entries
[seekhead
->num_entries
].elementid
= elementid
;
279 entries
[seekhead
->num_entries
++].segmentpos
= filepos
- seekhead
->segment_offset
;
281 seekhead
->entries
= entries
;
286 * Write the seek head to the file and free it. If a maximum number of
287 * elements was specified to mkv_start_seekhead(), the seek head will
288 * be written at the location reserved for it. Otherwise, it is written
289 * at the current location in the file.
291 * @return The file offset where the seekhead was written.
293 static offset_t
mkv_write_seekhead(ByteIOContext
*pb
, mkv_seekhead
*seekhead
)
295 ebml_master metaseek
, seekentry
;
299 currentpos
= url_ftell(pb
);
301 if (seekhead
->reserved_size
> 0)
302 url_fseek(pb
, seekhead
->filepos
, SEEK_SET
);
304 metaseek
= start_ebml_master(pb
, MATROSKA_ID_SEEKHEAD
, seekhead
->reserved_size
);
305 for (i
= 0; i
< seekhead
->num_entries
; i
++) {
306 mkv_seekhead_entry
*entry
= &seekhead
->entries
[i
];
308 seekentry
= start_ebml_master(pb
, MATROSKA_ID_SEEKENTRY
, MAX_SEEKENTRY_SIZE
);
310 put_ebml_id(pb
, MATROSKA_ID_SEEKID
);
311 put_ebml_num(pb
, ebml_id_size(entry
->elementid
), 0);
312 put_ebml_id(pb
, entry
->elementid
);
314 put_ebml_uint(pb
, MATROSKA_ID_SEEKPOSITION
, entry
->segmentpos
);
315 end_ebml_master(pb
, seekentry
);
317 end_ebml_master(pb
, metaseek
);
319 if (seekhead
->reserved_size
> 0) {
320 uint64_t remaining
= seekhead
->filepos
+ seekhead
->reserved_size
- url_ftell(pb
);
321 put_ebml_void(pb
, remaining
);
322 url_fseek(pb
, currentpos
, SEEK_SET
);
324 currentpos
= seekhead
->filepos
;
326 av_free(seekhead
->entries
);
332 static mkv_cues
* mkv_start_cues(offset_t segment_offset
)
334 mkv_cues
*cues
= av_mallocz(sizeof(mkv_cues
));
338 cues
->segment_offset
= segment_offset
;
342 static int mkv_add_cuepoint(mkv_cues
*cues
, AVPacket
*pkt
, offset_t cluster_pos
)
344 mkv_cuepoint
*entries
= cues
->entries
;
346 entries
= av_realloc(entries
, (cues
->num_entries
+ 1) * sizeof(mkv_cuepoint
));
348 return AVERROR(ENOMEM
);
350 entries
[cues
->num_entries
].pts
= pkt
->pts
;
351 entries
[cues
->num_entries
].tracknum
= pkt
->stream_index
+ 1;
352 entries
[cues
->num_entries
++].cluster_pos
= cluster_pos
- cues
->segment_offset
;
354 cues
->entries
= entries
;
358 static offset_t
mkv_write_cues(ByteIOContext
*pb
, mkv_cues
*cues
, int num_tracks
)
360 ebml_master cues_element
;
364 currentpos
= url_ftell(pb
);
365 cues_element
= start_ebml_master(pb
, MATROSKA_ID_CUES
, 0);
367 for (i
= 0; i
< cues
->num_entries
; i
++) {
368 ebml_master cuepoint
, track_positions
;
369 mkv_cuepoint
*entry
= &cues
->entries
[i
];
370 uint64_t pts
= entry
->pts
;
372 cuepoint
= start_ebml_master(pb
, MATROSKA_ID_POINTENTRY
, MAX_CUEPOINT_SIZE(num_tracks
));
373 put_ebml_uint(pb
, MATROSKA_ID_CUETIME
, pts
);
375 // put all the entries from different tracks that have the exact same
376 // timestamp into the same CuePoint
377 for (j
= 0; j
< cues
->num_entries
- i
&& entry
[j
].pts
== pts
; j
++) {
378 track_positions
= start_ebml_master(pb
, MATROSKA_ID_CUETRACKPOSITION
, MAX_CUETRACKPOS_SIZE
);
379 put_ebml_uint(pb
, MATROSKA_ID_CUETRACK
, entry
[j
].tracknum
);
380 put_ebml_uint(pb
, MATROSKA_ID_CUECLUSTERPOSITION
, entry
[j
].cluster_pos
);
381 end_ebml_master(pb
, track_positions
);
384 end_ebml_master(pb
, cuepoint
);
386 end_ebml_master(pb
, cues_element
);
388 av_free(cues
->entries
);
393 static int put_xiph_codecpriv(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
)
395 uint8_t *header_start
[3];
397 int first_header_size
;
400 if (codec
->codec_id
== CODEC_ID_VORBIS
)
401 first_header_size
= 30;
403 first_header_size
= 42;
405 if (ff_split_xiph_headers(codec
->extradata
, codec
->extradata_size
,
406 first_header_size
, header_start
, header_len
) < 0) {
407 av_log(s
, AV_LOG_ERROR
, "Extradata corrupt.\n");
411 put_byte(pb
, 2); // number packets - 1
412 for (j
= 0; j
< 2; j
++) {
413 put_xiph_size(pb
, header_len
[j
]);
415 for (j
= 0; j
< 3; j
++)
416 put_buffer(pb
, header_start
[j
], header_len
[j
]);
421 #define FLAC_STREAMINFO_SIZE 34
423 static int put_flac_codecpriv(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
)
425 // if the extradata_size is greater than FLAC_STREAMINFO_SIZE,
426 // assume that it's in Matroska's format already
427 if (codec
->extradata_size
< FLAC_STREAMINFO_SIZE
) {
428 av_log(s
, AV_LOG_ERROR
, "Invalid FLAC extradata\n");
430 } else if (codec
->extradata_size
== FLAC_STREAMINFO_SIZE
) {
431 // only the streaminfo packet
432 put_buffer(pb
, "fLaC", 4);
434 put_be24(pb
, FLAC_STREAMINFO_SIZE
);
435 } else if(memcmp("fLaC", codec
->extradata
, 4)) {
436 av_log(s
, AV_LOG_ERROR
, "Invalid FLAC extradata\n");
439 put_buffer(pb
, codec
->extradata
, codec
->extradata_size
);
443 static void get_aac_sample_rates(AVFormatContext
*s
, AVCodecContext
*codec
, int *sample_rate
, int *output_sample_rate
)
447 if (codec
->extradata_size
< 2) {
448 av_log(s
, AV_LOG_WARNING
, "No AAC extradata, unable to determine samplerate.\n");
452 sri
= ((codec
->extradata
[0] << 1) & 0xE) | (codec
->extradata
[1] >> 7);
454 av_log(s
, AV_LOG_WARNING
, "AAC samplerate index out of bounds\n");
457 *sample_rate
= ff_mpeg4audio_sample_rates
[sri
];
459 // if sbr, get output sample rate as well
460 if (codec
->extradata_size
== 5) {
461 sri
= (codec
->extradata
[4] >> 3) & 0xF;
463 av_log(s
, AV_LOG_WARNING
, "AAC output samplerate index out of bounds\n");
466 *output_sample_rate
= ff_mpeg4audio_sample_rates
[sri
];
470 static int mkv_write_codecprivate(AVFormatContext
*s
, ByteIOContext
*pb
, AVCodecContext
*codec
, int native_id
)
472 ByteIOContext
*dyn_cp
;
474 int ret
, codecpriv_size
;
476 ret
= url_open_dyn_buf(&dyn_cp
);
481 if (codec
->codec_id
== CODEC_ID_VORBIS
|| codec
->codec_id
== CODEC_ID_THEORA
)
482 ret
= put_xiph_codecpriv(s
, dyn_cp
, codec
);
483 else if (codec
->codec_id
== CODEC_ID_FLAC
)
484 ret
= put_flac_codecpriv(s
, dyn_cp
, codec
);
485 else if (codec
->codec_id
== CODEC_ID_H264
)
486 ret
= ff_isom_write_avcc(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
487 else if (codec
->extradata_size
)
488 put_buffer(dyn_cp
, codec
->extradata
, codec
->extradata_size
);
489 } else if (codec
->codec_type
== CODEC_TYPE_VIDEO
) {
490 if (!codec
->codec_tag
)
491 codec
->codec_tag
= codec_get_tag(codec_bmp_tags
, codec
->codec_id
);
492 if (!codec
->codec_tag
) {
493 av_log(s
, AV_LOG_ERROR
, "No bmp codec ID found.");
497 put_bmp_header(dyn_cp
, codec
, codec_bmp_tags
, 0);
499 } else if (codec
->codec_type
== CODEC_TYPE_AUDIO
) {
500 if (!codec
->codec_tag
)
501 codec
->codec_tag
= codec_get_tag(codec_wav_tags
, codec
->codec_id
);
502 if (!codec
->codec_tag
) {
503 av_log(s
, AV_LOG_ERROR
, "No wav codec ID found.");
507 put_wav_header(dyn_cp
, codec
);
510 codecpriv_size
= url_close_dyn_buf(dyn_cp
, &codecpriv
);
512 put_ebml_binary(pb
, MATROSKA_ID_CODECPRIVATE
, codecpriv
, codecpriv_size
);
517 static int mkv_write_tracks(AVFormatContext
*s
)
519 MatroskaMuxContext
*mkv
= s
->priv_data
;
520 ByteIOContext
*pb
= s
->pb
;
524 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_TRACKS
, url_ftell(pb
));
525 if (ret
< 0) return ret
;
527 tracks
= start_ebml_master(pb
, MATROSKA_ID_TRACKS
, 0);
528 for (i
= 0; i
< s
->nb_streams
; i
++) {
529 AVStream
*st
= s
->streams
[i
];
530 AVCodecContext
*codec
= st
->codec
;
531 ebml_master subinfo
, track
;
533 int bit_depth
= av_get_bits_per_sample(codec
->codec_id
);
534 int sample_rate
= codec
->sample_rate
;
535 int output_sample_rate
= 0;
538 bit_depth
= av_get_bits_per_sample_format(codec
->sample_fmt
);
540 if (codec
->codec_id
== CODEC_ID_AAC
)
541 get_aac_sample_rates(s
, codec
, &sample_rate
, &output_sample_rate
);
543 track
= start_ebml_master(pb
, MATROSKA_ID_TRACKENTRY
, 0);
544 put_ebml_uint (pb
, MATROSKA_ID_TRACKNUMBER
, i
+ 1);
545 put_ebml_uint (pb
, MATROSKA_ID_TRACKUID
, i
+ 1);
546 put_ebml_uint (pb
, MATROSKA_ID_TRACKFLAGLACING
, 0); // no lacing (yet)
549 put_ebml_string(pb
, MATROSKA_ID_TRACKLANGUAGE
, st
->language
);
551 put_ebml_string(pb
, MATROSKA_ID_TRACKLANGUAGE
, "und");
553 put_ebml_uint(pb
, MATROSKA_ID_TRACKFLAGDEFAULT
, !!(st
->disposition
& AV_DISPOSITION_DEFAULT
));
555 // look for a codec ID string specific to mkv to use,
556 // if none are found, use AVI codes
557 for (j
= 0; ff_mkv_codec_tags
[j
].id
!= CODEC_ID_NONE
; j
++) {
558 if (ff_mkv_codec_tags
[j
].id
== codec
->codec_id
) {
559 put_ebml_string(pb
, MATROSKA_ID_CODECID
, ff_mkv_codec_tags
[j
].str
);
565 switch (codec
->codec_type
) {
566 case CODEC_TYPE_VIDEO
:
567 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_VIDEO
);
570 // if there is no mkv-specific codec ID, use VFW mode
571 put_ebml_string(pb
, MATROSKA_ID_CODECID
, MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC
);
573 subinfo
= start_ebml_master(pb
, MATROSKA_ID_TRACKVIDEO
, 0);
574 // XXX: interlace flag?
575 put_ebml_uint (pb
, MATROSKA_ID_VIDEOPIXELWIDTH
, codec
->width
);
576 put_ebml_uint (pb
, MATROSKA_ID_VIDEOPIXELHEIGHT
, codec
->height
);
577 if (codec
->sample_aspect_ratio
.num
) {
578 AVRational dar
= av_mul_q(codec
->sample_aspect_ratio
,
579 (AVRational
){codec
->width
, codec
->height
});
580 put_ebml_uint(pb
, MATROSKA_ID_VIDEODISPLAYWIDTH
, dar
.num
);
581 put_ebml_uint(pb
, MATROSKA_ID_VIDEODISPLAYHEIGHT
, dar
.den
);
583 end_ebml_master(pb
, subinfo
);
586 case CODEC_TYPE_AUDIO
:
587 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_AUDIO
);
590 // no mkv-specific ID, use ACM mode
591 put_ebml_string(pb
, MATROSKA_ID_CODECID
, MATROSKA_CODEC_ID_AUDIO_ACM
);
593 subinfo
= start_ebml_master(pb
, MATROSKA_ID_TRACKAUDIO
, 0);
594 put_ebml_uint (pb
, MATROSKA_ID_AUDIOCHANNELS
, codec
->channels
);
595 put_ebml_float (pb
, MATROSKA_ID_AUDIOSAMPLINGFREQ
, sample_rate
);
596 if (output_sample_rate
)
597 put_ebml_float(pb
, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ
, output_sample_rate
);
599 put_ebml_uint(pb
, MATROSKA_ID_AUDIOBITDEPTH
, bit_depth
);
600 end_ebml_master(pb
, subinfo
);
603 case CODEC_TYPE_SUBTITLE
:
604 put_ebml_uint(pb
, MATROSKA_ID_TRACKTYPE
, MATROSKA_TRACK_TYPE_SUBTITLE
);
607 av_log(s
, AV_LOG_ERROR
, "Only audio, video, and subtitles are supported for Matroska.");
610 ret
= mkv_write_codecprivate(s
, pb
, codec
, native_id
);
611 if (ret
< 0) return ret
;
613 end_ebml_master(pb
, track
);
615 // ms precision is the de-facto standard timescale for mkv files
616 av_set_pts_info(st
, 64, 1, 1000);
618 end_ebml_master(pb
, tracks
);
622 static int mkv_write_header(AVFormatContext
*s
)
624 MatroskaMuxContext
*mkv
= s
->priv_data
;
625 ByteIOContext
*pb
= s
->pb
;
626 ebml_master ebml_header
, segment_info
;
629 mkv
->md5_ctx
= av_mallocz(av_md5_size
);
630 av_md5_init(mkv
->md5_ctx
);
632 ebml_header
= start_ebml_master(pb
, EBML_ID_HEADER
, 0);
633 put_ebml_uint (pb
, EBML_ID_EBMLVERSION
, 1);
634 put_ebml_uint (pb
, EBML_ID_EBMLREADVERSION
, 1);
635 put_ebml_uint (pb
, EBML_ID_EBMLMAXIDLENGTH
, 4);
636 put_ebml_uint (pb
, EBML_ID_EBMLMAXSIZELENGTH
, 8);
637 put_ebml_string (pb
, EBML_ID_DOCTYPE
, "matroska");
638 put_ebml_uint (pb
, EBML_ID_DOCTYPEVERSION
, 2);
639 put_ebml_uint (pb
, EBML_ID_DOCTYPEREADVERSION
, 2);
640 end_ebml_master(pb
, ebml_header
);
642 mkv
->segment
= start_ebml_master(pb
, MATROSKA_ID_SEGMENT
, 0);
643 mkv
->segment_offset
= url_ftell(pb
);
645 // we write 2 seek heads - one at the end of the file to point to each
646 // cluster, and one at the beginning to point to all other level one
647 // elements (including the seek head at the end of the file), which
648 // isn't more than 10 elements if we only write one of each other
649 // currently defined level 1 element
650 mkv
->main_seekhead
= mkv_start_seekhead(pb
, mkv
->segment_offset
, 10);
651 mkv
->cluster_seekhead
= mkv_start_seekhead(pb
, mkv
->segment_offset
, 0);
652 if (mkv
->main_seekhead
== NULL
|| mkv
->cluster_seekhead
== NULL
)
653 return AVERROR(ENOMEM
);
655 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_INFO
, url_ftell(pb
));
656 if (ret
< 0) return ret
;
658 segment_info
= start_ebml_master(pb
, MATROSKA_ID_INFO
, 0);
659 put_ebml_uint(pb
, MATROSKA_ID_TIMECODESCALE
, 1000000);
660 if (strlen(s
->title
))
661 put_ebml_string(pb
, MATROSKA_ID_TITLE
, s
->title
);
662 if (!(s
->streams
[0]->codec
->flags
& CODEC_FLAG_BITEXACT
)) {
663 put_ebml_string(pb
, MATROSKA_ID_MUXINGAPP
, LIBAVFORMAT_IDENT
);
664 put_ebml_string(pb
, MATROSKA_ID_WRITINGAPP
, LIBAVFORMAT_IDENT
);
666 // reserve space to write the segment UID later
667 mkv
->segment_uid
= url_ftell(pb
);
668 put_ebml_void(pb
, 19);
671 // reserve space for the duration
673 mkv
->duration_offset
= url_ftell(pb
);
674 put_ebml_void(pb
, 11); // assumes double-precision float to be written
675 end_ebml_master(pb
, segment_info
);
677 ret
= mkv_write_tracks(s
);
678 if (ret
< 0) return ret
;
680 ret
= mkv_add_seekhead_entry(mkv
->cluster_seekhead
, MATROSKA_ID_CLUSTER
, url_ftell(pb
));
681 if (ret
< 0) return ret
;
683 mkv
->cluster_pos
= url_ftell(pb
);
684 mkv
->cluster
= start_ebml_master(pb
, MATROSKA_ID_CLUSTER
, 0);
685 put_ebml_uint(pb
, MATROSKA_ID_CLUSTERTIMECODE
, 0);
686 mkv
->cluster_pts
= 0;
688 mkv
->cues
= mkv_start_cues(mkv
->segment_offset
);
689 if (mkv
->cues
== NULL
)
690 return AVERROR(ENOMEM
);
695 static int mkv_block_size(AVPacket
*pkt
)
697 int size
= 4; // track num + timecode + flags
698 return size
+ pkt
->size
;
701 static int mkv_blockgroup_size(AVPacket
*pkt
)
703 int size
= mkv_block_size(pkt
);
704 size
+= ebml_num_size(size
);
705 size
+= 2; // EBML ID for block and block duration
706 size
+= 8; // max size of block duration
707 size
+= ebml_num_size(size
);
708 size
+= 1; // blockgroup EBML ID
712 static void mkv_write_block(AVFormatContext
*s
, unsigned int blockid
, AVPacket
*pkt
, int flags
)
714 MatroskaMuxContext
*mkv
= s
->priv_data
;
715 ByteIOContext
*pb
= s
->pb
;
717 av_log(s
, AV_LOG_DEBUG
, "Writing block at offset %" PRIu64
", size %d, "
718 "pts %" PRId64
", dts %" PRId64
", duration %d, flags %d\n",
719 url_ftell(pb
), pkt
->size
, pkt
->pts
, pkt
->dts
, pkt
->duration
, flags
);
720 put_ebml_id(pb
, blockid
);
721 put_ebml_num(pb
, mkv_block_size(pkt
), 0);
722 put_byte(pb
, 0x80 | (pkt
->stream_index
+ 1)); // this assumes stream_index is less than 126
723 put_be16(pb
, pkt
->pts
- mkv
->cluster_pts
);
725 put_buffer(pb
, pkt
->data
, pkt
->size
);
728 static int mkv_write_packet(AVFormatContext
*s
, AVPacket
*pkt
)
730 MatroskaMuxContext
*mkv
= s
->priv_data
;
731 ByteIOContext
*pb
= s
->pb
;
732 AVCodecContext
*codec
= s
->streams
[pkt
->stream_index
]->codec
;
733 int keyframe
= !!(pkt
->flags
& PKT_FLAG_KEY
);
736 // start a new cluster every 5 MB or 5 sec
737 if (url_ftell(pb
) > mkv
->cluster_pos
+ 5*1024*1024 || pkt
->pts
> mkv
->cluster_pts
+ 5000) {
738 av_log(s
, AV_LOG_DEBUG
, "Starting new cluster at offset %" PRIu64
739 " bytes, pts %" PRIu64
"\n", url_ftell(pb
), pkt
->pts
);
740 end_ebml_master(pb
, mkv
->cluster
);
742 ret
= mkv_add_seekhead_entry(mkv
->cluster_seekhead
, MATROSKA_ID_CLUSTER
, url_ftell(pb
));
743 if (ret
< 0) return ret
;
745 mkv
->cluster_pos
= url_ftell(pb
);
746 mkv
->cluster
= start_ebml_master(pb
, MATROSKA_ID_CLUSTER
, 0);
747 put_ebml_uint(pb
, MATROSKA_ID_CLUSTERTIMECODE
, pkt
->pts
);
748 mkv
->cluster_pts
= pkt
->pts
;
749 av_md5_update(mkv
->md5_ctx
, pkt
->data
, FFMIN(200, pkt
->size
));
752 if (codec
->codec_id
== CODEC_ID_H264
&&
753 codec
->extradata_size
> 0 && AV_RB32(codec
->extradata
) == 0x00000001) {
754 /* from x264 or from bytestream h264 */
755 /* nal reformating needed */
756 int ret
= ff_avc_parse_nal_units(pkt
->data
, &pkt
->data
, &pkt
->size
);
762 if (codec
->codec_type
!= CODEC_TYPE_SUBTITLE
) {
763 mkv_write_block(s
, MATROSKA_ID_SIMPLEBLOCK
, pkt
, keyframe
<< 7);
765 ebml_master blockgroup
= start_ebml_master(pb
, MATROSKA_ID_BLOCKGROUP
, mkv_blockgroup_size(pkt
));
766 mkv_write_block(s
, MATROSKA_ID_BLOCK
, pkt
, 0);
767 put_ebml_uint(pb
, MATROSKA_ID_DURATION
, pkt
->duration
);
768 end_ebml_master(pb
, blockgroup
);
771 if (codec
->codec_type
== CODEC_TYPE_VIDEO
&& keyframe
) {
772 ret
= mkv_add_cuepoint(mkv
->cues
, pkt
, mkv
->cluster_pos
);
773 if (ret
< 0) return ret
;
776 mkv
->duration
= FFMAX(mkv
->duration
, pkt
->pts
+ pkt
->duration
);
780 static int mkv_write_trailer(AVFormatContext
*s
)
782 MatroskaMuxContext
*mkv
= s
->priv_data
;
783 ByteIOContext
*pb
= s
->pb
;
784 offset_t currentpos
, second_seekhead
, cuespos
;
787 end_ebml_master(pb
, mkv
->cluster
);
789 if (!url_is_streamed(pb
)) {
790 cuespos
= mkv_write_cues(pb
, mkv
->cues
, s
->nb_streams
);
791 second_seekhead
= mkv_write_seekhead(pb
, mkv
->cluster_seekhead
);
793 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_CUES
, cuespos
);
794 if (ret
< 0) return ret
;
795 ret
= mkv_add_seekhead_entry(mkv
->main_seekhead
, MATROSKA_ID_SEEKHEAD
, second_seekhead
);
796 if (ret
< 0) return ret
;
797 mkv_write_seekhead(pb
, mkv
->main_seekhead
);
799 // update the duration
800 av_log(s
, AV_LOG_DEBUG
, "end duration = %" PRIu64
"\n", mkv
->duration
);
801 currentpos
= url_ftell(pb
);
802 url_fseek(pb
, mkv
->duration_offset
, SEEK_SET
);
803 put_ebml_float(pb
, MATROSKA_ID_DURATION
, mkv
->duration
);
805 // write the md5sum of some frames as the segment UID
806 if (!(s
->streams
[0]->codec
->flags
& CODEC_FLAG_BITEXACT
)) {
807 uint8_t segment_uid
[16];
808 av_md5_final(mkv
->md5_ctx
, segment_uid
);
809 url_fseek(pb
, mkv
->segment_uid
, SEEK_SET
);
810 put_ebml_binary(pb
, MATROSKA_ID_SEGMENTUID
, segment_uid
, 16);
812 url_fseek(pb
, currentpos
, SEEK_SET
);
815 end_ebml_master(pb
, mkv
->segment
);
816 av_free(mkv
->md5_ctx
);
820 AVOutputFormat matroska_muxer
= {
822 "Matroska File Format",
825 sizeof(MatroskaMuxContext
),
831 .codec_tag
= (const AVCodecTag
*[]){codec_bmp_tags
, codec_wav_tags
, 0},
832 .subtitle_codec
= CODEC_ID_TEXT
,
835 AVOutputFormat matroska_audio_muxer
= {
837 "Matroska File Format",
840 sizeof(MatroskaMuxContext
),
846 .codec_tag
= (const AVCodecTag
*[]){codec_wav_tags
, 0},