]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - libavformat/matroskaenc.c
Correct handling of smaller unknown sizes
[frescor/ffmpeg.git] / libavformat / matroskaenc.c
1 /*
2  * Matroska file muxer
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 "md5.h"
24 #include "riff.h"
25 #include "xiph.h"
26 #include "matroska.h"
27
28 typedef struct mkv_seekhead_entry {
29     unsigned int    elementid;
30     uint64_t        segmentpos;
31 } mkv_seekhead_entry;
32
33 typedef struct mkv_seekhead {
34     offset_t                filepos;
35     offset_t                segment_offset;     ///< the file offset to the beginning of the segment
36     int                     reserved_size;      ///< -1 if appending to file
37     int                     max_entries;
38     mkv_seekhead_entry      *entries;
39     int                     num_entries;
40 } mkv_seekhead;
41
42 typedef struct {
43     uint64_t        pts;
44     int             tracknum;
45     offset_t        cluster_pos;        ///< file offset of the cluster containing the block
46 } mkv_cuepoint;
47
48 typedef struct {
49     offset_t        segment_offset;
50     mkv_cuepoint    *entries;
51     int             num_entries;
52 } mkv_cues;
53
54 typedef struct MatroskaMuxContext {
55     offset_t        segment;
56     offset_t        segment_offset;
57     offset_t        segment_uid;
58     offset_t        cluster;
59     offset_t        cluster_pos;        ///< file offset of the current cluster
60     uint64_t        cluster_pts;
61     offset_t        duration_offset;
62     uint64_t        duration;
63     mkv_seekhead    *main_seekhead;
64     mkv_seekhead    *cluster_seekhead;
65     mkv_cues        *cues;
66
67     struct AVMD5    *md5_ctx;
68 } MatroskaMuxContext;
69
70 static void put_ebml_id(ByteIOContext *pb, unsigned int id)
71 {
72     if (id >= 0x3fffff)
73         put_byte(pb, id >> 24);
74     if (id >= 0x7fff)
75         put_byte(pb, id >> 16);
76     if (id >= 0xff)
77         put_byte(pb, id >> 8);
78     put_byte(pb, id);
79 }
80
81 static int ebml_id_size(unsigned int id)
82 {
83     return (av_log2(id+1)-1)/7+1;
84 }
85
86 /**
87  * Write an EBML size meaning "unknown size"
88  *
89  * @param bytes The number of bytes the size should occupy. Maximum of 8.
90  */
91 static void put_ebml_size_unknown(ByteIOContext *pb, int bytes)
92 {
93     uint64_t value = 0;
94     int i;
95
96     bytes = FFMIN(bytes, 8);
97     for (i = 0; i < bytes*7 + 1; i++)
98         value |= 1ULL << i;
99     for (i = bytes-1; i >= 0; i--)
100         put_byte(pb, value >> i*8);
101 }
102
103 // XXX: test this thoroughly and get rid of minbytes hack (currently needed to
104 // use up all of the space reserved in start_ebml_master)
105 static void put_ebml_size(ByteIOContext *pb, uint64_t size, int minbytes)
106 {
107     int bytes = minbytes;
108
109     // sizes larger than this are currently undefined in EBML
110     // so write "unknown" size
111     if (size >= (1ULL<<56)-1) {
112         put_ebml_size_unknown(pb, 1);
113         return;
114     }
115
116     while ((size+1) >> (bytes*7 + 7)) bytes++;
117
118     put_byte(pb, (0x80 >> bytes) | (size >> bytes*8));
119     for (bytes -= 1; bytes >= 0; bytes--)
120         put_byte(pb, size >> bytes*8);
121 }
122
123 static void put_ebml_uint(ByteIOContext *pb, unsigned int elementid, uint64_t val)
124 {
125     int bytes = 1;
126     while (val >> bytes*8) bytes++;
127
128     put_ebml_id(pb, elementid);
129     put_ebml_size(pb, bytes, 0);
130     for (bytes -= 1; bytes >= 0; bytes--)
131         put_byte(pb, val >> bytes*8);
132 }
133
134 static void put_ebml_float(ByteIOContext *pb, unsigned int elementid, double val)
135 {
136     put_ebml_id(pb, elementid);
137     put_ebml_size(pb, 8, 0);
138     put_be64(pb, av_dbl2int(val));
139 }
140
141 static void put_ebml_binary(ByteIOContext *pb, unsigned int elementid,
142                             const uint8_t *buf, int size)
143 {
144     put_ebml_id(pb, elementid);
145     put_ebml_size(pb, size, 0);
146     put_buffer(pb, buf, size);
147 }
148
149 static void put_ebml_string(ByteIOContext *pb, unsigned int elementid, const char *str)
150 {
151     put_ebml_binary(pb, elementid, str, strlen(str));
152 }
153
154 /**
155  * Writes a void element of a given size. Useful for reserving space in the file to be
156  * written to later.
157  *
158  * @param size The amount of space to reserve, which must be at least 2.
159  */
160 static void put_ebml_void(ByteIOContext *pb, uint64_t size)
161 {
162     offset_t currentpos = url_ftell(pb);
163
164     if (size < 2)
165         return;
166
167     put_ebml_id(pb, EBML_ID_VOID);
168     // we need to subtract the length needed to store the size from the size we need to reserve
169     // so 2 cases, we use 8 bytes to store the size if possible, 1 byte otherwise
170     if (size < 10)
171         put_ebml_size(pb, size-1, 0);
172     else
173         put_ebml_size(pb, size-9, 7);
174     url_fseek(pb, currentpos + size, SEEK_SET);
175 }
176
177 static offset_t start_ebml_master(ByteIOContext *pb, unsigned int elementid)
178 {
179     put_ebml_id(pb, elementid);
180     // XXX: this always reserves the maximum needed space to store any size value
181     // we should be smarter (additional parameter for expected size?)
182     put_ebml_size_unknown(pb, 8);
183     return url_ftell(pb);
184 }
185
186 static void end_ebml_master(ByteIOContext *pb, offset_t start)
187 {
188     offset_t pos = url_ftell(pb);
189
190     url_fseek(pb, start - 8, SEEK_SET);
191     put_ebml_size(pb, pos - start, 7);
192     url_fseek(pb, pos, SEEK_SET);
193 }
194
195 static void put_xiph_size(ByteIOContext *pb, int size)
196 {
197     int i;
198     for (i = 0; i < size / 255; i++)
199         put_byte(pb, 255);
200     put_byte(pb, size % 255);
201 }
202
203 /**
204  * Initialize a mkv_seekhead element to be ready to index level 1 Matroska elements.
205  * If a maximum number of elements is specified, enough space will be reserved at
206  * the current file location to write a seek head of that size.
207  *
208  * @param segment_offset the absolute offset into the file that the segment begins
209  * @param numelements the maximum number of elements that will be indexed by this
210  *                    seek head, 0 if unlimited.
211  */
212 static mkv_seekhead * mkv_start_seekhead(ByteIOContext *pb, offset_t segment_offset, int numelements)
213 {
214     mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
215     if (new_seekhead == NULL)
216         return NULL;
217
218     new_seekhead->segment_offset = segment_offset;
219
220     if (numelements > 0) {
221         new_seekhead->filepos = url_ftell(pb);
222         // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID and size,
223         // and 3 bytes to guarantee that an EBML void element will fit afterwards
224         // XXX: 28 bytes right now because begin_ebml_master() reserves more than necessary
225         new_seekhead->reserved_size = numelements * 28 + 13;
226         new_seekhead->max_entries = numelements;
227         put_ebml_void(pb, new_seekhead->reserved_size);
228     }
229     return new_seekhead;
230 }
231
232 static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
233 {
234     mkv_seekhead_entry *entries = seekhead->entries;
235     int new_entry = seekhead->num_entries;
236
237     // don't store more elements than we reserved space for
238     if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
239         return -1;
240
241     entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry));
242     if (entries == NULL)
243         return -1;
244
245     entries[new_entry].elementid = elementid;
246     entries[new_entry].segmentpos = filepos - seekhead->segment_offset;
247
248     seekhead->entries = entries;
249     seekhead->num_entries++;
250
251     return 0;
252 }
253
254 /**
255  * Write the seek head to the file and free it. If a maximum number of elements was
256  * specified to mkv_start_seekhead(), the seek head will be written at the location
257  * reserved for it. Otherwise, it is written at the current location in the file.
258  *
259  * @return the file offset where the seekhead was written
260  */
261 static offset_t mkv_write_seekhead(ByteIOContext *pb, mkv_seekhead *seekhead)
262 {
263     offset_t metaseek, seekentry, currentpos;
264     int i;
265
266     currentpos = url_ftell(pb);
267
268     if (seekhead->reserved_size > 0)
269         url_fseek(pb, seekhead->filepos, SEEK_SET);
270
271     metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD);
272     for (i = 0; i < seekhead->num_entries; i++) {
273         mkv_seekhead_entry *entry = &seekhead->entries[i];
274
275         seekentry = start_ebml_master(pb, MATROSKA_ID_SEEKENTRY);
276
277         put_ebml_id(pb, MATROSKA_ID_SEEKID);
278         put_ebml_size(pb, ebml_id_size(entry->elementid), 0);
279         put_ebml_id(pb, entry->elementid);
280
281         put_ebml_uint(pb, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
282         end_ebml_master(pb, seekentry);
283     }
284     end_ebml_master(pb, metaseek);
285
286     if (seekhead->reserved_size > 0) {
287         uint64_t remaining = seekhead->filepos + seekhead->reserved_size - url_ftell(pb);
288         put_ebml_void(pb, remaining);
289         url_fseek(pb, currentpos, SEEK_SET);
290
291         currentpos = seekhead->filepos;
292     }
293     av_free(seekhead->entries);
294     av_free(seekhead);
295
296     return currentpos;
297 }
298
299 static mkv_cues * mkv_start_cues(offset_t segment_offset)
300 {
301     mkv_cues *cues = av_mallocz(sizeof(mkv_cues));
302     if (cues == NULL)
303         return NULL;
304
305     cues->segment_offset = segment_offset;
306     return cues;
307 }
308
309 static int mkv_add_cuepoint(mkv_cues *cues, AVPacket *pkt, offset_t cluster_pos)
310 {
311     mkv_cuepoint *entries = cues->entries;
312     int new_entry = cues->num_entries;
313
314     entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint));
315     if (entries == NULL)
316         return -1;
317
318     entries[new_entry].pts = pkt->pts;
319     entries[new_entry].tracknum = pkt->stream_index + 1;
320     entries[new_entry].cluster_pos = cluster_pos - cues->segment_offset;
321
322     cues->entries = entries;
323     cues->num_entries++;
324     return 0;
325 }
326
327 static offset_t mkv_write_cues(ByteIOContext *pb, mkv_cues *cues)
328 {
329     offset_t currentpos, cues_element;
330     int i, j;
331
332     currentpos = url_ftell(pb);
333     cues_element = start_ebml_master(pb, MATROSKA_ID_CUES);
334
335     for (i = 0; i < cues->num_entries; i++) {
336         offset_t cuepoint, track_positions;
337         mkv_cuepoint *entry = &cues->entries[i];
338         uint64_t pts = entry->pts;
339
340         cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY);
341         put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts);
342
343         // put all the entries from different tracks that have the exact same
344         // timestamp into the same CuePoint
345         for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
346             track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION);
347             put_ebml_uint(pb, MATROSKA_ID_CUETRACK          , entry[j].tracknum   );
348             put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos);
349             end_ebml_master(pb, track_positions);
350         }
351         i += j - 1;
352         end_ebml_master(pb, cuepoint);
353     }
354     end_ebml_master(pb, cues_element);
355
356     av_free(cues->entries);
357     av_free(cues);
358     return currentpos;
359 }
360
361 static int put_xiph_codecpriv(ByteIOContext *pb, AVCodecContext *codec)
362 {
363     offset_t codecprivate;
364     uint8_t *header_start[3];
365     int header_len[3];
366     int first_header_size;
367     int j;
368
369     if (codec->codec_id == CODEC_ID_VORBIS)
370         first_header_size = 30;
371     else
372         first_header_size = 42;
373
374     if (ff_split_xiph_headers(codec->extradata, codec->extradata_size,
375                               first_header_size, header_start, header_len) < 0) {
376         av_log(codec, AV_LOG_ERROR, "Extradata corrupt.\n");
377         return -1;
378     }
379
380     codecprivate = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE);
381     put_byte(pb, 2);                    // number packets - 1
382     for (j = 0; j < 2; j++) {
383         put_xiph_size(pb, header_len[j]);
384     }
385     for (j = 0; j < 3; j++)
386         put_buffer(pb, header_start[j], header_len[j]);
387     end_ebml_master(pb, codecprivate);
388
389     return 0;
390 }
391
392 #define FLAC_STREAMINFO_SIZE 34
393
394 static int put_flac_codecpriv(ByteIOContext *pb, AVCodecContext *codec)
395 {
396     offset_t codecpriv = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE);
397
398     // if the extradata_size is greater than FLAC_STREAMINFO_SIZE,
399     // assume that it's in Matroska's format already
400     if (codec->extradata_size < FLAC_STREAMINFO_SIZE) {
401         av_log(codec, AV_LOG_ERROR, "Invalid FLAC extradata\n");
402         return -1;
403     } else if (codec->extradata_size == FLAC_STREAMINFO_SIZE) {
404         // only the streaminfo packet
405         put_byte(pb, 0);
406         put_xiph_size(pb, codec->extradata_size);
407         av_log(codec, AV_LOG_ERROR, "Only one packet\n");
408     }
409     put_buffer(pb, codec->extradata, codec->extradata_size);
410     end_ebml_master(pb, codecpriv);
411     return 0;
412 }
413
414 static void get_aac_sample_rates(AVCodecContext *codec, int *sample_rate, int *output_sample_rate)
415 {
416     static const int aac_sample_rates[] = {
417         96000, 88200, 64000, 48000, 44100, 32000,
418         24000, 22050, 16000, 12000, 11025,  8000,
419     };
420     int sri;
421
422     if (codec->extradata_size < 2) {
423         av_log(codec, AV_LOG_WARNING, "no aac extradata, unable to determine sample rate\n");
424         return;
425     }
426
427     sri = ((codec->extradata[0] << 1) & 0xE) | (codec->extradata[1] >> 7);
428     if (sri > 12) {
429         av_log(codec, AV_LOG_WARNING, "aac samplerate index out of bounds\n");
430         return;
431     }
432     *sample_rate = aac_sample_rates[sri];
433
434     // if sbr, get output sample rate as well
435     if (codec->extradata_size == 5) {
436         sri = (codec->extradata[4] >> 3) & 0xF;
437         if (sri > 12) {
438             av_log(codec, AV_LOG_WARNING, "aac output samplerate index out of bounds\n");
439             return;
440         }
441         *output_sample_rate = aac_sample_rates[sri];
442     }
443 }
444
445 static int mkv_write_tracks(AVFormatContext *s)
446 {
447     MatroskaMuxContext *mkv = s->priv_data;
448     ByteIOContext *pb = &s->pb;
449     offset_t tracks;
450     int i, j;
451
452     if (mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, url_ftell(pb)) < 0)
453         return -1;
454
455     tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS);
456     for (i = 0; i < s->nb_streams; i++) {
457         AVStream *st = s->streams[i];
458         AVCodecContext *codec = st->codec;
459         offset_t subinfo, track;
460         int native_id = 0;
461         int bit_depth = av_get_bits_per_sample(codec->codec_id);
462         int sample_rate = codec->sample_rate;
463         int output_sample_rate = 0;
464
465         if (codec->codec_id == CODEC_ID_AAC)
466             get_aac_sample_rates(codec, &sample_rate, &output_sample_rate);
467
468         track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY);
469         put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER     , i + 1);
470         put_ebml_uint (pb, MATROSKA_ID_TRACKUID        , i + 1);
471         put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0);    // no lacing (yet)
472
473         if (st->language[0])
474             put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, st->language);
475         else
476             put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, "und");
477
478         // look for a codec id string specific to mkv to use, if none are found, use AVI codes
479         for (j = 0; ff_mkv_codec_tags[j].id != CODEC_ID_NONE; j++) {
480             if (ff_mkv_codec_tags[j].id == codec->codec_id) {
481                 put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str);
482                 native_id = 1;
483                 break;
484             }
485         }
486
487         if (native_id) {
488             if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA) {
489                 if (put_xiph_codecpriv(pb, codec) < 0)
490                     return -1;
491             } else if (codec->codec_id == CODEC_ID_FLAC) {
492                 if (put_flac_codecpriv(pb, codec) < 0)
493                     return -1;
494             } else if (codec->extradata_size) {
495                 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codec->extradata, codec->extradata_size);
496             }
497         }
498
499         switch (codec->codec_type) {
500             case CODEC_TYPE_VIDEO:
501                 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
502
503                 if (!native_id) {
504                     offset_t bmp_header;
505                     // if there is no mkv-specific codec id, use VFW mode
506                     if (!codec->codec_tag)
507                         codec->codec_tag = codec_get_tag(codec_bmp_tags, codec->codec_id);
508
509                     put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC);
510                     bmp_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE);
511                     put_bmp_header(pb, codec, codec_bmp_tags, 0);
512                     end_ebml_master(pb, bmp_header);
513                 }
514                 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO);
515                 // XXX: interlace flag?
516                 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
517                 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
518                 if (codec->sample_aspect_ratio.num) {
519                     put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , codec->sample_aspect_ratio.num);
520                     put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->sample_aspect_ratio.den);
521                 }
522                 end_ebml_master(pb, subinfo);
523                 break;
524
525             case CODEC_TYPE_AUDIO:
526                 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
527
528                 if (!native_id) {
529                     offset_t wav_header;
530                     // no mkv-specific ID, use ACM mode
531                     codec->codec_tag = codec_get_tag(codec_wav_tags, codec->codec_id);
532                     if (!codec->codec_tag) {
533                         av_log(s, AV_LOG_ERROR, "no codec id found for stream %d", i);
534                         return -1;
535                     }
536
537                     put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_AUDIO_ACM);
538                     wav_header = start_ebml_master(pb, MATROSKA_ID_CODECPRIVATE);
539                     put_wav_header(pb, codec);
540                     end_ebml_master(pb, wav_header);
541                 }
542                 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO);
543                 put_ebml_uint  (pb, MATROSKA_ID_AUDIOCHANNELS    , codec->channels);
544                 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
545                 if (output_sample_rate)
546                     put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
547                 if (bit_depth)
548                     put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
549                 end_ebml_master(pb, subinfo);
550                 break;
551
552                 case CODEC_TYPE_SUBTITLE:
553                     put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_SUBTITLE);
554                     break;
555             default:
556                 av_log(s, AV_LOG_ERROR, "Only audio and video are supported for Matroska.");
557                 break;
558         }
559         end_ebml_master(pb, track);
560
561         // ms precision is the de-facto standard timescale for mkv files
562         av_set_pts_info(st, 64, 1, 1000);
563     }
564     end_ebml_master(pb, tracks);
565     return 0;
566 }
567
568 static int mkv_write_header(AVFormatContext *s)
569 {
570     MatroskaMuxContext *mkv = s->priv_data;
571     ByteIOContext *pb = &s->pb;
572     offset_t ebml_header, segment_info;
573
574     mkv->md5_ctx = av_mallocz(av_md5_size);
575     av_md5_init(mkv->md5_ctx);
576
577     ebml_header = start_ebml_master(pb, EBML_ID_HEADER);
578     put_ebml_uint   (pb, EBML_ID_EBMLVERSION        ,           1);
579     put_ebml_uint   (pb, EBML_ID_EBMLREADVERSION    ,           1);
580     put_ebml_uint   (pb, EBML_ID_EBMLMAXIDLENGTH    ,           4);
581     put_ebml_uint   (pb, EBML_ID_EBMLMAXSIZELENGTH  ,           8);
582     put_ebml_string (pb, EBML_ID_DOCTYPE            ,  "matroska");
583     put_ebml_uint   (pb, EBML_ID_DOCTYPEVERSION     ,           2);
584     put_ebml_uint   (pb, EBML_ID_DOCTYPEREADVERSION ,           2);
585     end_ebml_master(pb, ebml_header);
586
587     mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT);
588     mkv->segment_offset = url_ftell(pb);
589
590     // we write 2 seek heads - one at the end of the file to point to each cluster, and
591     // one at the beginning to point to all other level one elements (including the seek
592     // head at the end of the file), which isn't more than 10 elements if we only write one
593     // of each other currently defined level 1 element
594     mkv->main_seekhead    = mkv_start_seekhead(pb, mkv->segment_offset, 10);
595     mkv->cluster_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 0);
596
597     if (mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, url_ftell(pb)) < 0)
598         return -1;
599
600     segment_info = start_ebml_master(pb, MATROSKA_ID_INFO);
601     put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
602     if (strlen(s->title))
603         put_ebml_string(pb, MATROSKA_ID_TITLE, s->title);
604     if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
605         put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT);
606         put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
607
608         // reserve space to write the segment UID later
609         mkv->segment_uid = url_ftell(pb);
610         put_ebml_void(pb, 19);
611     }
612
613     // reserve space for the duration
614     mkv->duration = 0;
615     mkv->duration_offset = url_ftell(pb);
616     put_ebml_void(pb, 11);                  // assumes double-precision float to be written
617     end_ebml_master(pb, segment_info);
618
619     if (mkv_write_tracks(s) < 0)
620         return -1;
621
622     if (mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)) < 0)
623         return -1;
624
625     mkv->cluster_pos = url_ftell(pb);
626     mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER);
627     put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0);
628     mkv->cluster_pts = 0;
629
630     mkv->cues = mkv_start_cues(mkv->segment_offset);
631     if (mkv->cues == NULL)
632         return -1;
633
634     return 0;
635 }
636
637 static void mkv_write_block(AVFormatContext *s, unsigned int blockid, AVPacket *pkt, int flags)
638 {
639     MatroskaMuxContext *mkv = s->priv_data;
640     ByteIOContext *pb = &s->pb;
641
642     av_log(s, AV_LOG_DEBUG, "Writing block at offset %llu, size %d, pts %lld, dts %lld, duration %d, flags %d\n",
643            url_ftell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags);
644     put_ebml_id(pb, blockid);
645     put_ebml_size(pb, pkt->size + 4, 0);
646     put_byte(pb, 0x80 | (pkt->stream_index + 1));     // this assumes stream_index is less than 126
647     put_be16(pb, pkt->pts - mkv->cluster_pts);
648     put_byte(pb, flags);
649     put_buffer(pb, pkt->data, pkt->size);
650 }
651
652 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
653 {
654     MatroskaMuxContext *mkv = s->priv_data;
655     ByteIOContext *pb = &s->pb;
656     AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
657     int keyframe = !!(pkt->flags & PKT_FLAG_KEY);
658
659     // start a new cluster every 5 MB or 5 sec
660     if (url_ftell(pb) > mkv->cluster + 5*1024*1024 || pkt->pts > mkv->cluster_pts + 5000) {
661         av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %llu bytes, pts %llu\n", url_ftell(pb), pkt->pts);
662         end_ebml_master(pb, mkv->cluster);
663
664         if (mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb)) < 0)
665             return -1;
666
667         mkv->cluster_pos = url_ftell(pb);
668         mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER);
669         put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts);
670         mkv->cluster_pts = pkt->pts;
671         av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size));
672     }
673
674     if (codec->codec_type != CODEC_TYPE_SUBTITLE) {
675         mkv_write_block(s, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);
676     } else {
677         offset_t blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP);
678         mkv_write_block(s, MATROSKA_ID_BLOCK, pkt, 0);
679         put_ebml_uint(pb, MATROSKA_ID_DURATION, pkt->duration);
680         end_ebml_master(pb, blockgroup);
681     }
682
683     if (codec->codec_type == CODEC_TYPE_VIDEO && keyframe) {
684         if (mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos) < 0)
685             return -1;
686     }
687
688     mkv->duration = pkt->pts + pkt->duration;
689     return 0;
690 }
691
692 static int mkv_write_trailer(AVFormatContext *s)
693 {
694     MatroskaMuxContext *mkv = s->priv_data;
695     ByteIOContext *pb = &s->pb;
696     offset_t currentpos, second_seekhead, cuespos;
697
698     end_ebml_master(pb, mkv->cluster);
699
700     cuespos = mkv_write_cues(pb, mkv->cues);
701     second_seekhead = mkv_write_seekhead(pb, mkv->cluster_seekhead);
702
703     mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES    , cuespos);
704     mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_SEEKHEAD, second_seekhead);
705     mkv_write_seekhead(pb, mkv->main_seekhead);
706
707     // update the duration
708     av_log(s, AV_LOG_DEBUG, "end duration = %llu\n", mkv->duration);
709     currentpos = url_ftell(pb);
710     url_fseek(pb, mkv->duration_offset, SEEK_SET);
711     put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration);
712
713     // write the md5sum of some frames as the segment UID
714     if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
715         uint8_t segment_uid[16];
716         av_md5_final(mkv->md5_ctx, segment_uid);
717         url_fseek(pb, mkv->segment_uid, SEEK_SET);
718         put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
719     }
720     url_fseek(pb, currentpos, SEEK_SET);
721
722     end_ebml_master(pb, mkv->segment);
723     av_free(mkv->md5_ctx);
724     return 0;
725 }
726
727 AVOutputFormat matroska_muxer = {
728     "matroska",
729     "Matroska File Format",
730     "video/x-matroska",
731     "mkv",
732     sizeof(MatroskaMuxContext),
733     CODEC_ID_MP2,
734     CODEC_ID_MPEG4,
735     mkv_write_header,
736     mkv_write_packet,
737     mkv_write_trailer,
738     .codec_tag = (const AVCodecTag*[]){codec_bmp_tags, codec_wav_tags, 0},
739 };
740
741 AVOutputFormat matroska_audio_muxer = {
742     "matroska",
743     "Matroska File Format",
744     "audio/x-matroska",
745     "mka",
746     sizeof(MatroskaMuxContext),
747     CODEC_ID_MP2,
748     CODEC_ID_NONE,
749     mkv_write_header,
750     mkv_write_packet,
751     mkv_write_trailer,
752     .codec_tag = (const AVCodecTag*[]){codec_wav_tags, 0},
753 };