annotate ffmpeg/libavformat/matroskaenc.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * Matroska muxer
yading@11 3 * Copyright (c) 2007 David Conrad
yading@11 4 *
yading@11 5 * This file is part of FFmpeg.
yading@11 6 *
yading@11 7 * FFmpeg is free software; you can redistribute it and/or
yading@11 8 * modify it under the terms of the GNU Lesser General Public
yading@11 9 * License as published by the Free Software Foundation; either
yading@11 10 * version 2.1 of the License, or (at your option) any later version.
yading@11 11 *
yading@11 12 * FFmpeg is distributed in the hope that it will be useful,
yading@11 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 15 * Lesser General Public License for more details.
yading@11 16 *
yading@11 17 * You should have received a copy of the GNU Lesser General Public
yading@11 18 * License along with FFmpeg; if not, write to the Free Software
yading@11 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 20 */
yading@11 21
yading@11 22 #include "avformat.h"
yading@11 23 #include "internal.h"
yading@11 24 #include "riff.h"
yading@11 25 #include "isom.h"
yading@11 26 #include "matroska.h"
yading@11 27 #include "avc.h"
yading@11 28 #include "flacenc.h"
yading@11 29 #include "avlanguage.h"
yading@11 30 #include "libavutil/samplefmt.h"
yading@11 31 #include "libavutil/sha.h"
yading@11 32 #include "libavutil/intreadwrite.h"
yading@11 33 #include "libavutil/intfloat.h"
yading@11 34 #include "libavutil/mathematics.h"
yading@11 35 #include "libavutil/random_seed.h"
yading@11 36 #include "libavutil/lfg.h"
yading@11 37 #include "libavutil/dict.h"
yading@11 38 #include "libavutil/avstring.h"
yading@11 39 #include "libavcodec/xiph.h"
yading@11 40 #include "libavcodec/mpeg4audio.h"
yading@11 41
yading@11 42 typedef struct ebml_master {
yading@11 43 int64_t pos; ///< absolute offset in the file where the master's elements start
yading@11 44 int sizebytes; ///< how many bytes were reserved for the size
yading@11 45 } ebml_master;
yading@11 46
yading@11 47 typedef struct mkv_seekhead_entry {
yading@11 48 unsigned int elementid;
yading@11 49 uint64_t segmentpos;
yading@11 50 } mkv_seekhead_entry;
yading@11 51
yading@11 52 typedef struct mkv_seekhead {
yading@11 53 int64_t filepos;
yading@11 54 int64_t segment_offset; ///< the file offset to the beginning of the segment
yading@11 55 int reserved_size; ///< -1 if appending to file
yading@11 56 int max_entries;
yading@11 57 mkv_seekhead_entry *entries;
yading@11 58 int num_entries;
yading@11 59 } mkv_seekhead;
yading@11 60
yading@11 61 typedef struct {
yading@11 62 uint64_t pts;
yading@11 63 int tracknum;
yading@11 64 int64_t cluster_pos; ///< file offset of the cluster containing the block
yading@11 65 } mkv_cuepoint;
yading@11 66
yading@11 67 typedef struct {
yading@11 68 int64_t segment_offset;
yading@11 69 mkv_cuepoint *entries;
yading@11 70 int num_entries;
yading@11 71 } mkv_cues;
yading@11 72
yading@11 73 typedef struct {
yading@11 74 int write_dts;
yading@11 75 int has_cue;
yading@11 76 } mkv_track;
yading@11 77
yading@11 78 #define MODE_MATROSKAv2 0x01
yading@11 79 #define MODE_WEBM 0x02
yading@11 80
yading@11 81 typedef struct MatroskaMuxContext {
yading@11 82 int mode;
yading@11 83 AVIOContext *dyn_bc;
yading@11 84 ebml_master segment;
yading@11 85 int64_t segment_offset;
yading@11 86 ebml_master cluster;
yading@11 87 int64_t cluster_pos; ///< file offset of the current cluster
yading@11 88 int64_t cluster_pts;
yading@11 89 int64_t duration_offset;
yading@11 90 int64_t duration;
yading@11 91 mkv_seekhead *main_seekhead;
yading@11 92 mkv_cues *cues;
yading@11 93 mkv_track *tracks;
yading@11 94
yading@11 95 AVPacket cur_audio_pkt;
yading@11 96
yading@11 97 int have_attachments;
yading@11 98 } MatroskaMuxContext;
yading@11 99
yading@11 100
yading@11 101 /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
yading@11 102 * offset, 4 bytes for target EBML ID */
yading@11 103 #define MAX_SEEKENTRY_SIZE 21
yading@11 104
yading@11 105 /** per-cuepoint-track - 3 1-byte EBML IDs, 3 1-byte EBML sizes, 2
yading@11 106 * 8-byte uint max */
yading@11 107 #define MAX_CUETRACKPOS_SIZE 22
yading@11 108
yading@11 109 /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */
yading@11 110 #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks
yading@11 111
yading@11 112
yading@11 113 static int ebml_id_size(unsigned int id)
yading@11 114 {
yading@11 115 return (av_log2(id+1)-1)/7+1;
yading@11 116 }
yading@11 117
yading@11 118 static void put_ebml_id(AVIOContext *pb, unsigned int id)
yading@11 119 {
yading@11 120 int i = ebml_id_size(id);
yading@11 121 while (i--)
yading@11 122 avio_w8(pb, (uint8_t)(id >> (i*8)));
yading@11 123 }
yading@11 124
yading@11 125 /**
yading@11 126 * Write an EBML size meaning "unknown size".
yading@11 127 *
yading@11 128 * @param bytes The number of bytes the size should occupy (maximum: 8).
yading@11 129 */
yading@11 130 static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
yading@11 131 {
yading@11 132 av_assert0(bytes <= 8);
yading@11 133 avio_w8(pb, 0x1ff >> bytes);
yading@11 134 while (--bytes)
yading@11 135 avio_w8(pb, 0xff);
yading@11 136 }
yading@11 137
yading@11 138 /**
yading@11 139 * Calculate how many bytes are needed to represent a given number in EBML.
yading@11 140 */
yading@11 141 static int ebml_num_size(uint64_t num)
yading@11 142 {
yading@11 143 int bytes = 1;
yading@11 144 while ((num+1) >> bytes*7) bytes++;
yading@11 145 return bytes;
yading@11 146 }
yading@11 147
yading@11 148 /**
yading@11 149 * Write a number in EBML variable length format.
yading@11 150 *
yading@11 151 * @param bytes The number of bytes that need to be used to write the number.
yading@11 152 * If zero, any number of bytes can be used.
yading@11 153 */
yading@11 154 static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
yading@11 155 {
yading@11 156 int i, needed_bytes = ebml_num_size(num);
yading@11 157
yading@11 158 // sizes larger than this are currently undefined in EBML
yading@11 159 av_assert0(num < (1ULL<<56)-1);
yading@11 160
yading@11 161 if (bytes == 0)
yading@11 162 // don't care how many bytes are used, so use the min
yading@11 163 bytes = needed_bytes;
yading@11 164 // the bytes needed to write the given size would exceed the bytes
yading@11 165 // that we need to use, so write unknown size. This shouldn't happen.
yading@11 166 av_assert0(bytes >= needed_bytes);
yading@11 167
yading@11 168 num |= 1ULL << bytes*7;
yading@11 169 for (i = bytes - 1; i >= 0; i--)
yading@11 170 avio_w8(pb, (uint8_t)(num >> i*8));
yading@11 171 }
yading@11 172
yading@11 173 static void put_ebml_uint(AVIOContext *pb, unsigned int elementid, uint64_t val)
yading@11 174 {
yading@11 175 int i, bytes = 1;
yading@11 176 uint64_t tmp = val;
yading@11 177 while (tmp>>=8) bytes++;
yading@11 178
yading@11 179 put_ebml_id(pb, elementid);
yading@11 180 put_ebml_num(pb, bytes, 0);
yading@11 181 for (i = bytes - 1; i >= 0; i--)
yading@11 182 avio_w8(pb, (uint8_t)(val >> i*8));
yading@11 183 }
yading@11 184
yading@11 185 static void put_ebml_float(AVIOContext *pb, unsigned int elementid, double val)
yading@11 186 {
yading@11 187 put_ebml_id(pb, elementid);
yading@11 188 put_ebml_num(pb, 8, 0);
yading@11 189 avio_wb64(pb, av_double2int(val));
yading@11 190 }
yading@11 191
yading@11 192 static void put_ebml_binary(AVIOContext *pb, unsigned int elementid,
yading@11 193 const void *buf, int size)
yading@11 194 {
yading@11 195 put_ebml_id(pb, elementid);
yading@11 196 put_ebml_num(pb, size, 0);
yading@11 197 avio_write(pb, buf, size);
yading@11 198 }
yading@11 199
yading@11 200 static void put_ebml_string(AVIOContext *pb, unsigned int elementid, const char *str)
yading@11 201 {
yading@11 202 put_ebml_binary(pb, elementid, str, strlen(str));
yading@11 203 }
yading@11 204
yading@11 205 /**
yading@11 206 * Write a void element of a given size. Useful for reserving space in
yading@11 207 * the file to be written to later.
yading@11 208 *
yading@11 209 * @param size The number of bytes to reserve, which must be at least 2.
yading@11 210 */
yading@11 211 static void put_ebml_void(AVIOContext *pb, uint64_t size)
yading@11 212 {
yading@11 213 int64_t currentpos = avio_tell(pb);
yading@11 214
yading@11 215 av_assert0(size >= 2);
yading@11 216
yading@11 217 put_ebml_id(pb, EBML_ID_VOID);
yading@11 218 // we need to subtract the length needed to store the size from the
yading@11 219 // size we need to reserve so 2 cases, we use 8 bytes to store the
yading@11 220 // size if possible, 1 byte otherwise
yading@11 221 if (size < 10)
yading@11 222 put_ebml_num(pb, size-1, 0);
yading@11 223 else
yading@11 224 put_ebml_num(pb, size-9, 8);
yading@11 225 while(avio_tell(pb) < currentpos + size)
yading@11 226 avio_w8(pb, 0);
yading@11 227 }
yading@11 228
yading@11 229 static ebml_master start_ebml_master(AVIOContext *pb, unsigned int elementid, uint64_t expectedsize)
yading@11 230 {
yading@11 231 int bytes = expectedsize ? ebml_num_size(expectedsize) : 8;
yading@11 232 put_ebml_id(pb, elementid);
yading@11 233 put_ebml_size_unknown(pb, bytes);
yading@11 234 return (ebml_master){ avio_tell(pb), bytes };
yading@11 235 }
yading@11 236
yading@11 237 static void end_ebml_master(AVIOContext *pb, ebml_master master)
yading@11 238 {
yading@11 239 int64_t pos = avio_tell(pb);
yading@11 240
yading@11 241 if (avio_seek(pb, master.pos - master.sizebytes, SEEK_SET) < 0)
yading@11 242 return;
yading@11 243 put_ebml_num(pb, pos - master.pos, master.sizebytes);
yading@11 244 avio_seek(pb, pos, SEEK_SET);
yading@11 245 }
yading@11 246
yading@11 247 static void put_xiph_size(AVIOContext *pb, int size)
yading@11 248 {
yading@11 249 int i;
yading@11 250 for (i = 0; i < size / 255; i++)
yading@11 251 avio_w8(pb, 255);
yading@11 252 avio_w8(pb, size % 255);
yading@11 253 }
yading@11 254
yading@11 255 /**
yading@11 256 * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
yading@11 257 * elements. If a maximum number of elements is specified, enough space
yading@11 258 * will be reserved at the current file location to write a seek head of
yading@11 259 * that size.
yading@11 260 *
yading@11 261 * @param segment_offset The absolute offset to the position in the file
yading@11 262 * where the segment begins.
yading@11 263 * @param numelements The maximum number of elements that will be indexed
yading@11 264 * by this seek head, 0 if unlimited.
yading@11 265 */
yading@11 266 static mkv_seekhead * mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset, int numelements)
yading@11 267 {
yading@11 268 mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
yading@11 269 if (new_seekhead == NULL)
yading@11 270 return NULL;
yading@11 271
yading@11 272 new_seekhead->segment_offset = segment_offset;
yading@11 273
yading@11 274 if (numelements > 0) {
yading@11 275 new_seekhead->filepos = avio_tell(pb);
yading@11 276 // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
yading@11 277 // and size, and 3 bytes to guarantee that an EBML void element
yading@11 278 // will fit afterwards
yading@11 279 new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 13;
yading@11 280 new_seekhead->max_entries = numelements;
yading@11 281 put_ebml_void(pb, new_seekhead->reserved_size);
yading@11 282 }
yading@11 283 return new_seekhead;
yading@11 284 }
yading@11 285
yading@11 286 static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
yading@11 287 {
yading@11 288 mkv_seekhead_entry *entries = seekhead->entries;
yading@11 289
yading@11 290 // don't store more elements than we reserved space for
yading@11 291 if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
yading@11 292 return -1;
yading@11 293
yading@11 294 entries = av_realloc(entries, (seekhead->num_entries + 1) * sizeof(mkv_seekhead_entry));
yading@11 295 if (entries == NULL)
yading@11 296 return AVERROR(ENOMEM);
yading@11 297
yading@11 298 entries[seekhead->num_entries ].elementid = elementid;
yading@11 299 entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
yading@11 300
yading@11 301 seekhead->entries = entries;
yading@11 302 return 0;
yading@11 303 }
yading@11 304
yading@11 305 /**
yading@11 306 * Write the seek head to the file and free it. If a maximum number of
yading@11 307 * elements was specified to mkv_start_seekhead(), the seek head will
yading@11 308 * be written at the location reserved for it. Otherwise, it is written
yading@11 309 * at the current location in the file.
yading@11 310 *
yading@11 311 * @return The file offset where the seekhead was written,
yading@11 312 * -1 if an error occurred.
yading@11 313 */
yading@11 314 static int64_t mkv_write_seekhead(AVIOContext *pb, mkv_seekhead *seekhead)
yading@11 315 {
yading@11 316 ebml_master metaseek, seekentry;
yading@11 317 int64_t currentpos;
yading@11 318 int i;
yading@11 319
yading@11 320 currentpos = avio_tell(pb);
yading@11 321
yading@11 322 if (seekhead->reserved_size > 0) {
yading@11 323 if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) {
yading@11 324 currentpos = -1;
yading@11 325 goto fail;
yading@11 326 }
yading@11 327 }
yading@11 328
yading@11 329 metaseek = start_ebml_master(pb, MATROSKA_ID_SEEKHEAD, seekhead->reserved_size);
yading@11 330 for (i = 0; i < seekhead->num_entries; i++) {
yading@11 331 mkv_seekhead_entry *entry = &seekhead->entries[i];
yading@11 332
yading@11 333 seekentry = start_ebml_master(pb, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE);
yading@11 334
yading@11 335 put_ebml_id(pb, MATROSKA_ID_SEEKID);
yading@11 336 put_ebml_num(pb, ebml_id_size(entry->elementid), 0);
yading@11 337 put_ebml_id(pb, entry->elementid);
yading@11 338
yading@11 339 put_ebml_uint(pb, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
yading@11 340 end_ebml_master(pb, seekentry);
yading@11 341 }
yading@11 342 end_ebml_master(pb, metaseek);
yading@11 343
yading@11 344 if (seekhead->reserved_size > 0) {
yading@11 345 uint64_t remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
yading@11 346 put_ebml_void(pb, remaining);
yading@11 347 avio_seek(pb, currentpos, SEEK_SET);
yading@11 348
yading@11 349 currentpos = seekhead->filepos;
yading@11 350 }
yading@11 351 fail:
yading@11 352 av_free(seekhead->entries);
yading@11 353 av_free(seekhead);
yading@11 354
yading@11 355 return currentpos;
yading@11 356 }
yading@11 357
yading@11 358 static mkv_cues * mkv_start_cues(int64_t segment_offset)
yading@11 359 {
yading@11 360 mkv_cues *cues = av_mallocz(sizeof(mkv_cues));
yading@11 361 if (cues == NULL)
yading@11 362 return NULL;
yading@11 363
yading@11 364 cues->segment_offset = segment_offset;
yading@11 365 return cues;
yading@11 366 }
yading@11 367
yading@11 368 static int mkv_add_cuepoint(mkv_cues *cues, int stream, int64_t ts, int64_t cluster_pos)
yading@11 369 {
yading@11 370 mkv_cuepoint *entries = cues->entries;
yading@11 371
yading@11 372 if (ts < 0)
yading@11 373 return 0;
yading@11 374
yading@11 375 entries = av_realloc(entries, (cues->num_entries + 1) * sizeof(mkv_cuepoint));
yading@11 376 if (entries == NULL)
yading@11 377 return AVERROR(ENOMEM);
yading@11 378
yading@11 379 entries[cues->num_entries ].pts = ts;
yading@11 380 entries[cues->num_entries ].tracknum = stream + 1;
yading@11 381 entries[cues->num_entries++].cluster_pos = cluster_pos - cues->segment_offset;
yading@11 382
yading@11 383 cues->entries = entries;
yading@11 384 return 0;
yading@11 385 }
yading@11 386
yading@11 387 static int64_t mkv_write_cues(AVIOContext *pb, mkv_cues *cues, mkv_track *tracks, int num_tracks)
yading@11 388 {
yading@11 389 ebml_master cues_element;
yading@11 390 int64_t currentpos;
yading@11 391 int i, j;
yading@11 392
yading@11 393 currentpos = avio_tell(pb);
yading@11 394 cues_element = start_ebml_master(pb, MATROSKA_ID_CUES, 0);
yading@11 395
yading@11 396 for (i = 0; i < cues->num_entries; i++) {
yading@11 397 ebml_master cuepoint, track_positions;
yading@11 398 mkv_cuepoint *entry = &cues->entries[i];
yading@11 399 uint64_t pts = entry->pts;
yading@11 400
yading@11 401 cuepoint = start_ebml_master(pb, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(num_tracks));
yading@11 402 put_ebml_uint(pb, MATROSKA_ID_CUETIME, pts);
yading@11 403
yading@11 404 // put all the entries from different tracks that have the exact same
yading@11 405 // timestamp into the same CuePoint
yading@11 406 for (j = 0; j < num_tracks; j++)
yading@11 407 tracks[j].has_cue = 0;
yading@11 408 for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
yading@11 409 int tracknum = entry[j].tracknum - 1;
yading@11 410 av_assert0(tracknum>=0 && tracknum<num_tracks);
yading@11 411 if (tracks[tracknum].has_cue)
yading@11 412 continue;
yading@11 413 tracks[tracknum].has_cue = 1;
yading@11 414 track_positions = start_ebml_master(pb, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
yading@11 415 put_ebml_uint(pb, MATROSKA_ID_CUETRACK , entry[j].tracknum );
yading@11 416 put_ebml_uint(pb, MATROSKA_ID_CUECLUSTERPOSITION, entry[j].cluster_pos);
yading@11 417 end_ebml_master(pb, track_positions);
yading@11 418 }
yading@11 419 i += j - 1;
yading@11 420 end_ebml_master(pb, cuepoint);
yading@11 421 }
yading@11 422 end_ebml_master(pb, cues_element);
yading@11 423
yading@11 424 return currentpos;
yading@11 425 }
yading@11 426
yading@11 427 static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecContext *codec)
yading@11 428 {
yading@11 429 uint8_t *header_start[3];
yading@11 430 int header_len[3];
yading@11 431 int first_header_size;
yading@11 432 int j;
yading@11 433
yading@11 434 if (codec->codec_id == AV_CODEC_ID_VORBIS)
yading@11 435 first_header_size = 30;
yading@11 436 else
yading@11 437 first_header_size = 42;
yading@11 438
yading@11 439 if (avpriv_split_xiph_headers(codec->extradata, codec->extradata_size,
yading@11 440 first_header_size, header_start, header_len) < 0) {
yading@11 441 av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
yading@11 442 return -1;
yading@11 443 }
yading@11 444
yading@11 445 avio_w8(pb, 2); // number packets - 1
yading@11 446 for (j = 0; j < 2; j++) {
yading@11 447 put_xiph_size(pb, header_len[j]);
yading@11 448 }
yading@11 449 for (j = 0; j < 3; j++)
yading@11 450 avio_write(pb, header_start[j], header_len[j]);
yading@11 451
yading@11 452 return 0;
yading@11 453 }
yading@11 454
yading@11 455 static void get_aac_sample_rates(AVFormatContext *s, AVCodecContext *codec, int *sample_rate, int *output_sample_rate)
yading@11 456 {
yading@11 457 MPEG4AudioConfig mp4ac;
yading@11 458
yading@11 459 if (avpriv_mpeg4audio_get_config(&mp4ac, codec->extradata,
yading@11 460 codec->extradata_size * 8, 1) < 0) {
yading@11 461 av_log(s, AV_LOG_WARNING, "Error parsing AAC extradata, unable to determine samplerate.\n");
yading@11 462 return;
yading@11 463 }
yading@11 464
yading@11 465 *sample_rate = mp4ac.sample_rate;
yading@11 466 *output_sample_rate = mp4ac.ext_sample_rate;
yading@11 467 }
yading@11 468
yading@11 469 static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, AVCodecContext *codec, int native_id, int qt_id)
yading@11 470 {
yading@11 471 AVIOContext *dyn_cp;
yading@11 472 uint8_t *codecpriv;
yading@11 473 int ret, codecpriv_size;
yading@11 474
yading@11 475 ret = avio_open_dyn_buf(&dyn_cp);
yading@11 476 if(ret < 0)
yading@11 477 return ret;
yading@11 478
yading@11 479 if (native_id) {
yading@11 480 if (codec->codec_id == AV_CODEC_ID_VORBIS || codec->codec_id == AV_CODEC_ID_THEORA)
yading@11 481 ret = put_xiph_codecpriv(s, dyn_cp, codec);
yading@11 482 else if (codec->codec_id == AV_CODEC_ID_FLAC)
yading@11 483 ret = ff_flac_write_header(dyn_cp, codec, 1);
yading@11 484 else if (codec->codec_id == AV_CODEC_ID_H264)
yading@11 485 ret = ff_isom_write_avcc(dyn_cp, codec->extradata, codec->extradata_size);
yading@11 486 else if (codec->codec_id == AV_CODEC_ID_ALAC) {
yading@11 487 if (codec->extradata_size < 36) {
yading@11 488 av_log(s, AV_LOG_ERROR,
yading@11 489 "Invalid extradata found, ALAC expects a 36-byte "
yading@11 490 "QuickTime atom.");
yading@11 491 ret = AVERROR_INVALIDDATA;
yading@11 492 } else
yading@11 493 avio_write(dyn_cp, codec->extradata + 12,
yading@11 494 codec->extradata_size - 12);
yading@11 495 }
yading@11 496 else if (codec->extradata_size && codec->codec_id != AV_CODEC_ID_TTA)
yading@11 497 avio_write(dyn_cp, codec->extradata, codec->extradata_size);
yading@11 498 } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
yading@11 499 if (qt_id) {
yading@11 500 if (!codec->codec_tag)
yading@11 501 codec->codec_tag = ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id);
yading@11 502 if (codec->extradata_size)
yading@11 503 avio_write(dyn_cp, codec->extradata, codec->extradata_size);
yading@11 504 } else {
yading@11 505 if (!codec->codec_tag)
yading@11 506 codec->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id);
yading@11 507 if (!codec->codec_tag) {
yading@11 508 av_log(s, AV_LOG_ERROR, "No bmp codec tag found for codec %s\n",
yading@11 509 avcodec_get_name(codec->codec_id));
yading@11 510 ret = AVERROR(EINVAL);
yading@11 511 }
yading@11 512
yading@11 513 ff_put_bmp_header(dyn_cp, codec, ff_codec_bmp_tags, 0);
yading@11 514 }
yading@11 515
yading@11 516 } else if (codec->codec_type == AVMEDIA_TYPE_AUDIO) {
yading@11 517 unsigned int tag;
yading@11 518 tag = ff_codec_get_tag(ff_codec_wav_tags, codec->codec_id);
yading@11 519 if (!tag) {
yading@11 520 av_log(s, AV_LOG_ERROR, "No wav codec tag found for codec %s\n",
yading@11 521 avcodec_get_name(codec->codec_id));
yading@11 522 ret = AVERROR(EINVAL);
yading@11 523 }
yading@11 524 if (!codec->codec_tag)
yading@11 525 codec->codec_tag = tag;
yading@11 526
yading@11 527 ff_put_wav_header(dyn_cp, codec);
yading@11 528 }
yading@11 529
yading@11 530 codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv);
yading@11 531 if (codecpriv_size)
yading@11 532 put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, codecpriv_size);
yading@11 533 av_free(codecpriv);
yading@11 534 return ret;
yading@11 535 }
yading@11 536
yading@11 537 static int mkv_write_tracks(AVFormatContext *s)
yading@11 538 {
yading@11 539 MatroskaMuxContext *mkv = s->priv_data;
yading@11 540 AVIOContext *pb = s->pb;
yading@11 541 ebml_master tracks;
yading@11 542 int i, j, ret, default_stream_exists = 0;
yading@11 543
yading@11 544 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
yading@11 545 if (ret < 0) return ret;
yading@11 546
yading@11 547 tracks = start_ebml_master(pb, MATROSKA_ID_TRACKS, 0);
yading@11 548 for (i = 0; i < s->nb_streams; i++) {
yading@11 549 AVStream *st = s->streams[i];
yading@11 550 default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT;
yading@11 551 }
yading@11 552 for (i = 0; i < s->nb_streams; i++) {
yading@11 553 AVStream *st = s->streams[i];
yading@11 554 AVCodecContext *codec = st->codec;
yading@11 555 ebml_master subinfo, track;
yading@11 556 int native_id = 0;
yading@11 557 int qt_id = 0;
yading@11 558 int bit_depth = av_get_bits_per_sample(codec->codec_id);
yading@11 559 int sample_rate = codec->sample_rate;
yading@11 560 int output_sample_rate = 0;
yading@11 561 AVDictionaryEntry *tag;
yading@11 562
yading@11 563 if (codec->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
yading@11 564 mkv->have_attachments = 1;
yading@11 565 continue;
yading@11 566 }
yading@11 567
yading@11 568 if (!bit_depth)
yading@11 569 bit_depth = av_get_bytes_per_sample(codec->sample_fmt) << 3;
yading@11 570 if (!bit_depth)
yading@11 571 bit_depth = codec->bits_per_coded_sample;
yading@11 572
yading@11 573 if (codec->codec_id == AV_CODEC_ID_AAC)
yading@11 574 get_aac_sample_rates(s, codec, &sample_rate, &output_sample_rate);
yading@11 575
yading@11 576 track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
yading@11 577 put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER , i + 1);
yading@11 578 put_ebml_uint (pb, MATROSKA_ID_TRACKUID , i + 1);
yading@11 579 put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet)
yading@11 580
yading@11 581 if ((tag = av_dict_get(st->metadata, "title", NULL, 0)))
yading@11 582 put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value);
yading@11 583 tag = av_dict_get(st->metadata, "language", NULL, 0);
yading@11 584 put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag ? tag->value:"und");
yading@11 585
yading@11 586 if (default_stream_exists) {
yading@11 587 put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT));
yading@11 588 }
yading@11 589 if (st->disposition & AV_DISPOSITION_FORCED)
yading@11 590 put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1);
yading@11 591
yading@11 592 // look for a codec ID string specific to mkv to use,
yading@11 593 // if none are found, use AVI codes
yading@11 594 for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
yading@11 595 if (ff_mkv_codec_tags[j].id == codec->codec_id) {
yading@11 596 put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str);
yading@11 597 native_id = 1;
yading@11 598 break;
yading@11 599 }
yading@11 600 }
yading@11 601
yading@11 602 if (mkv->mode == MODE_WEBM && !(codec->codec_id == AV_CODEC_ID_VP8 ||
yading@11 603 codec->codec_id == AV_CODEC_ID_VORBIS)) {
yading@11 604 av_log(s, AV_LOG_ERROR,
yading@11 605 "Only VP8 video and Vorbis audio are supported for WebM.\n");
yading@11 606 return AVERROR(EINVAL);
yading@11 607 }
yading@11 608
yading@11 609 switch (codec->codec_type) {
yading@11 610 case AVMEDIA_TYPE_VIDEO:
yading@11 611 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
yading@11 612 if(st->avg_frame_rate.num && st->avg_frame_rate.den && 1.0/av_q2d(st->avg_frame_rate) > av_q2d(codec->time_base))
yading@11 613 put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1E9/av_q2d(st->avg_frame_rate));
yading@11 614 else
yading@11 615 put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9);
yading@11 616
yading@11 617 if (!native_id &&
yading@11 618 ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id) &&
yading@11 619 (!ff_codec_get_tag(ff_codec_bmp_tags, codec->codec_id)
yading@11 620 || codec->codec_id == AV_CODEC_ID_SVQ1
yading@11 621 || codec->codec_id == AV_CODEC_ID_SVQ3
yading@11 622 || codec->codec_id == AV_CODEC_ID_CINEPAK))
yading@11 623 qt_id = 1;
yading@11 624
yading@11 625 if (qt_id)
yading@11 626 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_QUICKTIME");
yading@11 627 else if (!native_id) {
yading@11 628 // if there is no mkv-specific codec ID, use VFW mode
yading@11 629 put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC");
yading@11 630 mkv->tracks[i].write_dts = 1;
yading@11 631 }
yading@11 632
yading@11 633 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0);
yading@11 634 // XXX: interlace flag?
yading@11 635 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
yading@11 636 put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
yading@11 637
yading@11 638 if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
yading@11 639 (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
yading@11 640 // save stereo mode flag
yading@11 641 uint64_t st_mode = MATROSKA_VIDEO_STEREO_MODE_COUNT;
yading@11 642
yading@11 643 for (j=0; j<MATROSKA_VIDEO_STEREO_MODE_COUNT; j++)
yading@11 644 if (!strcmp(tag->value, ff_matroska_video_stereo_mode[j])){
yading@11 645 st_mode = j;
yading@11 646 break;
yading@11 647 }
yading@11 648
yading@11 649 if ((mkv->mode == MODE_WEBM && st_mode > 3 && st_mode != 11)
yading@11 650 || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
yading@11 651 av_log(s, AV_LOG_ERROR,
yading@11 652 "The specified stereo mode is not valid.\n");
yading@11 653 return AVERROR(EINVAL);
yading@11 654 } else
yading@11 655 put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, st_mode);
yading@11 656 }
yading@11 657
yading@11 658 if (st->sample_aspect_ratio.num) {
yading@11 659 int64_t d_width = av_rescale(codec->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
yading@11 660 if (d_width > INT_MAX) {
yading@11 661 av_log(s, AV_LOG_ERROR, "Overflow in display width\n");
yading@11 662 return AVERROR(EINVAL);
yading@11 663 }
yading@11 664 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width);
yading@11 665 put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height);
yading@11 666 }
yading@11 667
yading@11 668 if (codec->codec_id == AV_CODEC_ID_RAWVIDEO) {
yading@11 669 uint32_t color_space = av_le2ne32(codec->codec_tag);
yading@11 670 put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space));
yading@11 671 }
yading@11 672 end_ebml_master(pb, subinfo);
yading@11 673 break;
yading@11 674
yading@11 675 case AVMEDIA_TYPE_AUDIO:
yading@11 676 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
yading@11 677
yading@11 678 if (!native_id)
yading@11 679 // no mkv-specific ID, use ACM mode
yading@11 680 put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM");
yading@11 681
yading@11 682 subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0);
yading@11 683 put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , codec->channels);
yading@11 684 put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
yading@11 685 if (output_sample_rate)
yading@11 686 put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
yading@11 687 if (bit_depth)
yading@11 688 put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
yading@11 689 end_ebml_master(pb, subinfo);
yading@11 690 break;
yading@11 691
yading@11 692 case AVMEDIA_TYPE_SUBTITLE:
yading@11 693 put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_SUBTITLE);
yading@11 694 if (!native_id) {
yading@11 695 av_log(s, AV_LOG_ERROR, "Subtitle codec %d is not supported.\n", codec->codec_id);
yading@11 696 return AVERROR(ENOSYS);
yading@11 697 }
yading@11 698 break;
yading@11 699 default:
yading@11 700 av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.\n");
yading@11 701 break;
yading@11 702 }
yading@11 703 ret = mkv_write_codecprivate(s, pb, codec, native_id, qt_id);
yading@11 704 if (ret < 0) return ret;
yading@11 705
yading@11 706 end_ebml_master(pb, track);
yading@11 707
yading@11 708 // ms precision is the de-facto standard timescale for mkv files
yading@11 709 avpriv_set_pts_info(st, 64, 1, 1000);
yading@11 710 }
yading@11 711 end_ebml_master(pb, tracks);
yading@11 712 return 0;
yading@11 713 }
yading@11 714
yading@11 715 static int mkv_write_chapters(AVFormatContext *s)
yading@11 716 {
yading@11 717 MatroskaMuxContext *mkv = s->priv_data;
yading@11 718 AVIOContext *pb = s->pb;
yading@11 719 ebml_master chapters, editionentry;
yading@11 720 AVRational scale = {1, 1E9};
yading@11 721 int i, ret;
yading@11 722
yading@11 723 if (!s->nb_chapters)
yading@11 724 return 0;
yading@11 725
yading@11 726 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
yading@11 727 if (ret < 0) return ret;
yading@11 728
yading@11 729 chapters = start_ebml_master(pb, MATROSKA_ID_CHAPTERS , 0);
yading@11 730 editionentry = start_ebml_master(pb, MATROSKA_ID_EDITIONENTRY, 0);
yading@11 731 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGDEFAULT, 1);
yading@11 732 put_ebml_uint(pb, MATROSKA_ID_EDITIONFLAGHIDDEN , 0);
yading@11 733 for (i = 0; i < s->nb_chapters; i++) {
yading@11 734 ebml_master chapteratom, chapterdisplay;
yading@11 735 AVChapter *c = s->chapters[i];
yading@11 736 AVDictionaryEntry *t = NULL;
yading@11 737
yading@11 738 chapteratom = start_ebml_master(pb, MATROSKA_ID_CHAPTERATOM, 0);
yading@11 739 put_ebml_uint(pb, MATROSKA_ID_CHAPTERUID, c->id);
yading@11 740 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMESTART,
yading@11 741 av_rescale_q(c->start, c->time_base, scale));
yading@11 742 put_ebml_uint(pb, MATROSKA_ID_CHAPTERTIMEEND,
yading@11 743 av_rescale_q(c->end, c->time_base, scale));
yading@11 744 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0);
yading@11 745 put_ebml_uint(pb, MATROSKA_ID_CHAPTERFLAGENABLED, 1);
yading@11 746 if ((t = av_dict_get(c->metadata, "title", NULL, 0))) {
yading@11 747 chapterdisplay = start_ebml_master(pb, MATROSKA_ID_CHAPTERDISPLAY, 0);
yading@11 748 put_ebml_string(pb, MATROSKA_ID_CHAPSTRING, t->value);
yading@11 749 put_ebml_string(pb, MATROSKA_ID_CHAPLANG , "und");
yading@11 750 end_ebml_master(pb, chapterdisplay);
yading@11 751 }
yading@11 752 end_ebml_master(pb, chapteratom);
yading@11 753 }
yading@11 754 end_ebml_master(pb, editionentry);
yading@11 755 end_ebml_master(pb, chapters);
yading@11 756 return 0;
yading@11 757 }
yading@11 758
yading@11 759 static void mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t)
yading@11 760 {
yading@11 761 uint8_t *key = av_strdup(t->key);
yading@11 762 uint8_t *p = key;
yading@11 763 const uint8_t *lang = NULL;
yading@11 764 ebml_master tag;
yading@11 765
yading@11 766 if ((p = strrchr(p, '-')) &&
yading@11 767 (lang = av_convert_lang_to(p + 1, AV_LANG_ISO639_2_BIBL)))
yading@11 768 *p = 0;
yading@11 769
yading@11 770 p = key;
yading@11 771 while (*p) {
yading@11 772 if (*p == ' ')
yading@11 773 *p = '_';
yading@11 774 else if (*p >= 'a' && *p <= 'z')
yading@11 775 *p -= 'a' - 'A';
yading@11 776 p++;
yading@11 777 }
yading@11 778
yading@11 779 tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0);
yading@11 780 put_ebml_string(pb, MATROSKA_ID_TAGNAME, key);
yading@11 781 if (lang)
yading@11 782 put_ebml_string(pb, MATROSKA_ID_TAGLANG, lang);
yading@11 783 put_ebml_string(pb, MATROSKA_ID_TAGSTRING, t->value);
yading@11 784 end_ebml_master(pb, tag);
yading@11 785
yading@11 786 av_freep(&key);
yading@11 787 }
yading@11 788
yading@11 789 static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int elementid,
yading@11 790 unsigned int uid, ebml_master *tags)
yading@11 791 {
yading@11 792 MatroskaMuxContext *mkv = s->priv_data;
yading@11 793 ebml_master tag, targets;
yading@11 794 AVDictionaryEntry *t = NULL;
yading@11 795 int ret;
yading@11 796
yading@11 797 if (!tags->pos) {
yading@11 798 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
yading@11 799 if (ret < 0) return ret;
yading@11 800
yading@11 801 *tags = start_ebml_master(s->pb, MATROSKA_ID_TAGS, 0);
yading@11 802 }
yading@11 803
yading@11 804 tag = start_ebml_master(s->pb, MATROSKA_ID_TAG, 0);
yading@11 805 targets = start_ebml_master(s->pb, MATROSKA_ID_TAGTARGETS, 0);
yading@11 806 if (elementid)
yading@11 807 put_ebml_uint(s->pb, elementid, uid);
yading@11 808 end_ebml_master(s->pb, targets);
yading@11 809
yading@11 810 while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
yading@11 811 if (av_strcasecmp(t->key, "title") && av_strcasecmp(t->key, "stereo_mode"))
yading@11 812 mkv_write_simpletag(s->pb, t);
yading@11 813
yading@11 814 end_ebml_master(s->pb, tag);
yading@11 815 return 0;
yading@11 816 }
yading@11 817
yading@11 818 static int mkv_write_tags(AVFormatContext *s)
yading@11 819 {
yading@11 820 ebml_master tags = {0};
yading@11 821 int i, ret;
yading@11 822
yading@11 823 ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL);
yading@11 824
yading@11 825 if (av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
yading@11 826 ret = mkv_write_tag(s, s->metadata, 0, 0, &tags);
yading@11 827 if (ret < 0) return ret;
yading@11 828 }
yading@11 829
yading@11 830 for (i = 0; i < s->nb_streams; i++) {
yading@11 831 AVStream *st = s->streams[i];
yading@11 832
yading@11 833 if (!av_dict_get(st->metadata, "", 0, AV_DICT_IGNORE_SUFFIX))
yading@11 834 continue;
yading@11 835
yading@11 836 ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &tags);
yading@11 837 if (ret < 0) return ret;
yading@11 838 }
yading@11 839
yading@11 840 for (i = 0; i < s->nb_chapters; i++) {
yading@11 841 AVChapter *ch = s->chapters[i];
yading@11 842
yading@11 843 if (!av_dict_get(ch->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
yading@11 844 continue;
yading@11 845
yading@11 846 ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, ch->id, &tags);
yading@11 847 if (ret < 0) return ret;
yading@11 848 }
yading@11 849
yading@11 850 if (tags.pos)
yading@11 851 end_ebml_master(s->pb, tags);
yading@11 852 return 0;
yading@11 853 }
yading@11 854
yading@11 855 static int mkv_write_attachments(AVFormatContext *s)
yading@11 856 {
yading@11 857 MatroskaMuxContext *mkv = s->priv_data;
yading@11 858 AVIOContext *pb = s->pb;
yading@11 859 ebml_master attachments;
yading@11 860 AVLFG c;
yading@11 861 int i, ret;
yading@11 862
yading@11 863 if (!mkv->have_attachments)
yading@11 864 return 0;
yading@11 865
yading@11 866 av_lfg_init(&c, av_get_random_seed());
yading@11 867
yading@11 868 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
yading@11 869 if (ret < 0) return ret;
yading@11 870
yading@11 871 attachments = start_ebml_master(pb, MATROSKA_ID_ATTACHMENTS, 0);
yading@11 872
yading@11 873 for (i = 0; i < s->nb_streams; i++) {
yading@11 874 AVStream *st = s->streams[i];
yading@11 875 ebml_master attached_file;
yading@11 876 AVDictionaryEntry *t;
yading@11 877 const char *mimetype = NULL;
yading@11 878 uint64_t fileuid;
yading@11 879
yading@11 880 if (st->codec->codec_type != AVMEDIA_TYPE_ATTACHMENT)
yading@11 881 continue;
yading@11 882
yading@11 883 attached_file = start_ebml_master(pb, MATROSKA_ID_ATTACHEDFILE, 0);
yading@11 884
yading@11 885 if (t = av_dict_get(st->metadata, "title", NULL, 0))
yading@11 886 put_ebml_string(pb, MATROSKA_ID_FILEDESC, t->value);
yading@11 887 if (!(t = av_dict_get(st->metadata, "filename", NULL, 0))) {
yading@11 888 av_log(s, AV_LOG_ERROR, "Attachment stream %d has no filename tag.\n", i);
yading@11 889 return AVERROR(EINVAL);
yading@11 890 }
yading@11 891 put_ebml_string(pb, MATROSKA_ID_FILENAME, t->value);
yading@11 892 if (t = av_dict_get(st->metadata, "mimetype", NULL, 0))
yading@11 893 mimetype = t->value;
yading@11 894 else if (st->codec->codec_id != AV_CODEC_ID_NONE ) {
yading@11 895 int i;
yading@11 896 for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++)
yading@11 897 if (ff_mkv_mime_tags[i].id == st->codec->codec_id) {
yading@11 898 mimetype = ff_mkv_mime_tags[i].str;
yading@11 899 break;
yading@11 900 }
yading@11 901 }
yading@11 902 if (!mimetype) {
yading@11 903 av_log(s, AV_LOG_ERROR, "Attachment stream %d has no mimetype tag and "
yading@11 904 "it cannot be deduced from the codec id.\n", i);
yading@11 905 return AVERROR(EINVAL);
yading@11 906 }
yading@11 907
yading@11 908 if (st->codec->flags & CODEC_FLAG_BITEXACT) {
yading@11 909 struct AVSHA *sha = av_sha_alloc();
yading@11 910 uint8_t digest[20];
yading@11 911 if (!sha)
yading@11 912 return AVERROR(ENOMEM);
yading@11 913 av_sha_init(sha, 160);
yading@11 914 av_sha_update(sha, st->codec->extradata, st->codec->extradata_size);
yading@11 915 av_sha_final(sha, digest);
yading@11 916 av_free(sha);
yading@11 917 fileuid = AV_RL64(digest);
yading@11 918 } else {
yading@11 919 fileuid = av_lfg_get(&c);
yading@11 920 }
yading@11 921 av_log(s, AV_LOG_VERBOSE, "Using %.16"PRIx64" for attachment %d\n",
yading@11 922 fileuid, i);
yading@11 923
yading@11 924 put_ebml_string(pb, MATROSKA_ID_FILEMIMETYPE, mimetype);
yading@11 925 put_ebml_binary(pb, MATROSKA_ID_FILEDATA, st->codec->extradata, st->codec->extradata_size);
yading@11 926 put_ebml_uint(pb, MATROSKA_ID_FILEUID, fileuid);
yading@11 927 end_ebml_master(pb, attached_file);
yading@11 928 }
yading@11 929 end_ebml_master(pb, attachments);
yading@11 930
yading@11 931 return 0;
yading@11 932 }
yading@11 933
yading@11 934 static int mkv_write_header(AVFormatContext *s)
yading@11 935 {
yading@11 936 MatroskaMuxContext *mkv = s->priv_data;
yading@11 937 AVIOContext *pb = s->pb;
yading@11 938 ebml_master ebml_header, segment_info;
yading@11 939 AVDictionaryEntry *tag;
yading@11 940 int ret, i;
yading@11 941
yading@11 942 if (!strcmp(s->oformat->name, "webm")) mkv->mode = MODE_WEBM;
yading@11 943 else mkv->mode = MODE_MATROSKAv2;
yading@11 944
yading@11 945 if (s->avoid_negative_ts < 0)
yading@11 946 s->avoid_negative_ts = 1;
yading@11 947
yading@11 948 for (i = 0; i < s->nb_streams; i++)
yading@11 949 if (s->streams[i]->codec->codec_id == AV_CODEC_ID_ATRAC3 ||
yading@11 950 s->streams[i]->codec->codec_id == AV_CODEC_ID_COOK ||
yading@11 951 s->streams[i]->codec->codec_id == AV_CODEC_ID_RA_288 ||
yading@11 952 s->streams[i]->codec->codec_id == AV_CODEC_ID_SIPR ||
yading@11 953 s->streams[i]->codec->codec_id == AV_CODEC_ID_RV10 ||
yading@11 954 s->streams[i]->codec->codec_id == AV_CODEC_ID_RV20) {
yading@11 955 av_log(s, AV_LOG_ERROR,
yading@11 956 "The Matroska muxer does not yet support muxing %s\n",
yading@11 957 avcodec_get_name(s->streams[i]->codec->codec_id));
yading@11 958 return AVERROR_PATCHWELCOME;
yading@11 959 }
yading@11 960
yading@11 961 mkv->tracks = av_mallocz(s->nb_streams * sizeof(*mkv->tracks));
yading@11 962 if (!mkv->tracks)
yading@11 963 return AVERROR(ENOMEM);
yading@11 964
yading@11 965 ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0);
yading@11 966 put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1);
yading@11 967 put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1);
yading@11 968 put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4);
yading@11 969 put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8);
yading@11 970 put_ebml_string (pb, EBML_ID_DOCTYPE , s->oformat->name);
yading@11 971 put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 2);
yading@11 972 put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2);
yading@11 973 end_ebml_master(pb, ebml_header);
yading@11 974
yading@11 975 mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0);
yading@11 976 mkv->segment_offset = avio_tell(pb);
yading@11 977
yading@11 978 // we write 2 seek heads - one at the end of the file to point to each
yading@11 979 // cluster, and one at the beginning to point to all other level one
yading@11 980 // elements (including the seek head at the end of the file), which
yading@11 981 // isn't more than 10 elements if we only write one of each other
yading@11 982 // currently defined level 1 element
yading@11 983 mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10);
yading@11 984 if (!mkv->main_seekhead)
yading@11 985 return AVERROR(ENOMEM);
yading@11 986
yading@11 987 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, avio_tell(pb));
yading@11 988 if (ret < 0) return ret;
yading@11 989
yading@11 990 segment_info = start_ebml_master(pb, MATROSKA_ID_INFO, 0);
yading@11 991 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
yading@11 992 if ((tag = av_dict_get(s->metadata, "title", NULL, 0)))
yading@11 993 put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value);
yading@11 994 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
yading@11 995 uint32_t segment_uid[4];
yading@11 996 AVLFG lfg;
yading@11 997
yading@11 998 av_lfg_init(&lfg, av_get_random_seed());
yading@11 999
yading@11 1000 for (i = 0; i < 4; i++)
yading@11 1001 segment_uid[i] = av_lfg_get(&lfg);
yading@11 1002
yading@11 1003 put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT);
yading@11 1004 put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
yading@11 1005 put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
yading@11 1006 }
yading@11 1007
yading@11 1008 if (tag = av_dict_get(s->metadata, "creation_time", NULL, 0)) {
yading@11 1009 // Adjust time so it's relative to 2001-01-01 and convert to nanoseconds.
yading@11 1010 int64_t date_utc = (ff_iso8601_to_unix_time(tag->value) - 978307200) * 1000000000;
yading@11 1011 uint8_t date_utc_buf[8];
yading@11 1012 AV_WB64(date_utc_buf, date_utc);
yading@11 1013 put_ebml_binary(pb, MATROSKA_ID_DATEUTC, date_utc_buf, 8);
yading@11 1014 }
yading@11 1015
yading@11 1016 // reserve space for the duration
yading@11 1017 mkv->duration = 0;
yading@11 1018 mkv->duration_offset = avio_tell(pb);
yading@11 1019 put_ebml_void(pb, 11); // assumes double-precision float to be written
yading@11 1020 end_ebml_master(pb, segment_info);
yading@11 1021
yading@11 1022 ret = mkv_write_tracks(s);
yading@11 1023 if (ret < 0) return ret;
yading@11 1024
yading@11 1025 if (mkv->mode != MODE_WEBM) {
yading@11 1026 ret = mkv_write_chapters(s);
yading@11 1027 if (ret < 0) return ret;
yading@11 1028
yading@11 1029 ret = mkv_write_tags(s);
yading@11 1030 if (ret < 0) return ret;
yading@11 1031
yading@11 1032 ret = mkv_write_attachments(s);
yading@11 1033 if (ret < 0) return ret;
yading@11 1034 }
yading@11 1035
yading@11 1036 if (!s->pb->seekable)
yading@11 1037 mkv_write_seekhead(pb, mkv->main_seekhead);
yading@11 1038
yading@11 1039 mkv->cues = mkv_start_cues(mkv->segment_offset);
yading@11 1040 if (mkv->cues == NULL)
yading@11 1041 return AVERROR(ENOMEM);
yading@11 1042
yading@11 1043 av_init_packet(&mkv->cur_audio_pkt);
yading@11 1044 mkv->cur_audio_pkt.size = 0;
yading@11 1045 mkv->cluster_pos = -1;
yading@11 1046
yading@11 1047 avio_flush(pb);
yading@11 1048 return 0;
yading@11 1049 }
yading@11 1050
yading@11 1051 static int mkv_blockgroup_size(int pkt_size)
yading@11 1052 {
yading@11 1053 int size = pkt_size + 4;
yading@11 1054 size += ebml_num_size(size);
yading@11 1055 size += 2; // EBML ID for block and block duration
yading@11 1056 size += 8; // max size of block duration
yading@11 1057 size += ebml_num_size(size);
yading@11 1058 size += 1; // blockgroup EBML ID
yading@11 1059 return size;
yading@11 1060 }
yading@11 1061
yading@11 1062 static int ass_get_duration(const uint8_t *p)
yading@11 1063 {
yading@11 1064 int sh, sm, ss, sc, eh, em, es, ec;
yading@11 1065 uint64_t start, end;
yading@11 1066
yading@11 1067 if (sscanf(p, "%*[^,],%d:%d:%d%*c%d,%d:%d:%d%*c%d",
yading@11 1068 &sh, &sm, &ss, &sc, &eh, &em, &es, &ec) != 8)
yading@11 1069 return 0;
yading@11 1070 start = 3600000LL*sh + 60000LL*sm + 1000LL*ss + 10LL*sc;
yading@11 1071 end = 3600000LL*eh + 60000LL*em + 1000LL*es + 10LL*ec;
yading@11 1072 return end - start;
yading@11 1073 }
yading@11 1074
yading@11 1075 #if FF_API_ASS_SSA
yading@11 1076 static int mkv_write_ass_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
yading@11 1077 {
yading@11 1078 MatroskaMuxContext *mkv = s->priv_data;
yading@11 1079 int i, layer = 0, max_duration = 0, size, line_size, data_size = pkt->size;
yading@11 1080 uint8_t *start, *end, *data = pkt->data;
yading@11 1081 ebml_master blockgroup;
yading@11 1082 char buffer[2048];
yading@11 1083
yading@11 1084 while (data_size) {
yading@11 1085 int duration = ass_get_duration(data);
yading@11 1086 max_duration = FFMAX(duration, max_duration);
yading@11 1087 end = memchr(data, '\n', data_size);
yading@11 1088 size = line_size = end ? end-data+1 : data_size;
yading@11 1089 size -= end ? (end[-1]=='\r')+1 : 0;
yading@11 1090 start = data;
yading@11 1091 for (i=0; i<3; i++, start++)
yading@11 1092 if (!(start = memchr(start, ',', size-(start-data))))
yading@11 1093 return max_duration;
yading@11 1094 size -= start - data;
yading@11 1095 sscanf(data, "Dialogue: %d,", &layer);
yading@11 1096 i = snprintf(buffer, sizeof(buffer), "%"PRId64",%d,",
yading@11 1097 s->streams[pkt->stream_index]->nb_frames, layer);
yading@11 1098 size = FFMIN(i+size, sizeof(buffer));
yading@11 1099 memcpy(buffer+i, start, size-i);
yading@11 1100
yading@11 1101 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
yading@11 1102 "pts %" PRId64 ", duration %d\n",
yading@11 1103 avio_tell(pb), size, pkt->pts, duration);
yading@11 1104 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size));
yading@11 1105 put_ebml_id(pb, MATROSKA_ID_BLOCK);
yading@11 1106 put_ebml_num(pb, size+4, 0);
yading@11 1107 avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126
yading@11 1108 avio_wb16(pb, pkt->pts - mkv->cluster_pts);
yading@11 1109 avio_w8(pb, 0);
yading@11 1110 avio_write(pb, buffer, size);
yading@11 1111 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
yading@11 1112 end_ebml_master(pb, blockgroup);
yading@11 1113
yading@11 1114 data += line_size;
yading@11 1115 data_size -= line_size;
yading@11 1116 }
yading@11 1117
yading@11 1118 return max_duration;
yading@11 1119 }
yading@11 1120 #endif
yading@11 1121
yading@11 1122 static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
yading@11 1123 unsigned int blockid, AVPacket *pkt, int flags)
yading@11 1124 {
yading@11 1125 MatroskaMuxContext *mkv = s->priv_data;
yading@11 1126 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
yading@11 1127 uint8_t *data = NULL;
yading@11 1128 int offset = 0, size = pkt->size;
yading@11 1129 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
yading@11 1130
yading@11 1131 av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
yading@11 1132 "pts %" PRId64 ", dts %" PRId64 ", duration %d, flags %d\n",
yading@11 1133 avio_tell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration, flags);
yading@11 1134 if (codec->codec_id == AV_CODEC_ID_H264 && codec->extradata_size > 0 &&
yading@11 1135 (AV_RB24(codec->extradata) == 1 || AV_RB32(codec->extradata) == 1))
yading@11 1136 ff_avc_parse_nal_units_buf(pkt->data, &data, &size);
yading@11 1137 else
yading@11 1138 data = pkt->data;
yading@11 1139
yading@11 1140 if (codec->codec_id == AV_CODEC_ID_PRORES) {
yading@11 1141 /* Matroska specification requires to remove the first QuickTime atom
yading@11 1142 */
yading@11 1143 size -= 8;
yading@11 1144 offset = 8;
yading@11 1145 }
yading@11 1146
yading@11 1147 put_ebml_id(pb, blockid);
yading@11 1148 put_ebml_num(pb, size+4, 0);
yading@11 1149 avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126
yading@11 1150 avio_wb16(pb, ts - mkv->cluster_pts);
yading@11 1151 avio_w8(pb, flags);
yading@11 1152 avio_write(pb, data + offset, size);
yading@11 1153 if (data != pkt->data)
yading@11 1154 av_free(data);
yading@11 1155 }
yading@11 1156
yading@11 1157 static int srt_get_duration(uint8_t **buf)
yading@11 1158 {
yading@11 1159 int i, duration = 0;
yading@11 1160
yading@11 1161 for (i=0; i<2 && !duration; i++) {
yading@11 1162 int s_hour, s_min, s_sec, s_hsec, e_hour, e_min, e_sec, e_hsec;
yading@11 1163 if (sscanf(*buf, "%d:%2d:%2d%*1[,.]%3d --> %d:%2d:%2d%*1[,.]%3d",
yading@11 1164 &s_hour, &s_min, &s_sec, &s_hsec,
yading@11 1165 &e_hour, &e_min, &e_sec, &e_hsec) == 8) {
yading@11 1166 s_min += 60*s_hour; e_min += 60*e_hour;
yading@11 1167 s_sec += 60*s_min; e_sec += 60*e_min;
yading@11 1168 s_hsec += 1000*s_sec; e_hsec += 1000*e_sec;
yading@11 1169 duration = e_hsec - s_hsec;
yading@11 1170 }
yading@11 1171 *buf += strcspn(*buf, "\n") + 1;
yading@11 1172 }
yading@11 1173 return duration;
yading@11 1174 }
yading@11 1175
yading@11 1176 static int mkv_write_srt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
yading@11 1177 {
yading@11 1178 ebml_master blockgroup;
yading@11 1179 AVPacket pkt2 = *pkt;
yading@11 1180 int64_t duration = srt_get_duration(&pkt2.data);
yading@11 1181 pkt2.size -= pkt2.data - pkt->data;
yading@11 1182
yading@11 1183 blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP,
yading@11 1184 mkv_blockgroup_size(pkt2.size));
yading@11 1185 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, &pkt2, 0);
yading@11 1186 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
yading@11 1187 end_ebml_master(pb, blockgroup);
yading@11 1188
yading@11 1189 return duration;
yading@11 1190 }
yading@11 1191
yading@11 1192 static void mkv_flush_dynbuf(AVFormatContext *s)
yading@11 1193 {
yading@11 1194 MatroskaMuxContext *mkv = s->priv_data;
yading@11 1195 int bufsize;
yading@11 1196 uint8_t *dyn_buf;
yading@11 1197
yading@11 1198 if (!mkv->dyn_bc)
yading@11 1199 return;
yading@11 1200
yading@11 1201 bufsize = avio_close_dyn_buf(mkv->dyn_bc, &dyn_buf);
yading@11 1202 avio_write(s->pb, dyn_buf, bufsize);
yading@11 1203 av_free(dyn_buf);
yading@11 1204 mkv->dyn_bc = NULL;
yading@11 1205 }
yading@11 1206
yading@11 1207 static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
yading@11 1208 {
yading@11 1209 MatroskaMuxContext *mkv = s->priv_data;
yading@11 1210 AVIOContext *pb = s->pb;
yading@11 1211 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
yading@11 1212 int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
yading@11 1213 int duration = pkt->duration;
yading@11 1214 int ret;
yading@11 1215 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
yading@11 1216
yading@11 1217 if (ts == AV_NOPTS_VALUE) {
yading@11 1218 av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n");
yading@11 1219 return AVERROR(EINVAL);
yading@11 1220 }
yading@11 1221
yading@11 1222 if (!s->pb->seekable) {
yading@11 1223 if (!mkv->dyn_bc) {
yading@11 1224 if ((ret = avio_open_dyn_buf(&mkv->dyn_bc)) < 0) {
yading@11 1225 av_log(s, AV_LOG_ERROR, "Failed to open dynamic buffer\n");
yading@11 1226 return ret;
yading@11 1227 }
yading@11 1228 }
yading@11 1229 pb = mkv->dyn_bc;
yading@11 1230 }
yading@11 1231
yading@11 1232 if (mkv->cluster_pos == -1) {
yading@11 1233 mkv->cluster_pos = avio_tell(s->pb);
yading@11 1234 mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
yading@11 1235 put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
yading@11 1236 mkv->cluster_pts = FFMAX(0, ts);
yading@11 1237 }
yading@11 1238
yading@11 1239 if (codec->codec_type != AVMEDIA_TYPE_SUBTITLE) {
yading@11 1240 mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe << 7);
yading@11 1241 #if FF_API_ASS_SSA
yading@11 1242 } else if (codec->codec_id == AV_CODEC_ID_SSA) {
yading@11 1243 duration = mkv_write_ass_blocks(s, pb, pkt);
yading@11 1244 #endif
yading@11 1245 } else if (codec->codec_id == AV_CODEC_ID_SRT) {
yading@11 1246 duration = mkv_write_srt_blocks(s, pb, pkt);
yading@11 1247 } else {
yading@11 1248 ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size));
yading@11 1249 /* For backward compatibility, prefer convergence_duration. */
yading@11 1250 if (pkt->convergence_duration > 0) {
yading@11 1251 duration = pkt->convergence_duration;
yading@11 1252 }
yading@11 1253 mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 0);
yading@11 1254 put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
yading@11 1255 end_ebml_master(pb, blockgroup);
yading@11 1256 }
yading@11 1257
yading@11 1258 if (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe) {
yading@11 1259 ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, ts, mkv->cluster_pos);
yading@11 1260 if (ret < 0) return ret;
yading@11 1261 }
yading@11 1262
yading@11 1263 mkv->duration = FFMAX(mkv->duration, ts + duration);
yading@11 1264 return 0;
yading@11 1265 }
yading@11 1266
yading@11 1267 static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
yading@11 1268 {
yading@11 1269 MatroskaMuxContext *mkv = s->priv_data;
yading@11 1270 AVIOContext *pb = s->pb->seekable ? s->pb : mkv->dyn_bc;
yading@11 1271 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
yading@11 1272 int ret, keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
yading@11 1273 int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
yading@11 1274 int cluster_size = avio_tell(pb) - (s->pb->seekable ? mkv->cluster_pos : 0);
yading@11 1275
yading@11 1276 // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
yading@11 1277 // after 4k and on a keyframe
yading@11 1278 if (mkv->cluster_pos != -1 &&
yading@11 1279 ((!s->pb->seekable && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000))
yading@11 1280 || cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000
yading@11 1281 || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) {
yading@11 1282 av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64
yading@11 1283 " bytes, pts %" PRIu64 "\n", avio_tell(pb), ts);
yading@11 1284 end_ebml_master(pb, mkv->cluster);
yading@11 1285 mkv->cluster_pos = -1;
yading@11 1286 if (mkv->dyn_bc)
yading@11 1287 mkv_flush_dynbuf(s);
yading@11 1288 }
yading@11 1289
yading@11 1290 // check if we have an audio packet cached
yading@11 1291 if (mkv->cur_audio_pkt.size > 0) {
yading@11 1292 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
yading@11 1293 av_free_packet(&mkv->cur_audio_pkt);
yading@11 1294 if (ret < 0) {
yading@11 1295 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
yading@11 1296 return ret;
yading@11 1297 }
yading@11 1298 }
yading@11 1299
yading@11 1300 // buffer an audio packet to ensure the packet containing the video
yading@11 1301 // keyframe's timecode is contained in the same cluster for WebM
yading@11 1302 if (codec->codec_type == AVMEDIA_TYPE_AUDIO) {
yading@11 1303 mkv->cur_audio_pkt = *pkt;
yading@11 1304 mkv->cur_audio_pkt.buf = av_buffer_ref(pkt->buf);
yading@11 1305 ret = mkv->cur_audio_pkt.buf ? 0 : AVERROR(ENOMEM);
yading@11 1306 } else
yading@11 1307 ret = mkv_write_packet_internal(s, pkt);
yading@11 1308 return ret;
yading@11 1309 }
yading@11 1310
yading@11 1311 static int mkv_write_trailer(AVFormatContext *s)
yading@11 1312 {
yading@11 1313 MatroskaMuxContext *mkv = s->priv_data;
yading@11 1314 AVIOContext *pb = s->pb;
yading@11 1315 int64_t currentpos, cuespos;
yading@11 1316 int ret;
yading@11 1317
yading@11 1318 // check if we have an audio packet cached
yading@11 1319 if (mkv->cur_audio_pkt.size > 0) {
yading@11 1320 ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
yading@11 1321 av_free_packet(&mkv->cur_audio_pkt);
yading@11 1322 if (ret < 0) {
yading@11 1323 av_log(s, AV_LOG_ERROR, "Could not write cached audio packet ret:%d\n", ret);
yading@11 1324 return ret;
yading@11 1325 }
yading@11 1326 }
yading@11 1327
yading@11 1328 if (mkv->dyn_bc) {
yading@11 1329 end_ebml_master(mkv->dyn_bc, mkv->cluster);
yading@11 1330 mkv_flush_dynbuf(s);
yading@11 1331 } else if (mkv->cluster_pos != -1) {
yading@11 1332 end_ebml_master(pb, mkv->cluster);
yading@11 1333 }
yading@11 1334
yading@11 1335 if (pb->seekable) {
yading@11 1336 if (mkv->cues->num_entries) {
yading@11 1337 cuespos = mkv_write_cues(pb, mkv->cues, mkv->tracks, s->nb_streams);
yading@11 1338
yading@11 1339 ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES, cuespos);
yading@11 1340 if (ret < 0) return ret;
yading@11 1341 }
yading@11 1342
yading@11 1343 mkv_write_seekhead(pb, mkv->main_seekhead);
yading@11 1344
yading@11 1345 // update the duration
yading@11 1346 av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
yading@11 1347 currentpos = avio_tell(pb);
yading@11 1348 avio_seek(pb, mkv->duration_offset, SEEK_SET);
yading@11 1349 put_ebml_float(pb, MATROSKA_ID_DURATION, mkv->duration);
yading@11 1350
yading@11 1351 avio_seek(pb, currentpos, SEEK_SET);
yading@11 1352 }
yading@11 1353
yading@11 1354 end_ebml_master(pb, mkv->segment);
yading@11 1355 av_free(mkv->tracks);
yading@11 1356 av_freep(&mkv->cues->entries);
yading@11 1357 av_freep(&mkv->cues);
yading@11 1358
yading@11 1359 return 0;
yading@11 1360 }
yading@11 1361
yading@11 1362 static int mkv_query_codec(enum AVCodecID codec_id, int std_compliance)
yading@11 1363 {
yading@11 1364 int i;
yading@11 1365 for (i = 0; ff_mkv_codec_tags[i].id != AV_CODEC_ID_NONE; i++)
yading@11 1366 if (ff_mkv_codec_tags[i].id == codec_id)
yading@11 1367 return 1;
yading@11 1368
yading@11 1369 if (std_compliance < FF_COMPLIANCE_NORMAL) { // mkv theoretically supports any
yading@11 1370 enum AVMediaType type = avcodec_get_type(codec_id); // video/audio through VFW/ACM
yading@11 1371 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO)
yading@11 1372 return 1;
yading@11 1373 }
yading@11 1374
yading@11 1375 return 0;
yading@11 1376 }
yading@11 1377
yading@11 1378 const AVCodecTag additional_audio_tags[] = {
yading@11 1379 { AV_CODEC_ID_ALAC, 0XFFFFFFFF },
yading@11 1380 { AV_CODEC_ID_EAC3, 0XFFFFFFFF },
yading@11 1381 { AV_CODEC_ID_MLP, 0xFFFFFFFF },
yading@11 1382 { AV_CODEC_ID_OPUS, 0xFFFFFFFF },
yading@11 1383 { AV_CODEC_ID_PCM_S16BE, 0xFFFFFFFF },
yading@11 1384 { AV_CODEC_ID_PCM_S24BE, 0xFFFFFFFF },
yading@11 1385 { AV_CODEC_ID_PCM_S32BE, 0xFFFFFFFF },
yading@11 1386 { AV_CODEC_ID_QDM2, 0xFFFFFFFF },
yading@11 1387 { AV_CODEC_ID_RA_144, 0xFFFFFFFF },
yading@11 1388 { AV_CODEC_ID_RA_288, 0xFFFFFFFF },
yading@11 1389 { AV_CODEC_ID_COOK, 0xFFFFFFFF },
yading@11 1390 { AV_CODEC_ID_TRUEHD, 0xFFFFFFFF },
yading@11 1391 { AV_CODEC_ID_WAVPACK, 0xFFFFFFFF },
yading@11 1392 { AV_CODEC_ID_NONE, 0xFFFFFFFF }
yading@11 1393 };
yading@11 1394
yading@11 1395 const AVCodecTag additional_video_tags[] = {
yading@11 1396 { AV_CODEC_ID_PRORES, 0xFFFFFFFF },
yading@11 1397 { AV_CODEC_ID_RV10, 0xFFFFFFFF },
yading@11 1398 { AV_CODEC_ID_RV20, 0xFFFFFFFF },
yading@11 1399 { AV_CODEC_ID_RV30, 0xFFFFFFFF },
yading@11 1400 { AV_CODEC_ID_RV40, 0xFFFFFFFF },
yading@11 1401 { AV_CODEC_ID_VP9, 0xFFFFFFFF },
yading@11 1402 { AV_CODEC_ID_NONE, 0xFFFFFFFF }
yading@11 1403 };
yading@11 1404
yading@11 1405 #if CONFIG_MATROSKA_MUXER
yading@11 1406 AVOutputFormat ff_matroska_muxer = {
yading@11 1407 .name = "matroska",
yading@11 1408 .long_name = NULL_IF_CONFIG_SMALL("Matroska"),
yading@11 1409 .mime_type = "video/x-matroska",
yading@11 1410 .extensions = "mkv",
yading@11 1411 .priv_data_size = sizeof(MatroskaMuxContext),
yading@11 1412 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
yading@11 1413 AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
yading@11 1414 .video_codec = CONFIG_LIBX264_ENCODER ?
yading@11 1415 AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4,
yading@11 1416 .write_header = mkv_write_header,
yading@11 1417 .write_packet = mkv_write_packet,
yading@11 1418 .write_trailer = mkv_write_trailer,
yading@11 1419 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
yading@11 1420 AVFMT_TS_NONSTRICT,
yading@11 1421 .codec_tag = (const AVCodecTag* const []){
yading@11 1422 ff_codec_bmp_tags, ff_codec_wav_tags,
yading@11 1423 additional_audio_tags, additional_video_tags, 0
yading@11 1424 },
yading@11 1425 #if FF_API_ASS_SSA
yading@11 1426 .subtitle_codec = AV_CODEC_ID_SSA,
yading@11 1427 #else
yading@11 1428 .subtitle_codec = AV_CODEC_ID_ASS,
yading@11 1429 #endif
yading@11 1430 .query_codec = mkv_query_codec,
yading@11 1431 };
yading@11 1432 #endif
yading@11 1433
yading@11 1434 #if CONFIG_WEBM_MUXER
yading@11 1435 AVOutputFormat ff_webm_muxer = {
yading@11 1436 .name = "webm",
yading@11 1437 .long_name = NULL_IF_CONFIG_SMALL("WebM"),
yading@11 1438 .mime_type = "video/webm",
yading@11 1439 .extensions = "webm",
yading@11 1440 .priv_data_size = sizeof(MatroskaMuxContext),
yading@11 1441 .audio_codec = AV_CODEC_ID_VORBIS,
yading@11 1442 .video_codec = AV_CODEC_ID_VP8,
yading@11 1443 .write_header = mkv_write_header,
yading@11 1444 .write_packet = mkv_write_packet,
yading@11 1445 .write_trailer = mkv_write_trailer,
yading@11 1446 .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
yading@11 1447 AVFMT_TS_NONSTRICT,
yading@11 1448 };
yading@11 1449 #endif
yading@11 1450
yading@11 1451 #if CONFIG_MATROSKA_AUDIO_MUXER
yading@11 1452 AVOutputFormat ff_matroska_audio_muxer = {
yading@11 1453 .name = "matroska",
yading@11 1454 .long_name = NULL_IF_CONFIG_SMALL("Matroska"),
yading@11 1455 .mime_type = "audio/x-matroska",
yading@11 1456 .extensions = "mka",
yading@11 1457 .priv_data_size = sizeof(MatroskaMuxContext),
yading@11 1458 .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
yading@11 1459 AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
yading@11 1460 .video_codec = AV_CODEC_ID_NONE,
yading@11 1461 .write_header = mkv_write_header,
yading@11 1462 .write_packet = mkv_write_packet,
yading@11 1463 .write_trailer = mkv_write_trailer,
yading@11 1464 .flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
yading@11 1465 .codec_tag = (const AVCodecTag* const []){
yading@11 1466 ff_codec_wav_tags, additional_audio_tags, 0
yading@11 1467 },
yading@11 1468 };
yading@11 1469 #endif