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 "internal.h"
00024 #include "riff.h"
00025 #include "isom.h"
00026 #include "matroska.h"
00027 #include "avc.h"
00028 #include "flacenc.h"
00029 #include "avlanguage.h"
00030 #include "libavutil/samplefmt.h"
00031 #include "libavutil/intreadwrite.h"
00032 #include "libavutil/intfloat.h"
00033 #include "libavutil/mathematics.h"
00034 #include "libavutil/random_seed.h"
00035 #include "libavutil/lfg.h"
00036 #include "libavutil/dict.h"
00037 #include "libavutil/avstring.h"
00038 #include "libavcodec/xiph.h"
00039 #include "libavcodec/mpeg4audio.h"
00040
00041 typedef struct ebml_master {
00042 int64_t pos;
00043 int sizebytes;
00044 } ebml_master;
00045
00046 typedef struct mkv_seekhead_entry {
00047 unsigned int elementid;
00048 uint64_t segmentpos;
00049 } mkv_seekhead_entry;
00050
00051 typedef struct mkv_seekhead {
00052 int64_t filepos;
00053 int64_t segment_offset;
00054 int reserved_size;
00055 int max_entries;
00056 mkv_seekhead_entry *entries;
00057 int num_entries;
00058 } mkv_seekhead;
00059
00060 typedef struct {
00061 uint64_t pts;
00062 int tracknum;
00063 int64_t cluster_pos;
00064 } mkv_cuepoint;
00065
00066 typedef struct {
00067 int64_t segment_offset;
00068 mkv_cuepoint *entries;
00069 int num_entries;
00070 } mkv_cues;
00071
00072 typedef struct {
00073 int write_dts;
00074 } mkv_track;
00075
00076 #define MODE_MATROSKAv2 0x01
00077 #define MODE_WEBM 0x02
00078
00079 typedef struct MatroskaMuxContext {
00080 int mode;
00081 AVIOContext *dyn_bc;
00082 ebml_master segment;
00083 int64_t segment_offset;
00084 ebml_master cluster;
00085 int64_t cluster_pos;
00086 int64_t cluster_pts;
00087 int64_t duration_offset;
00088 int64_t duration;
00089 mkv_seekhead *main_seekhead;
00090 mkv_cues *cues;
00091 mkv_track *tracks;
00092
00093 unsigned int audio_buffer_size;
00094 AVPacket cur_audio_pkt;
00095
00096 int have_attachments;
00097 } MatroskaMuxContext;
00098
00099
00102 #define MAX_SEEKENTRY_SIZE 21
00103
00106 #define MAX_CUETRACKPOS_SIZE 22
00107
00109 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
00110
00111
00112 static int ebml_id_size(unsigned int id)
00113 {
00114 return (av_log2(id+1)-1)/7+1;
00115 }
00116
00117 static void put_ebml_id(AVIOContext *pb, unsigned int id)
00118 {
00119 int i = ebml_id_size(id);
00120 while (i--)
00121 avio_w8(pb, (uint8_t)(id >> (i*8)));
00122 }
00123
00129 static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
00130 {
00131 av_assert0(bytes <= 8);
00132 avio_w8(pb, 0x1ff >> bytes);
00133 while (--bytes)
00134 avio_w8(pb, 0xff);
00135 }
00136
00140 static int ebml_num_size(uint64_t num)
00141 {
00142 int bytes = 1;
00143 while ((num+1) >> bytes*7) bytes++;
00144 return bytes;
00145 }
00146
00153 static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
00154 {
00155 int i, needed_bytes = ebml_num_size(num);
00156
00157
00158 av_assert0(num < (1ULL<<56)-1);
00159
00160 if (bytes == 0)
00161
00162 bytes = needed_bytes;
00163
00164
00165 av_assert0(bytes >= needed_bytes);
00166
00167 num |= 1ULL << bytes*7;
00168 for (i = bytes - 1; i >= 0; i--)
00169 avio_w8(pb, (uint8_t)(num >> i*8));
00170 }
00171
00172 static void put_ebml_uint(AVIOContext *pb, unsigned int elementid, uint64_t val)
00173 {
00174 int i, bytes = 1;
00175 uint64_t tmp = val;
00176 while (tmp>>=8) bytes++;
00177
00178 put_ebml_id(pb, elementid);
00179 put_ebml_num(pb, bytes, 0);
00180 for (i = bytes - 1; i >= 0; i--)
00181 avio_w8(pb, (uint8_t)(val >> i*8));
00182 }
00183
00184 static void put_ebml_float(AVIOContext *pb, unsigned int elementid, double val)
00185 {
00186 put_ebml_id(pb, elementid);
00187 put_ebml_num(pb, 8, 0);
00188 avio_wb64(pb, av_double2int(val));
00189 }
00190
00191 static void put_ebml_binary(AVIOContext *pb, unsigned int elementid,
00192 const void *buf, int size)
00193 {
00194 put_ebml_id(pb, elementid);
00195 put_ebml_num(pb, size, 0);
00196 avio_write(pb, buf, size);
00197 }
00198
00199 static void put_ebml_string(AVIOContext *pb, unsigned int elementid, const char *str)
00200 {
00201 put_ebml_binary(pb, elementid, str, strlen(str));
00202 }
00203
00210 static void put_ebml_void(AVIOContext *pb, uint64_t size)
00211 {
00212 int64_t currentpos = avio_tell(pb);
00213
00214 av_assert0(size >= 2);
00215
00216 put_ebml_id(pb, EBML_ID_VOID);
00217
00218
00219
00220 if (size < 10)
00221 put_ebml_num(pb, size-1, 0);
00222 else
00223 put_ebml_num(pb, size-9, 8);
00224 while(avio_tell(pb) < currentpos + size)
00225 avio_w8(pb, 0);
00226 }
00227
00228 static ebml_master start_ebml_master(AVIOContext *pb, unsigned int elementid, uint64_t expectedsize)
00229 {
00230 int bytes = expectedsize ? ebml_num_size(expectedsize) : 8;
00231 put_ebml_id(pb, elementid);
00232 put_ebml_size_unknown(pb, bytes);
00233 return (ebml_master){ avio_tell(pb), bytes };
00234 }
00235
00236 static void end_ebml_master(AVIOContext *pb, ebml_master master)
00237 {
00238 int64_t pos = avio_tell(pb);
00239
00240 if (avio_seek(pb, master.pos - master.sizebytes, SEEK_SET) < 0)
00241 return;
00242 put_ebml_num(pb, pos - master.pos, master.sizebytes);
00243 avio_seek(pb, pos, SEEK_SET);
00244 }
00245
00246 static void put_xiph_size(AVIOContext *pb, int size)
00247 {
00248 int i;
00249 for (i = 0; i < size / 255; i++)
00250 avio_w8(pb, 255);
00251 avio_w8(pb, size % 255);
00252 }
00253
00265 static mkv_seekhead * mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset, int numelements)
00266 {
00267 mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
00268 if (new_seekhead == NULL)
00269 return NULL;
00270
00271 new_seekhead->segment_offset = segment_offset;
00272
00273 if (numelements > 0) {
00274 new_seekhead->filepos = avio_tell(pb);
00275
00276
00277
00278 new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 13;
00279 new_seekhead->max_entries = numelements;
00280 put_ebml_void(pb, new_seekhead->reserved_size);
00281 }
00282 return new_seekhead;
00283 }
00284
00285 static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
00286 {
00287 mkv_seekhead_entry *entries = seekhead->entries;
00288
00289
00290 if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
00291 return -1;
00292
00293 entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry));
00294 if (entries == NULL)
00295 return AVERROR(ENOMEM);
00296
00297 entries[seekhead->num_entries ].elementid = elementid;
00298 entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
00299
00300 seekhead->entries = entries;
00301 return 0;
00302 }
00303
00313 static int64_t mkv_write_seekhead(AVIOContext *pb, mkv_seekhead *seekhead)
00314 {
00315 ebml_master metaseek, seekentry;
00316 int64_t currentpos;
00317 int i;
00318
00319 currentpos = avio_tell(pb);
00320
00321 if (seekhead->reserved_size > 0) {
00322 if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) {
00323 currentpos = -1;
00324 goto fail;
00325 }
00326 }
00327
00328 metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size);
00329 for (i = 0; i < seekhead->num_entries; i++) {
00330 mkv_seekhead_entry *entry = &seekhead->entries[i];
00331
00332 seekentry = start_ebml_master(pb, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE);
00333
00334 put_ebml_id(pb, MATROSKA_ID_SEEKID);
00335 put_ebml_num(pb, ebml_id_size(entry->elementid), 0);
00336 put_ebml_id(pb, entry->elementid);
00337
00338 put_ebml_uint(pb, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
00339 end_ebml_master(pb, seekentry);
00340 }
00341 end_ebml_master(pb, metaseek);
00342
00343 if (seekhead->reserved_size > 0) {
00344 uint64_t remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
00345 put_ebml_void(pb, remaining);
00346 avio_seek(pb, currentpos, SEEK_SET);
00347
00348 currentpos = seekhead->filepos;
00349 }
00350 fail:
00351 av_free(seekhead->entries);
00352 av_free(seekhead);
00353
00354 return currentpos;
00355 }
00356
00357 static mkv_cues * mkv_start_cues(int64_t segment_offset)
00358 {
00359 mkv_cues *cues = av_mallocz(sizeof(mkv_cues));
00360 if (cues == NULL)
00361 return NULL;
00362
00363 cues->segment_offset = segment_offset;
00364 return cues;
00365 }
00366
00367 static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos)
00368 {
00369 mkv_cuepoint *entries = cues->entries;
00370
00371 if (ts < 0)
00372 return 0;
00373
00374 entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint));
00375 if (entries == NULL)
00376 return AVERROR(ENOMEM);
00377
00378 entries[cues->num_entries ].pts = ts;
00379 entries[cues->num_entries ].tracknum = stream + 1;
00380 entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset;
00381
00382 cues->entries = entries;
00383 return 0;
00384 }
00385
00386 static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, int num_tracks)
00387 {
00388 ebml_master cues_element;
00389 int64_t currentpos;
00390 int i, j;
00391
00392 currentpos = avio_tell(pb);
00393 cues_element = start_ebml_master(pb, MATROSKA_ID_CUES, 0);
00394
00395 for (i = 0; i < cues->num_entries; i++) {
00396 ebml_master cuepoint, track_positions;
00397 mkv_cuepoint *entry = &cues->entries[i];
00398 uint64_t pts = entry->pts;
00399
00400 cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(num_tracks));
00401 put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts);
00402
00403
00404
00405 for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
00406 track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
00407 put_ebml_uint(pb, MATROSKA_ID_CUETRACK , entry[j].tracknum );
00408 put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos);
00409 end_ebml_master(pb, track_positions);
00410 }
00411 i += j - 1;
00412 end_ebml_master(pb, cuepoint);
00413 }
00414 end_ebml_master(pb, cues_element);
00415
00416 return currentpos;
00417 }
00418
00419 static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecContext *codec)
00420 {
00421 uint8_t *header_start[3];
00422 int header_len[3];
00423 int first_header_size;
00424 int j;
00425
00426 if (codec->codec_id == AV_CODEC_ID_VORBIS)
00427 first_header_size = 30;
00428 else
00429 first_header_size = 42;
00430
00431 if (avpriv_split_xiph_headers(codec->extradata, codec->extradata_size,
00432 first_header_size, header_start, header_len) < 0) {
00433 av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
00434 return -1;
00435 }
00436
00437 avio_w8(pb, 2);
00438 for (j = 0; j < 2; j++) {
00439 put_xiph_size(pb, header_len[j]);
00440 }
00441 for (j = 0; j < 3; j++)
00442 avio_write(pb, header_start[j], header_len[j]);
00443
00444 return 0;
00445 }
00446
00447 static void get_aac_sample_rates(AVFormatContext *s, AVCodecContext *codec, int *sample_rate, int *output_sample_rate)
00448 {
00449 MPEG4AudioConfig mp4ac;
00450
00451 if (avpriv_mpeg4audio_get_config(&mp4ac, codec->extradata,
00452 codec->extradata_size * 8, 1) < 0) {
00453 av_log(s, AV_LOG_WARNING, "Error parsing AAC extradata, unable to determine samplerate.\n");
00454 return;
00455 }
00456
00457 *sample_rate = mp4ac.sample_rate;
00458 *output_sample_rate = mp4ac.ext_sample_rate;
00459 }
00460
00461 static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, AVCodecContext *codec, int native_id, int qt_id)
00462 {
00463 AVIOContext *dyn_cp;
00464 uint8_t *codecpriv;
00465 int ret, codecpriv_size;
00466
00467 ret = avio_open_dyn_buf(&dyn_cp);
00468 if(ret < 0)
00469 return ret;
00470
00471 if (native_id) {
00472 if (codec->codec_id == AV_CODEC_ID_VORBIS || codec->codec_id == AV_CODEC_ID_THEORA)
00473 ret = put_xiph_codecpriv(s, dyn_cp, codec);
00474 else if (codec->codec_id == AV_CODEC_ID_FLAC)
00475 ret = ff_flac_write_header(dyn_cp, codec, 1);
00476 else if (codec->codec_id == AV_CODEC_ID_H264)
00477 ret = ff_isom_write_avcc(dyn_cp, codec->extradata, codec->extradata_size);
00478 else if (codec->codec_id == AV_CODEC_ID_ALAC) {
00479 if (codec->extradata_size < 36) {
00480 av_log(s, AV_LOG_ERROR,
00481 "Invalid extradata found, ALAC expects a 36-byte "
00482 "QuickTime atom.");
00483 ret = AVERROR_INVALIDDATA;
00484 } else
00485 avio_write(dyn_cp, codec->extradata + 12,
00486 codec->extradata_size - 12);
00487 }
00488 else if (codec->extradata_size)
00489 avio_write(dyn_cp, codec->extradata, codec->extradata_size);
00490 } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
00491 if (qt_id) {
00492 if (!codec->codec_tag)
00493 codec->codec_tag = ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id);
00494 if (codec->extradata_size)
00495 avio_write(dyn_cp, codec->extradata, codec->extradata_size);
00496 } else {
00497 if (!codec->codec_tag)
00498 codec->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id);
00499 if (!codec->codec_tag) {
00500 av_log(s, AV_LOG_ERROR, "No bmp codec ID found.\n");
00501 ret = -1;
00502 }
00503
00504 ff_put_bmp_header(dyn_cp, codec, ff_codec_bmp_tags, 0);
00505 }
00506
00507 } else if (codec->codec_type == AVMEDIA_TYPE_AUDIO) {
00508 unsigned int tag;
00509 tag = ff_codec_get_tag(ff_codec_wav_tags, codec->codec_id);
00510 if (!tag) {
00511 av_log(s, AV_LOG_ERROR, "No wav codec ID found.\n");
00512 ret = -1;
00513 }
00514 if (!codec->codec_tag)
00515 codec->codec_tag = tag;
00516
00517 ff_put_wav_header(dyn_cp, codec);
00518 }
00519
00520 codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv);
00521 if (codecpriv_size)
00522 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size);
00523 av_free(codecpriv);
00524 return ret;
00525 }
00526
00527 static int mkv_write_tracks(AVFormatContext *s)
00528 {
00529 MatroskaMuxContext *mkv = s->priv_data;
00530 AVIOContext *pb = s->pb;
00531 ebml_master tracks;
00532 int i, j, ret;
00533
00534 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
00535 if (ret < 0) return ret;
00536
00537 tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0);
00538 for (i = 0; i < s->nb_streams; i++) {
00539 AVStream *st = s->streams[i];
00540 AVCodecContext *codec = st->codec;
00541 ebml_master subinfo, track;
00542 int native_id = 0;
00543 int qt_id = 0;
00544 int bit_depth = av_get_bits_per_sample(codec->codec_id);
00545 int sample_rate = codec->sample_rate;
00546 int output_sample_rate = 0;
00547 AVDictionaryEntry *tag;
00548
00549 if (codec->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
00550 mkv->have_attachments = 1;
00551 continue;
00552 }
00553
00554 if (!bit_depth)
00555 bit_depth = av_get_bytes_per_sample(codec->sample_fmt) << 3;
00556
00557 if (codec->codec_id == AV_CODEC_ID_AAC)
00558 get_aac_sample_rates(s, codec, &sample_rate, &output_sample_rate);
00559
00560 track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
00561 put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER , i + 1);
00562 put_ebml_uint (pb, MATROSKA_ID_TRACKUID , i + 1);
00563 put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0);
00564
00565 if ((tag = av_dict_get(st->metadata, "title", NULL, 0)))
00566 put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value);
00567 tag = av_dict_get(st->metadata, "language", NULL, 0);
00568 put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag ? tag->value:"und");
00569
00570 if (st->disposition)
00571 put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT));
00572
00573
00574
00575 for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
00576 if (ff_mkv_codec_tags[j].id == codec->codec_id) {
00577 put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str);
00578 native_id = 1;
00579 break;
00580 }
00581 }
00582
00583 if (mkv->mode == MODE_WEBM && !(codec->codec_id == AV_CODEC_ID_VP8 ||
00584 codec->codec_id == AV_CODEC_ID_VORBIS)) {
00585 av_log(s, AV_LOG_ERROR,
00586 "Only VP8 video and Vorbis audio are supported for WebM.\n");
00587 return AVERROR(EINVAL);
00588 }
00589
00590 switch (codec->codec_type) {
00591 case AVMEDIA_TYPE_VIDEO:
00592 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
00593 if(st->avg_frame_rate.num && st->avg_frame_rate.den && 1.0/av_q2d(st->avg_frame_rate) > av_q2d(codec->time_base))
00594 put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1E9/av_q2d(st->avg_frame_rate));
00595 else
00596 put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9);
00597
00598 if (!native_id &&
00599 ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id) &&
00600 (!ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id)
00601 || codec->codec_id == AV_CODEC_ID_SVQ1
00602 || codec->codec_id == AV_CODEC_ID_SVQ3
00603 || codec->codec_id == AV_CODEC_ID_CINEPAK))
00604 qt_id = 1;
00605
00606 if (qt_id)
00607 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_QUICKTIME");
00608 else if (!native_id) {
00609
00610 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC");
00611 mkv->tracks[i].write_dts = 1;
00612 }
00613
00614 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0);
00615
00616 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
00617 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
00618
00619 if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
00620 (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
00621
00622 uint64_t st_mode = MATROSKA_VIDEO_STEREO_MODE_COUNT;
00623
00624 for (j=0; j<MATROSKA_VIDEO_STEREO_MODE_COUNT; j++)
00625 if (!strcmp(tag->value, ff_matroska_video_stereo_mode[j])){
00626 st_mode = j;
00627 break;
00628 }
00629
00630 if ((mkv->mode == MODE_WEBM && st_mode > 3 && st_mode != 11)
00631 || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
00632 av_log(s, AV_LOG_ERROR,
00633 "The specified stereo mode is not valid.\n");
00634 return AVERROR(EINVAL);
00635 } else
00636 put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, st_mode);
00637 }
00638
00639 if (st->sample_aspect_ratio.num) {
00640 int64_t d_width = av_rescale(codec->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
00641 if (d_width > INT_MAX) {
00642 av_log(s, AV_LOG_ERROR, "Overflow in display width\n");
00643 return AVERROR(EINVAL);
00644 }
00645 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width);
00646 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height);
00647 }
00648
00649 if (codec->codec_id == AV_CODEC_ID_RAWVIDEO) {
00650 uint32_t color_space = av_le2ne32(codec->codec_tag);
00651 put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space));
00652 }
00653 end_ebml_master(pb, subinfo);
00654 break;
00655
00656 case AVMEDIA_TYPE_AUDIO:
00657 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
00658
00659 if (!native_id)
00660
00661 put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM");
00662
00663 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0);
00664 put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels);
00665 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
00666 if (output_sample_rate)
00667 put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
00668 if (bit_depth)
00669 put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
00670 end_ebml_master(pb, subinfo);
00671 break;
00672
00673 case AVMEDIA_TYPE_SUBTITLE:
00674 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_SUBTITLE);
00675 if (!native_id) {
00676 av_log(s, AV_LOG_ERROR, "Subtitle codec %d is not supported.\n", codec->codec_id);
00677 return AVERROR(ENOSYS);
00678 }
00679 break;
00680 default:
00681 av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.\n");
00682 break;
00683 }
00684 ret = mkv_write_codecprivate(s, pb, codec, native_id, qt_id);
00685 if (ret < 0) return ret;
00686
00687 end_ebml_master(pb, track);
00688
00689
00690 avpriv_set_pts_info(st, 64, 1, 1000);
00691 }
00692 end_ebml_master(pb, tracks);
00693 return 0;
00694 }
00695
00696 static int mkv_write_chapters(AVFormatContext *s)
00697 {
00698 MatroskaMuxContext *mkv = s->priv_data;
00699 AVIOContext *pb = s->pb;
00700 ebml_master chapters, editionentry;
00701 AVRational scale = {1, 1E9};
00702 int i, ret;
00703
00704 if (!s->nb_chapters)
00705 return 0;
00706
00707 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
00708 if (ret < 0) return ret;
00709
00710 chapters = start_ebml_master(pb, MATROSKA_ID_CHAPTERS , 0);
00711 editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0);
00712 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGDEFAULT, 1);
00713 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGHIDDEN , 0);
00714 for (i = 0; i < s->nb_chapters; i++) {
00715 ebml_master chapteratom, chapterdisplay;
00716 AVChapter *c = s->chapters[i];
00717 AVDictionaryEntry *t = NULL;
00718
00719 chapteratom = start_ebml_master(pb, MATROSKA_ID_CHAPTERATOM, 0);
00720 put_ebml_uint(pb, MATROSKA_ID_CHAPTERUID, c->id);
00721 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMESTART,
00722 av_rescale_q(c->start, c->time_base, scale));
00723 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMEEND,
00724 av_rescale_q(c->end, c->time_base, scale));
00725 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0);
00726 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGENABLED, 1);
00727 if ((t = av_dict_get(c->metadata, "title", NULL, 0))) {
00728 chapterdisplay = start_ebml_master(pb, MATROSKA_ID_CHAPTERDISPLAY, 0);
00729 put_ebml_string(pb, MATROSKA_ID_CHAPSTRING, t->value);
00730 put_ebml_string(pb, MATROSKA_ID_CHAPLANG , "und");
00731 end_ebml_master(pb, chapterdisplay);
00732 }
00733 end_ebml_master(pb, chapteratom);
00734 }
00735 end_ebml_master(pb, editionentry);
00736 end_ebml_master(pb, chapters);
00737 return 0;
00738 }
00739
00740 static void mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t)
00741 {
00742 uint8_t *key = av_strdup(t->key);
00743 uint8_t *p = key;
00744 const uint8_t *lang = NULL;
00745 ebml_master tag;
00746
00747 if ((p = strrchr(p, '-')) &&
00748 (lang = av_convert_lang_to(p + 1, AV_LANG_ISO639_2_BIBL)))
00749 *p = 0;
00750
00751 p = key;
00752 while (*p) {
00753 if (*p == ' ')
00754 *p = '_';
00755 else if (*p >= 'a' && *p <= 'z')
00756 *p -= 'a' - 'A';
00757 p++;
00758 }
00759
00760 tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0);
00761 put_ebml_string(pb, MATROSKA_ID_TAGNAME, key);
00762 if (lang)
00763 put_ebml_string(pb, MATROSKA_ID_TAGLANG, lang);
00764 put_ebml_string(pb, MATROSKA_ID_TAGSTRING, t->value);
00765 end_ebml_master(pb, tag);
00766
00767 av_freep(&key);
00768 }
00769
00770 static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int elementid,
00771 unsigned int uid, ebml_master *tags)
00772 {
00773 MatroskaMuxContext *mkv = s->priv_data;
00774 ebml_master tag, targets;
00775 AVDictionaryEntry *t = NULL;
00776 int ret;
00777
00778 if (!tags->pos) {
00779 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
00780 if (ret < 0) return ret;
00781
00782 *tags = start_ebml_master(s->pb, MATROSKA_ID_TAGS, 0);
00783 }
00784
00785 tag = start_ebml_master(s->pb, MATROSKA_ID_TAG, 0);
00786 targets = start_ebml_master(s->pb, MATROSKA_ID_TAGTARGETS, 0);
00787 if (elementid)
00788 put_ebml_uint(s->pb, elementid, uid);
00789 end_ebml_master(s->pb, targets);
00790
00791 while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
00792 if (av_strcasecmp(t->key, "title") && av_strcasecmp(t->key, "stereo_mode"))
00793 mkv_write_simpletag(s->pb, t);
00794
00795 end_ebml_master(s->pb, tag);
00796 return 0;
00797 }
00798
00799 static int mkv_write_tags(AVFormatContext *s)
00800 {
00801 ebml_master tags = {0};
00802 int i, ret;
00803
00804 ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL);
00805
00806 if (av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
00807 ret = mkv_write_tag(s, s->metadata, 0, 0, &tags);
00808 if (ret < 0) return ret;
00809 }
00810
00811 for (i = 0; i < s->nb_streams; i++) {
00812 AVStream *st = s->streams[i];
00813
00814 if (!av_dict_get(st->metadata, "", 0, AV_DICT_IGNORE_SUFFIX))
00815 continue;
00816
00817 ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &tags);
00818 if (ret < 0) return ret;
00819 }
00820
00821 for (i = 0; i < s->nb_chapters; i++) {
00822 AVChapter *ch = s->chapters[i];
00823
00824 if (!av_dict_get(ch->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
00825 continue;
00826
00827 ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, ch->id, &tags);
00828 if (ret < 0) return ret;
00829 }
00830
00831 if (tags.pos)
00832 end_ebml_master(s->pb, tags);
00833 return 0;
00834 }
00835
00836 static int mkv_write_attachments(AVFormatContext *s)
00837 {
00838 MatroskaMuxContext *mkv = s->priv_data;
00839 AVIOContext *pb = s->pb;
00840 ebml_master attachments;
00841 AVLFG c;
00842 int i, ret;
00843
00844 if (!mkv->have_attachments)
00845 return 0;
00846
00847 av_lfg_init(&c, av_get_random_seed());
00848
00849 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
00850 if (ret < 0) return ret;
00851
00852 attachments = start_ebml_master(pb, MATROSKA_ID_ATTACHMENTS, 0);
00853
00854 for (i = 0; i < s->nb_streams; i++) {
00855 AVStream *st = s->streams[i];
00856 ebml_master attached_file;
00857 AVDictionaryEntry *t;
00858 const char *mimetype = NULL;
00859
00860 if (st->codec->codec_type != AVMEDIA_TYPE_ATTACHMENT)
00861 continue;
00862
00863 attached_file = start_ebml_master(pb, MATROSKA_ID_ATTACHEDFILE, 0);
00864
00865 if (t = av_dict_get(st->metadata, "title", NULL, 0))
00866 put_ebml_string(pb, MATROSKA_ID_FILEDESC, t->value);
00867 if (!(t = av_dict_get(st->metadata, "filename", NULL, 0))) {
00868 av_log(s, AV_LOG_ERROR, "Attachment stream %d has no filename tag.\n", i);
00869 return AVERROR(EINVAL);
00870 }
00871 put_ebml_string(pb, MATROSKA_ID_FILENAME, t->value);
00872 if (t = av_dict_get(st->metadata, "mimetype", NULL, 0))
00873 mimetype = t->value;
00874 else if (st->codec->codec_id != AV_CODEC_ID_NONE ) {
00875 int i;
00876 for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++)
00877 if (ff_mkv_mime_tags[i].id == st->codec->codec_id) {
00878 mimetype = ff_mkv_mime_tags[i].str;
00879 break;
00880 }
00881 }
00882 if (!mimetype) {
00883 av_log(s, AV_LOG_ERROR, "Attachment stream %d has no mimetype tag and "
00884 "it cannot be deduced from the codec id.\n", i);
00885 return AVERROR(EINVAL);
00886 }
00887
00888 put_ebml_string(pb, MATROSKA_ID_FILEMIMETYPE, mimetype);
00889 put_ebml_binary(pb, MATROSKA_ID_FILEDATA, st->codec->extradata, st->codec->extradata_size);
00890 put_ebml_uint(pb, MATROSKA_ID_FILEUID, av_lfg_get(&c));
00891 end_ebml_master(pb, attached_file);
00892 }
00893 end_ebml_master(pb, attachments);
00894
00895 return 0;
00896 }
00897
00898 static int mkv_write_header(AVFormatContext *s)
00899 {
00900 MatroskaMuxContext *mkv = s->priv_data;
00901 AVIOContext *pb = s->pb;
00902 ebml_master ebml_header, segment_info;
00903 AVDictionaryEntry *tag;
00904 int ret, i;
00905
00906 if (!strcmp(s->oformat->name, "webm")) mkv->mode = MODE_WEBM;
00907 else mkv->mode = MODE_MATROSKAv2;
00908
00909 if (s->avoid_negative_ts < 0)
00910 s->avoid_negative_ts = 1;
00911
00912 mkv->tracks = av_mallocz(s->nb_streams * sizeof(*mkv->tracks));
00913 if (!mkv->tracks)
00914 return AVERROR(ENOMEM);
00915
00916 ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0);
00917 put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1);
00918 put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1);
00919 put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4);
00920 put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8);
00921 put_ebml_string (pb, EBML_ID_DOCTYPE , s->oformat->name);
00922 put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 2);
00923 put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2);
00924 end_ebml_master(pb, ebml_header);
00925
00926 mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0);
00927 mkv->segment_offset = avio_tell(pb);
00928
00929
00930
00931
00932
00933
00934 mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10);
00935 if (!mkv->main_seekhead)
00936 return AVERROR(ENOMEM);
00937
00938 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, avio_tell(pb));
00939 if (ret < 0) return ret;
00940
00941 segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0);
00942 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
00943 if ((tag = av_dict_get(s->metadata, "title", NULL, 0)))
00944 put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value);
00945 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
00946 uint32_t segment_uid[4];
00947 AVLFG lfg;
00948
00949 av_lfg_init(&lfg, av_get_random_seed());
00950
00951 for (i = 0; i < 4; i++)
00952 segment_uid[i] = av_lfg_get(&lfg);
00953
00954 put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT);
00955 put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
00956 put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
00957 }
00958
00959 if (tag = av_dict_get(s->metadata, "creation_time", NULL, 0)) {
00960
00961 int64_t date_utc = (ff_iso8601_to_unix_time(tag->value) - 978307200) * 1000000000;
00962 uint8_t date_utc_buf[8];
00963 AV_WB64(date_utc_buf, date_utc);
00964 put_ebml_binary(pb, MATROSKA_ID_DATEUTC, date_utc_buf, 8);
00965 }
00966
00967
00968 mkv->duration = 0;
00969 mkv->duration_offset = avio_tell(pb);
00970 put_ebml_void(pb, 11);
00971 end_ebml_master(pb, segment_info);
00972
00973 ret = mkv_write_tracks(s);
00974 if (ret < 0) return ret;
00975
00976 if (mkv->mode != MODE_WEBM) {
00977 ret = mkv_write_chapters(s);
00978 if (ret < 0) return ret;
00979
00980 ret = mkv_write_tags(s);
00981 if (ret < 0) return ret;
00982
00983 ret = mkv_write_attachments(s);
00984 if (ret < 0) return ret;
00985 }
00986
00987 if (!s->pb->seekable)
00988 mkv_write_seekhead(pb, mkv->main_seekhead);
00989
00990 mkv->cues = mkv_start_cues(mkv->segment_offset);
00991 if (mkv->cues == NULL)
00992 return AVERROR(ENOMEM);
00993
00994 av_init_packet(&mkv->cur_audio_pkt);
00995 mkv->cur_audio_pkt.size = 0;
00996 mkv->audio_buffer_size = 0;
00997 mkv->cluster_pos = -1;
00998
00999 avio_flush(pb);
01000 return 0;
01001 }
01002
01003 static int mkv_blockgroup_size(int pkt_size)
01004 {
01005 int size = pkt_size + 4;
01006 size += ebml_num_size(size);
01007 size += 2;
01008 size += 8;
01009 size += ebml_num_size(size);
01010 size += 1;
01011 return size;
01012 }
01013
01014 static int ass_get_duration(const uint8_t *p)
01015 {
01016 int sh, sm, ss, sc, eh, em, es, ec;
01017 uint64_t start, end;
01018
01019 if (sscanf(p, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d",
01020 &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8)
01021 return 0;
01022 start = 3600000LL*sh + 60000LL*sm + 1000LL*ss + 10LL*sc;
01023 end = 3600000LL*eh + 60000LL*em + 1000LL*es + 10LL*ec;
01024 return end - start;
01025 }
01026
01027 static int mkv_write_ass_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
01028 {
01029 MatroskaMuxContext *mkv = s->priv_data;
01030 int i, layer = 0, max_duration = 0, size, line_size, data_size = pkt->size;
01031 uint8_t *start, *end, *data = pkt->data;
01032 ebml_master blockgroup;
01033 char buffer[2048];
01034
01035 while (data_size) {
01036 int duration = ass_get_duration(data);
01037 max_duration = FFMAX(duration, max_duration);
01038 end = memchr(data, '\n', data_size);
01039 size = line_size = end ? end-data+1 : data_size;
01040 size -= end ? (end[-1]=='\r')+1 : 0;
01041 start = data;
01042 for (i=0; i<3; i++, start++)
01043 if (!(start = memchr(start, ',', size-(start-data))))
01044 return max_duration;
01045 size -= start - data;
01046 sscanf(data, "Dialogue: %d,", &layer);
01047 i = snprintf(buffer, sizeof(buffer), "%"PRId64",%d,",
01048 s->streams[pkt->stream_index]->nb_frames, layer);
01049 size = FFMIN(i+size, sizeof(buffer));
01050 memcpy(buffer+i, start, size-i);
01051
01052 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
01053 "pts %" PRId64 ", duration %d\n",
01054 avio_tell(pb), size, pkt->pts, duration);
01055 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size));
01056 put_ebml_id(pb, MATROSKA_ID_BLOCK);
01057 put_ebml_num(pb, size+4, 0);
01058 avio_w8(pb, 0x80 | (pkt->stream_index + 1));
01059 avio_wb16(pb, pkt->pts - mkv->cluster_pts);
01060 avio_w8(pb, 0);
01061 avio_write(pb, buffer, size);
01062 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
01063 end_ebml_master(pb, blockgroup);
01064
01065 data += line_size;
01066 data_size -= line_size;
01067 }
01068
01069 return max_duration;
01070 }
01071
01072 static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
01073 unsigned int blockid, AVPacket *pkt, int flags)
01074 {
01075 MatroskaMuxContext *mkv = s->priv_data;
01076 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
01077 uint8_t *data = NULL;
01078 int offset = 0, size = pkt->size;
01079 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
01080
01081 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
01082 "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n",
01083 avio_tell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags);
01084 if (codec->codec_id == AV_CODEC_ID_H264 && codec->extradata_size > 0 &&
01085 (AV_RB24(codec->extradata) == 1 || AV_RB32(codec->extradata) == 1))
01086 ff_avc_parse_nal_units_buf(pkt->data, &data, &size);
01087 else
01088 data = pkt->data;
01089
01090 if (codec->codec_id == AV_CODEC_ID_PRORES) {
01091
01092
01093 size -= 8;
01094 offset = 8;
01095 }
01096
01097 put_ebml_id(pb, blockid);
01098 put_ebml_num(pb, size+4, 0);
01099 avio_w8(pb, 0x80 | (pkt->stream_index + 1));
01100 avio_wb16(pb, ts - mkv->cluster_pts);
01101 avio_w8(pb, flags);
01102 avio_write(pb, data + offset, size);
01103 if (data != pkt->data)
01104 av_free(data);
01105 }
01106
01107 static int srt_get_duration(uint8_t **buf)
01108 {
01109 int i, duration = 0;
01110
01111 for (i=0; i<2 && !duration; i++) {
01112 int s_hour, s_min, s_sec, s_hsec, e_hour, e_min, e_sec, e_hsec;
01113 if (sscanf(*buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d",
01114 &s_hour, &s_min, &s_sec, &s_hsec,
01115 &e_hour, &e_min, &e_sec, &e_hsec) == 8) {
01116 s_min += 60*s_hour; e_min += 60*e_hour;
01117 s_sec += 60*s_min; e_sec += 60*e_min;
01118 s_hsec += 1000*s_sec; e_hsec += 1000*e_sec;
01119 duration = e_hsec - s_hsec;
01120 }
01121 *buf += strcspn(*buf, "\n") + 1;
01122 }
01123 return duration;
01124 }
01125
01126 static int mkv_write_srt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
01127 {
01128 ebml_master blockgroup;
01129 AVPacket pkt2 = *pkt;
01130 int64_t duration = srt_get_duration(&pkt2.data);
01131 pkt2.size -= pkt2.data - pkt->data;
01132
01133 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP,
01134 mkv_blockgroup_size(pkt2.size));
01135 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, &pkt2, 0);
01136 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
01137 end_ebml_master(pb, blockgroup);
01138
01139 return duration;
01140 }
01141
01142 static void mkv_flush_dynbuf(AVFormatContext *s)
01143 {
01144 MatroskaMuxContext *mkv = s->priv_data;
01145 int bufsize;
01146 uint8_t *dyn_buf;
01147
01148 if (!mkv->dyn_bc)
01149 return;
01150
01151 bufsize = avio_close_dyn_buf(mkv->dyn_bc, &dyn_buf);
01152 avio_write(s->pb, dyn_buf, bufsize);
01153 av_free(dyn_buf);
01154 mkv->dyn_bc = NULL;
01155 }
01156
01157 static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
01158 {
01159 MatroskaMuxContext *mkv = s->priv_data;
01160 AVIOContext *pb = s->pb;
01161 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
01162 int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
01163 int duration = pkt->duration;
01164 int ret;
01165 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
01166
01167 if (ts == AV_NOPTS_VALUE) {
01168 av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n");
01169 return AVERROR(EINVAL);
01170 }
01171
01172 if (!s->pb->seekable) {
01173 if (!mkv->dyn_bc) {
01174 if ((ret = avio_open_dyn_buf(&mkv->dyn_bc)) < 0) {
01175 av_log(s, AV_LOG_ERROR, "Failed to open dynamic buffer\n");
01176 return ret;
01177 }
01178 }
01179 pb = mkv->dyn_bc;
01180 }
01181
01182 if (mkv->cluster_pos == -1) {
01183 mkv->cluster_pos = avio_tell(s->pb);
01184 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
01185 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
01186 mkv->cluster_pts = FFMAX(0, ts);
01187 }
01188
01189 if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) {
01190 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);
01191 } else if (codec->codec_id == AV_CODEC_ID_SSA) {
01192 duration = mkv_write_ass_blocks(s, pb, pkt);
01193 } else if (codec->codec_id == AV_CODEC_ID_SRT) {
01194 duration = mkv_write_srt_blocks(s, pb, pkt);
01195 } else {
01196 ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size));
01197
01198 if (pkt->convergence_duration > 0) {
01199 duration = pkt->convergence_duration;
01200 }
01201 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 0);
01202 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
01203 end_ebml_master(pb, blockgroup);
01204 }
01205
01206 if (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe) {
01207 ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, ts, mkv->cluster_pos);
01208 if (ret < 0) return ret;
01209 }
01210
01211 mkv->duration = FFMAX(mkv->duration, ts + duration);
01212 return 0;
01213 }
01214
01215 static int mkv_copy_packet(MatroskaMuxContext *mkv, const AVPacket *pkt)
01216 {
01217 uint8_t *data = mkv->cur_audio_pkt.data;
01218 mkv->cur_audio_pkt = *pkt;
01219 mkv->cur_audio_pkt.data = av_fast_realloc(data, &mkv->audio_buffer_size, pkt->size);
01220 if (!mkv->cur_audio_pkt.data)
01221 return AVERROR(ENOMEM);
01222
01223 memcpy(mkv->cur_audio_pkt.data, pkt->data, pkt->size);
01224 mkv->cur_audio_pkt.size = pkt->size;
01225 return 0;
01226 }
01227
01228 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
01229 {
01230 MatroskaMuxContext *mkv = s->priv_data;
01231 AVIOContext *pb = s->pb->seekable ? s->pb : mkv->dyn_bc;
01232 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
01233 int ret, keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
01234 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
01235 int cluster_size = avio_tell(pb) - (s->pb->seekable ? mkv->cluster_pos : 0);
01236
01237
01238
01239 if (mkv->cluster_pos != -1 &&
01240 ((!s->pb->seekable && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000))
01241 || cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000
01242 || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) {
01243 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64
01244 " bytes, pts %" PRIu64 "\n", avio_tell(pb), ts);
01245 end_ebml_master(pb, mkv->cluster);
01246 mkv->cluster_pos = -1;
01247 if (mkv->dyn_bc)
01248 mkv_flush_dynbuf(s);
01249 }
01250
01251
01252 if (mkv->cur_audio_pkt.size > 0) {
01253 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
01254 mkv->cur_audio_pkt.size = 0;
01255 if (ret < 0) {
01256 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
01257 return ret;
01258 }
01259 }
01260
01261
01262
01263 if (codec->codec_type == AVMEDIA_TYPE_AUDIO)
01264 ret = mkv_copy_packet(mkv, pkt);
01265 else
01266 ret = mkv_write_packet_internal(s, pkt);
01267 return ret;
01268 }
01269
01270 static int mkv_write_trailer(AVFormatContext *s)
01271 {
01272 MatroskaMuxContext *mkv = s->priv_data;
01273 AVIOContext *pb = s->pb;
01274 int64_t currentpos, cuespos;
01275 int ret;
01276
01277
01278 if (mkv->cur_audio_pkt.size > 0) {
01279 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
01280 mkv->cur_audio_pkt.size = 0;
01281 if (ret < 0) {
01282 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
01283 return ret;
01284 }
01285 }
01286
01287 if (mkv->dyn_bc) {
01288 end_ebml_master(mkv->dyn_bc, mkv->cluster);
01289 mkv_flush_dynbuf(s);
01290 } else if (mkv->cluster_pos != -1) {
01291 end_ebml_master(pb, mkv->cluster);
01292 }
01293
01294 if (pb->seekable) {
01295 if (mkv->cues->num_entries) {
01296 cuespos = mkv_write_cues(pb, mkv->cues, s->nb_streams);
01297
01298 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES, cuespos);
01299 if (ret < 0) return ret;
01300 }
01301
01302 mkv_write_seekhead(pb, mkv->main_seekhead);
01303
01304
01305 av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
01306 currentpos = avio_tell(pb);
01307 avio_seek(pb, mkv->duration_offset, SEEK_SET);
01308 put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration);
01309
01310 avio_seek(pb, currentpos, SEEK_SET);
01311 }
01312
01313 end_ebml_master(pb, mkv->segment);
01314 av_free(mkv->tracks);
01315 av_freep(&mkv->cues->entries);
01316 av_freep(&mkv->cues);
01317 av_destruct_packet(&mkv->cur_audio_pkt);
01318
01319 return 0;
01320 }
01321
01322 static int mkv_query_codec(enum AVCodecID codec_id, int std_compliance)
01323 {
01324 int i;
01325 for (i = 0; ff_mkv_codec_tags[i].id != AV_CODEC_ID_NONE; i++)
01326 if (ff_mkv_codec_tags[i].id == codec_id)
01327 return 1;
01328
01329 if (std_compliance < FF_COMPLIANCE_NORMAL) {
01330 enum AVMediaType type = avcodec_get_type(codec_id);
01331 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO)
01332 return 1;
01333 }
01334
01335 return 0;
01336 }
01337
01338 #if CONFIG_MATROSKA_MUXER
01339 AVOutputFormat ff_matroska_muxer = {
01340 .name = "matroska",
01341 .long_name = NULL_IF_CONFIG_SMALL("Matroska"),
01342 .mime_type = "video/x-matroska",
01343 .extensions = "mkv",
01344 .priv_data_size = sizeof(MatroskaMuxContext),
01345 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
01346 AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
01347 .video_codec = CONFIG_LIBX264_ENCODER ?
01348 AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4,
01349 .write_header = mkv_write_header,
01350 .write_packet = mkv_write_packet,
01351 .write_trailer = mkv_write_trailer,
01352 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
01353 AVFMT_TS_NONSTRICT,
01354 .subtitle_codec = AV_CODEC_ID_SSA,
01355 .query_codec = mkv_query_codec,
01356 };
01357 #endif
01358
01359 #if CONFIG_WEBM_MUXER
01360 AVOutputFormat ff_webm_muxer = {
01361 .name = "webm",
01362 .long_name = NULL_IF_CONFIG_SMALL("WebM"),
01363 .mime_type = "video/webm",
01364 .extensions = "webm",
01365 .priv_data_size = sizeof(MatroskaMuxContext),
01366 .audio_codec = AV_CODEC_ID_VORBIS,
01367 .video_codec = AV_CODEC_ID_VP8,
01368 .write_header = mkv_write_header,
01369 .write_packet = mkv_write_packet,
01370 .write_trailer = mkv_write_trailer,
01371 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
01372 AVFMT_TS_NONSTRICT,
01373 };
01374 #endif
01375
01376 #if CONFIG_MATROSKA_AUDIO_MUXER
01377 AVOutputFormat ff_matroska_audio_muxer = {
01378 .name = "matroska",
01379 .long_name = NULL_IF_CONFIG_SMALL("Matroska"),
01380 .mime_type = "audio/x-matroska",
01381 .extensions = "mka",
01382 .priv_data_size = sizeof(MatroskaMuxContext),
01383 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
01384 AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
01385 .video_codec = AV_CODEC_ID_NONE,
01386 .write_header = mkv_write_header,
01387 .write_packet = mkv_write_packet,
01388 .write_trailer = mkv_write_trailer,
01389 .flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
01390 };
01391 #endif