You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2817 lines
102KB

  1. /*
  2. * Matroska muxer
  3. * Copyright (c) 2007 David Conrad
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <stdint.h>
  22. #include "avc.h"
  23. #include "hevc.h"
  24. #include "avformat.h"
  25. #include "avio_internal.h"
  26. #include "avlanguage.h"
  27. #include "flacenc.h"
  28. #include "internal.h"
  29. #include "isom.h"
  30. #include "matroska.h"
  31. #include "riff.h"
  32. #include "subtitles.h"
  33. #include "vorbiscomment.h"
  34. #include "wv.h"
  35. #include "libavutil/avstring.h"
  36. #include "libavutil/channel_layout.h"
  37. #include "libavutil/crc.h"
  38. #include "libavutil/dict.h"
  39. #include "libavutil/intfloat.h"
  40. #include "libavutil/intreadwrite.h"
  41. #include "libavutil/lfg.h"
  42. #include "libavutil/mastering_display_metadata.h"
  43. #include "libavutil/mathematics.h"
  44. #include "libavutil/opt.h"
  45. #include "libavutil/parseutils.h"
  46. #include "libavutil/random_seed.h"
  47. #include "libavutil/rational.h"
  48. #include "libavutil/samplefmt.h"
  49. #include "libavutil/sha.h"
  50. #include "libavutil/stereo3d.h"
  51. #include "libavcodec/xiph.h"
  52. #include "libavcodec/mpeg4audio.h"
  53. #include "libavcodec/internal.h"
  54. typedef struct ebml_master {
  55. int64_t pos; ///< absolute offset in the file where the master's elements start
  56. int sizebytes; ///< how many bytes were reserved for the size
  57. } ebml_master;
  58. typedef struct mkv_seekhead_entry {
  59. unsigned int elementid;
  60. uint64_t segmentpos;
  61. } mkv_seekhead_entry;
  62. typedef struct mkv_seekhead {
  63. int64_t filepos;
  64. int64_t segment_offset; ///< the file offset to the beginning of the segment
  65. int reserved_size; ///< -1 if appending to file
  66. int max_entries;
  67. mkv_seekhead_entry *entries;
  68. int num_entries;
  69. } mkv_seekhead;
  70. typedef struct mkv_cuepoint {
  71. uint64_t pts;
  72. int stream_idx;
  73. int tracknum;
  74. int64_t cluster_pos; ///< file offset of the cluster containing the block
  75. int64_t relative_pos; ///< relative offset from the position of the cluster containing the block
  76. int64_t duration; ///< duration of the block according to time base
  77. } mkv_cuepoint;
  78. typedef struct mkv_cues {
  79. int64_t segment_offset;
  80. mkv_cuepoint *entries;
  81. int num_entries;
  82. } mkv_cues;
  83. typedef struct mkv_track {
  84. int write_dts;
  85. int has_cue;
  86. int sample_rate;
  87. int64_t sample_rate_offset;
  88. int64_t codecpriv_offset;
  89. int64_t ts_offset;
  90. } mkv_track;
  91. typedef struct mkv_attachment {
  92. int stream_idx;
  93. uint32_t fileuid;
  94. } mkv_attachment;
  95. typedef struct mkv_attachments {
  96. mkv_attachment *entries;
  97. int num_entries;
  98. } mkv_attachments;
  99. #define MODE_MATROSKAv2 0x01
  100. #define MODE_WEBM 0x02
  101. /** Maximum number of tracks allowed in a Matroska file (with track numbers in
  102. * range 1 to 126 (inclusive) */
  103. #define MAX_TRACKS 126
  104. typedef struct MatroskaMuxContext {
  105. const AVClass *class;
  106. int mode;
  107. AVIOContext *dyn_bc;
  108. AVIOContext *tags_bc;
  109. ebml_master tags;
  110. AVIOContext *info_bc;
  111. ebml_master info;
  112. AVIOContext *tracks_bc;
  113. ebml_master tracks_master;
  114. ebml_master segment;
  115. int64_t segment_offset;
  116. ebml_master cluster;
  117. int64_t cluster_pos; ///< file offset of the current cluster
  118. int64_t cluster_pts;
  119. int64_t duration_offset;
  120. int64_t duration;
  121. mkv_seekhead *main_seekhead;
  122. mkv_cues *cues;
  123. mkv_track *tracks;
  124. mkv_attachments *attachments;
  125. AVPacket cur_audio_pkt;
  126. int have_attachments;
  127. int have_video;
  128. int reserve_cues_space;
  129. int cluster_size_limit;
  130. int64_t cues_pos;
  131. int64_t cluster_time_limit;
  132. int is_dash;
  133. int dash_track_number;
  134. int is_live;
  135. int write_crc;
  136. uint32_t chapter_id_offset;
  137. int wrote_chapters;
  138. int64_t last_track_timestamp[MAX_TRACKS];
  139. int64_t* stream_durations;
  140. int64_t* stream_duration_offsets;
  141. int allow_raw_vfw;
  142. } MatroskaMuxContext;
  143. /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
  144. * offset, 4 bytes for target EBML ID */
  145. #define MAX_SEEKENTRY_SIZE 21
  146. /** per-cuepoint-track - 5 1-byte EBML IDs, 5 1-byte EBML sizes, 4
  147. * 8-byte uint max */
  148. #define MAX_CUETRACKPOS_SIZE 42
  149. /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */
  150. #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE * num_tracks
  151. /** Seek preroll value for opus */
  152. #define OPUS_SEEK_PREROLL 80000000
  153. static int ebml_id_size(unsigned int id)
  154. {
  155. return (av_log2(id + 1) - 1) / 7 + 1;
  156. }
  157. static void put_ebml_id(AVIOContext *pb, unsigned int id)
  158. {
  159. int i = ebml_id_size(id);
  160. while (i--)
  161. avio_w8(pb, (uint8_t)(id >> (i * 8)));
  162. }
  163. /**
  164. * Write an EBML size meaning "unknown size".
  165. *
  166. * @param bytes The number of bytes the size should occupy (maximum: 8).
  167. */
  168. static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
  169. {
  170. av_assert0(bytes <= 8);
  171. avio_w8(pb, 0x1ff >> bytes);
  172. ffio_fill(pb, 0xff, bytes - 1);
  173. }
  174. /**
  175. * Calculate how many bytes are needed to represent a given number in EBML.
  176. */
  177. static int ebml_num_size(uint64_t num)
  178. {
  179. int bytes = 1;
  180. while ((num + 1) >> bytes * 7)
  181. bytes++;
  182. return bytes;
  183. }
  184. /**
  185. * Write a number in EBML variable length format.
  186. *
  187. * @param bytes The number of bytes that need to be used to write the number.
  188. * If zero, any number of bytes can be used.
  189. */
  190. static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
  191. {
  192. int i, needed_bytes = ebml_num_size(num);
  193. // sizes larger than this are currently undefined in EBML
  194. av_assert0(num < (1ULL << 56) - 1);
  195. if (bytes == 0)
  196. // don't care how many bytes are used, so use the min
  197. bytes = needed_bytes;
  198. // the bytes needed to write the given size would exceed the bytes
  199. // that we need to use, so write unknown size. This shouldn't happen.
  200. av_assert0(bytes >= needed_bytes);
  201. num |= 1ULL << bytes * 7;
  202. for (i = bytes - 1; i >= 0; i--)
  203. avio_w8(pb, (uint8_t)(num >> i * 8));
  204. }
  205. static void put_ebml_uint(AVIOContext *pb, unsigned int elementid, uint64_t val)
  206. {
  207. int i, bytes = 1;
  208. uint64_t tmp = val;
  209. while (tmp >>= 8)
  210. bytes++;
  211. put_ebml_id(pb, elementid);
  212. put_ebml_num(pb, bytes, 0);
  213. for (i = bytes - 1; i >= 0; i--)
  214. avio_w8(pb, (uint8_t)(val >> i * 8));
  215. }
  216. static void put_ebml_sint(AVIOContext *pb, unsigned int elementid, int64_t val)
  217. {
  218. int i, bytes = 1;
  219. uint64_t tmp = 2*(val < 0 ? val^-1 : val);
  220. while (tmp>>=8) bytes++;
  221. put_ebml_id(pb, elementid);
  222. put_ebml_num(pb, bytes, 0);
  223. for (i = bytes - 1; i >= 0; i--)
  224. avio_w8(pb, (uint8_t)(val >> i * 8));
  225. }
  226. static void put_ebml_float(AVIOContext *pb, unsigned int elementid, double val)
  227. {
  228. put_ebml_id(pb, elementid);
  229. put_ebml_num(pb, 8, 0);
  230. avio_wb64(pb, av_double2int(val));
  231. }
  232. static void put_ebml_binary(AVIOContext *pb, unsigned int elementid,
  233. const void *buf, int size)
  234. {
  235. put_ebml_id(pb, elementid);
  236. put_ebml_num(pb, size, 0);
  237. avio_write(pb, buf, size);
  238. }
  239. static void put_ebml_string(AVIOContext *pb, unsigned int elementid,
  240. const char *str)
  241. {
  242. put_ebml_binary(pb, elementid, str, strlen(str));
  243. }
  244. /**
  245. * Write a void element of a given size. Useful for reserving space in
  246. * the file to be written to later.
  247. *
  248. * @param size The number of bytes to reserve, which must be at least 2.
  249. */
  250. static void put_ebml_void(AVIOContext *pb, uint64_t size)
  251. {
  252. int64_t currentpos = avio_tell(pb);
  253. av_assert0(size >= 2);
  254. put_ebml_id(pb, EBML_ID_VOID);
  255. // we need to subtract the length needed to store the size from the
  256. // size we need to reserve so 2 cases, we use 8 bytes to store the
  257. // size if possible, 1 byte otherwise
  258. if (size < 10)
  259. put_ebml_num(pb, size - 2, 0);
  260. else
  261. put_ebml_num(pb, size - 9, 8);
  262. ffio_fill(pb, 0, currentpos + size - avio_tell(pb));
  263. }
  264. static ebml_master start_ebml_master(AVIOContext *pb, unsigned int elementid,
  265. uint64_t expectedsize)
  266. {
  267. int bytes = expectedsize ? ebml_num_size(expectedsize) : 8;
  268. put_ebml_id(pb, elementid);
  269. put_ebml_size_unknown(pb, bytes);
  270. return (ebml_master) {avio_tell(pb), bytes };
  271. }
  272. static void end_ebml_master(AVIOContext *pb, ebml_master master)
  273. {
  274. int64_t pos = avio_tell(pb);
  275. if (avio_seek(pb, master.pos - master.sizebytes, SEEK_SET) < 0)
  276. return;
  277. put_ebml_num(pb, pos - master.pos, master.sizebytes);
  278. avio_seek(pb, pos, SEEK_SET);
  279. }
  280. static int start_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
  281. ebml_master *master, unsigned int elementid, uint64_t expectedsize)
  282. {
  283. int ret;
  284. if ((ret = avio_open_dyn_buf(dyn_cp)) < 0)
  285. return ret;
  286. if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
  287. *master = start_ebml_master(pb, elementid, expectedsize);
  288. if (mkv->write_crc && mkv->mode != MODE_WEBM)
  289. put_ebml_void(*dyn_cp, 6); /* Reserve space for CRC32 so position/size calculations using avio_tell() take it into account */
  290. } else
  291. *master = start_ebml_master(*dyn_cp, elementid, expectedsize);
  292. return 0;
  293. }
  294. static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
  295. ebml_master master)
  296. {
  297. uint8_t *buf, crc[4];
  298. int size, skip = 0;
  299. if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
  300. size = avio_close_dyn_buf(*dyn_cp, &buf);
  301. if (mkv->write_crc && mkv->mode != MODE_WEBM) {
  302. skip = 6; /* Skip reserved 6-byte long void element from the dynamic buffer. */
  303. AV_WL32(crc, av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), UINT32_MAX, buf + skip, size - skip) ^ UINT32_MAX);
  304. put_ebml_binary(pb, EBML_ID_CRC32, crc, sizeof(crc));
  305. }
  306. avio_write(pb, buf + skip, size - skip);
  307. end_ebml_master(pb, master);
  308. } else {
  309. end_ebml_master(*dyn_cp, master);
  310. size = avio_close_dyn_buf(*dyn_cp, &buf);
  311. avio_write(pb, buf, size);
  312. }
  313. av_free(buf);
  314. *dyn_cp = NULL;
  315. }
  316. /**
  317. * Complete ebml master whithout destroying the buffer, allowing for later updates
  318. */
  319. static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
  320. ebml_master master)
  321. {
  322. if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
  323. uint8_t *buf;
  324. int size = avio_get_dyn_buf(*dyn_cp, &buf);
  325. avio_write(pb, buf, size);
  326. end_ebml_master(pb, master);
  327. }
  328. }
  329. static void put_xiph_size(AVIOContext *pb, int size)
  330. {
  331. ffio_fill(pb, 255, size / 255);
  332. avio_w8(pb, size % 255);
  333. }
  334. /**
  335. * Free the members allocated in the mux context.
  336. */
  337. static void mkv_free(MatroskaMuxContext *mkv) {
  338. uint8_t* buf;
  339. if (mkv->dyn_bc) {
  340. avio_close_dyn_buf(mkv->dyn_bc, &buf);
  341. av_free(buf);
  342. }
  343. if (mkv->info_bc) {
  344. avio_close_dyn_buf(mkv->info_bc, &buf);
  345. av_free(buf);
  346. }
  347. if (mkv->tracks_bc) {
  348. avio_close_dyn_buf(mkv->tracks_bc, &buf);
  349. av_free(buf);
  350. }
  351. if (mkv->tags_bc) {
  352. avio_close_dyn_buf(mkv->tags_bc, &buf);
  353. av_free(buf);
  354. }
  355. if (mkv->main_seekhead) {
  356. av_freep(&mkv->main_seekhead->entries);
  357. av_freep(&mkv->main_seekhead);
  358. }
  359. if (mkv->cues) {
  360. av_freep(&mkv->cues->entries);
  361. av_freep(&mkv->cues);
  362. }
  363. if (mkv->attachments) {
  364. av_freep(&mkv->attachments->entries);
  365. av_freep(&mkv->attachments);
  366. }
  367. av_freep(&mkv->tracks);
  368. av_freep(&mkv->stream_durations);
  369. av_freep(&mkv->stream_duration_offsets);
  370. }
  371. /**
  372. * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
  373. * elements. If a maximum number of elements is specified, enough space
  374. * will be reserved at the current file location to write a seek head of
  375. * that size.
  376. *
  377. * @param segment_offset The absolute offset to the position in the file
  378. * where the segment begins.
  379. * @param numelements The maximum number of elements that will be indexed
  380. * by this seek head, 0 if unlimited.
  381. */
  382. static mkv_seekhead *mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset,
  383. int numelements)
  384. {
  385. mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
  386. if (!new_seekhead)
  387. return NULL;
  388. new_seekhead->segment_offset = segment_offset;
  389. if (numelements > 0) {
  390. new_seekhead->filepos = avio_tell(pb);
  391. // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
  392. // and size, 6 bytes for a CRC32 element, and 3 bytes to guarantee
  393. // that an EBML void element will fit afterwards
  394. new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 19;
  395. new_seekhead->max_entries = numelements;
  396. put_ebml_void(pb, new_seekhead->reserved_size);
  397. }
  398. return new_seekhead;
  399. }
  400. static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
  401. {
  402. mkv_seekhead_entry *entries = seekhead->entries;
  403. // don't store more elements than we reserved space for
  404. if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
  405. return -1;
  406. entries = av_realloc_array(entries, seekhead->num_entries + 1, sizeof(mkv_seekhead_entry));
  407. if (!entries)
  408. return AVERROR(ENOMEM);
  409. seekhead->entries = entries;
  410. seekhead->entries[seekhead->num_entries].elementid = elementid;
  411. seekhead->entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
  412. return 0;
  413. }
  414. /**
  415. * Write the seek head to the file and free it. If a maximum number of
  416. * elements was specified to mkv_start_seekhead(), the seek head will
  417. * be written at the location reserved for it. Otherwise, it is written
  418. * at the current location in the file.
  419. *
  420. * @return The file offset where the seekhead was written,
  421. * -1 if an error occurred.
  422. */
  423. static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv)
  424. {
  425. AVIOContext *dyn_cp;
  426. mkv_seekhead *seekhead = mkv->main_seekhead;
  427. ebml_master metaseek, seekentry;
  428. int64_t currentpos;
  429. int i;
  430. currentpos = avio_tell(pb);
  431. if (seekhead->reserved_size > 0) {
  432. if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) {
  433. currentpos = -1;
  434. goto fail;
  435. }
  436. }
  437. if (start_ebml_master_crc32(pb, &dyn_cp, mkv, &metaseek, MATROSKA_ID_SEEKHEAD,
  438. seekhead->reserved_size) < 0) {
  439. currentpos = -1;
  440. goto fail;
  441. }
  442. for (i = 0; i < seekhead->num_entries; i++) {
  443. mkv_seekhead_entry *entry = &seekhead->entries[i];
  444. seekentry = start_ebml_master(dyn_cp, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE);
  445. put_ebml_id(dyn_cp, MATROSKA_ID_SEEKID);
  446. put_ebml_num(dyn_cp, ebml_id_size(entry->elementid), 0);
  447. put_ebml_id(dyn_cp, entry->elementid);
  448. put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
  449. end_ebml_master(dyn_cp, seekentry);
  450. }
  451. end_ebml_master_crc32(pb, &dyn_cp, mkv, metaseek);
  452. if (seekhead->reserved_size > 0) {
  453. uint64_t remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
  454. put_ebml_void(pb, remaining);
  455. avio_seek(pb, currentpos, SEEK_SET);
  456. currentpos = seekhead->filepos;
  457. }
  458. fail:
  459. av_freep(&mkv->main_seekhead->entries);
  460. av_freep(&mkv->main_seekhead);
  461. return currentpos;
  462. }
  463. static mkv_cues *mkv_start_cues(int64_t segment_offset)
  464. {
  465. mkv_cues *cues = av_mallocz(sizeof(mkv_cues));
  466. if (!cues)
  467. return NULL;
  468. cues->segment_offset = segment_offset;
  469. return cues;
  470. }
  471. static int mkv_add_cuepoint(mkv_cues *cues, int stream, int tracknum, int64_t ts,
  472. int64_t cluster_pos, int64_t relative_pos, int64_t duration)
  473. {
  474. mkv_cuepoint *entries = cues->entries;
  475. if (ts < 0)
  476. return 0;
  477. entries = av_realloc_array(entries, cues->num_entries + 1, sizeof(mkv_cuepoint));
  478. if (!entries)
  479. return AVERROR(ENOMEM);
  480. cues->entries = entries;
  481. cues->entries[cues->num_entries].pts = ts;
  482. cues->entries[cues->num_entries].stream_idx = stream;
  483. cues->entries[cues->num_entries].tracknum = tracknum;
  484. cues->entries[cues->num_entries].cluster_pos = cluster_pos - cues->segment_offset;
  485. cues->entries[cues->num_entries].relative_pos = relative_pos;
  486. cues->entries[cues->num_entries++].duration = duration;
  487. return 0;
  488. }
  489. static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tracks, int num_tracks)
  490. {
  491. MatroskaMuxContext *mkv = s->priv_data;
  492. AVIOContext *dyn_cp, *pb = s->pb;
  493. ebml_master cues_element;
  494. int64_t currentpos;
  495. int i, j, ret;
  496. currentpos = avio_tell(pb);
  497. ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &cues_element, MATROSKA_ID_CUES, 0);
  498. if (ret < 0)
  499. return ret;
  500. for (i = 0; i < cues->num_entries; i++) {
  501. ebml_master cuepoint, track_positions;
  502. mkv_cuepoint *entry = &cues->entries[i];
  503. uint64_t pts = entry->pts;
  504. int ctp_nb = 0;
  505. // Calculate the number of entries, so we know the element size
  506. for (j = 0; j < num_tracks; j++)
  507. tracks[j].has_cue = 0;
  508. for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
  509. int tracknum = entry[j].stream_idx;
  510. av_assert0(tracknum>=0 && tracknum<num_tracks);
  511. if (tracks[tracknum].has_cue && s->streams[tracknum]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
  512. continue;
  513. tracks[tracknum].has_cue = 1;
  514. ctp_nb ++;
  515. }
  516. cuepoint = start_ebml_master(dyn_cp, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(ctp_nb));
  517. put_ebml_uint(dyn_cp, MATROSKA_ID_CUETIME, pts);
  518. // put all the entries from different tracks that have the exact same
  519. // timestamp into the same CuePoint
  520. for (j = 0; j < num_tracks; j++)
  521. tracks[j].has_cue = 0;
  522. for (j = 0; j < cues->num_entries - i && entry[j].pts == pts; j++) {
  523. int tracknum = entry[j].stream_idx;
  524. av_assert0(tracknum>=0 && tracknum<num_tracks);
  525. if (tracks[tracknum].has_cue && s->streams[tracknum]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
  526. continue;
  527. tracks[tracknum].has_cue = 1;
  528. track_positions = start_ebml_master(dyn_cp, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
  529. put_ebml_uint(dyn_cp, MATROSKA_ID_CUETRACK , entry[j].tracknum );
  530. put_ebml_uint(dyn_cp, MATROSKA_ID_CUECLUSTERPOSITION , entry[j].cluster_pos);
  531. put_ebml_uint(dyn_cp, MATROSKA_ID_CUERELATIVEPOSITION, entry[j].relative_pos);
  532. if (entry[j].duration != -1)
  533. put_ebml_uint(dyn_cp, MATROSKA_ID_CUEDURATION , entry[j].duration);
  534. end_ebml_master(dyn_cp, track_positions);
  535. }
  536. i += j - 1;
  537. end_ebml_master(dyn_cp, cuepoint);
  538. }
  539. end_ebml_master_crc32(pb, &dyn_cp, mkv, cues_element);
  540. return currentpos;
  541. }
  542. static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par)
  543. {
  544. const uint8_t *header_start[3];
  545. int header_len[3];
  546. int first_header_size;
  547. int j;
  548. if (par->codec_id == AV_CODEC_ID_VORBIS)
  549. first_header_size = 30;
  550. else
  551. first_header_size = 42;
  552. if (avpriv_split_xiph_headers(par->extradata, par->extradata_size,
  553. first_header_size, header_start, header_len) < 0) {
  554. av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
  555. return -1;
  556. }
  557. avio_w8(pb, 2); // number packets - 1
  558. for (j = 0; j < 2; j++) {
  559. put_xiph_size(pb, header_len[j]);
  560. }
  561. for (j = 0; j < 3; j++)
  562. avio_write(pb, header_start[j], header_len[j]);
  563. return 0;
  564. }
  565. static int put_wv_codecpriv(AVIOContext *pb, AVCodecParameters *par)
  566. {
  567. if (par->extradata && par->extradata_size == 2)
  568. avio_write(pb, par->extradata, 2);
  569. else
  570. avio_wl16(pb, 0x403); // fallback to the version mentioned in matroska specs
  571. return 0;
  572. }
  573. static int put_flac_codecpriv(AVFormatContext *s,
  574. AVIOContext *pb, AVCodecParameters *par)
  575. {
  576. int write_comment = (par->channel_layout &&
  577. !(par->channel_layout & ~0x3ffffULL) &&
  578. !ff_flac_is_native_layout(par->channel_layout));
  579. int ret = ff_flac_write_header(pb, par->extradata, par->extradata_size,
  580. !write_comment);
  581. if (ret < 0)
  582. return ret;
  583. if (write_comment) {
  584. const char *vendor = (s->flags & AVFMT_FLAG_BITEXACT) ?
  585. "Lavf" : LIBAVFORMAT_IDENT;
  586. AVDictionary *dict = NULL;
  587. uint8_t buf[32], *data, *p;
  588. int64_t len;
  589. snprintf(buf, sizeof(buf), "0x%"PRIx64, par->channel_layout);
  590. av_dict_set(&dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", buf, 0);
  591. len = ff_vorbiscomment_length(dict, vendor);
  592. if (len >= ((1<<24) - 4))
  593. return AVERROR(EINVAL);
  594. data = av_malloc(len + 4);
  595. if (!data) {
  596. av_dict_free(&dict);
  597. return AVERROR(ENOMEM);
  598. }
  599. data[0] = 0x84;
  600. AV_WB24(data + 1, len);
  601. p = data + 4;
  602. ff_vorbiscomment_write(&p, &dict, vendor);
  603. avio_write(pb, data, len + 4);
  604. av_freep(&data);
  605. av_dict_free(&dict);
  606. }
  607. return 0;
  608. }
  609. static int get_aac_sample_rates(AVFormatContext *s, uint8_t *extradata, int extradata_size,
  610. int *sample_rate, int *output_sample_rate)
  611. {
  612. MPEG4AudioConfig mp4ac;
  613. int ret;
  614. ret = avpriv_mpeg4audio_get_config(&mp4ac, extradata,
  615. extradata_size * 8, 1);
  616. /* Don't abort if the failure is because of missing extradata. Assume in that
  617. * case a bitstream filter will provide the muxer with the extradata in the
  618. * first packet.
  619. * Abort however if s->pb is not seekable, as we would not be able to seek back
  620. * to write the sample rate elements once the extradata shows up, anyway. */
  621. if (ret < 0 && (extradata_size || !(s->pb->seekable & AVIO_SEEKABLE_NORMAL))) {
  622. av_log(s, AV_LOG_ERROR,
  623. "Error parsing AAC extradata, unable to determine samplerate.\n");
  624. return AVERROR(EINVAL);
  625. }
  626. if (ret < 0) {
  627. /* This will only happen when this function is called while writing the
  628. * header and no extradata is available. The space for this element has
  629. * to be reserved for when this function is called again after the
  630. * extradata shows up in the first packet, as there's no way to know if
  631. * output_sample_rate will be different than sample_rate or not. */
  632. *output_sample_rate = *sample_rate;
  633. } else {
  634. *sample_rate = mp4ac.sample_rate;
  635. *output_sample_rate = mp4ac.ext_sample_rate;
  636. }
  637. return 0;
  638. }
  639. static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb,
  640. AVCodecParameters *par,
  641. AVIOContext *dyn_cp)
  642. {
  643. switch (par->codec_id) {
  644. case AV_CODEC_ID_VORBIS:
  645. case AV_CODEC_ID_THEORA:
  646. return put_xiph_codecpriv(s, dyn_cp, par);
  647. case AV_CODEC_ID_FLAC:
  648. return put_flac_codecpriv(s, dyn_cp, par);
  649. case AV_CODEC_ID_WAVPACK:
  650. return put_wv_codecpriv(dyn_cp, par);
  651. case AV_CODEC_ID_H264:
  652. return ff_isom_write_avcc(dyn_cp, par->extradata,
  653. par->extradata_size);
  654. case AV_CODEC_ID_HEVC:
  655. ff_isom_write_hvcc(dyn_cp, par->extradata,
  656. par->extradata_size, 0);
  657. return 0;
  658. case AV_CODEC_ID_ALAC:
  659. if (par->extradata_size < 36) {
  660. av_log(s, AV_LOG_ERROR,
  661. "Invalid extradata found, ALAC expects a 36-byte "
  662. "QuickTime atom.");
  663. return AVERROR_INVALIDDATA;
  664. } else
  665. avio_write(dyn_cp, par->extradata + 12,
  666. par->extradata_size - 12);
  667. break;
  668. case AV_CODEC_ID_AAC:
  669. if (par->extradata_size)
  670. avio_write(dyn_cp, par->extradata, par->extradata_size);
  671. else
  672. put_ebml_void(pb, MAX_PCE_SIZE + 2 + 4);
  673. break;
  674. default:
  675. if (par->codec_id == AV_CODEC_ID_PRORES &&
  676. ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == AV_CODEC_ID_PRORES) {
  677. avio_wl32(dyn_cp, par->codec_tag);
  678. } else if (par->extradata_size && par->codec_id != AV_CODEC_ID_TTA)
  679. avio_write(dyn_cp, par->extradata, par->extradata_size);
  680. }
  681. return 0;
  682. }
  683. static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb,
  684. AVCodecParameters *par,
  685. int native_id, int qt_id)
  686. {
  687. AVIOContext *dyn_cp;
  688. uint8_t *codecpriv;
  689. int ret, codecpriv_size;
  690. ret = avio_open_dyn_buf(&dyn_cp);
  691. if (ret < 0)
  692. return ret;
  693. if (native_id) {
  694. ret = mkv_write_native_codecprivate(s, pb, par, dyn_cp);
  695. } else if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
  696. if (qt_id) {
  697. if (!par->codec_tag)
  698. par->codec_tag = ff_codec_get_tag(ff_codec_movvideo_tags,
  699. par->codec_id);
  700. if ( ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == par->codec_id
  701. && (!par->extradata_size || ff_codec_get_id(ff_codec_movvideo_tags, AV_RL32(par->extradata + 4)) != par->codec_id)
  702. ) {
  703. int i;
  704. avio_wb32(dyn_cp, 0x5a + par->extradata_size);
  705. avio_wl32(dyn_cp, par->codec_tag);
  706. for(i = 0; i < 0x5a - 8; i++)
  707. avio_w8(dyn_cp, 0);
  708. }
  709. avio_write(dyn_cp, par->extradata, par->extradata_size);
  710. } else {
  711. if (!ff_codec_get_tag(ff_codec_bmp_tags, par->codec_id))
  712. av_log(s, AV_LOG_WARNING, "codec %s is not supported by this format\n",
  713. avcodec_get_name(par->codec_id));
  714. if (!par->codec_tag)
  715. par->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags,
  716. par->codec_id);
  717. if (!par->codec_tag && par->codec_id != AV_CODEC_ID_RAWVIDEO) {
  718. av_log(s, AV_LOG_ERROR, "No bmp codec tag found for codec %s\n",
  719. avcodec_get_name(par->codec_id));
  720. ret = AVERROR(EINVAL);
  721. }
  722. ff_put_bmp_header(dyn_cp, par, 0, 0);
  723. }
  724. } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
  725. unsigned int tag;
  726. tag = ff_codec_get_tag(ff_codec_wav_tags, par->codec_id);
  727. if (!tag) {
  728. av_log(s, AV_LOG_ERROR, "No wav codec tag found for codec %s\n",
  729. avcodec_get_name(par->codec_id));
  730. ret = AVERROR(EINVAL);
  731. }
  732. if (!par->codec_tag)
  733. par->codec_tag = tag;
  734. ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX);
  735. }
  736. codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv);
  737. if (codecpriv_size)
  738. put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv,
  739. codecpriv_size);
  740. av_free(codecpriv);
  741. return ret;
  742. }
  743. static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStream *st) {
  744. AVIOContext *dyn_cp;
  745. uint8_t *colorinfo_ptr;
  746. int side_data_size = 0;
  747. int ret, colorinfo_size;
  748. const uint8_t *side_data;
  749. ret = avio_open_dyn_buf(&dyn_cp);
  750. if (ret < 0)
  751. return ret;
  752. if (par->color_trc != AVCOL_TRC_UNSPECIFIED &&
  753. par->color_trc < AVCOL_TRC_NB) {
  754. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS,
  755. par->color_trc);
  756. }
  757. if (par->color_space != AVCOL_SPC_UNSPECIFIED &&
  758. par->color_space < AVCOL_SPC_NB) {
  759. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORMATRIXCOEFF, par->color_space);
  760. }
  761. if (par->color_primaries != AVCOL_PRI_UNSPECIFIED &&
  762. par->color_primaries < AVCOL_PRI_NB) {
  763. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORPRIMARIES, par->color_primaries);
  764. }
  765. if (par->color_range != AVCOL_RANGE_UNSPECIFIED &&
  766. par->color_range < AVCOL_RANGE_NB) {
  767. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORRANGE, par->color_range);
  768. }
  769. if (par->chroma_location != AVCHROMA_LOC_UNSPECIFIED &&
  770. par->chroma_location <= AVCHROMA_LOC_TOP) {
  771. int xpos, ypos;
  772. avcodec_enum_to_chroma_pos(&xpos, &ypos, par->chroma_location);
  773. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ, (xpos >> 7) + 1);
  774. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT, (ypos >> 7) + 1);
  775. }
  776. side_data = av_stream_get_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
  777. &side_data_size);
  778. if (side_data_size) {
  779. const AVContentLightMetadata *metadata =
  780. (const AVContentLightMetadata*)side_data;
  781. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORMAXCLL, metadata->MaxCLL);
  782. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOCOLORMAXFALL, metadata->MaxFALL);
  783. }
  784. side_data = av_stream_get_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
  785. &side_data_size);
  786. if (side_data_size == sizeof(AVMasteringDisplayMetadata)) {
  787. ebml_master meta_element = start_ebml_master(
  788. dyn_cp, MATROSKA_ID_VIDEOCOLORMASTERINGMETA, 0);
  789. const AVMasteringDisplayMetadata *metadata =
  790. (const AVMasteringDisplayMetadata*)side_data;
  791. if (metadata->has_primaries) {
  792. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_RX,
  793. av_q2d(metadata->display_primaries[0][0]));
  794. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_RY,
  795. av_q2d(metadata->display_primaries[0][1]));
  796. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_GX,
  797. av_q2d(metadata->display_primaries[1][0]));
  798. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_GY,
  799. av_q2d(metadata->display_primaries[1][1]));
  800. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_BX,
  801. av_q2d(metadata->display_primaries[2][0]));
  802. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_BY,
  803. av_q2d(metadata->display_primaries[2][1]));
  804. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_WHITEX,
  805. av_q2d(metadata->white_point[0]));
  806. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_WHITEY,
  807. av_q2d(metadata->white_point[1]));
  808. }
  809. if (metadata->has_luminance) {
  810. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX,
  811. av_q2d(metadata->max_luminance));
  812. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN,
  813. av_q2d(metadata->min_luminance));
  814. }
  815. end_ebml_master(dyn_cp, meta_element);
  816. }
  817. colorinfo_size = avio_close_dyn_buf(dyn_cp, &colorinfo_ptr);
  818. if (colorinfo_size) {
  819. ebml_master colorinfo = start_ebml_master(pb, MATROSKA_ID_VIDEOCOLOR, colorinfo_size);
  820. avio_write(pb, colorinfo_ptr, colorinfo_size);
  821. end_ebml_master(pb, colorinfo);
  822. }
  823. av_free(colorinfo_ptr);
  824. return 0;
  825. }
  826. static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, AVStream *st)
  827. {
  828. int side_data_size = 0;
  829. const AVSphericalMapping *spherical =
  830. (const AVSphericalMapping*) av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL,
  831. &side_data_size);
  832. if (side_data_size) {
  833. AVIOContext *dyn_cp;
  834. uint8_t *projection_ptr;
  835. int ret, projection_size;
  836. ret = avio_open_dyn_buf(&dyn_cp);
  837. if (ret < 0)
  838. return ret;
  839. switch (spherical->projection) {
  840. case AV_SPHERICAL_EQUIRECTANGULAR:
  841. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
  842. MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
  843. break;
  844. case AV_SPHERICAL_EQUIRECTANGULAR_TILE:
  845. {
  846. AVIOContext b;
  847. uint8_t private[20];
  848. ffio_init_context(&b, private, sizeof(private),
  849. 1, NULL, NULL, NULL, NULL);
  850. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
  851. MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
  852. avio_wb32(&b, 0); // version + flags
  853. avio_wb32(&b, spherical->bound_top);
  854. avio_wb32(&b, spherical->bound_bottom);
  855. avio_wb32(&b, spherical->bound_left);
  856. avio_wb32(&b, spherical->bound_right);
  857. put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, private, sizeof(private));
  858. break;
  859. }
  860. case AV_SPHERICAL_CUBEMAP:
  861. {
  862. AVIOContext b;
  863. uint8_t private[12];
  864. ffio_init_context(&b, private, sizeof(private),
  865. 1, NULL, NULL, NULL, NULL);
  866. put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
  867. MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP);
  868. avio_wb32(&b, 0); // version + flags
  869. avio_wb32(&b, 0); // layout
  870. avio_wb32(&b, spherical->padding);
  871. put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, private, sizeof(private));
  872. break;
  873. }
  874. default:
  875. av_log(s, AV_LOG_WARNING, "Unknown projection type\n");
  876. goto end;
  877. }
  878. if (spherical->yaw)
  879. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, (double)spherical->yaw / (1 << 16));
  880. if (spherical->pitch)
  881. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, (double)spherical->pitch / (1 << 16));
  882. if (spherical->roll)
  883. put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, (double)spherical->roll / (1 << 16));
  884. end:
  885. projection_size = avio_close_dyn_buf(dyn_cp, &projection_ptr);
  886. if (projection_size) {
  887. ebml_master projection = start_ebml_master(pb, MATROSKA_ID_VIDEOPROJECTION, projection_size);
  888. avio_write(pb, projection_ptr, projection_size);
  889. end_ebml_master(pb, projection);
  890. }
  891. av_freep(&projection_ptr);
  892. }
  893. return 0;
  894. }
  895. static void mkv_write_field_order(AVIOContext *pb, int mode,
  896. enum AVFieldOrder field_order)
  897. {
  898. switch (field_order) {
  899. case AV_FIELD_UNKNOWN:
  900. break;
  901. case AV_FIELD_PROGRESSIVE:
  902. put_ebml_uint(pb, MATROSKA_ID_VIDEOFLAGINTERLACED,
  903. MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE);
  904. break;
  905. case AV_FIELD_TT:
  906. case AV_FIELD_BB:
  907. case AV_FIELD_TB:
  908. case AV_FIELD_BT:
  909. put_ebml_uint(pb, MATROSKA_ID_VIDEOFLAGINTERLACED,
  910. MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED);
  911. if (mode != MODE_WEBM) {
  912. switch (field_order) {
  913. case AV_FIELD_TT:
  914. put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER,
  915. MATROSKA_VIDEO_FIELDORDER_TT);
  916. break;
  917. case AV_FIELD_BB:
  918. put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER,
  919. MATROSKA_VIDEO_FIELDORDER_BB);
  920. break;
  921. case AV_FIELD_TB:
  922. put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER,
  923. MATROSKA_VIDEO_FIELDORDER_TB);
  924. break;
  925. case AV_FIELD_BT:
  926. put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER,
  927. MATROSKA_VIDEO_FIELDORDER_BT);
  928. break;
  929. }
  930. }
  931. }
  932. }
  933. static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb,
  934. AVStream *st, int mode, int *h_width, int *h_height)
  935. {
  936. int i;
  937. int ret = 0;
  938. AVDictionaryEntry *tag;
  939. MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB;
  940. *h_width = 1;
  941. *h_height = 1;
  942. // convert metadata into proper side data and add it to the stream
  943. if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
  944. (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
  945. int stereo_mode = atoi(tag->value);
  946. for (i=0; i<MATROSKA_VIDEO_STEREOMODE_TYPE_NB; i++)
  947. if (!strcmp(tag->value, ff_matroska_video_stereo_mode[i])){
  948. stereo_mode = i;
  949. break;
  950. }
  951. if (stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB &&
  952. stereo_mode != 10 && stereo_mode != 12) {
  953. int ret = ff_mkv_stereo3d_conv(st, stereo_mode);
  954. if (ret < 0)
  955. return ret;
  956. }
  957. }
  958. // iterate to find the stereo3d side data
  959. for (i = 0; i < st->nb_side_data; i++) {
  960. AVPacketSideData sd = st->side_data[i];
  961. if (sd.type == AV_PKT_DATA_STEREO3D) {
  962. AVStereo3D *stereo = (AVStereo3D *)sd.data;
  963. switch (stereo->type) {
  964. case AV_STEREO3D_2D:
  965. format = MATROSKA_VIDEO_STEREOMODE_TYPE_MONO;
  966. break;
  967. case AV_STEREO3D_SIDEBYSIDE:
  968. format = (stereo->flags & AV_STEREO3D_FLAG_INVERT)
  969. ? MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT
  970. : MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT;
  971. *h_width = 2;
  972. break;
  973. case AV_STEREO3D_TOPBOTTOM:
  974. format = MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM;
  975. if (stereo->flags & AV_STEREO3D_FLAG_INVERT)
  976. format--;
  977. *h_height = 2;
  978. break;
  979. case AV_STEREO3D_CHECKERBOARD:
  980. format = MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR;
  981. if (stereo->flags & AV_STEREO3D_FLAG_INVERT)
  982. format--;
  983. break;
  984. case AV_STEREO3D_LINES:
  985. format = MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR;
  986. if (stereo->flags & AV_STEREO3D_FLAG_INVERT)
  987. format--;
  988. *h_height = 2;
  989. break;
  990. case AV_STEREO3D_COLUMNS:
  991. format = MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR;
  992. if (stereo->flags & AV_STEREO3D_FLAG_INVERT)
  993. format--;
  994. *h_width = 2;
  995. break;
  996. case AV_STEREO3D_FRAMESEQUENCE:
  997. format = MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR;
  998. if (stereo->flags & AV_STEREO3D_FLAG_INVERT)
  999. format++;
  1000. break;
  1001. }
  1002. break;
  1003. }
  1004. }
  1005. if (format == MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
  1006. return ret;
  1007. // if webm, do not write unsupported modes
  1008. if ((mode == MODE_WEBM &&
  1009. format > MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM &&
  1010. format != MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT)
  1011. || format >= MATROSKA_VIDEO_STEREOMODE_TYPE_NB) {
  1012. av_log(s, AV_LOG_ERROR,
  1013. "The specified stereo mode is not valid.\n");
  1014. format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB;
  1015. return AVERROR(EINVAL);
  1016. }
  1017. // write StereoMode if format is valid
  1018. put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, format);
  1019. return ret;
  1020. }
  1021. static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
  1022. int i, AVIOContext *pb, int default_stream_exists)
  1023. {
  1024. AVStream *st = s->streams[i];
  1025. AVCodecParameters *par = st->codecpar;
  1026. ebml_master subinfo, track;
  1027. int native_id = 0;
  1028. int qt_id = 0;
  1029. int bit_depth = av_get_bits_per_sample(par->codec_id);
  1030. int sample_rate = par->sample_rate;
  1031. int output_sample_rate = 0;
  1032. int display_width_div = 1;
  1033. int display_height_div = 1;
  1034. int j, ret;
  1035. AVDictionaryEntry *tag;
  1036. if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
  1037. mkv->have_attachments = 1;
  1038. return 0;
  1039. }
  1040. if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
  1041. if (!bit_depth && par->codec_id != AV_CODEC_ID_ADPCM_G726) {
  1042. if (par->bits_per_raw_sample)
  1043. bit_depth = par->bits_per_raw_sample;
  1044. else
  1045. bit_depth = av_get_bytes_per_sample(par->format) << 3;
  1046. }
  1047. if (!bit_depth)
  1048. bit_depth = par->bits_per_coded_sample;
  1049. }
  1050. if (par->codec_id == AV_CODEC_ID_AAC) {
  1051. ret = get_aac_sample_rates(s, par->extradata, par->extradata_size, &sample_rate,
  1052. &output_sample_rate);
  1053. if (ret < 0)
  1054. return ret;
  1055. }
  1056. track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
  1057. put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER,
  1058. mkv->is_dash ? mkv->dash_track_number : i + 1);
  1059. put_ebml_uint (pb, MATROSKA_ID_TRACKUID,
  1060. mkv->is_dash ? mkv->dash_track_number : i + 1);
  1061. put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0); // no lacing (yet)
  1062. if ((tag = av_dict_get(st->metadata, "title", NULL, 0)))
  1063. put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value);
  1064. tag = av_dict_get(st->metadata, "language", NULL, 0);
  1065. if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) {
  1066. put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag && tag->value ? tag->value:"und");
  1067. } else if (tag && tag->value) {
  1068. put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag->value);
  1069. }
  1070. // The default value for TRACKFLAGDEFAULT is 1, so add element
  1071. // if we need to clear it.
  1072. if (default_stream_exists && !(st->disposition & AV_DISPOSITION_DEFAULT))
  1073. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT));
  1074. if (st->disposition & AV_DISPOSITION_FORCED)
  1075. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1);
  1076. if (mkv->mode == MODE_WEBM && par->codec_id == AV_CODEC_ID_WEBVTT) {
  1077. const char *codec_id;
  1078. if (st->disposition & AV_DISPOSITION_CAPTIONS) {
  1079. codec_id = "D_WEBVTT/CAPTIONS";
  1080. native_id = MATROSKA_TRACK_TYPE_SUBTITLE;
  1081. } else if (st->disposition & AV_DISPOSITION_DESCRIPTIONS) {
  1082. codec_id = "D_WEBVTT/DESCRIPTIONS";
  1083. native_id = MATROSKA_TRACK_TYPE_METADATA;
  1084. } else if (st->disposition & AV_DISPOSITION_METADATA) {
  1085. codec_id = "D_WEBVTT/METADATA";
  1086. native_id = MATROSKA_TRACK_TYPE_METADATA;
  1087. } else {
  1088. codec_id = "D_WEBVTT/SUBTITLES";
  1089. native_id = MATROSKA_TRACK_TYPE_SUBTITLE;
  1090. }
  1091. put_ebml_string(pb, MATROSKA_ID_CODECID, codec_id);
  1092. } else {
  1093. // look for a codec ID string specific to mkv to use,
  1094. // if none are found, use AVI codes
  1095. if (par->codec_id != AV_CODEC_ID_RAWVIDEO || par->codec_tag) {
  1096. for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
  1097. if (ff_mkv_codec_tags[j].id == par->codec_id && par->codec_id != AV_CODEC_ID_FFV1) {
  1098. put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str);
  1099. native_id = 1;
  1100. break;
  1101. }
  1102. }
  1103. } else {
  1104. if (mkv->allow_raw_vfw) {
  1105. native_id = 0;
  1106. } else {
  1107. av_log(s, AV_LOG_ERROR, "Raw RGB is not supported Natively in Matroska, you can use AVI or NUT or\n"
  1108. "If you would like to store it anyway using VFW mode, enable allow_raw_vfw (-allow_raw_vfw 1)\n");
  1109. return AVERROR(EINVAL);
  1110. }
  1111. }
  1112. }
  1113. if (par->codec_type == AVMEDIA_TYPE_AUDIO && par->initial_padding && par->codec_id == AV_CODEC_ID_OPUS) {
  1114. int64_t codecdelay = av_rescale_q(par->initial_padding,
  1115. (AVRational){ 1, 48000 },
  1116. (AVRational){ 1, 1000000000 });
  1117. if (codecdelay < 0) {
  1118. av_log(s, AV_LOG_ERROR, "Initial padding is invalid\n");
  1119. return AVERROR(EINVAL);
  1120. }
  1121. // mkv->tracks[i].ts_offset = av_rescale_q(par->initial_padding,
  1122. // (AVRational){ 1, par->sample_rate },
  1123. // st->time_base);
  1124. put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay);
  1125. }
  1126. if (par->codec_id == AV_CODEC_ID_OPUS) {
  1127. put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL);
  1128. }
  1129. if (mkv->mode == MODE_WEBM && !(par->codec_id == AV_CODEC_ID_VP8 ||
  1130. par->codec_id == AV_CODEC_ID_VP9 ||
  1131. par->codec_id == AV_CODEC_ID_OPUS ||
  1132. par->codec_id == AV_CODEC_ID_VORBIS ||
  1133. par->codec_id == AV_CODEC_ID_WEBVTT)) {
  1134. av_log(s, AV_LOG_ERROR,
  1135. "Only VP8 or VP9 video and Vorbis or Opus audio and WebVTT subtitles are supported for WebM.\n");
  1136. return AVERROR(EINVAL);
  1137. }
  1138. switch (par->codec_type) {
  1139. case AVMEDIA_TYPE_VIDEO:
  1140. mkv->have_video = 1;
  1141. put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
  1142. if( st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0
  1143. && av_cmp_q(av_inv_q(st->avg_frame_rate), st->time_base) > 0)
  1144. put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1000000000LL * st->avg_frame_rate.den / st->avg_frame_rate.num);
  1145. else
  1146. put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1000000000LL * st->time_base.num / st->time_base.den);
  1147. if (!native_id &&
  1148. ff_codec_get_tag(ff_codec_movvideo_tags, par->codec_id) &&
  1149. ((!ff_codec_get_tag(ff_codec_bmp_tags, par->codec_id) && par->codec_id != AV_CODEC_ID_RAWVIDEO) ||
  1150. par->codec_id == AV_CODEC_ID_SVQ1 ||
  1151. par->codec_id == AV_CODEC_ID_SVQ3 ||
  1152. par->codec_id == AV_CODEC_ID_CINEPAK))
  1153. qt_id = 1;
  1154. if (qt_id)
  1155. put_ebml_string(pb, MATROSKA_ID_CODECID, "V_QUICKTIME");
  1156. else if (!native_id) {
  1157. // if there is no mkv-specific codec ID, use VFW mode
  1158. put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC");
  1159. mkv->tracks[i].write_dts = 1;
  1160. s->internal->avoid_negative_ts_use_pts = 0;
  1161. }
  1162. subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0);
  1163. put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , par->width);
  1164. put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, par->height);
  1165. mkv_write_field_order(pb, mkv->mode, par->field_order);
  1166. // check both side data and metadata for stereo information,
  1167. // write the result to the bitstream if any is found
  1168. ret = mkv_write_stereo_mode(s, pb, st, mkv->mode,
  1169. &display_width_div,
  1170. &display_height_div);
  1171. if (ret < 0)
  1172. return ret;
  1173. if (((tag = av_dict_get(st->metadata, "alpha_mode", NULL, 0)) && atoi(tag->value)) ||
  1174. ((tag = av_dict_get( s->metadata, "alpha_mode", NULL, 0)) && atoi(tag->value)) ||
  1175. (par->format == AV_PIX_FMT_YUVA420P)) {
  1176. put_ebml_uint(pb, MATROSKA_ID_VIDEOALPHAMODE, 1);
  1177. }
  1178. // write DisplayWidth and DisplayHeight, they contain the size of
  1179. // a single source view and/or the display aspect ratio
  1180. if (st->sample_aspect_ratio.num) {
  1181. int64_t d_width = av_rescale(par->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
  1182. if (d_width > INT_MAX) {
  1183. av_log(s, AV_LOG_ERROR, "Overflow in display width\n");
  1184. return AVERROR(EINVAL);
  1185. }
  1186. if (d_width != par->width || display_width_div != 1 || display_height_div != 1) {
  1187. if (mkv->mode == MODE_WEBM || display_width_div != 1 || display_height_div != 1) {
  1188. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width / display_width_div);
  1189. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, par->height / display_height_div);
  1190. } else {
  1191. AVRational display_aspect_ratio;
  1192. av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
  1193. par->width * (int64_t)st->sample_aspect_ratio.num,
  1194. par->height * (int64_t)st->sample_aspect_ratio.den,
  1195. 1024 * 1024);
  1196. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH, display_aspect_ratio.num);
  1197. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, display_aspect_ratio.den);
  1198. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_DAR);
  1199. }
  1200. }
  1201. } else if (display_width_div != 1 || display_height_div != 1) {
  1202. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , par->width / display_width_div);
  1203. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, par->height / display_height_div);
  1204. } else if (mkv->mode != MODE_WEBM)
  1205. put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN);
  1206. if (par->codec_id == AV_CODEC_ID_RAWVIDEO) {
  1207. uint32_t color_space = av_le2ne32(par->codec_tag);
  1208. put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space));
  1209. }
  1210. ret = mkv_write_video_color(pb, par, st);
  1211. if (ret < 0)
  1212. return ret;
  1213. ret = mkv_write_video_projection(s, pb, st);
  1214. if (ret < 0)
  1215. return ret;
  1216. end_ebml_master(pb, subinfo);
  1217. break;
  1218. case AVMEDIA_TYPE_AUDIO:
  1219. put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
  1220. if (!native_id)
  1221. // no mkv-specific ID, use ACM mode
  1222. put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM");
  1223. subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0);
  1224. put_ebml_uint (pb, MATROSKA_ID_AUDIOCHANNELS , par->channels);
  1225. mkv->tracks[i].sample_rate_offset = avio_tell(pb);
  1226. put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
  1227. if (output_sample_rate)
  1228. put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
  1229. if (bit_depth)
  1230. put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
  1231. end_ebml_master(pb, subinfo);
  1232. break;
  1233. case AVMEDIA_TYPE_SUBTITLE:
  1234. if (!native_id) {
  1235. av_log(s, AV_LOG_ERROR, "Subtitle codec %d is not supported.\n", par->codec_id);
  1236. return AVERROR(ENOSYS);
  1237. }
  1238. if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT)
  1239. native_id = MATROSKA_TRACK_TYPE_SUBTITLE;
  1240. put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, native_id);
  1241. break;
  1242. default:
  1243. av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.\n");
  1244. return AVERROR(EINVAL);
  1245. }
  1246. if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) {
  1247. mkv->tracks[i].codecpriv_offset = avio_tell(pb);
  1248. ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id);
  1249. if (ret < 0)
  1250. return ret;
  1251. }
  1252. end_ebml_master(pb, track);
  1253. return 0;
  1254. }
  1255. static int mkv_write_tracks(AVFormatContext *s)
  1256. {
  1257. MatroskaMuxContext *mkv = s->priv_data;
  1258. AVIOContext *pb = s->pb;
  1259. int i, ret, default_stream_exists = 0;
  1260. ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
  1261. if (ret < 0)
  1262. return ret;
  1263. ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, &mkv->tracks_master, MATROSKA_ID_TRACKS, 0);
  1264. if (ret < 0)
  1265. return ret;
  1266. for (i = 0; i < s->nb_streams; i++) {
  1267. AVStream *st = s->streams[i];
  1268. default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT;
  1269. }
  1270. for (i = 0; i < s->nb_streams; i++) {
  1271. ret = mkv_write_track(s, mkv, i, mkv->tracks_bc, default_stream_exists);
  1272. if (ret < 0)
  1273. return ret;
  1274. }
  1275. if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
  1276. end_ebml_master_crc32_preliminary(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
  1277. else
  1278. end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
  1279. return 0;
  1280. }
  1281. static int mkv_write_chapters(AVFormatContext *s)
  1282. {
  1283. MatroskaMuxContext *mkv = s->priv_data;
  1284. AVIOContext *dyn_cp, *pb = s->pb;
  1285. ebml_master chapters, editionentry;
  1286. AVRational scale = {1, 1E9};
  1287. int i, ret;
  1288. if (!s->nb_chapters || mkv->wrote_chapters)
  1289. return 0;
  1290. ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
  1291. if (ret < 0) return ret;
  1292. ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &chapters, MATROSKA_ID_CHAPTERS, 0);
  1293. if (ret < 0) return ret;
  1294. editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0);
  1295. if (mkv->mode != MODE_WEBM) {
  1296. put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1);
  1297. put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGHIDDEN , 0);
  1298. }
  1299. for (i = 0; i < s->nb_chapters; i++) {
  1300. ebml_master chapteratom, chapterdisplay;
  1301. AVChapter *c = s->chapters[i];
  1302. int64_t chapterstart = av_rescale_q(c->start, c->time_base, scale);
  1303. int64_t chapterend = av_rescale_q(c->end, c->time_base, scale);
  1304. AVDictionaryEntry *t = NULL;
  1305. if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) {
  1306. av_log(s, AV_LOG_ERROR,
  1307. "Invalid chapter start (%"PRId64") or end (%"PRId64").\n",
  1308. chapterstart, chapterend);
  1309. return AVERROR_INVALIDDATA;
  1310. }
  1311. chapteratom = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERATOM, 0);
  1312. put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, c->id + mkv->chapter_id_offset);
  1313. put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart);
  1314. put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend);
  1315. if (mkv->mode != MODE_WEBM) {
  1316. put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0);
  1317. put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGENABLED, 1);
  1318. }
  1319. if ((t = av_dict_get(c->metadata, "title", NULL, 0))) {
  1320. chapterdisplay = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERDISPLAY, 0);
  1321. put_ebml_string(dyn_cp, MATROSKA_ID_CHAPSTRING, t->value);
  1322. put_ebml_string(dyn_cp, MATROSKA_ID_CHAPLANG , "und");
  1323. end_ebml_master(dyn_cp, chapterdisplay);
  1324. }
  1325. end_ebml_master(dyn_cp, chapteratom);
  1326. }
  1327. end_ebml_master(dyn_cp, editionentry);
  1328. end_ebml_master_crc32(pb, &dyn_cp, mkv, chapters);
  1329. mkv->wrote_chapters = 1;
  1330. return 0;
  1331. }
  1332. static int mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t)
  1333. {
  1334. uint8_t *key = av_strdup(t->key);
  1335. uint8_t *p = key;
  1336. const uint8_t *lang = NULL;
  1337. ebml_master tag;
  1338. if (!key)
  1339. return AVERROR(ENOMEM);
  1340. if ((p = strrchr(p, '-')) &&
  1341. (lang = ff_convert_lang_to(p + 1, AV_LANG_ISO639_2_BIBL)))
  1342. *p = 0;
  1343. p = key;
  1344. while (*p) {
  1345. if (*p == ' ')
  1346. *p = '_';
  1347. else if (*p >= 'a' && *p <= 'z')
  1348. *p -= 'a' - 'A';
  1349. p++;
  1350. }
  1351. tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0);
  1352. put_ebml_string(pb, MATROSKA_ID_TAGNAME, key);
  1353. if (lang)
  1354. put_ebml_string(pb, MATROSKA_ID_TAGLANG, lang);
  1355. put_ebml_string(pb, MATROSKA_ID_TAGSTRING, t->value);
  1356. end_ebml_master(pb, tag);
  1357. av_freep(&key);
  1358. return 0;
  1359. }
  1360. static int mkv_write_tag_targets(AVFormatContext *s,
  1361. unsigned int elementid, unsigned int uid,
  1362. ebml_master *tags, ebml_master* tag)
  1363. {
  1364. AVIOContext *pb;
  1365. MatroskaMuxContext *mkv = s->priv_data;
  1366. ebml_master targets;
  1367. int ret;
  1368. if (!tags->pos) {
  1369. ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
  1370. if (ret < 0) return ret;
  1371. start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, tags, MATROSKA_ID_TAGS, 0);
  1372. }
  1373. pb = mkv->tags_bc;
  1374. *tag = start_ebml_master(pb, MATROSKA_ID_TAG, 0);
  1375. targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 0);
  1376. if (elementid)
  1377. put_ebml_uint(pb, elementid, uid);
  1378. end_ebml_master(pb, targets);
  1379. return 0;
  1380. }
  1381. static int mkv_check_tag_name(const char *name, unsigned int elementid)
  1382. {
  1383. return av_strcasecmp(name, "title") &&
  1384. av_strcasecmp(name, "stereo_mode") &&
  1385. av_strcasecmp(name, "creation_time") &&
  1386. av_strcasecmp(name, "encoding_tool") &&
  1387. av_strcasecmp(name, "duration") &&
  1388. (elementid != MATROSKA_ID_TAGTARGETS_TRACKUID ||
  1389. av_strcasecmp(name, "language")) &&
  1390. (elementid != MATROSKA_ID_TAGTARGETS_ATTACHUID ||
  1391. (av_strcasecmp(name, "filename") &&
  1392. av_strcasecmp(name, "mimetype")));
  1393. }
  1394. static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int elementid,
  1395. unsigned int uid, ebml_master *tags)
  1396. {
  1397. MatroskaMuxContext *mkv = s->priv_data;
  1398. ebml_master tag;
  1399. int ret;
  1400. AVDictionaryEntry *t = NULL;
  1401. ret = mkv_write_tag_targets(s, elementid, uid, tags, &tag);
  1402. if (ret < 0)
  1403. return ret;
  1404. while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) {
  1405. if (mkv_check_tag_name(t->key, elementid)) {
  1406. ret = mkv_write_simpletag(mkv->tags_bc, t);
  1407. if (ret < 0)
  1408. return ret;
  1409. }
  1410. }
  1411. end_ebml_master(mkv->tags_bc, tag);
  1412. return 0;
  1413. }
  1414. static int mkv_check_tag(AVDictionary *m, unsigned int elementid)
  1415. {
  1416. AVDictionaryEntry *t = NULL;
  1417. while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
  1418. if (mkv_check_tag_name(t->key, elementid))
  1419. return 1;
  1420. return 0;
  1421. }
  1422. static int mkv_write_tags(AVFormatContext *s)
  1423. {
  1424. MatroskaMuxContext *mkv = s->priv_data;
  1425. int i, ret;
  1426. ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL);
  1427. if (mkv_check_tag(s->metadata, 0)) {
  1428. ret = mkv_write_tag(s, s->metadata, 0, 0, &mkv->tags);
  1429. if (ret < 0) return ret;
  1430. }
  1431. for (i = 0; i < s->nb_streams; i++) {
  1432. AVStream *st = s->streams[i];
  1433. if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT)
  1434. continue;
  1435. if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID))
  1436. continue;
  1437. ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &mkv->tags);
  1438. if (ret < 0) return ret;
  1439. }
  1440. if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
  1441. for (i = 0; i < s->nb_streams; i++) {
  1442. AVIOContext *pb;
  1443. AVStream *st = s->streams[i];
  1444. ebml_master tag_target;
  1445. ebml_master tag;
  1446. if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT)
  1447. continue;
  1448. mkv_write_tag_targets(s, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &mkv->tags, &tag_target);
  1449. pb = mkv->tags_bc;
  1450. tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0);
  1451. put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION");
  1452. mkv->stream_duration_offsets[i] = avio_tell(pb);
  1453. // Reserve space to write duration as a 20-byte string.
  1454. // 2 (ebml id) + 1 (data size) + 20 (data)
  1455. put_ebml_void(pb, 23);
  1456. end_ebml_master(pb, tag);
  1457. end_ebml_master(pb, tag_target);
  1458. }
  1459. }
  1460. if (mkv->mode != MODE_WEBM) {
  1461. for (i = 0; i < s->nb_chapters; i++) {
  1462. AVChapter *ch = s->chapters[i];
  1463. if (!mkv_check_tag(ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID))
  1464. continue;
  1465. ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, ch->id + mkv->chapter_id_offset, &mkv->tags);
  1466. if (ret < 0)
  1467. return ret;
  1468. }
  1469. }
  1470. if (mkv->have_attachments && mkv->mode != MODE_WEBM) {
  1471. for (i = 0; i < mkv->attachments->num_entries; i++) {
  1472. mkv_attachment *attachment = &mkv->attachments->entries[i];
  1473. AVStream *st = s->streams[attachment->stream_idx];
  1474. if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID))
  1475. continue;
  1476. ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, attachment->fileuid, &mkv->tags);
  1477. if (ret < 0)
  1478. return ret;
  1479. }
  1480. }
  1481. if (mkv->tags.pos) {
  1482. if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
  1483. end_ebml_master_crc32_preliminary(s->pb, &mkv->tags_bc, mkv, mkv->tags);
  1484. else
  1485. end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, mkv->tags);
  1486. }
  1487. return 0;
  1488. }
  1489. static int mkv_write_attachments(AVFormatContext *s)
  1490. {
  1491. MatroskaMuxContext *mkv = s->priv_data;
  1492. AVIOContext *dyn_cp, *pb = s->pb;
  1493. ebml_master attachments;
  1494. AVLFG c;
  1495. int i, ret;
  1496. if (!mkv->have_attachments)
  1497. return 0;
  1498. mkv->attachments = av_mallocz(sizeof(*mkv->attachments));
  1499. if (!mkv->attachments)
  1500. return AVERROR(ENOMEM);
  1501. av_lfg_init(&c, av_get_random_seed());
  1502. ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
  1503. if (ret < 0) return ret;
  1504. ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &attachments, MATROSKA_ID_ATTACHMENTS, 0);
  1505. if (ret < 0) return ret;
  1506. for (i = 0; i < s->nb_streams; i++) {
  1507. AVStream *st = s->streams[i];
  1508. ebml_master attached_file;
  1509. mkv_attachment *attachment = mkv->attachments->entries;
  1510. AVDictionaryEntry *t;
  1511. const char *mimetype = NULL;
  1512. uint32_t fileuid;
  1513. if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT)
  1514. continue;
  1515. attachment = av_realloc_array(attachment, mkv->attachments->num_entries + 1, sizeof(mkv_attachment));
  1516. if (!attachment)
  1517. return AVERROR(ENOMEM);
  1518. mkv->attachments->entries = attachment;
  1519. attached_file = start_ebml_master(dyn_cp, MATROSKA_ID_ATTACHEDFILE, 0);
  1520. if (t = av_dict_get(st->metadata, "title", NULL, 0))
  1521. put_ebml_string(dyn_cp, MATROSKA_ID_FILEDESC, t->value);
  1522. if (!(t = av_dict_get(st->metadata, "filename", NULL, 0))) {
  1523. av_log(s, AV_LOG_ERROR, "Attachment stream %d has no filename tag.\n", i);
  1524. return AVERROR(EINVAL);
  1525. }
  1526. put_ebml_string(dyn_cp, MATROSKA_ID_FILENAME, t->value);
  1527. if (t = av_dict_get(st->metadata, "mimetype", NULL, 0))
  1528. mimetype = t->value;
  1529. else if (st->codecpar->codec_id != AV_CODEC_ID_NONE ) {
  1530. int i;
  1531. for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++)
  1532. if (ff_mkv_mime_tags[i].id == st->codecpar->codec_id) {
  1533. mimetype = ff_mkv_mime_tags[i].str;
  1534. break;
  1535. }
  1536. for (i = 0; ff_mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++)
  1537. if (ff_mkv_image_mime_tags[i].id == st->codecpar->codec_id) {
  1538. mimetype = ff_mkv_image_mime_tags[i].str;
  1539. break;
  1540. }
  1541. }
  1542. if (!mimetype) {
  1543. av_log(s, AV_LOG_ERROR, "Attachment stream %d has no mimetype tag and "
  1544. "it cannot be deduced from the codec id.\n", i);
  1545. return AVERROR(EINVAL);
  1546. }
  1547. if (s->flags & AVFMT_FLAG_BITEXACT) {
  1548. struct AVSHA *sha = av_sha_alloc();
  1549. uint8_t digest[20];
  1550. if (!sha)
  1551. return AVERROR(ENOMEM);
  1552. av_sha_init(sha, 160);
  1553. av_sha_update(sha, st->codecpar->extradata, st->codecpar->extradata_size);
  1554. av_sha_final(sha, digest);
  1555. av_free(sha);
  1556. fileuid = AV_RL32(digest);
  1557. } else {
  1558. fileuid = av_lfg_get(&c);
  1559. }
  1560. av_log(s, AV_LOG_VERBOSE, "Using %.8"PRIx32" for attachment %d\n",
  1561. fileuid, mkv->attachments->num_entries);
  1562. put_ebml_string(dyn_cp, MATROSKA_ID_FILEMIMETYPE, mimetype);
  1563. put_ebml_binary(dyn_cp, MATROSKA_ID_FILEDATA, st->codecpar->extradata, st->codecpar->extradata_size);
  1564. put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, fileuid);
  1565. end_ebml_master(dyn_cp, attached_file);
  1566. mkv->attachments->entries[mkv->attachments->num_entries].stream_idx = i;
  1567. mkv->attachments->entries[mkv->attachments->num_entries++].fileuid = fileuid;
  1568. }
  1569. end_ebml_master_crc32(pb, &dyn_cp, mkv, attachments);
  1570. return 0;
  1571. }
  1572. static int64_t get_metadata_duration(AVFormatContext *s)
  1573. {
  1574. int i = 0;
  1575. int64_t max = 0;
  1576. int64_t us;
  1577. AVDictionaryEntry *explicitDuration = av_dict_get(s->metadata, "DURATION", NULL, 0);
  1578. if (explicitDuration && (av_parse_time(&us, explicitDuration->value, 1) == 0) && us > 0) {
  1579. av_log(s, AV_LOG_DEBUG, "get_metadata_duration found duration in context metadata: %" PRId64 "\n", us);
  1580. return us;
  1581. }
  1582. for (i = 0; i < s->nb_streams; i++) {
  1583. int64_t us;
  1584. AVDictionaryEntry *duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0);
  1585. if (duration && (av_parse_time(&us, duration->value, 1) == 0))
  1586. max = FFMAX(max, us);
  1587. }
  1588. av_log(s, AV_LOG_DEBUG, "get_metadata_duration returned: %" PRId64 "\n", max);
  1589. return max;
  1590. }
  1591. static int mkv_write_header(AVFormatContext *s)
  1592. {
  1593. MatroskaMuxContext *mkv = s->priv_data;
  1594. AVIOContext *pb = s->pb;
  1595. ebml_master ebml_header;
  1596. AVDictionaryEntry *tag;
  1597. int ret, i, version = 2;
  1598. int64_t creation_time;
  1599. if (!strcmp(s->oformat->name, "webm"))
  1600. mkv->mode = MODE_WEBM;
  1601. else
  1602. mkv->mode = MODE_MATROSKAv2;
  1603. if (mkv->mode != MODE_WEBM ||
  1604. av_dict_get(s->metadata, "stereo_mode", NULL, 0) ||
  1605. av_dict_get(s->metadata, "alpha_mode", NULL, 0))
  1606. version = 4;
  1607. for (i = 0; i < s->nb_streams; i++) {
  1608. if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_ATRAC3 ||
  1609. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_COOK ||
  1610. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_RA_288 ||
  1611. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_SIPR ||
  1612. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_RV10 ||
  1613. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_RV20) {
  1614. av_log(s, AV_LOG_ERROR,
  1615. "The Matroska muxer does not yet support muxing %s\n",
  1616. avcodec_get_name(s->streams[i]->codecpar->codec_id));
  1617. return AVERROR_PATCHWELCOME;
  1618. }
  1619. if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_OPUS ||
  1620. av_dict_get(s->streams[i]->metadata, "stereo_mode", NULL, 0) ||
  1621. av_dict_get(s->streams[i]->metadata, "alpha_mode", NULL, 0))
  1622. version = 4;
  1623. }
  1624. mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks));
  1625. if (!mkv->tracks) {
  1626. ret = AVERROR(ENOMEM);
  1627. goto fail;
  1628. }
  1629. ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0);
  1630. put_ebml_uint (pb, EBML_ID_EBMLVERSION , 1);
  1631. put_ebml_uint (pb, EBML_ID_EBMLREADVERSION , 1);
  1632. put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4);
  1633. put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8);
  1634. put_ebml_string (pb, EBML_ID_DOCTYPE , s->oformat->name);
  1635. put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , version);
  1636. put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2);
  1637. end_ebml_master(pb, ebml_header);
  1638. mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0);
  1639. mkv->segment_offset = avio_tell(pb);
  1640. // we write 2 seek heads - one at the end of the file to point to each
  1641. // cluster, and one at the beginning to point to all other level one
  1642. // elements (including the seek head at the end of the file), which
  1643. // isn't more than 10 elements if we only write one of each other
  1644. // currently defined level 1 element
  1645. mkv->main_seekhead = mkv_start_seekhead(pb, mkv->segment_offset, 10);
  1646. if (!mkv->main_seekhead) {
  1647. ret = AVERROR(ENOMEM);
  1648. goto fail;
  1649. }
  1650. ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, avio_tell(pb));
  1651. if (ret < 0) goto fail;
  1652. ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, &mkv->info, MATROSKA_ID_INFO, 0);
  1653. if (ret < 0)
  1654. return ret;
  1655. pb = mkv->info_bc;
  1656. put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
  1657. if ((tag = av_dict_get(s->metadata, "title", NULL, 0)))
  1658. put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value);
  1659. if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
  1660. put_ebml_string(pb, MATROSKA_ID_MUXINGAPP, LIBAVFORMAT_IDENT);
  1661. if ((tag = av_dict_get(s->metadata, "encoding_tool", NULL, 0)))
  1662. put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, tag->value);
  1663. else
  1664. put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
  1665. if (mkv->mode != MODE_WEBM) {
  1666. uint32_t segment_uid[4];
  1667. AVLFG lfg;
  1668. av_lfg_init(&lfg, av_get_random_seed());
  1669. for (i = 0; i < 4; i++)
  1670. segment_uid[i] = av_lfg_get(&lfg);
  1671. put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
  1672. }
  1673. } else {
  1674. const char *ident = "Lavf";
  1675. put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , ident);
  1676. put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, ident);
  1677. }
  1678. if (ff_parse_creation_time_metadata(s, &creation_time, 0) > 0) {
  1679. // Adjust time so it's relative to 2001-01-01 and convert to nanoseconds.
  1680. int64_t date_utc = (creation_time - 978307200000000LL) * 1000;
  1681. uint8_t date_utc_buf[8];
  1682. AV_WB64(date_utc_buf, date_utc);
  1683. put_ebml_binary(pb, MATROSKA_ID_DATEUTC, date_utc_buf, 8);
  1684. }
  1685. // reserve space for the duration
  1686. mkv->duration = 0;
  1687. mkv->duration_offset = avio_tell(pb);
  1688. if (!mkv->is_live) {
  1689. int64_t metadata_duration = get_metadata_duration(s);
  1690. if (s->duration > 0) {
  1691. int64_t scaledDuration = av_rescale(s->duration, 1000, AV_TIME_BASE);
  1692. put_ebml_float(pb, MATROSKA_ID_DURATION, scaledDuration);
  1693. av_log(s, AV_LOG_DEBUG, "Write early duration from recording time = %" PRIu64 "\n", scaledDuration);
  1694. } else if (metadata_duration > 0) {
  1695. int64_t scaledDuration = av_rescale(metadata_duration, 1000, AV_TIME_BASE);
  1696. put_ebml_float(pb, MATROSKA_ID_DURATION, scaledDuration);
  1697. av_log(s, AV_LOG_DEBUG, "Write early duration from metadata = %" PRIu64 "\n", scaledDuration);
  1698. } else {
  1699. put_ebml_void(pb, 11); // assumes double-precision float to be written
  1700. }
  1701. }
  1702. if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
  1703. end_ebml_master_crc32_preliminary(s->pb, &mkv->info_bc, mkv, mkv->info);
  1704. else
  1705. end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, mkv->info);
  1706. pb = s->pb;
  1707. // initialize stream_duration fields
  1708. mkv->stream_durations = av_mallocz(s->nb_streams * sizeof(int64_t));
  1709. mkv->stream_duration_offsets = av_mallocz(s->nb_streams * sizeof(int64_t));
  1710. ret = mkv_write_tracks(s);
  1711. if (ret < 0)
  1712. goto fail;
  1713. for (i = 0; i < s->nb_chapters; i++)
  1714. mkv->chapter_id_offset = FFMAX(mkv->chapter_id_offset, 1LL - s->chapters[i]->id);
  1715. ret = mkv_write_chapters(s);
  1716. if (ret < 0)
  1717. goto fail;
  1718. if (mkv->mode != MODE_WEBM) {
  1719. ret = mkv_write_attachments(s);
  1720. if (ret < 0)
  1721. goto fail;
  1722. }
  1723. ret = mkv_write_tags(s);
  1724. if (ret < 0)
  1725. goto fail;
  1726. if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
  1727. mkv_write_seekhead(pb, mkv);
  1728. mkv->cues = mkv_start_cues(mkv->segment_offset);
  1729. if (!mkv->cues) {
  1730. ret = AVERROR(ENOMEM);
  1731. goto fail;
  1732. }
  1733. if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && mkv->reserve_cues_space) {
  1734. mkv->cues_pos = avio_tell(pb);
  1735. put_ebml_void(pb, mkv->reserve_cues_space);
  1736. }
  1737. av_init_packet(&mkv->cur_audio_pkt);
  1738. mkv->cur_audio_pkt.size = 0;
  1739. mkv->cluster_pos = -1;
  1740. avio_flush(pb);
  1741. // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
  1742. // after 4k and on a keyframe
  1743. if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
  1744. if (mkv->cluster_time_limit < 0)
  1745. mkv->cluster_time_limit = 5000;
  1746. if (mkv->cluster_size_limit < 0)
  1747. mkv->cluster_size_limit = 5 * 1024 * 1024;
  1748. } else {
  1749. if (mkv->cluster_time_limit < 0)
  1750. mkv->cluster_time_limit = 1000;
  1751. if (mkv->cluster_size_limit < 0)
  1752. mkv->cluster_size_limit = 32 * 1024;
  1753. }
  1754. return 0;
  1755. fail:
  1756. mkv_free(mkv);
  1757. return ret;
  1758. }
  1759. static int mkv_blockgroup_size(int pkt_size)
  1760. {
  1761. int size = pkt_size + 4;
  1762. size += ebml_num_size(size);
  1763. size += 2; // EBML ID for block and block duration
  1764. size += 8; // max size of block duration
  1765. size += ebml_num_size(size);
  1766. size += 1; // blockgroup EBML ID
  1767. return size;
  1768. }
  1769. static int mkv_strip_wavpack(const uint8_t *src, uint8_t **pdst, int *size)
  1770. {
  1771. uint8_t *dst;
  1772. int srclen = *size;
  1773. int offset = 0;
  1774. int ret;
  1775. dst = av_malloc(srclen);
  1776. if (!dst)
  1777. return AVERROR(ENOMEM);
  1778. while (srclen >= WV_HEADER_SIZE) {
  1779. WvHeader header;
  1780. ret = ff_wv_parse_header(&header, src);
  1781. if (ret < 0)
  1782. goto fail;
  1783. src += WV_HEADER_SIZE;
  1784. srclen -= WV_HEADER_SIZE;
  1785. if (srclen < header.blocksize) {
  1786. ret = AVERROR_INVALIDDATA;
  1787. goto fail;
  1788. }
  1789. if (header.initial) {
  1790. AV_WL32(dst + offset, header.samples);
  1791. offset += 4;
  1792. }
  1793. AV_WL32(dst + offset, header.flags);
  1794. AV_WL32(dst + offset + 4, header.crc);
  1795. offset += 8;
  1796. if (!(header.initial && header.final)) {
  1797. AV_WL32(dst + offset, header.blocksize);
  1798. offset += 4;
  1799. }
  1800. memcpy(dst + offset, src, header.blocksize);
  1801. src += header.blocksize;
  1802. srclen -= header.blocksize;
  1803. offset += header.blocksize;
  1804. }
  1805. *pdst = dst;
  1806. *size = offset;
  1807. return 0;
  1808. fail:
  1809. av_freep(&dst);
  1810. return ret;
  1811. }
  1812. static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
  1813. unsigned int blockid, AVPacket *pkt, int keyframe)
  1814. {
  1815. MatroskaMuxContext *mkv = s->priv_data;
  1816. AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
  1817. uint8_t *data = NULL, *side_data = NULL;
  1818. int offset = 0, size = pkt->size, side_data_size = 0;
  1819. int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
  1820. uint64_t additional_id = 0;
  1821. int64_t discard_padding = 0;
  1822. uint8_t track_number = (mkv->is_dash ? mkv->dash_track_number : (pkt->stream_index + 1));
  1823. ebml_master block_group, block_additions, block_more;
  1824. ts += mkv->tracks[pkt->stream_index].ts_offset;
  1825. av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
  1826. "pts %" PRId64 ", dts %" PRId64 ", duration %" PRId64 ", keyframe %d\n",
  1827. avio_tell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration,
  1828. keyframe != 0);
  1829. if (par->codec_id == AV_CODEC_ID_H264 && par->extradata_size > 0 &&
  1830. (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1))
  1831. ff_avc_parse_nal_units_buf(pkt->data, &data, &size);
  1832. else if (par->codec_id == AV_CODEC_ID_HEVC && par->extradata_size > 6 &&
  1833. (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1))
  1834. /* extradata is Annex B, assume the bitstream is too and convert it */
  1835. ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL);
  1836. else if (par->codec_id == AV_CODEC_ID_WAVPACK) {
  1837. int ret = mkv_strip_wavpack(pkt->data, &data, &size);
  1838. if (ret < 0) {
  1839. av_log(s, AV_LOG_ERROR, "Error stripping a WavPack packet.\n");
  1840. return;
  1841. }
  1842. } else
  1843. data = pkt->data;
  1844. if (par->codec_id == AV_CODEC_ID_PRORES && size >= 8) {
  1845. /* Matroska specification requires to remove the first QuickTime atom
  1846. */
  1847. size -= 8;
  1848. offset = 8;
  1849. }
  1850. side_data = av_packet_get_side_data(pkt,
  1851. AV_PKT_DATA_SKIP_SAMPLES,
  1852. &side_data_size);
  1853. if (side_data && side_data_size >= 10) {
  1854. discard_padding = av_rescale_q(AV_RL32(side_data + 4),
  1855. (AVRational){1, par->sample_rate},
  1856. (AVRational){1, 1000000000});
  1857. }
  1858. side_data = av_packet_get_side_data(pkt,
  1859. AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
  1860. &side_data_size);
  1861. if (side_data) {
  1862. additional_id = AV_RB64(side_data);
  1863. side_data += 8;
  1864. side_data_size -= 8;
  1865. }
  1866. if ((side_data_size && additional_id == 1) || discard_padding) {
  1867. block_group = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, 0);
  1868. blockid = MATROSKA_ID_BLOCK;
  1869. }
  1870. put_ebml_id(pb, blockid);
  1871. put_ebml_num(pb, size + 4, 0);
  1872. // this assumes stream_index is less than 126
  1873. avio_w8(pb, 0x80 | track_number);
  1874. avio_wb16(pb, ts - mkv->cluster_pts);
  1875. avio_w8(pb, (blockid == MATROSKA_ID_SIMPLEBLOCK && keyframe) ? (1 << 7) : 0);
  1876. avio_write(pb, data + offset, size);
  1877. if (data != pkt->data)
  1878. av_free(data);
  1879. if (blockid == MATROSKA_ID_BLOCK && !keyframe) {
  1880. put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE,
  1881. mkv->last_track_timestamp[track_number - 1]);
  1882. }
  1883. mkv->last_track_timestamp[track_number - 1] = ts - mkv->cluster_pts;
  1884. if (discard_padding) {
  1885. put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding);
  1886. }
  1887. if (side_data_size && additional_id == 1) {
  1888. block_additions = start_ebml_master(pb, MATROSKA_ID_BLOCKADDITIONS, 0);
  1889. block_more = start_ebml_master(pb, MATROSKA_ID_BLOCKMORE, 0);
  1890. put_ebml_uint(pb, MATROSKA_ID_BLOCKADDID, 1);
  1891. put_ebml_id(pb, MATROSKA_ID_BLOCKADDITIONAL);
  1892. put_ebml_num(pb, side_data_size, 0);
  1893. avio_write(pb, side_data, side_data_size);
  1894. end_ebml_master(pb, block_more);
  1895. end_ebml_master(pb, block_additions);
  1896. }
  1897. if ((side_data_size && additional_id == 1) || discard_padding) {
  1898. end_ebml_master(pb, block_group);
  1899. }
  1900. }
  1901. static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
  1902. {
  1903. MatroskaMuxContext *mkv = s->priv_data;
  1904. ebml_master blockgroup;
  1905. int id_size, settings_size, size;
  1906. uint8_t *id, *settings;
  1907. int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
  1908. const int flags = 0;
  1909. id_size = 0;
  1910. id = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_IDENTIFIER,
  1911. &id_size);
  1912. settings_size = 0;
  1913. settings = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_SETTINGS,
  1914. &settings_size);
  1915. size = id_size + 1 + settings_size + 1 + pkt->size;
  1916. av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
  1917. "pts %" PRId64 ", dts %" PRId64 ", duration %" PRId64 ", flags %d\n",
  1918. avio_tell(pb), size, pkt->pts, pkt->dts, pkt->duration, flags);
  1919. blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size));
  1920. put_ebml_id(pb, MATROSKA_ID_BLOCK);
  1921. put_ebml_num(pb, size + 4, 0);
  1922. avio_w8(pb, 0x80 | (pkt->stream_index + 1)); // this assumes stream_index is less than 126
  1923. avio_wb16(pb, ts - mkv->cluster_pts);
  1924. avio_w8(pb, flags);
  1925. avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size, id, settings_size, settings, pkt->size, pkt->data);
  1926. put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, pkt->duration);
  1927. end_ebml_master(pb, blockgroup);
  1928. return pkt->duration;
  1929. }
  1930. static void mkv_start_new_cluster(AVFormatContext *s, AVPacket *pkt)
  1931. {
  1932. MatroskaMuxContext *mkv = s->priv_data;
  1933. end_ebml_master_crc32(s->pb, &mkv->dyn_bc, mkv, mkv->cluster);
  1934. mkv->cluster_pos = -1;
  1935. if (s->pb->seekable & AVIO_SEEKABLE_NORMAL)
  1936. av_log(s, AV_LOG_DEBUG,
  1937. "Starting new cluster at offset %" PRIu64 " bytes, "
  1938. "pts %" PRIu64 "dts %" PRIu64 "\n",
  1939. avio_tell(s->pb), pkt->pts, pkt->dts);
  1940. else
  1941. av_log(s, AV_LOG_DEBUG, "Starting new cluster, "
  1942. "pts %" PRIu64 "dts %" PRIu64 "\n",
  1943. pkt->pts, pkt->dts);
  1944. avio_flush(s->pb);
  1945. }
  1946. static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt)
  1947. {
  1948. MatroskaMuxContext *mkv = s->priv_data;
  1949. mkv_track *track = &mkv->tracks[pkt->stream_index];
  1950. AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
  1951. uint8_t *side_data;
  1952. int side_data_size = 0, ret;
  1953. side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA,
  1954. &side_data_size);
  1955. switch (par->codec_id) {
  1956. case AV_CODEC_ID_AAC:
  1957. if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
  1958. int filler, output_sample_rate = 0;
  1959. int64_t curpos;
  1960. ret = get_aac_sample_rates(s, side_data, side_data_size, &track->sample_rate,
  1961. &output_sample_rate);
  1962. if (ret < 0)
  1963. return ret;
  1964. if (!output_sample_rate)
  1965. output_sample_rate = track->sample_rate; // Space is already reserved, so it's this or a void element.
  1966. av_freep(&par->extradata);
  1967. ret = ff_alloc_extradata(par, side_data_size);
  1968. if (ret < 0)
  1969. return ret;
  1970. memcpy(par->extradata, side_data, side_data_size);
  1971. curpos = avio_tell(mkv->tracks_bc);
  1972. avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET);
  1973. mkv_write_codecprivate(s, mkv->tracks_bc, par, 1, 0);
  1974. filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->tracks_bc) - track->codecpriv_offset);
  1975. if (filler)
  1976. put_ebml_void(mkv->tracks_bc, filler);
  1977. avio_seek(mkv->tracks_bc, track->sample_rate_offset, SEEK_SET);
  1978. put_ebml_float(mkv->tracks_bc, MATROSKA_ID_AUDIOSAMPLINGFREQ, track->sample_rate);
  1979. put_ebml_float(mkv->tracks_bc, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
  1980. avio_seek(mkv->tracks_bc, curpos, SEEK_SET);
  1981. } else if (!par->extradata_size && !track->sample_rate) {
  1982. // No extradata (codecpar or packet side data).
  1983. av_log(s, AV_LOG_ERROR, "Error parsing AAC extradata, unable to determine samplerate.\n");
  1984. return AVERROR(EINVAL);
  1985. }
  1986. break;
  1987. case AV_CODEC_ID_FLAC:
  1988. if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
  1989. AVCodecParameters *codecpriv_par;
  1990. int64_t curpos;
  1991. if (side_data_size != par->extradata_size) {
  1992. av_log(s, AV_LOG_ERROR, "Invalid FLAC STREAMINFO metadata for output stream %d\n",
  1993. pkt->stream_index);
  1994. return AVERROR(EINVAL);
  1995. }
  1996. codecpriv_par = avcodec_parameters_alloc();
  1997. if (!codecpriv_par)
  1998. return AVERROR(ENOMEM);
  1999. ret = avcodec_parameters_copy(codecpriv_par, par);
  2000. if (ret < 0) {
  2001. avcodec_parameters_free(&codecpriv_par);
  2002. return ret;
  2003. }
  2004. memcpy(codecpriv_par->extradata, side_data, side_data_size);
  2005. curpos = avio_tell(mkv->tracks_bc);
  2006. avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET);
  2007. mkv_write_codecprivate(s, mkv->tracks_bc, codecpriv_par, 1, 0);
  2008. avio_seek(mkv->tracks_bc, curpos, SEEK_SET);
  2009. avcodec_parameters_free(&codecpriv_par);
  2010. }
  2011. break;
  2012. default:
  2013. if (side_data_size)
  2014. av_log(s, AV_LOG_DEBUG, "Ignoring new extradata in a packet for stream %d.\n", pkt->stream_index);
  2015. break;
  2016. }
  2017. return 0;
  2018. }
  2019. static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_cue)
  2020. {
  2021. MatroskaMuxContext *mkv = s->priv_data;
  2022. AVIOContext *pb = s->pb;
  2023. AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
  2024. int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
  2025. int duration = pkt->duration;
  2026. int ret;
  2027. int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
  2028. int64_t relative_packet_pos;
  2029. int dash_tracknum = mkv->is_dash ? mkv->dash_track_number : pkt->stream_index + 1;
  2030. if (ts == AV_NOPTS_VALUE) {
  2031. av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n");
  2032. return AVERROR(EINVAL);
  2033. }
  2034. ts += mkv->tracks[pkt->stream_index].ts_offset;
  2035. if (mkv->cluster_pos != -1) {
  2036. int64_t cluster_time = ts - mkv->cluster_pts + mkv->tracks[pkt->stream_index].ts_offset;
  2037. if ((int16_t)cluster_time != cluster_time) {
  2038. av_log(s, AV_LOG_WARNING, "Starting new cluster due to timestamp\n");
  2039. mkv_start_new_cluster(s, pkt);
  2040. }
  2041. }
  2042. if (mkv->cluster_pos == -1) {
  2043. mkv->cluster_pos = avio_tell(s->pb);
  2044. ret = start_ebml_master_crc32(s->pb, &mkv->dyn_bc, mkv, &mkv->cluster, MATROSKA_ID_CLUSTER, 0);
  2045. if (ret < 0)
  2046. return ret;
  2047. put_ebml_uint(mkv->dyn_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
  2048. mkv->cluster_pts = FFMAX(0, ts);
  2049. }
  2050. pb = mkv->dyn_bc;
  2051. relative_packet_pos = avio_tell(pb);
  2052. if (par->codec_type != AVMEDIA_TYPE_SUBTITLE) {
  2053. mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe);
  2054. if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (par->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) {
  2055. ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts, mkv->cluster_pos, relative_packet_pos, -1);
  2056. if (ret < 0) return ret;
  2057. }
  2058. } else {
  2059. if (par->codec_id == AV_CODEC_ID_WEBVTT) {
  2060. duration = mkv_write_vtt_blocks(s, pb, pkt);
  2061. } else {
  2062. ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP,
  2063. mkv_blockgroup_size(pkt->size));
  2064. #if FF_API_CONVERGENCE_DURATION
  2065. FF_DISABLE_DEPRECATION_WARNINGS
  2066. /* For backward compatibility, prefer convergence_duration. */
  2067. if (pkt->convergence_duration > 0) {
  2068. duration = pkt->convergence_duration;
  2069. }
  2070. FF_ENABLE_DEPRECATION_WARNINGS
  2071. #endif
  2072. /* All subtitle blocks are considered to be keyframes. */
  2073. mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 1);
  2074. put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
  2075. end_ebml_master(pb, blockgroup);
  2076. }
  2077. if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
  2078. ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts,
  2079. mkv->cluster_pos, relative_packet_pos, duration);
  2080. if (ret < 0)
  2081. return ret;
  2082. }
  2083. }
  2084. mkv->duration = FFMAX(mkv->duration, ts + duration);
  2085. if (mkv->stream_durations)
  2086. mkv->stream_durations[pkt->stream_index] =
  2087. FFMAX(mkv->stream_durations[pkt->stream_index], ts + duration);
  2088. return 0;
  2089. }
  2090. static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
  2091. {
  2092. MatroskaMuxContext *mkv = s->priv_data;
  2093. int codec_type = s->streams[pkt->stream_index]->codecpar->codec_type;
  2094. int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
  2095. int cluster_size;
  2096. int64_t cluster_time;
  2097. int ret;
  2098. int start_new_cluster;
  2099. ret = mkv_check_new_extra_data(s, pkt);
  2100. if (ret < 0)
  2101. return ret;
  2102. if (mkv->tracks[pkt->stream_index].write_dts)
  2103. cluster_time = pkt->dts - mkv->cluster_pts;
  2104. else
  2105. cluster_time = pkt->pts - mkv->cluster_pts;
  2106. cluster_time += mkv->tracks[pkt->stream_index].ts_offset;
  2107. // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
  2108. // after 4k and on a keyframe
  2109. cluster_size = avio_tell(mkv->dyn_bc);
  2110. if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) {
  2111. // WebM DASH specification states that the first block of every cluster
  2112. // has to be a key frame. So for DASH video, we only create a cluster
  2113. // on seeing key frames.
  2114. start_new_cluster = keyframe;
  2115. } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO &&
  2116. (mkv->cluster_pos == -1 ||
  2117. cluster_time > mkv->cluster_time_limit)) {
  2118. // For DASH audio, we create a Cluster based on cluster_time_limit
  2119. start_new_cluster = 1;
  2120. } else if (!mkv->is_dash &&
  2121. (cluster_size > mkv->cluster_size_limit ||
  2122. cluster_time > mkv->cluster_time_limit ||
  2123. (codec_type == AVMEDIA_TYPE_VIDEO && keyframe &&
  2124. cluster_size > 4 * 1024))) {
  2125. start_new_cluster = 1;
  2126. } else {
  2127. start_new_cluster = 0;
  2128. }
  2129. if (mkv->cluster_pos != -1 && start_new_cluster) {
  2130. mkv_start_new_cluster(s, pkt);
  2131. }
  2132. if (!mkv->cluster_pos)
  2133. avio_write_marker(s->pb,
  2134. av_rescale_q(pkt->dts, s->streams[pkt->stream_index]->time_base, AV_TIME_BASE_Q),
  2135. keyframe && (mkv->have_video ? codec_type == AVMEDIA_TYPE_VIDEO : 1) ? AVIO_DATA_MARKER_SYNC_POINT : AVIO_DATA_MARKER_BOUNDARY_POINT);
  2136. // check if we have an audio packet cached
  2137. if (mkv->cur_audio_pkt.size > 0) {
  2138. // for DASH audio, a CuePoint has to be added when there is a new cluster.
  2139. ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt,
  2140. mkv->is_dash ? start_new_cluster : 0);
  2141. av_packet_unref(&mkv->cur_audio_pkt);
  2142. if (ret < 0) {
  2143. av_log(s, AV_LOG_ERROR,
  2144. "Could not write cached audio packet ret:%d\n", ret);
  2145. return ret;
  2146. }
  2147. }
  2148. // buffer an audio packet to ensure the packet containing the video
  2149. // keyframe's timecode is contained in the same cluster for WebM
  2150. if (codec_type == AVMEDIA_TYPE_AUDIO) {
  2151. ret = av_packet_ref(&mkv->cur_audio_pkt, pkt);
  2152. } else
  2153. ret = mkv_write_packet_internal(s, pkt, 0);
  2154. return ret;
  2155. }
  2156. static int mkv_write_flush_packet(AVFormatContext *s, AVPacket *pkt)
  2157. {
  2158. MatroskaMuxContext *mkv = s->priv_data;
  2159. if (!pkt) {
  2160. if (mkv->cluster_pos != -1) {
  2161. end_ebml_master_crc32(s->pb, &mkv->dyn_bc, mkv, mkv->cluster);
  2162. mkv->cluster_pos = -1;
  2163. if (s->pb->seekable & AVIO_SEEKABLE_NORMAL)
  2164. av_log(s, AV_LOG_DEBUG,
  2165. "Flushing cluster at offset %" PRIu64 " bytes\n",
  2166. avio_tell(s->pb));
  2167. else
  2168. av_log(s, AV_LOG_DEBUG, "Flushing cluster\n");
  2169. avio_flush(s->pb);
  2170. }
  2171. return 1;
  2172. }
  2173. return mkv_write_packet(s, pkt);
  2174. }
  2175. static int mkv_write_trailer(AVFormatContext *s)
  2176. {
  2177. MatroskaMuxContext *mkv = s->priv_data;
  2178. AVIOContext *pb = s->pb;
  2179. int64_t currentpos, cuespos;
  2180. int ret;
  2181. // check if we have an audio packet cached
  2182. if (mkv->cur_audio_pkt.size > 0) {
  2183. ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt, 0);
  2184. av_packet_unref(&mkv->cur_audio_pkt);
  2185. if (ret < 0) {
  2186. av_log(s, AV_LOG_ERROR,
  2187. "Could not write cached audio packet ret:%d\n", ret);
  2188. return ret;
  2189. }
  2190. }
  2191. if (mkv->dyn_bc) {
  2192. end_ebml_master_crc32(pb, &mkv->dyn_bc, mkv, mkv->cluster);
  2193. }
  2194. ret = mkv_write_chapters(s);
  2195. if (ret < 0)
  2196. return ret;
  2197. if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
  2198. if (mkv->cues->num_entries) {
  2199. if (mkv->reserve_cues_space) {
  2200. int64_t cues_end;
  2201. currentpos = avio_tell(pb);
  2202. avio_seek(pb, mkv->cues_pos, SEEK_SET);
  2203. cuespos = mkv_write_cues(s, mkv->cues, mkv->tracks, s->nb_streams);
  2204. cues_end = avio_tell(pb);
  2205. if (cues_end > cuespos + mkv->reserve_cues_space) {
  2206. av_log(s, AV_LOG_ERROR,
  2207. "Insufficient space reserved for cues: %d "
  2208. "(needed: %" PRId64 ").\n",
  2209. mkv->reserve_cues_space, cues_end - cuespos);
  2210. return AVERROR(EINVAL);
  2211. }
  2212. if (cues_end < cuespos + mkv->reserve_cues_space)
  2213. put_ebml_void(pb, mkv->reserve_cues_space -
  2214. (cues_end - cuespos));
  2215. avio_seek(pb, currentpos, SEEK_SET);
  2216. } else {
  2217. cuespos = mkv_write_cues(s, mkv->cues, mkv->tracks, s->nb_streams);
  2218. }
  2219. ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES,
  2220. cuespos);
  2221. if (ret < 0)
  2222. return ret;
  2223. }
  2224. mkv_write_seekhead(pb, mkv);
  2225. // update the duration
  2226. av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
  2227. currentpos = avio_tell(pb);
  2228. avio_seek(mkv->info_bc, mkv->duration_offset, SEEK_SET);
  2229. put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration);
  2230. avio_seek(pb, mkv->info.pos, SEEK_SET);
  2231. end_ebml_master_crc32(pb, &mkv->info_bc, mkv, mkv->info);
  2232. // write tracks master
  2233. avio_seek(pb, mkv->tracks_master.pos, SEEK_SET);
  2234. end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
  2235. // update stream durations
  2236. if (!mkv->is_live && mkv->stream_durations) {
  2237. int i;
  2238. int64_t curr = avio_tell(mkv->tags_bc);
  2239. for (i = 0; i < s->nb_streams; ++i) {
  2240. AVStream *st = s->streams[i];
  2241. if (mkv->stream_duration_offsets[i] > 0) {
  2242. double duration_sec = mkv->stream_durations[i] * av_q2d(st->time_base);
  2243. char duration_string[20] = "";
  2244. av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i,
  2245. mkv->stream_durations[i]);
  2246. avio_seek(mkv->tags_bc, mkv->stream_duration_offsets[i], SEEK_SET);
  2247. snprintf(duration_string, 20, "%02d:%02d:%012.9f",
  2248. (int) duration_sec / 3600, ((int) duration_sec / 60) % 60,
  2249. fmod(duration_sec, 60));
  2250. put_ebml_binary(mkv->tags_bc, MATROSKA_ID_TAGSTRING, duration_string, 20);
  2251. }
  2252. }
  2253. avio_seek(mkv->tags_bc, curr, SEEK_SET);
  2254. }
  2255. if (mkv->tags.pos && !mkv->is_live) {
  2256. avio_seek(pb, mkv->tags.pos, SEEK_SET);
  2257. end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, mkv->tags);
  2258. }
  2259. avio_seek(pb, currentpos, SEEK_SET);
  2260. }
  2261. if (!mkv->is_live) {
  2262. end_ebml_master(pb, mkv->segment);
  2263. }
  2264. mkv_free(mkv);
  2265. return 0;
  2266. }
  2267. static int mkv_query_codec(enum AVCodecID codec_id, int std_compliance)
  2268. {
  2269. int i;
  2270. for (i = 0; ff_mkv_codec_tags[i].id != AV_CODEC_ID_NONE; i++)
  2271. if (ff_mkv_codec_tags[i].id == codec_id)
  2272. return 1;
  2273. if (std_compliance < FF_COMPLIANCE_NORMAL) {
  2274. enum AVMediaType type = avcodec_get_type(codec_id);
  2275. // mkv theoretically supports any video/audio through VFW/ACM
  2276. if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO)
  2277. return 1;
  2278. }
  2279. return 0;
  2280. }
  2281. static int mkv_init(struct AVFormatContext *s)
  2282. {
  2283. int i;
  2284. if (s->avoid_negative_ts < 0) {
  2285. s->avoid_negative_ts = 1;
  2286. s->internal->avoid_negative_ts_use_pts = 1;
  2287. }
  2288. for (i = 0; i < s->nb_streams; i++) {
  2289. // ms precision is the de-facto standard timescale for mkv files
  2290. avpriv_set_pts_info(s->streams[i], 64, 1, 1000);
  2291. }
  2292. return 0;
  2293. }
  2294. static int mkv_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
  2295. {
  2296. int ret = 1;
  2297. AVStream *st = s->streams[pkt->stream_index];
  2298. if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
  2299. if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0)
  2300. ret = ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL);
  2301. } else if (st->codecpar->codec_id == AV_CODEC_ID_VP9) {
  2302. ret = ff_stream_add_bitstream_filter(st, "vp9_superframe", NULL);
  2303. }
  2304. return ret;
  2305. }
  2306. static const AVCodecTag additional_audio_tags[] = {
  2307. { AV_CODEC_ID_ALAC, 0XFFFFFFFF },
  2308. { AV_CODEC_ID_EAC3, 0XFFFFFFFF },
  2309. { AV_CODEC_ID_MLP, 0xFFFFFFFF },
  2310. { AV_CODEC_ID_OPUS, 0xFFFFFFFF },
  2311. { AV_CODEC_ID_PCM_S16BE, 0xFFFFFFFF },
  2312. { AV_CODEC_ID_PCM_S24BE, 0xFFFFFFFF },
  2313. { AV_CODEC_ID_PCM_S32BE, 0xFFFFFFFF },
  2314. { AV_CODEC_ID_QDMC, 0xFFFFFFFF },
  2315. { AV_CODEC_ID_QDM2, 0xFFFFFFFF },
  2316. { AV_CODEC_ID_RA_144, 0xFFFFFFFF },
  2317. { AV_CODEC_ID_RA_288, 0xFFFFFFFF },
  2318. { AV_CODEC_ID_COOK, 0xFFFFFFFF },
  2319. { AV_CODEC_ID_TRUEHD, 0xFFFFFFFF },
  2320. { AV_CODEC_ID_NONE, 0xFFFFFFFF }
  2321. };
  2322. static const AVCodecTag additional_video_tags[] = {
  2323. { AV_CODEC_ID_RV10, 0xFFFFFFFF },
  2324. { AV_CODEC_ID_RV20, 0xFFFFFFFF },
  2325. { AV_CODEC_ID_RV30, 0xFFFFFFFF },
  2326. { AV_CODEC_ID_RV40, 0xFFFFFFFF },
  2327. { AV_CODEC_ID_VP9, 0xFFFFFFFF },
  2328. { AV_CODEC_ID_NONE, 0xFFFFFFFF }
  2329. };
  2330. static const AVCodecTag additional_subtitle_tags[] = {
  2331. { AV_CODEC_ID_DVB_SUBTITLE, 0xFFFFFFFF },
  2332. { AV_CODEC_ID_HDMV_PGS_SUBTITLE, 0xFFFFFFFF },
  2333. { AV_CODEC_ID_NONE, 0xFFFFFFFF }
  2334. };
  2335. #define OFFSET(x) offsetof(MatroskaMuxContext, x)
  2336. #define FLAGS AV_OPT_FLAG_ENCODING_PARAM
  2337. static const AVOption options[] = {
  2338. { "reserve_index_space", "Reserve a given amount of space (in bytes) at the beginning of the file for the index (cues).", OFFSET(reserve_cues_space), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
  2339. { "cluster_size_limit", "Store at most the provided amount of bytes in a cluster. ", OFFSET(cluster_size_limit), AV_OPT_TYPE_INT , { .i64 = -1 }, -1, INT_MAX, FLAGS },
  2340. { "cluster_time_limit", "Store at most the provided number of milliseconds in a cluster.", OFFSET(cluster_time_limit), AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, FLAGS },
  2341. { "dash", "Create a WebM file conforming to WebM DASH specification", OFFSET(is_dash), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
  2342. { "dash_track_number", "Track number for the DASH stream", OFFSET(dash_track_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 127, FLAGS },
  2343. { "live", "Write files assuming it is a live stream.", OFFSET(is_live), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
  2344. { "allow_raw_vfw", "allow RAW VFW mode", OFFSET(allow_raw_vfw), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
  2345. { "write_crc32", "write a CRC32 element inside every Level 1 element", OFFSET(write_crc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
  2346. { NULL },
  2347. };
  2348. #if CONFIG_MATROSKA_MUXER
  2349. static const AVClass matroska_class = {
  2350. .class_name = "matroska muxer",
  2351. .item_name = av_default_item_name,
  2352. .option = options,
  2353. .version = LIBAVUTIL_VERSION_INT,
  2354. };
  2355. AVOutputFormat ff_matroska_muxer = {
  2356. .name = "matroska",
  2357. .long_name = NULL_IF_CONFIG_SMALL("Matroska"),
  2358. .mime_type = "video/x-matroska",
  2359. .extensions = "mkv",
  2360. .priv_data_size = sizeof(MatroskaMuxContext),
  2361. .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
  2362. AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
  2363. .video_codec = CONFIG_LIBX264_ENCODER ?
  2364. AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4,
  2365. .init = mkv_init,
  2366. .write_header = mkv_write_header,
  2367. .write_packet = mkv_write_flush_packet,
  2368. .write_trailer = mkv_write_trailer,
  2369. .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
  2370. AVFMT_TS_NONSTRICT | AVFMT_ALLOW_FLUSH,
  2371. .codec_tag = (const AVCodecTag* const []){
  2372. ff_codec_bmp_tags, ff_codec_wav_tags,
  2373. additional_audio_tags, additional_video_tags, additional_subtitle_tags, 0
  2374. },
  2375. .subtitle_codec = AV_CODEC_ID_ASS,
  2376. .query_codec = mkv_query_codec,
  2377. .check_bitstream = mkv_check_bitstream,
  2378. .priv_class = &matroska_class,
  2379. };
  2380. #endif
  2381. #if CONFIG_WEBM_MUXER
  2382. static const AVClass webm_class = {
  2383. .class_name = "webm muxer",
  2384. .item_name = av_default_item_name,
  2385. .option = options,
  2386. .version = LIBAVUTIL_VERSION_INT,
  2387. };
  2388. AVOutputFormat ff_webm_muxer = {
  2389. .name = "webm",
  2390. .long_name = NULL_IF_CONFIG_SMALL("WebM"),
  2391. .mime_type = "video/webm",
  2392. .extensions = "webm",
  2393. .priv_data_size = sizeof(MatroskaMuxContext),
  2394. .audio_codec = CONFIG_LIBOPUS_ENCODER ? AV_CODEC_ID_OPUS : AV_CODEC_ID_VORBIS,
  2395. .video_codec = CONFIG_LIBVPX_VP9_ENCODER? AV_CODEC_ID_VP9 : AV_CODEC_ID_VP8,
  2396. .subtitle_codec = AV_CODEC_ID_WEBVTT,
  2397. .init = mkv_init,
  2398. .write_header = mkv_write_header,
  2399. .write_packet = mkv_write_flush_packet,
  2400. .write_trailer = mkv_write_trailer,
  2401. .check_bitstream = mkv_check_bitstream,
  2402. .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
  2403. AVFMT_TS_NONSTRICT | AVFMT_ALLOW_FLUSH,
  2404. .priv_class = &webm_class,
  2405. };
  2406. #endif
  2407. #if CONFIG_MATROSKA_AUDIO_MUXER
  2408. static const AVClass mka_class = {
  2409. .class_name = "matroska audio muxer",
  2410. .item_name = av_default_item_name,
  2411. .option = options,
  2412. .version = LIBAVUTIL_VERSION_INT,
  2413. };
  2414. AVOutputFormat ff_matroska_audio_muxer = {
  2415. .name = "matroska",
  2416. .long_name = NULL_IF_CONFIG_SMALL("Matroska Audio"),
  2417. .mime_type = "audio/x-matroska",
  2418. .extensions = "mka",
  2419. .priv_data_size = sizeof(MatroskaMuxContext),
  2420. .audio_codec = CONFIG_LIBVORBIS_ENCODER ?
  2421. AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
  2422. .video_codec = AV_CODEC_ID_NONE,
  2423. .init = mkv_init,
  2424. .write_header = mkv_write_header,
  2425. .write_packet = mkv_write_flush_packet,
  2426. .write_trailer = mkv_write_trailer,
  2427. .check_bitstream = mkv_check_bitstream,
  2428. .flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT |
  2429. AVFMT_ALLOW_FLUSH,
  2430. .codec_tag = (const AVCodecTag* const []){
  2431. ff_codec_wav_tags, additional_audio_tags, 0
  2432. },
  2433. .priv_class = &mka_class,
  2434. };
  2435. #endif