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