00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "md5.h"
00024 #include "riff.h"
00025 #include "xiph.h"
00026 #include "matroska.h"
00027
00028 typedef struct ebml_master {
00029 offset_t pos;
00030 int sizebytes;
00031 } ebml_master;
00032
00033 typedef struct mkv_seekhead_entry {
00034 unsigned int elementid;
00035 uint64_t segmentpos;
00036 } mkv_seekhead_entry;
00037
00038 typedef struct mkv_seekhead {
00039 offset_t filepos;
00040 offset_t segment_offset;
00041 int reserved_size;
00042 int max_entries;
00043 mkv_seekhead_entry *entries;
00044 int num_entries;
00045 } mkv_seekhead;
00046
00047 typedef struct {
00048 uint64_t pts;
00049 int tracknum;
00050 offset_t cluster_pos;
00051 } mkv_cuepoint;
00052
00053 typedef struct {
00054 offset_t segment_offset;
00055 mkv_cuepoint *entries;
00056 int num_entries;
00057 } mkv_cues;
00058
00059 typedef struct MatroskaMuxContext {
00060 ebml_master segment;
00061 offset_t segment_offset;
00062 offset_t segment_uid;
00063 ebml_master cluster;
00064 offset_t cluster_pos;
00065 uint64_t cluster_pts;
00066 offset_t duration_offset;
00067 uint64_t duration;
00068 mkv_seekhead *main_seekhead;
00069 mkv_seekhead *cluster_seekhead;
00070 mkv_cues *cues;
00071
00072 struct AVMD5 *md5_ctx;
00073 } MatroskaMuxContext;
00074
00075
00078 #define MAX_SEEKENTRY_SIZE 21
00079
00082 #define MAX_CUETRACKPOS_SIZE 22
00083
00085 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
00086
00087
00088 static int ebml_id_size(unsigned int id)
00089 {
00090 return (av_log2(id+1)-1)/7+1;
00091 }
00092
00093 static void put_ebml_id(ByteIOContext *pb, unsigned int id)
00094 {
00095 int i = ebml_id_size(id);
00096 while (i--)
00097 put_byte(pb, id >> (i*8));
00098 }
00099
00105 static void put_ebml_size_unknown(ByteIOContext *pb, int bytes)
00106 {
00107 assert(bytes <= 8);
00108 put_byte(pb, 0x1ff >> bytes);
00109 while (--bytes)
00110 put_byte(pb, 0xff);
00111 }
00112
00116 static int ebml_num_size(uint64_t num)
00117 {
00118 int bytes = 1;
00119 while ((num+1) >> bytes*7) bytes++;
00120 return bytes;
00121 }
00122
00129 static void put_ebml_num(ByteIOContext *pb, uint64_t num, int bytes)
00130 {
00131 int i, needed_bytes = ebml_num_size(num);
00132
00133
00134 assert(num < (1ULL<<56)-1);
00135
00136 if (bytes == 0)
00137
00138 bytes = needed_bytes;
00139
00140
00141 assert(bytes >= needed_bytes);
00142
00143 num |= 1ULL << bytes*7;
00144 for (i = bytes - 1; i >= 0; i--)
00145 put_byte(pb, num >> i*8);
00146 }
00147
00148 static void put_ebml_uint(ByteIOContext *pb, unsigned int elementid, uint64_t val)
00149 {
00150 int i, bytes = 1;
00151 while (val >> bytes*8) bytes++;
00152
00153 put_ebml_id(pb, elementid);
00154 put_ebml_num(pb, bytes, 0);
00155 for (i = bytes - 1; i >= 0; i--)
00156 put_byte(pb, val >> i*8);
00157 }
00158
00159 static void put_ebml_float(ByteIOContext *pb, unsigned int elementid, double val)
00160 {
00161 put_ebml_id(pb, elementid);
00162 put_ebml_num(pb, 8, 0);
00163 put_be64(pb, av_dbl2int(val));
00164 }
00165
00166 static void put_ebml_binary(ByteIOContext *pb, unsigned int elementid,
00167 const uint8_t *buf, int size)
00168 {
00169 put_ebml_id(pb, elementid);
00170 put_ebml_num(pb, size, 0);
00171 put_buffer(pb, buf, size);
00172 }
00173
00174 static void put_ebml_string(ByteIOContext *pb, unsigned int elementid, const char *str)
00175 {
00176 put_ebml_binary(pb, elementid, str, strlen(str));
00177 }
00178
00185 static void put_ebml_void(ByteIOContext *pb, uint64_t size)
00186 {
00187 offset_t currentpos = url_ftell(pb);
00188
00189 assert(size >= 2);
00190
00191 put_ebml_id(pb, EBML_ID_VOID);
00192
00193
00194
00195 if (size < 10)
00196 put_ebml_num(pb, size-1, 0);
00197 else
00198 put_ebml_num(pb, size-9, 8);
00199 url_fseek(pb, currentpos + size, SEEK_SET);
00200 }
00201
00202 static ebml_master start_ebml_master(ByteIOContext *pb, unsigned int elementid, uint64_t expectedsize)
00203 {
00204 int bytes = expectedsize ? ebml_num_size(expectedsize) : 8;
00205 put_ebml_id(pb, elementid);
00206 put_ebml_size_unknown(pb, bytes);
00207 return (ebml_master){ url_ftell(pb), bytes };
00208 }
00209
00210 static void end_ebml_master(ByteIOContext *pb, ebml_master master)
00211 {
00212 offset_t pos = url_ftell(pb);
00213
00214
00215 if (url_is_streamed(pb))
00216 return;
00217
00218 url_fseek(pb, master.pos - master.sizebytes, SEEK_SET);
00219 put_ebml_num(pb, pos - master.pos, master.sizebytes);
00220 url_fseek(pb, pos, SEEK_SET);
00221 }
00222
00223 static void put_xiph_size(ByteIOContext *pb, int size)
00224 {
00225 int i;
00226 for (i = 0; i < size / 255; i++)
00227 put_byte(pb, 255);
00228 put_byte(pb, size % 255);
00229 }
00230
00242 static mkv_seekhead * mkv_start_seekhead(ByteIOContext *pb, offset_t segment_offset, int numelements)
00243 {
00244 mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
00245 if (new_seekhead == NULL)
00246 return NULL;
00247
00248 new_seekhead->segment_offset = segment_offset;
00249
00250 if (numelements > 0) {
00251 new_seekhead->filepos = url_ftell(pb);
00252
00253
00254
00255 new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 13;
00256 new_seekhead->max_entries = numelements;
00257 put_ebml_void(pb, new_seekhead->reserved_size);
00258 }
00259 return new_seekhead;
00260 }
00261
00262 static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
00263 {
00264 mkv_seekhead_entry *entries = seekhead->entries;
00265
00266
00267 if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
00268 return -1;
00269
00270 entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry));
00271 if (entries == NULL)
00272 return AVERROR(ENOMEM);
00273
00274 entries[seekhead->num_entries ].elementid = elementid;
00275 entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
00276
00277 seekhead->entries = entries;
00278 return 0;
00279 }
00280
00289 static offset_t mkv_write_seekhead(ByteIOContext *pb, mkv_seekhead *seekhead)
00290 {
00291 ebml_master metaseek, seekentry;
00292 offset_t currentpos;
00293 int i;
00294
00295 currentpos = url_ftell(pb);
00296
00297 if (seekhead->reserved_size > 0)
00298 url_fseek(pb, seekhead->filepos, SEEK_SET);
00299
00300 metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size);
00301 for (i = 0; i < seekhead->num_entries; i++) {
00302 mkv_seekhead_entry *entry = &seekhead->entries[i];
00303
00304 seekentry = start_ebml_master(pb, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE);
00305
00306 put_ebml_id(pb, MATROSKA_ID_SEEKID);
00307 put_ebml_num(pb, ebml_id_size(entry->elementid), 0);
00308 put_ebml_id(pb, entry->elementid);
00309
00310 put_ebml_uint(pb, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
00311 end_ebml_master(pb, seekentry);
00312 }
00313 end_ebml_master(pb, metaseek);
00314
00315 if (seekhead->reserved_size > 0) {
00316 uint64_t remaining = seekhead->filepos + seekhead->reserved_size - url_ftell(pb);
00317 put_ebml_void(pb, remaining);
00318 url_fseek(pb, currentpos, SEEK_SET);
00319
00320 currentpos = seekhead->filepos;
00321 }
00322 av_free(seekhead->entries);
00323 av_free(seekhead);
00324
00325 return currentpos;
00326 }
00327
00328 static mkv_cues * mkv_start_cues(offset_t segment_offset)
00329 {
00330 mkv_cues *cues = av_mallocz(sizeof(mkv_cues));
00331 if (cues == NULL)
00332 return NULL;
00333
00334 cues->segment_offset = segment_offset;
00335 return cues;
00336 }
00337
00338 static int mkv_add_cuepoint(mkv_cues *cues, AVPacket *pkt, offset_t cluster_pos)
00339 {
00340 mkv_cuepoint *entries = cues->entries;
00341
00342 entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint));
00343 if (entries == NULL)
00344 return AVERROR(ENOMEM);
00345
00346 entries[cues->num_entries ].pts = pkt->pts;
00347 entries[cues->num_entries ].tracknum = pkt->stream_index + 1;
00348 entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset;
00349
00350 cues->entries = entries;
00351 return 0;
00352 }
00353
00354 static offset_t mkv_write_cues(ByteIOContext *pb, mkv_cues *cues, int num_tracks)
00355 {
00356 ebml_master cues_element;
00357 offset_t currentpos;
00358 int i, j;
00359
00360 currentpos = url_ftell(pb);
00361 cues_element = start_ebml_master(pb, MATROSKA_ID_CUES, 0);
00362
00363 for (i = 0; i < cues->num_entries; i++) {
00364 ebml_master cuepoint, track_positions;
00365 mkv_cuepoint *entry = &cues->entries[i];
00366 uint64_t pts = entry->pts;
00367
00368 cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(num_tracks));
00369 put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts);
00370
00371
00372
00373 for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
00374 track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
00375 put_ebml_uint(pb, MATROSKA_ID_CUETRACK , entry[j].tracknum );
00376 put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos);
00377 end_ebml_master(pb, track_positions);
00378 }
00379 i += j - 1;
00380 end_ebml_master(pb, cuepoint);
00381 }
00382 end_ebml_master(pb, cues_element);
00383
00384 av_free(cues->entries);
00385 av_free(cues);
00386 return currentpos;
00387 }
00388
00389 static int put_xiph_codecpriv(AVFormatContext *s, ByteIOContext *pb, AVCodecContext *codec)
00390 {
00391 uint8_t *header_start[3];
00392 int header_len[3];
00393 int first_header_size;
00394 int j;
00395
00396 if (codec->codec_id == CODEC_ID_VORBIS)
00397 first_header_size = 30;
00398 else
00399 first_header_size = 42;
00400
00401 if (ff_split_xiph_headers(codec->extradata, codec->extradata_size,
00402 first_header_size, header_start, header_len) < 0) {
00403 av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
00404 return -1;
00405 }
00406
00407 put_byte(pb, 2);
00408 for (j = 0; j < 2; j++) {
00409 put_xiph_size(pb, header_len[j]);
00410 }
00411 for (j = 0; j < 3; j++)
00412 put_buffer(pb, header_start[j], header_len[j]);
00413
00414 return 0;
00415 }
00416
00417 #define FLAC_STREAMINFO_SIZE 34
00418
00419 static int put_flac_codecpriv(AVFormatContext *s, ByteIOContext *pb, AVCodecContext *codec)
00420 {
00421
00422
00423 if (codec->extradata_size < FLAC_STREAMINFO_SIZE) {
00424 av_log(s, AV_LOG_ERROR, "Invalid FLAC extradata\n");
00425 return -1;
00426 } else if (codec->extradata_size == FLAC_STREAMINFO_SIZE) {
00427
00428 put_byte(pb, 0);
00429 put_xiph_size(pb, codec->extradata_size);
00430 av_log(s, AV_LOG_ERROR, "Only one packet\n");
00431 }
00432 put_buffer(pb, codec->extradata, codec->extradata_size);
00433 return 0;
00434 }
00435
00436 static void get_aac_sample_rates(AVFormatContext *s, AVCodecContext *codec, int *sample_rate, int *output_sample_rate)
00437 {
00438 static const int aac_sample_rates[] = {
00439 96000, 88200, 64000, 48000, 44100, 32000,
00440 24000, 22050, 16000, 12000, 11025, 8000,
00441 };
00442 int sri;
00443
00444 if (codec->extradata_size < 2) {
00445 av_log(s, AV_LOG_WARNING, "No AAC extradata, unable to determine samplerate.\n");
00446 return;
00447 }
00448
00449 sri = ((codec->extradata[0] << 1) & 0xE) | (codec->extradata[1] >> 7);
00450 if (sri > 12) {
00451 av_log(s, AV_LOG_WARNING, "AAC samplerate index out of bounds\n");
00452 return;
00453 }
00454 *sample_rate = aac_sample_rates[sri];
00455
00456
00457 if (codec->extradata_size == 5) {
00458 sri = (codec->extradata[4] >> 3) & 0xF;
00459 if (sri > 12) {
00460 av_log(s, AV_LOG_WARNING, "AAC output samplerate index out of bounds\n");
00461 return;
00462 }
00463 *output_sample_rate = aac_sample_rates[sri];
00464 }
00465 }
00466
00467 static int mkv_write_codecprivate(AVFormatContext *s, ByteIOContext *pb, AVCodecContext *codec, int native_id)
00468 {
00469 ByteIOContext dyn_cp;
00470 uint8_t *codecpriv;
00471 int ret = 0, codecpriv_size;
00472
00473 url_open_dyn_buf(&dyn_cp);
00474
00475 if (native_id) {
00476 if (codec->codec_id == CODEC_ID_VORBIS || codec->codec_id == CODEC_ID_THEORA)
00477 ret = put_xiph_codecpriv(s, &dyn_cp, codec);
00478 else if (codec->codec_id == CODEC_ID_FLAC)
00479 ret = put_flac_codecpriv(s, &dyn_cp, codec);
00480 else if (codec->extradata_size)
00481 put_buffer(&dyn_cp, codec->extradata, codec->extradata_size);
00482 } else if (codec->codec_type == CODEC_TYPE_VIDEO) {
00483 if (!codec->codec_tag)
00484 codec->codec_tag = codec_get_tag(codec_bmp_tags, codec->codec_id);
00485 if (!codec->codec_tag) {
00486 av_log(s, AV_LOG_ERROR, "No bmp codec ID found.");
00487 ret = -1;
00488 }
00489
00490 put_bmp_header(&dyn_cp, codec, codec_bmp_tags, 0);
00491
00492 } else if (codec->codec_type == CODEC_TYPE_AUDIO) {
00493 if (!codec->codec_tag)
00494 codec->codec_tag = codec_get_tag(codec_wav_tags, codec->codec_id);
00495 if (!codec->codec_tag) {
00496 av_log(s, AV_LOG_ERROR, "No wav codec ID found.");
00497 ret = -1;
00498 }
00499
00500 put_wav_header(&dyn_cp, codec);
00501 }
00502
00503 codecpriv_size = url_close_dyn_buf(&dyn_cp, &codecpriv);
00504 if (codecpriv_size)
00505 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size);
00506 av_free(codecpriv);
00507 return ret;
00508 }
00509
00510 static int mkv_write_tracks(AVFormatContext *s)
00511 {
00512 MatroskaMuxContext *mkv = s->priv_data;
00513 ByteIOContext *pb = &s->pb;
00514 ebml_master tracks;
00515 int i, j, ret;
00516
00517 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, url_ftell(pb));
00518 if (ret < 0) return ret;
00519
00520 tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0);
00521 for (i = 0; i < s->nb_streams; i++) {
00522 AVStream *st = s->streams[i];
00523 AVCodecContext *codec = st->codec;
00524 ebml_master subinfo, track;
00525 int native_id = 0;
00526 int bit_depth = av_get_bits_per_sample(codec->codec_id);
00527 int sample_rate = codec->sample_rate;
00528 int output_sample_rate = 0;
00529
00530 if (!bit_depth)
00531 bit_depth = av_get_bits_per_sample_format(codec->sample_fmt);
00532
00533 if (codec->codec_id == CODEC_ID_AAC)
00534 get_aac_sample_rates(s, codec, &sample_rate, &output_sample_rate);
00535
00536 track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
00537 put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER , i + 1);
00538 put_ebml_uint (pb, MATROSKA_ID_TRACKUID , i + 1);
00539 put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0);
00540
00541 if (st->language[0])
00542 put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, st->language);
00543 else
00544 put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, "und");
00545
00546
00547
00548 for (j = 0; ff_mkv_codec_tags[j].id != CODEC_ID_NONE; j++) {
00549 if (ff_mkv_codec_tags[j].id == codec->codec_id) {
00550 put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str);
00551 native_id = 1;
00552 break;
00553 }
00554 }
00555
00556 switch (codec->codec_type) {
00557 case CODEC_TYPE_VIDEO:
00558 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
00559
00560 if (!native_id)
00561
00562 put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC);
00563
00564 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0);
00565
00566 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
00567 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
00568 if (codec->sample_aspect_ratio.num) {
00569 AVRational dar = av_mul_q(codec->sample_aspect_ratio,
00570 (AVRational){codec->width, codec->height});
00571 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , dar.num);
00572 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, dar.den);
00573 }
00574 end_ebml_master(pb, subinfo);
00575 break;
00576
00577 case CODEC_TYPE_AUDIO:
00578 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
00579
00580 if (!native_id)
00581
00582 put_ebml_string(pb, MATROSKA_ID_CODECID, MATROSKA_CODEC_ID_AUDIO_ACM);
00583
00584 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0);
00585 put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels);
00586 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
00587 if (output_sample_rate)
00588 put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
00589 if (bit_depth)
00590 put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
00591 end_ebml_master(pb, subinfo);
00592 break;
00593
00594 case CODEC_TYPE_SUBTITLE:
00595 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_SUBTITLE);
00596 break;
00597 default:
00598 av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.");
00599 break;
00600 }
00601 ret = mkv_write_codecprivate(s, pb, codec, native_id);
00602 if (ret < 0) return ret;
00603
00604 end_ebml_master(pb, track);
00605
00606
00607 av_set_pts_info(st, 64, 1, 1000);
00608 }
00609 end_ebml_master(pb, tracks);
00610 return 0;
00611 }
00612
00613 static int mkv_write_header(AVFormatContext *s)
00614 {
00615 MatroskaMuxContext *mkv = s->priv_data;
00616 ByteIOContext *pb = &s->pb;
00617 ebml_master ebml_header, segment_info;
00618 int ret;
00619
00620 mkv->md5_ctx = av_mallocz(av_md5_size);
00621 av_md5_init(mkv->md5_ctx);
00622
00623 ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0);
00624 put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1);
00625 put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1);
00626 put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4);
00627 put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8);
00628 put_ebml_string (pb, EBML_ID_DOCTYPE , "matroska");
00629 put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 2);
00630 put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2);
00631 end_ebml_master(pb, ebml_header);
00632
00633 mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0);
00634 mkv->segment_offset = url_ftell(pb);
00635
00636
00637
00638
00639
00640
00641 mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10);
00642 mkv->cluster_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 0);
00643 if (mkv->main_seekhead == NULL || mkv->cluster_seekhead == NULL)
00644 return AVERROR(ENOMEM);
00645
00646 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, url_ftell(pb));
00647 if (ret < 0) return ret;
00648
00649 segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0);
00650 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
00651 if (strlen(s->title))
00652 put_ebml_string(pb, MATROSKA_ID_TITLE, s->title);
00653 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
00654 put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT);
00655 put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
00656
00657
00658 mkv->segment_uid = url_ftell(pb);
00659 put_ebml_void(pb, 19);
00660 }
00661
00662
00663 mkv->duration = 0;
00664 mkv->duration_offset = url_ftell(pb);
00665 put_ebml_void(pb, 11);
00666 end_ebml_master(pb, segment_info);
00667
00668 ret = mkv_write_tracks(s);
00669 if (ret < 0) return ret;
00670
00671 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb));
00672 if (ret < 0) return ret;
00673
00674 mkv->cluster_pos = url_ftell(pb);
00675 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
00676 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, 0);
00677 mkv->cluster_pts = 0;
00678
00679 mkv->cues = mkv_start_cues(mkv->segment_offset);
00680 if (mkv->cues == NULL)
00681 return AVERROR(ENOMEM);
00682
00683 return 0;
00684 }
00685
00686 static int mkv_block_size(AVPacket *pkt)
00687 {
00688 int size = 4;
00689 return size + pkt->size;
00690 }
00691
00692 static int mkv_blockgroup_size(AVPacket *pkt)
00693 {
00694 int size = mkv_block_size(pkt);
00695 size += ebml_num_size(size);
00696 size += 2;
00697 size += 8;
00698 size += ebml_num_size(size);
00699 size += 1;
00700 return size;
00701 }
00702
00703 static void mkv_write_block(AVFormatContext *s, unsigned int blockid, AVPacket *pkt, int flags)
00704 {
00705 MatroskaMuxContext *mkv = s->priv_data;
00706 ByteIOContext *pb = &s->pb;
00707
00708 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
00709 "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n",
00710 url_ftell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags);
00711 put_ebml_id(pb, blockid);
00712 put_ebml_num(pb, mkv_block_size(pkt), 0);
00713 put_byte(pb, 0x80 | (pkt->stream_index + 1));
00714 put_be16(pb, pkt->pts - mkv->cluster_pts);
00715 put_byte(pb, flags);
00716 put_buffer(pb, pkt->data, pkt->size);
00717 }
00718
00719 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
00720 {
00721 MatroskaMuxContext *mkv = s->priv_data;
00722 ByteIOContext *pb = &s->pb;
00723 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
00724 int keyframe = !!(pkt->flags & PKT_FLAG_KEY);
00725 int ret;
00726
00727
00728 if (url_ftell(pb) > mkv->cluster_pos + 5*1024*1024 || pkt->pts > mkv->cluster_pts + 5000) {
00729 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64
00730 " bytes, pts %" PRIu64 "\n", url_ftell(pb), pkt->pts);
00731 end_ebml_master(pb, mkv->cluster);
00732
00733 ret = mkv_add_seekhead_entry(mkv->cluster_seekhead, MATROSKA_ID_CLUSTER, url_ftell(pb));
00734 if (ret < 0) return ret;
00735
00736 mkv->cluster_pos = url_ftell(pb);
00737 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
00738 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, pkt->pts);
00739 mkv->cluster_pts = pkt->pts;
00740 av_md5_update(mkv->md5_ctx, pkt->data, FFMIN(200, pkt->size));
00741 }
00742
00743 if (codec->codec_type != CODEC_TYPE_SUBTITLE) {
00744 mkv_write_block(s, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);
00745 } else {
00746 ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt));
00747 mkv_write_block(s, MATROSKA_ID_BLOCK, pkt, 0);
00748 put_ebml_uint(pb, MATROSKA_ID_DURATION, pkt->duration);
00749 end_ebml_master(pb, blockgroup);
00750 }
00751
00752 if (codec->codec_type == CODEC_TYPE_VIDEO && keyframe) {
00753 ret = mkv_add_cuepoint(mkv->cues, pkt, mkv->cluster_pos);
00754 if (ret < 0) return ret;
00755 }
00756
00757 mkv->duration = FFMAX(mkv->duration, pkt->pts + pkt->duration);
00758 return 0;
00759 }
00760
00761 static int mkv_write_trailer(AVFormatContext *s)
00762 {
00763 MatroskaMuxContext *mkv = s->priv_data;
00764 ByteIOContext *pb = &s->pb;
00765 offset_t currentpos, second_seekhead, cuespos;
00766 int ret;
00767
00768 end_ebml_master(pb, mkv->cluster);
00769
00770 if (!url_is_streamed(pb)) {
00771 cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams);
00772 second_seekhead = mkv_write_seekhead(pb, mkv->cluster_seekhead);
00773
00774 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES , cuespos);
00775 if (ret < 0) return ret;
00776 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_SEEKHEAD, second_seekhead);
00777 if (ret < 0) return ret;
00778 mkv_write_seekhead(pb, mkv->main_seekhead);
00779
00780
00781 av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
00782 currentpos = url_ftell(pb);
00783 url_fseek(pb, mkv->duration_offset, SEEK_SET);
00784 put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration);
00785
00786
00787 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
00788 uint8_t segment_uid[16];
00789 av_md5_final(mkv->md5_ctx, segment_uid);
00790 url_fseek(pb, mkv->segment_uid, SEEK_SET);
00791 put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
00792 }
00793 url_fseek(pb, currentpos, SEEK_SET);
00794 }
00795
00796 end_ebml_master(pb, mkv->segment);
00797 av_free(mkv->md5_ctx);
00798 return 0;
00799 }
00800
00801 AVOutputFormat matroska_muxer = {
00802 "matroska",
00803 "Matroska File Format",
00804 "video/x-matroska",
00805 "mkv",
00806 sizeof(MatroskaMuxContext),
00807 CODEC_ID_MP2,
00808 CODEC_ID_MPEG4,
00809 mkv_write_header,
00810 mkv_write_packet,
00811 mkv_write_trailer,
00812 .codec_tag = (const AVCodecTag*[]){codec_bmp_tags, codec_wav_tags, 0},
00813 .subtitle_codec = CODEC_ID_TEXT,
00814 };
00815
00816 AVOutputFormat matroska_audio_muxer = {
00817 "matroska",
00818 "Matroska File Format",
00819 "audio/x-matroska",
00820 "mka",
00821 sizeof(MatroskaMuxContext),
00822 CODEC_ID_MP2,
00823 CODEC_ID_NONE,
00824 mkv_write_header,
00825 mkv_write_packet,
00826 mkv_write_trailer,
00827 .codec_tag = (const AVCodecTag*[]){codec_wav_tags, 0},
00828 };