matroskaenc.c 133 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673
  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 "config_components.h"
  23. #include "av1.h"
  24. #include "avc.h"
  25. #include "hevc.h"
  26. #include "avformat.h"
  27. #include "avio_internal.h"
  28. #include "avlanguage.h"
  29. #include "dovi_isom.h"
  30. #include "flacenc.h"
  31. #include "internal.h"
  32. #include "isom.h"
  33. #include "nal.h"
  34. #include "matroska.h"
  35. #include "mux.h"
  36. #include "riff.h"
  37. #include "version.h"
  38. #include "vorbiscomment.h"
  39. #include "vvc.h"
  40. #include "wv.h"
  41. #include "libavutil/avstring.h"
  42. #include "libavutil/channel_layout.h"
  43. #include "libavutil/crc.h"
  44. #include "libavutil/dict.h"
  45. #include "libavutil/hdr_dynamic_metadata.h"
  46. #include "libavutil/intfloat.h"
  47. #include "libavutil/intreadwrite.h"
  48. #include "libavutil/lfg.h"
  49. #include "libavutil/mastering_display_metadata.h"
  50. #include "libavutil/mathematics.h"
  51. #include "libavutil/mem.h"
  52. #include "libavutil/opt.h"
  53. #include "libavutil/parseutils.h"
  54. #include "libavutil/pixdesc.h"
  55. #include "libavutil/random_seed.h"
  56. #include "libavutil/rational.h"
  57. #include "libavutil/samplefmt.h"
  58. #include "libavutil/stereo3d.h"
  59. #include "libavcodec/av1.h"
  60. #include "libavcodec/bytestream.h"
  61. #include "libavcodec/codec_desc.h"
  62. #include "libavcodec/codec_par.h"
  63. #include "libavcodec/defs.h"
  64. #include "libavcodec/itut35.h"
  65. #include "libavcodec/xiph.h"
  66. #include "libavcodec/mpeg4audio.h"
  67. /* Level 1 elements we create a SeekHead entry for:
  68. * Info, Tracks, Chapters, Attachments, Tags (potentially twice) and Cues */
  69. #define MAX_SEEKHEAD_ENTRIES 7
  70. /* Largest known-length EBML length */
  71. #define MAX_EBML_LENGTH ((1ULL << 56) - 2)
  72. /* The dynamic buffer API we rely upon has a limit of INT_MAX;
  73. * and so has avio_write(). */
  74. #define MAX_SUPPORTED_EBML_LENGTH FFMIN(MAX_EBML_LENGTH, INT_MAX)
  75. #define MODE_MATROSKAv2 0x01
  76. #define MODE_WEBM 0x02
  77. #define IS_WEBM(mkv) (CONFIG_WEBM_MUXER && CONFIG_MATROSKA_MUXER ? \
  78. ((mkv)->mode == MODE_WEBM) : CONFIG_WEBM_MUXER)
  79. #define IS_SEEKABLE(pb, mkv) (((pb)->seekable & AVIO_SEEKABLE_NORMAL) && \
  80. !(mkv)->is_live)
  81. enum {
  82. DEFAULT_MODE_INFER,
  83. DEFAULT_MODE_INFER_NO_SUBS,
  84. DEFAULT_MODE_PASSTHROUGH,
  85. };
  86. typedef struct ebml_master {
  87. int64_t pos; ///< absolute offset in the containing AVIOContext where the master's elements start
  88. int sizebytes; ///< how many bytes were reserved for the size
  89. } ebml_master;
  90. typedef struct ebml_stored_master {
  91. AVIOContext *bc;
  92. int64_t pos;
  93. } ebml_stored_master;
  94. typedef enum EbmlType {
  95. EBML_UINT,
  96. EBML_SINT,
  97. EBML_FLOAT,
  98. EBML_UID,
  99. EBML_STR,
  100. EBML_UTF8 = EBML_STR,
  101. EBML_BIN,
  102. EBML_BLOCK, ///< pseudo-type for writing (Simple)Blocks
  103. EBML_MASTER,
  104. } EbmlType;
  105. typedef struct BlockContext {
  106. struct mkv_track *track;
  107. const AVPacket *pkt;
  108. int16_t rel_ts;
  109. uint8_t flags;
  110. NALUList h2645_nalu_list;
  111. } BlockContext;
  112. typedef struct EbmlMaster {
  113. int nb_elements; ///< -1 if not finished
  114. int containing_master; ///< -1 if no parent exists
  115. } EbmlMaster;
  116. typedef struct EbmlElement {
  117. uint32_t id;
  118. EbmlType type;
  119. unsigned length_size;
  120. uint64_t size; ///< excluding id and length field
  121. union {
  122. uint64_t uint;
  123. int64_t sint;
  124. double f;
  125. const char *str;
  126. const uint8_t *bin;
  127. struct MatroskaMuxContext *mkv; ///< used by EBML_BLOCK
  128. EbmlMaster master;
  129. } priv;
  130. } EbmlElement;
  131. typedef struct EbmlWriter {
  132. unsigned nb_elements;
  133. int current_master_element;
  134. EbmlElement *elements;
  135. } EbmlWriter;
  136. #define EBML_WRITER(max_nb_elems) \
  137. EbmlElement elements[max_nb_elems]; \
  138. EbmlWriter writer = (EbmlWriter){ .elements = elements, \
  139. .current_master_element = -1 }
  140. typedef struct mkv_seekhead_entry {
  141. uint32_t elementid;
  142. uint64_t segmentpos;
  143. } mkv_seekhead_entry;
  144. typedef struct mkv_seekhead {
  145. int64_t filepos;
  146. mkv_seekhead_entry entries[MAX_SEEKHEAD_ENTRIES];
  147. int num_entries;
  148. int reserved_size;
  149. } mkv_seekhead;
  150. typedef struct mkv_cuepoint {
  151. uint64_t pts;
  152. int stream_idx;
  153. int64_t cluster_pos; ///< offset of the cluster containing the block relative to the segment
  154. int64_t relative_pos; ///< relative offset from the position of the cluster containing the block
  155. int64_t duration; ///< duration of the block according to time base
  156. } mkv_cuepoint;
  157. typedef struct mkv_cues {
  158. mkv_cuepoint *entries;
  159. int num_entries;
  160. } mkv_cues;
  161. struct MatroskaMuxContext;
  162. typedef struct mkv_track {
  163. int write_dts;
  164. int has_cue;
  165. uint64_t uid;
  166. unsigned track_num;
  167. int track_num_size;
  168. int sample_rate;
  169. unsigned offset;
  170. int64_t sample_rate_offset;
  171. int64_t last_timestamp;
  172. int64_t duration;
  173. int64_t duration_offset;
  174. uint64_t max_blockaddid;
  175. int64_t blockadditionmapping_offset;
  176. int codecpriv_offset;
  177. unsigned codecpriv_size; ///< size reserved for CodecPrivate excluding header+length field
  178. int64_t ts_offset;
  179. uint64_t default_duration_low;
  180. uint64_t default_duration_high;
  181. /* This callback will be called twice: First with a NULL AVIOContext
  182. * to return the size of the (Simple)Block's data via size
  183. * and a second time with the AVIOContext set when the data
  184. * shall be written.
  185. * The callback shall not return an error on the second call. */
  186. int (*reformat)(struct MatroskaMuxContext *, AVIOContext *,
  187. const AVPacket *, int *size);
  188. } mkv_track;
  189. typedef struct MatroskaMuxContext {
  190. const AVClass *class;
  191. AVFormatContext *ctx;
  192. int mode;
  193. ebml_stored_master info;
  194. ebml_stored_master track;
  195. ebml_stored_master tags;
  196. int64_t segment_offset;
  197. AVIOContext *cluster_bc;
  198. int64_t cluster_pos; ///< file offset of the current Cluster
  199. int64_t cluster_pts;
  200. int64_t duration_offset;
  201. int64_t duration;
  202. mkv_track *tracks;
  203. mkv_seekhead seekhead;
  204. mkv_cues cues;
  205. int64_t cues_pos;
  206. BlockContext cur_block;
  207. /* Used as temporary buffer to use the minimal amount of bytes
  208. * to write the length field of EBML Masters.
  209. * Every user has to reset the buffer after using it and
  210. * different uses may not overlap. It is currently used in
  211. * mkv_write_tag(), in mkv_assemble_cues() as well as in
  212. * mkv_update_codecprivate() and mkv_write_track(). */
  213. AVIOContext *tmp_bc;
  214. AVPacket *cur_audio_pkt;
  215. unsigned nb_attachments;
  216. int have_video;
  217. int wrote_chapters;
  218. int wrote_tags;
  219. int reserve_cues_space;
  220. int cluster_size_limit;
  221. int64_t cluster_time_limit;
  222. int write_crc;
  223. int is_live;
  224. int is_dash;
  225. int dash_track_number;
  226. int allow_raw_vfw;
  227. int flipped_raw_rgb;
  228. int default_mode;
  229. int move_cues_to_front;
  230. uint32_t segment_uid[4];
  231. } MatroskaMuxContext;
  232. /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
  233. * offset, 4 bytes for target EBML ID */
  234. #define MAX_SEEKENTRY_SIZE 21
  235. /** 4 * (1-byte EBML ID, 1-byte EBML size, 8-byte uint max) */
  236. #define MAX_CUETRACKPOS_SIZE 40
  237. /** DURATION_STRING_LENGTH must be <= 112 or the containing
  238. * simpletag will need more than one byte for its length field. */
  239. #define DURATION_STRING_LENGTH 19
  240. /** 2 + 1 Simpletag header, 2 + 1 + 8 Name "DURATION", rest for TagString */
  241. #define DURATION_SIMPLETAG_SIZE (2 + 1 + (2 + 1 + 8) + (2 + 1 + DURATION_STRING_LENGTH))
  242. /** Seek preroll value for opus */
  243. #define OPUS_SEEK_PREROLL 80000000
  244. static int ebml_id_size(uint32_t id)
  245. {
  246. return (av_log2(id) + 7U) / 8;
  247. }
  248. static void put_ebml_id(AVIOContext *pb, uint32_t id)
  249. {
  250. int i = ebml_id_size(id);
  251. while (i--)
  252. avio_w8(pb, (uint8_t)(id >> (i * 8)));
  253. }
  254. /**
  255. * Write an EBML size meaning "unknown size".
  256. *
  257. * @param bytes The number of bytes the size should occupy (maximum: 8).
  258. */
  259. static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
  260. {
  261. av_assert0(bytes <= 8);
  262. avio_w8(pb, 0x1ff >> bytes);
  263. if (av_builtin_constant_p(bytes) && bytes == 1)
  264. return;
  265. ffio_fill(pb, 0xff, bytes - 1);
  266. }
  267. /**
  268. * Returns how many bytes are needed to represent a number
  269. * as EBML variable length integer.
  270. */
  271. static int ebml_num_size(uint64_t num)
  272. {
  273. int bytes = 0;
  274. do {
  275. bytes++;
  276. } while (num >>= 7);
  277. return bytes;
  278. }
  279. /**
  280. * Calculate how many bytes are needed to represent the length field
  281. * of an EBML element whose payload has a given length.
  282. */
  283. static int ebml_length_size(uint64_t length)
  284. {
  285. return ebml_num_size(length + 1);
  286. }
  287. /**
  288. * Write a number as EBML variable length integer on `bytes` bytes.
  289. * `bytes` is taken literally without checking.
  290. */
  291. static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
  292. {
  293. num |= 1ULL << bytes * 7;
  294. for (int i = bytes - 1; i >= 0; i--)
  295. avio_w8(pb, (uint8_t)(num >> i * 8));
  296. }
  297. /**
  298. * Write a length as EBML variable length integer.
  299. *
  300. * @param bytes The number of bytes that need to be used to write the number.
  301. * If zero, the minimal number of bytes will be used.
  302. */
  303. static void put_ebml_length(AVIOContext *pb, uint64_t length, int bytes)
  304. {
  305. int needed_bytes = ebml_length_size(length);
  306. // sizes larger than this are currently undefined in EBML
  307. av_assert0(length < (1ULL << 56) - 1);
  308. if (bytes == 0)
  309. bytes = needed_bytes;
  310. // The bytes needed to write the given size must not exceed
  311. // the bytes that we ought to use.
  312. av_assert0(bytes >= needed_bytes);
  313. put_ebml_num(pb, length, bytes);
  314. }
  315. /**
  316. * Write a (random) UID with fixed size to make the output more deterministic
  317. */
  318. static void put_ebml_uid(AVIOContext *pb, uint32_t elementid, uint64_t uid)
  319. {
  320. put_ebml_id(pb, elementid);
  321. put_ebml_length(pb, 8, 0);
  322. avio_wb64(pb, uid);
  323. }
  324. static void put_ebml_uint(AVIOContext *pb, uint32_t elementid, uint64_t val)
  325. {
  326. int i, bytes = 1;
  327. uint64_t tmp = val;
  328. while (tmp >>= 8)
  329. bytes++;
  330. put_ebml_id(pb, elementid);
  331. put_ebml_length(pb, bytes, 0);
  332. for (i = bytes - 1; i >= 0; i--)
  333. avio_w8(pb, (uint8_t)(val >> i * 8));
  334. }
  335. static void put_ebml_float(AVIOContext *pb, uint32_t elementid, double val)
  336. {
  337. put_ebml_id(pb, elementid);
  338. put_ebml_length(pb, 8, 0);
  339. avio_wb64(pb, av_double2int(val));
  340. }
  341. static void put_ebml_binary(AVIOContext *pb, uint32_t elementid,
  342. const void *buf, int size)
  343. {
  344. put_ebml_id(pb, elementid);
  345. put_ebml_length(pb, size, 0);
  346. avio_write(pb, buf, size);
  347. }
  348. static void put_ebml_string(AVIOContext *pb, uint32_t elementid,
  349. const char *str)
  350. {
  351. put_ebml_binary(pb, elementid, str, strlen(str));
  352. }
  353. /**
  354. * Write a void element of a given size. Useful for reserving space in
  355. * the file to be written to later.
  356. *
  357. * @param size The number of bytes to reserve, which must be at least 2.
  358. */
  359. static void put_ebml_void(AVIOContext *pb, int size)
  360. {
  361. av_assert0(size >= 2);
  362. put_ebml_id(pb, EBML_ID_VOID);
  363. // we need to subtract the length needed to store the size from the
  364. // size we need to reserve so 2 cases, we use 8 bytes to store the
  365. // size if possible, 1 byte otherwise
  366. if (size < 10) {
  367. size -= 2;
  368. put_ebml_length(pb, size, 0);
  369. } else {
  370. size -= 9;
  371. put_ebml_length(pb, size, 8);
  372. }
  373. ffio_fill(pb, 0, size);
  374. }
  375. static ebml_master start_ebml_master(AVIOContext *pb, uint32_t elementid,
  376. uint64_t expectedsize)
  377. {
  378. int bytes = expectedsize ? ebml_length_size(expectedsize) : 8;
  379. put_ebml_id(pb, elementid);
  380. put_ebml_size_unknown(pb, bytes);
  381. return (ebml_master) { avio_tell(pb), bytes };
  382. }
  383. static void end_ebml_master(AVIOContext *pb, ebml_master master)
  384. {
  385. int64_t pos = avio_tell(pb);
  386. if (avio_seek(pb, master.pos - master.sizebytes, SEEK_SET) < 0)
  387. return;
  388. put_ebml_length(pb, pos - master.pos, master.sizebytes);
  389. avio_seek(pb, pos, SEEK_SET);
  390. }
  391. static EbmlElement *ebml_writer_add(EbmlWriter *writer,
  392. uint32_t id, EbmlType type)
  393. {
  394. writer->elements[writer->nb_elements].id = id;
  395. writer->elements[writer->nb_elements].type = type;
  396. return &writer->elements[writer->nb_elements++];
  397. }
  398. static void ebml_writer_open_master(EbmlWriter *writer, uint32_t id)
  399. {
  400. EbmlElement *const elem = ebml_writer_add(writer, id, EBML_MASTER);
  401. EbmlMaster *const master = &elem->priv.master;
  402. master->containing_master = writer->current_master_element;
  403. master->nb_elements = -1;
  404. writer->current_master_element = writer->nb_elements - 1;
  405. }
  406. static void ebml_writer_close_master(EbmlWriter *writer)
  407. {
  408. EbmlElement *elem;
  409. av_assert2(writer->current_master_element >= 0);
  410. av_assert2(writer->current_master_element < writer->nb_elements);
  411. elem = &writer->elements[writer->current_master_element];
  412. av_assert2(elem->type == EBML_MASTER);
  413. av_assert2(elem->priv.master.nb_elements < 0); /* means unset */
  414. elem->priv.master.nb_elements = writer->nb_elements - writer->current_master_element - 1;
  415. av_assert2(elem->priv.master.containing_master < 0 ||
  416. elem->priv.master.containing_master < writer->current_master_element);
  417. writer->current_master_element = elem->priv.master.containing_master;
  418. }
  419. static void ebml_writer_close_or_discard_master(EbmlWriter *writer)
  420. {
  421. av_assert2(writer->nb_elements > 0);
  422. av_assert2(0 <= writer->current_master_element);
  423. av_assert2(writer->current_master_element < writer->nb_elements);
  424. if (writer->current_master_element == writer->nb_elements - 1) {
  425. const EbmlElement *const elem = &writer->elements[writer->nb_elements - 1];
  426. /* The master element has no children. Discard it. */
  427. av_assert2(elem->type == EBML_MASTER);
  428. av_assert2(elem->priv.master.containing_master < 0 ||
  429. elem->priv.master.containing_master < writer->current_master_element);
  430. writer->current_master_element = elem->priv.master.containing_master;
  431. writer->nb_elements--;
  432. return;
  433. }
  434. ebml_writer_close_master(writer);
  435. }
  436. static void ebml_writer_add_string(EbmlWriter *writer, uint32_t id,
  437. const char *str)
  438. {
  439. EbmlElement *const elem = ebml_writer_add(writer, id, EBML_STR);
  440. elem->priv.str = str;
  441. }
  442. static void ebml_writer_add_bin(EbmlWriter *writer, uint32_t id,
  443. const uint8_t *data, size_t size)
  444. {
  445. EbmlElement *const elem = ebml_writer_add(writer, id, EBML_BIN);
  446. #if SIZE_MAX > UINT64_MAX
  447. size = FFMIN(size, UINT64_MAX);
  448. #endif
  449. elem->size = size;
  450. elem->priv.bin = data;
  451. }
  452. static void ebml_writer_add_float(EbmlWriter *writer, uint32_t id,
  453. double val)
  454. {
  455. EbmlElement *const elem = ebml_writer_add(writer, id, EBML_FLOAT);
  456. elem->priv.f = val;
  457. }
  458. static void ebml_writer_add_uid(EbmlWriter *writer, uint32_t id,
  459. uint64_t val)
  460. {
  461. EbmlElement *const elem = ebml_writer_add(writer, id, EBML_UID);
  462. elem->priv.uint = val;
  463. }
  464. static void ebml_writer_add_uint(EbmlWriter *writer, uint32_t id,
  465. uint64_t val)
  466. {
  467. EbmlElement *elem = ebml_writer_add(writer, id, EBML_UINT);
  468. elem->priv.uint = val;
  469. }
  470. static void ebml_writer_add_sint(EbmlWriter *writer, uint32_t id,
  471. int64_t val)
  472. {
  473. EbmlElement *elem = ebml_writer_add(writer, id, EBML_SINT);
  474. elem->priv.sint = val;
  475. }
  476. static void ebml_writer_add_block(EbmlWriter *writer, MatroskaMuxContext *mkv)
  477. {
  478. EbmlElement *elem = ebml_writer_add(writer, MATROSKA_ID_BLOCK, EBML_BLOCK);
  479. elem->priv.mkv = mkv;
  480. }
  481. static int ebml_writer_str_len(EbmlElement *elem)
  482. {
  483. size_t len = strlen(elem->priv.str);
  484. #if SIZE_MAX > UINT64_MAX
  485. len = FF_MIN(len, UINT64_MAX);
  486. #endif
  487. elem->size = len;
  488. return 0;
  489. }
  490. static av_const int uint_size(uint64_t val)
  491. {
  492. int bytes = 0;
  493. do {
  494. bytes++;
  495. } while (val >>= 8);
  496. return bytes;
  497. }
  498. static int ebml_writer_uint_len(EbmlElement *elem)
  499. {
  500. elem->size = uint_size(elem->priv.uint);
  501. return 0;
  502. }
  503. static av_const int sint_size(int64_t val)
  504. {
  505. uint64_t tmp = 2 * (uint64_t)(val < 0 ? val^-1 : val);
  506. return uint_size(tmp);
  507. }
  508. static int ebml_writer_sint_len(EbmlElement *elem)
  509. {
  510. elem->size = sint_size(elem->priv.sint);
  511. return 0;
  512. }
  513. static int ebml_writer_elem_len(EbmlWriter *writer, EbmlElement *elem,
  514. int remaining_elems);
  515. static int ebml_writer_master_len(EbmlWriter *writer, EbmlElement *elem,
  516. int remaining_elems)
  517. {
  518. int nb_elems = elem->priv.master.nb_elements >= 0 ? elem->priv.master.nb_elements : remaining_elems - 1;
  519. EbmlElement *const master = elem;
  520. uint64_t total_size = 0;
  521. master->priv.master.nb_elements = nb_elems;
  522. for (; elem++, nb_elems > 0;) {
  523. int ret = ebml_writer_elem_len(writer, elem, nb_elems);
  524. if (ret < 0)
  525. return ret;
  526. av_assert2(ret < nb_elems);
  527. /* No overflow is possible here, as both total_size and elem->size
  528. * are bounded by MAX_SUPPORTED_EBML_LENGTH. */
  529. total_size += ebml_id_size(elem->id) + elem->length_size + elem->size;
  530. if (total_size > MAX_SUPPORTED_EBML_LENGTH)
  531. return AVERROR(ERANGE);
  532. nb_elems--; /* consume elem */
  533. elem += ret, nb_elems -= ret; /* and elem's children */
  534. }
  535. master->size = total_size;
  536. return master->priv.master.nb_elements;
  537. }
  538. static int ebml_writer_block_len(EbmlElement *elem)
  539. {
  540. MatroskaMuxContext *const mkv = elem->priv.mkv;
  541. BlockContext *const block = &mkv->cur_block;
  542. mkv_track *const track = block->track;
  543. const AVPacket *const pkt = block->pkt;
  544. int err, size;
  545. if (track->reformat) {
  546. err = track->reformat(mkv, NULL, pkt, &size);
  547. if (err < 0) {
  548. av_log(mkv->ctx, AV_LOG_ERROR, "Error when reformatting data of "
  549. "a packet from stream %d.\n", pkt->stream_index);
  550. return err;
  551. }
  552. } else {
  553. size = pkt->size;
  554. if (track->offset <= size)
  555. size -= track->offset;
  556. }
  557. elem->size = track->track_num_size + 3U + size;
  558. return 0;
  559. }
  560. static void ebml_writer_write_block(const EbmlElement *elem, AVIOContext *pb)
  561. {
  562. MatroskaMuxContext *const mkv = elem->priv.mkv;
  563. BlockContext *const block = &mkv->cur_block;
  564. mkv_track *const track = block->track;
  565. const AVPacket *const pkt = block->pkt;
  566. put_ebml_num(pb, track->track_num, track->track_num_size);
  567. avio_wb16(pb, block->rel_ts);
  568. avio_w8(pb, block->flags);
  569. if (track->reformat) {
  570. int size;
  571. track->reformat(mkv, pb, pkt, &size);
  572. } else {
  573. const uint8_t *data = pkt->data;
  574. unsigned offset = track->offset <= pkt->size ? track->offset : 0;
  575. avio_write(pb, data + offset, pkt->size - offset);
  576. }
  577. }
  578. static int ebml_writer_elem_len(EbmlWriter *writer, EbmlElement *elem,
  579. int remaining_elems)
  580. {
  581. int ret = 0;
  582. switch (elem->type) {
  583. case EBML_FLOAT:
  584. case EBML_UID:
  585. elem->size = 8;
  586. break;
  587. case EBML_STR:
  588. ret = ebml_writer_str_len(elem);
  589. break;
  590. case EBML_UINT:
  591. ret = ebml_writer_uint_len(elem);
  592. break;
  593. case EBML_SINT:
  594. ret = ebml_writer_sint_len(elem);
  595. break;
  596. case EBML_BLOCK:
  597. ret = ebml_writer_block_len(elem);
  598. break;
  599. case EBML_MASTER:
  600. ret = ebml_writer_master_len(writer, elem, remaining_elems);
  601. break;
  602. }
  603. if (ret < 0)
  604. return ret;
  605. if (elem->size > MAX_SUPPORTED_EBML_LENGTH)
  606. return AVERROR(ERANGE);
  607. elem->length_size = ebml_length_size(elem->size);
  608. return ret; /* number of elements consumed excluding elem itself */
  609. }
  610. static int ebml_writer_elem_write(const EbmlElement *elem, AVIOContext *pb)
  611. {
  612. put_ebml_id(pb, elem->id);
  613. put_ebml_num(pb, elem->size, elem->length_size);
  614. switch (elem->type) {
  615. case EBML_UID:
  616. case EBML_FLOAT: {
  617. uint64_t val = elem->type == EBML_UID ? elem->priv.uint
  618. : av_double2int(elem->priv.f);
  619. avio_wb64(pb, val);
  620. break;
  621. }
  622. case EBML_UINT:
  623. case EBML_SINT: {
  624. uint64_t val = elem->type == EBML_UINT ? elem->priv.uint
  625. : elem->priv.sint;
  626. for (int i = elem->size; --i >= 0; )
  627. avio_w8(pb, (uint8_t)(val >> i * 8));
  628. break;
  629. }
  630. case EBML_STR:
  631. case EBML_BIN: {
  632. const uint8_t *data = elem->type == EBML_BIN ? elem->priv.bin
  633. : (const uint8_t*)elem->priv.str;
  634. avio_write(pb, data, elem->size);
  635. break;
  636. }
  637. case EBML_BLOCK:
  638. ebml_writer_write_block(elem, pb);
  639. break;
  640. case EBML_MASTER: {
  641. int nb_elems = elem->priv.master.nb_elements;
  642. elem++;
  643. for (int i = 0; i < nb_elems; i++)
  644. i += ebml_writer_elem_write(elem + i, pb);
  645. return nb_elems;
  646. }
  647. }
  648. return 0;
  649. }
  650. static int ebml_writer_write(EbmlWriter *writer, AVIOContext *pb)
  651. {
  652. int ret = ebml_writer_elem_len(writer, writer->elements,
  653. writer->nb_elements);
  654. if (ret < 0)
  655. return ret;
  656. ebml_writer_elem_write(writer->elements, pb);
  657. return 0;
  658. }
  659. static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid,
  660. uint64_t filepos)
  661. {
  662. mkv_seekhead *seekhead = &mkv->seekhead;
  663. av_assert1(seekhead->num_entries < MAX_SEEKHEAD_ENTRIES);
  664. seekhead->entries[seekhead->num_entries].elementid = elementid;
  665. seekhead->entries[seekhead->num_entries++].segmentpos = filepos - mkv->segment_offset;
  666. }
  667. static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv)
  668. {
  669. int ret;
  670. if (!*dyn_cp && (ret = avio_open_dyn_buf(dyn_cp)) < 0)
  671. return ret;
  672. if (mkv->write_crc)
  673. put_ebml_void(*dyn_cp, 6); /* Reserve space for CRC32 so position/size calculations using avio_tell() take it into account */
  674. return 0;
  675. }
  676. static int end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp,
  677. MatroskaMuxContext *mkv, uint32_t id,
  678. int length_size, int keep_buffer,
  679. int add_seekentry)
  680. {
  681. uint8_t *buf, crc[4];
  682. int ret, size, skip = 0;
  683. size = avio_get_dyn_buf(*dyn_cp, &buf);
  684. if ((ret = (*dyn_cp)->error) < 0)
  685. goto fail;
  686. if (add_seekentry)
  687. mkv_add_seekhead_entry(mkv, id, avio_tell(pb));
  688. put_ebml_id(pb, id);
  689. put_ebml_length(pb, size, length_size);
  690. if (mkv->write_crc) {
  691. skip = 6; /* Skip reserved 6-byte long void element from the dynamic buffer. */
  692. AV_WL32(crc, av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), UINT32_MAX, buf + skip, size - skip) ^ UINT32_MAX);
  693. put_ebml_binary(pb, EBML_ID_CRC32, crc, sizeof(crc));
  694. }
  695. avio_write(pb, buf + skip, size - skip);
  696. fail:
  697. if (keep_buffer) {
  698. ffio_reset_dyn_buf(*dyn_cp);
  699. } else {
  700. ffio_free_dyn_buf(dyn_cp);
  701. }
  702. return ret;
  703. }
  704. /**
  705. * Output EBML master. Keep the buffer if seekable, allowing for later updates.
  706. * Furthermore always add a SeekHead Entry for this element.
  707. */
  708. static int end_ebml_master_crc32_tentatively(AVIOContext *pb,
  709. ebml_stored_master *elem,
  710. MatroskaMuxContext *mkv, uint32_t id)
  711. {
  712. if (IS_SEEKABLE(pb, mkv)) {
  713. uint8_t *buf;
  714. int size = avio_get_dyn_buf(elem->bc, &buf);
  715. if (elem->bc->error < 0)
  716. return elem->bc->error;
  717. elem->pos = avio_tell(pb);
  718. mkv_add_seekhead_entry(mkv, id, elem->pos);
  719. put_ebml_id(pb, id);
  720. put_ebml_length(pb, size, 0);
  721. avio_write(pb, buf, size);
  722. return 0;
  723. } else
  724. return end_ebml_master_crc32(pb, &elem->bc, mkv, id, 0, 0, 1);
  725. }
  726. static void put_xiph_size(AVIOContext *pb, int size)
  727. {
  728. ffio_fill(pb, 255, size / 255);
  729. avio_w8(pb, size % 255);
  730. }
  731. /**
  732. * Free the members allocated in the mux context.
  733. */
  734. static void mkv_deinit(AVFormatContext *s)
  735. {
  736. MatroskaMuxContext *mkv = s->priv_data;
  737. ffio_free_dyn_buf(&mkv->cluster_bc);
  738. ffio_free_dyn_buf(&mkv->info.bc);
  739. ffio_free_dyn_buf(&mkv->track.bc);
  740. ffio_free_dyn_buf(&mkv->tags.bc);
  741. ffio_free_dyn_buf(&mkv->tmp_bc);
  742. av_freep(&mkv->cur_block.h2645_nalu_list.nalus);
  743. av_freep(&mkv->cues.entries);
  744. av_freep(&mkv->tracks);
  745. }
  746. /**
  747. * Initialize the SeekHead element to be ready to index level 1 Matroska
  748. * elements. Enough space to write MAX_SEEKHEAD_ENTRIES SeekHead entries
  749. * will be reserved at the current file location.
  750. */
  751. static void mkv_start_seekhead(MatroskaMuxContext *mkv, AVIOContext *pb)
  752. {
  753. mkv->seekhead.filepos = avio_tell(pb);
  754. // 21 bytes max for a Seek entry, 6 bytes max for the SeekHead ID
  755. // and size, 6 bytes for a CRC32 element, and 2 bytes to guarantee
  756. // that an EBML void element will fit afterwards
  757. mkv->seekhead.reserved_size = MAX_SEEKHEAD_ENTRIES * MAX_SEEKENTRY_SIZE + 14;
  758. put_ebml_void(pb, mkv->seekhead.reserved_size);
  759. }
  760. /**
  761. * Write the SeekHead to the file at the location reserved for it
  762. * and seek to destpos afterwards. When error_on_seek_failure
  763. * is not set, failure to seek to the position designated for the
  764. * SeekHead is not considered an error and it is presumed that
  765. * destpos is the current position; failure to seek to destpos
  766. * afterwards is always an error.
  767. *
  768. * @return 0 on success, < 0 on error.
  769. */
  770. static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv,
  771. int error_on_seek_failure, int64_t destpos)
  772. {
  773. AVIOContext *dyn_cp = NULL;
  774. mkv_seekhead *seekhead = &mkv->seekhead;
  775. int64_t remaining, ret64;
  776. int i, ret;
  777. if ((ret64 = avio_seek(pb, seekhead->filepos, SEEK_SET)) < 0)
  778. return error_on_seek_failure ? ret64 : 0;
  779. ret = start_ebml_master_crc32(&dyn_cp, mkv);
  780. if (ret < 0)
  781. return ret;
  782. for (i = 0; i < seekhead->num_entries; i++) {
  783. mkv_seekhead_entry *entry = &seekhead->entries[i];
  784. ebml_master seekentry = start_ebml_master(dyn_cp, MATROSKA_ID_SEEKENTRY,
  785. MAX_SEEKENTRY_SIZE);
  786. put_ebml_id(dyn_cp, MATROSKA_ID_SEEKID);
  787. put_ebml_length(dyn_cp, ebml_id_size(entry->elementid), 0);
  788. put_ebml_id(dyn_cp, entry->elementid);
  789. put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
  790. end_ebml_master(dyn_cp, seekentry);
  791. }
  792. ret = end_ebml_master_crc32(pb, &dyn_cp, mkv,
  793. MATROSKA_ID_SEEKHEAD, 0, 0, 0);
  794. if (ret < 0)
  795. return ret;
  796. remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
  797. put_ebml_void(pb, remaining);
  798. if ((ret64 = avio_seek(pb, destpos, SEEK_SET)) < 0)
  799. return ret64;
  800. return 0;
  801. }
  802. static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts,
  803. int64_t cluster_pos, int64_t relative_pos, int64_t duration)
  804. {
  805. mkv_cues *cues = &mkv->cues;
  806. mkv_cuepoint *entries = cues->entries;
  807. unsigned idx = cues->num_entries;
  808. if (ts < 0)
  809. return 0;
  810. entries = av_realloc_array(entries, cues->num_entries + 1, sizeof(mkv_cuepoint));
  811. if (!entries)
  812. return AVERROR(ENOMEM);
  813. cues->entries = entries;
  814. /* Make sure the cues entries are sorted by pts. */
  815. while (idx > 0 && entries[idx - 1].pts > ts)
  816. idx--;
  817. memmove(&entries[idx + 1], &entries[idx],
  818. (cues->num_entries - idx) * sizeof(entries[0]));
  819. entries[idx].pts = ts;
  820. entries[idx].stream_idx = stream;
  821. entries[idx].cluster_pos = cluster_pos - mkv->segment_offset;
  822. entries[idx].relative_pos = relative_pos;
  823. entries[idx].duration = duration;
  824. cues->num_entries++;
  825. return 0;
  826. }
  827. static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp, AVIOContext *cuepoint,
  828. const mkv_cues *cues, mkv_track *tracks, int num_tracks,
  829. uint64_t offset)
  830. {
  831. for (mkv_cuepoint *entry = cues->entries, *end = entry + cues->num_entries;
  832. entry < end;) {
  833. uint64_t pts = entry->pts;
  834. uint8_t *buf;
  835. int size;
  836. put_ebml_uint(cuepoint, MATROSKA_ID_CUETIME, pts);
  837. // put all the entries from different tracks that have the exact same
  838. // timestamp into the same CuePoint
  839. for (int j = 0; j < num_tracks; j++)
  840. tracks[j].has_cue = 0;
  841. do {
  842. ebml_master track_positions;
  843. int idx = entry->stream_idx;
  844. av_assert0(idx >= 0 && idx < num_tracks);
  845. if (tracks[idx].has_cue && streams[idx]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
  846. continue;
  847. tracks[idx].has_cue = 1;
  848. track_positions = start_ebml_master(cuepoint, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
  849. put_ebml_uint(cuepoint, MATROSKA_ID_CUETRACK , tracks[idx].track_num);
  850. put_ebml_uint(cuepoint, MATROSKA_ID_CUECLUSTERPOSITION , entry->cluster_pos + offset);
  851. put_ebml_uint(cuepoint, MATROSKA_ID_CUERELATIVEPOSITION, entry->relative_pos);
  852. if (entry->duration > 0)
  853. put_ebml_uint(cuepoint, MATROSKA_ID_CUEDURATION , entry->duration);
  854. end_ebml_master(cuepoint, track_positions);
  855. } while (++entry < end && entry->pts == pts);
  856. size = avio_get_dyn_buf(cuepoint, &buf);
  857. if (cuepoint->error < 0)
  858. return cuepoint->error;
  859. put_ebml_binary(dyn_cp, MATROSKA_ID_POINTENTRY, buf, size);
  860. ffio_reset_dyn_buf(cuepoint);
  861. }
  862. return 0;
  863. }
  864. static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb,
  865. const AVCodecParameters *par,
  866. const uint8_t *extradata, int extradata_size)
  867. {
  868. const uint8_t *header_start[3];
  869. int header_len[3];
  870. int first_header_size;
  871. int err, j;
  872. if (par->codec_id == AV_CODEC_ID_VORBIS)
  873. first_header_size = 30;
  874. else
  875. first_header_size = 42;
  876. err = avpriv_split_xiph_headers(extradata, extradata_size,
  877. first_header_size, header_start, header_len);
  878. if (err < 0) {
  879. av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n");
  880. return err;
  881. }
  882. avio_w8(pb, 2); // number packets - 1
  883. for (j = 0; j < 2; j++) {
  884. put_xiph_size(pb, header_len[j]);
  885. }
  886. for (j = 0; j < 3; j++)
  887. avio_write(pb, header_start[j], header_len[j]);
  888. return 0;
  889. }
  890. #if CONFIG_MATROSKA_MUXER
  891. static int put_wv_codecpriv(AVIOContext *pb, const uint8_t *extradata, int extradata_size)
  892. {
  893. if (extradata && extradata_size == 2)
  894. avio_write(pb, extradata, 2);
  895. else
  896. avio_wl16(pb, 0x410); // fallback to the most recent version
  897. return 0;
  898. }
  899. static int put_flac_codecpriv(AVFormatContext *s, AVIOContext *pb,
  900. const AVCodecParameters *par,
  901. const uint8_t *extradata, int extradata_size)
  902. {
  903. int write_comment = (par->ch_layout.order == AV_CHANNEL_ORDER_NATIVE &&
  904. !(par->ch_layout.u.mask & ~0x3ffffULL) &&
  905. !ff_flac_is_native_layout(par->ch_layout.u.mask));
  906. int ret = ff_flac_write_header(pb, extradata, extradata_size,
  907. !write_comment);
  908. if (ret < 0)
  909. return ret;
  910. if (write_comment) {
  911. const char *vendor = (s->flags & AVFMT_FLAG_BITEXACT) ?
  912. "Lavf" : LIBAVFORMAT_IDENT;
  913. AVDictionary *dict = NULL;
  914. uint8_t buf[32];
  915. int64_t len;
  916. snprintf(buf, sizeof(buf), "0x%"PRIx64, par->ch_layout.u.mask);
  917. av_dict_set(&dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", buf, 0);
  918. len = ff_vorbiscomment_length(dict, vendor, NULL, 0);
  919. av_assert1(len < (1 << 24) - 4);
  920. avio_w8(pb, 0x84);
  921. avio_wb24(pb, len);
  922. ff_vorbiscomment_write(pb, dict, vendor, NULL, 0);
  923. av_dict_free(&dict);
  924. }
  925. return 0;
  926. }
  927. static int get_aac_sample_rates(AVFormatContext *s, MatroskaMuxContext *mkv,
  928. const uint8_t *extradata, int extradata_size,
  929. int *sample_rate, int *output_sample_rate)
  930. {
  931. MPEG4AudioConfig mp4ac;
  932. int ret;
  933. ret = avpriv_mpeg4audio_get_config2(&mp4ac, extradata, extradata_size, 1, s);
  934. /* Don't abort if the failure is because of missing extradata. Assume in that
  935. * case a bitstream filter will provide the muxer with the extradata in the
  936. * first packet.
  937. * Abort however if s->pb is not seekable, as we would not be able to seek back
  938. * to write the sample rate elements once the extradata shows up, anyway. */
  939. if (ret < 0 && (extradata_size || !IS_SEEKABLE(s->pb, mkv))) {
  940. av_log(s, AV_LOG_ERROR,
  941. "Error parsing AAC extradata, unable to determine samplerate.\n");
  942. return AVERROR(EINVAL);
  943. }
  944. if (ret < 0) {
  945. /* This will only happen when this function is called while writing the
  946. * header and no extradata is available. The space for this element has
  947. * to be reserved for when this function is called again after the
  948. * extradata shows up in the first packet, as there's no way to know if
  949. * output_sample_rate will be different than sample_rate or not. */
  950. *output_sample_rate = *sample_rate;
  951. } else {
  952. *sample_rate = mp4ac.sample_rate;
  953. *output_sample_rate = mp4ac.ext_sample_rate;
  954. }
  955. return 0;
  956. }
  957. #endif
  958. static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp,
  959. const AVCodecParameters *par,
  960. const uint8_t *extradata,
  961. int extradata_size,
  962. unsigned *size_to_reserve)
  963. {
  964. switch (par->codec_id) {
  965. case AV_CODEC_ID_VORBIS:
  966. case AV_CODEC_ID_THEORA:
  967. return put_xiph_codecpriv(s, dyn_cp, par, extradata, extradata_size);
  968. case AV_CODEC_ID_AV1:
  969. if (extradata_size)
  970. return ff_isom_write_av1c(dyn_cp, extradata,
  971. extradata_size, 1);
  972. else
  973. *size_to_reserve = (AV1_SANE_SEQUENCE_HEADER_MAX_BITS + 7) / 8 + 100;
  974. break;
  975. #if CONFIG_MATROSKA_MUXER
  976. case AV_CODEC_ID_FLAC:
  977. return put_flac_codecpriv(s, dyn_cp, par, extradata, extradata_size);
  978. case AV_CODEC_ID_WAVPACK:
  979. return put_wv_codecpriv(dyn_cp, extradata, extradata_size);
  980. case AV_CODEC_ID_H264:
  981. return ff_isom_write_avcc(dyn_cp, extradata,
  982. extradata_size);
  983. case AV_CODEC_ID_HEVC:
  984. return ff_isom_write_hvcc(dyn_cp, extradata,
  985. extradata_size, 0, s);
  986. case AV_CODEC_ID_VVC:
  987. return ff_isom_write_vvcc(dyn_cp, extradata,
  988. extradata_size, 0);
  989. case AV_CODEC_ID_ALAC:
  990. if (extradata_size < 36) {
  991. av_log(s, AV_LOG_ERROR,
  992. "Invalid extradata found, ALAC expects a 36-byte "
  993. "QuickTime atom.");
  994. return AVERROR_INVALIDDATA;
  995. } else
  996. avio_write(dyn_cp, extradata + 12,
  997. extradata_size - 12);
  998. break;
  999. case AV_CODEC_ID_AAC:
  1000. if (extradata_size)
  1001. avio_write(dyn_cp, extradata, extradata_size);
  1002. else
  1003. *size_to_reserve = MAX_PCE_SIZE;
  1004. break;
  1005. case AV_CODEC_ID_ARIB_CAPTION: {
  1006. unsigned stream_identifier, data_component_id;
  1007. switch (par->profile) {
  1008. case AV_PROFILE_ARIB_PROFILE_A:
  1009. stream_identifier = 0x30;
  1010. data_component_id = 0x0008;
  1011. break;
  1012. case AV_PROFILE_ARIB_PROFILE_C:
  1013. stream_identifier = 0x87;
  1014. data_component_id = 0x0012;
  1015. break;
  1016. default:
  1017. av_log(s, AV_LOG_ERROR,
  1018. "Unset/unknown ARIB caption profile %d utilized!\n",
  1019. par->profile);
  1020. return AVERROR_INVALIDDATA;
  1021. }
  1022. avio_w8(dyn_cp, stream_identifier);
  1023. avio_wb16(dyn_cp, data_component_id);
  1024. break;
  1025. }
  1026. #endif
  1027. default:
  1028. if (CONFIG_MATROSKA_MUXER && par->codec_id == AV_CODEC_ID_PRORES &&
  1029. ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == AV_CODEC_ID_PRORES) {
  1030. avio_wl32(dyn_cp, par->codec_tag);
  1031. } else if (extradata_size && par->codec_id != AV_CODEC_ID_TTA)
  1032. avio_write(dyn_cp, extradata, extradata_size);
  1033. }
  1034. return 0;
  1035. }
  1036. static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp,
  1037. AVCodecParameters *par,
  1038. const uint8_t *extradata, int extradata_size,
  1039. int native_id, int qt_id,
  1040. uint8_t **codecpriv, int *codecpriv_size,
  1041. unsigned *max_payload_size)
  1042. {
  1043. av_unused MatroskaMuxContext *const mkv = s->priv_data;
  1044. unsigned size_to_reserve = 0;
  1045. int ret;
  1046. if (native_id) {
  1047. ret = mkv_assemble_native_codecprivate(s, dyn_cp, par,
  1048. extradata, extradata_size,
  1049. &size_to_reserve);
  1050. if (ret < 0)
  1051. return ret;
  1052. #if CONFIG_MATROSKA_MUXER
  1053. } else if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
  1054. if (qt_id) {
  1055. if (!par->codec_tag)
  1056. par->codec_tag = ff_codec_get_tag(ff_codec_movvideo_tags,
  1057. par->codec_id);
  1058. if ( ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == par->codec_id
  1059. && (!extradata_size || ff_codec_get_id(ff_codec_movvideo_tags, AV_RL32(extradata + 4)) != par->codec_id)
  1060. ) {
  1061. avio_wb32(dyn_cp, 0x5a + extradata_size);
  1062. avio_wl32(dyn_cp, par->codec_tag);
  1063. ffio_fill(dyn_cp, 0, 0x5a - 8);
  1064. }
  1065. avio_write(dyn_cp, extradata, extradata_size);
  1066. } else {
  1067. if (!ff_codec_get_tag(ff_codec_bmp_tags, par->codec_id))
  1068. av_log(s, AV_LOG_WARNING, "codec %s is not supported by this format\n",
  1069. avcodec_get_name(par->codec_id));
  1070. if (!par->codec_tag)
  1071. par->codec_tag = ff_codec_get_tag(ff_codec_bmp_tags,
  1072. par->codec_id);
  1073. if (!par->codec_tag && par->codec_id != AV_CODEC_ID_RAWVIDEO) {
  1074. av_log(s, AV_LOG_ERROR, "No bmp codec tag found for codec %s\n",
  1075. avcodec_get_name(par->codec_id));
  1076. return AVERROR(EINVAL);
  1077. }
  1078. /* If vfw extradata updates are supported, this will have
  1079. * to be updated to pass extradata(_size) explicitly. */
  1080. ff_put_bmp_header(dyn_cp, par, 0, 0, mkv->flipped_raw_rgb);
  1081. }
  1082. } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
  1083. unsigned int tag;
  1084. tag = ff_codec_get_tag(ff_codec_wav_tags, par->codec_id);
  1085. if (!tag) {
  1086. av_log(s, AV_LOG_ERROR, "No wav codec tag found for codec %s\n",
  1087. avcodec_get_name(par->codec_id));
  1088. return AVERROR(EINVAL);
  1089. }
  1090. if (!par->codec_tag)
  1091. par->codec_tag = tag;
  1092. /* Same comment as for ff_put_bmp_header applies here. */
  1093. ret = ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX);
  1094. if (ret < 0)
  1095. return ret;
  1096. #endif
  1097. }
  1098. *codecpriv_size = avio_get_dyn_buf(dyn_cp, codecpriv);
  1099. if (dyn_cp->error < 0)
  1100. return dyn_cp->error;
  1101. *max_payload_size = *codecpriv_size + size_to_reserve;
  1102. return 0;
  1103. }
  1104. static void mkv_put_codecprivate(AVIOContext *pb, unsigned max_payload_size,
  1105. const uint8_t *codecpriv, unsigned codecpriv_size)
  1106. {
  1107. unsigned total_codecpriv_size = 0, total_size;
  1108. av_assert1(codecpriv_size <= max_payload_size);
  1109. if (!max_payload_size)
  1110. return;
  1111. total_size = 2 + ebml_length_size(max_payload_size) + max_payload_size;
  1112. if (codecpriv_size) {
  1113. unsigned length_size = ebml_length_size(codecpriv_size);
  1114. total_codecpriv_size = 2U + length_size + codecpriv_size;
  1115. if (total_codecpriv_size + 1 == total_size) {
  1116. /* It is impossible to add one byte of padding via an EBML Void. */
  1117. length_size++;
  1118. total_codecpriv_size++;
  1119. }
  1120. put_ebml_id(pb, MATROSKA_ID_CODECPRIVATE);
  1121. put_ebml_length(pb, codecpriv_size, length_size);
  1122. avio_write(pb, codecpriv, codecpriv_size);
  1123. }
  1124. if (total_codecpriv_size < total_size)
  1125. put_ebml_void(pb, total_size - total_codecpriv_size);
  1126. }
  1127. static int mkv_update_codecprivate(AVFormatContext *s, MatroskaMuxContext *mkv,
  1128. uint8_t *side_data, int side_data_size,
  1129. AVCodecParameters *par, AVIOContext *pb,
  1130. mkv_track *track, unsigned alternative_size)
  1131. {
  1132. AVIOContext *const dyn_bc = mkv->tmp_bc;
  1133. uint8_t *codecpriv;
  1134. unsigned max_payload_size;
  1135. int ret, codecpriv_size;
  1136. ret = mkv_assemble_codecprivate(s, dyn_bc, par,
  1137. side_data, side_data_size, 1, 0,
  1138. &codecpriv, &codecpriv_size, &max_payload_size);
  1139. if (ret < 0)
  1140. goto fail;
  1141. if (codecpriv_size > track->codecpriv_size && !alternative_size) {
  1142. ret = AVERROR(ENOSPC);
  1143. goto fail;
  1144. } else if (codecpriv_size > track->codecpriv_size) {
  1145. av_assert1(alternative_size < track->codecpriv_size);
  1146. codecpriv_size = alternative_size;
  1147. }
  1148. avio_seek(pb, track->codecpriv_offset, SEEK_SET);
  1149. mkv_put_codecprivate(pb, track->codecpriv_size,
  1150. codecpriv, codecpriv_size);
  1151. if (!par->extradata_size) {
  1152. ret = ff_alloc_extradata(par, side_data_size);
  1153. if (ret < 0)
  1154. goto fail;
  1155. memcpy(par->extradata, side_data, side_data_size);
  1156. }
  1157. fail:
  1158. ffio_reset_dyn_buf(dyn_bc);
  1159. return ret;
  1160. }
  1161. #define MAX_VIDEO_COLOR_ELEMS 20
  1162. static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st,
  1163. const AVCodecParameters *par)
  1164. {
  1165. const AVPacketSideData *side_data;
  1166. ebml_writer_open_master(writer, MATROSKA_ID_VIDEOCOLOR);
  1167. if (par->color_trc != AVCOL_TRC_UNSPECIFIED &&
  1168. par->color_trc < AVCOL_TRC_NB) {
  1169. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS,
  1170. par->color_trc);
  1171. }
  1172. if (par->color_space != AVCOL_SPC_UNSPECIFIED &&
  1173. par->color_space < AVCOL_SPC_NB) {
  1174. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORMATRIXCOEFF,
  1175. par->color_space);
  1176. }
  1177. if (par->color_primaries != AVCOL_PRI_UNSPECIFIED &&
  1178. par->color_primaries < AVCOL_PRI_NB) {
  1179. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORPRIMARIES,
  1180. par->color_primaries);
  1181. }
  1182. if (par->color_range != AVCOL_RANGE_UNSPECIFIED &&
  1183. par->color_range < AVCOL_RANGE_NB) {
  1184. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORRANGE, par->color_range);
  1185. }
  1186. if (par->chroma_location != AVCHROMA_LOC_UNSPECIFIED &&
  1187. par->chroma_location <= AVCHROMA_LOC_TOP) {
  1188. int xpos, ypos;
  1189. av_chroma_location_enum_to_pos(&xpos, &ypos, par->chroma_location);
  1190. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORCHROMASITINGHORZ,
  1191. (xpos >> 7) + 1);
  1192. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORCHROMASITINGVERT,
  1193. (ypos >> 7) + 1);
  1194. }
  1195. side_data = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data,
  1196. AV_PKT_DATA_CONTENT_LIGHT_LEVEL);
  1197. if (side_data) {
  1198. const AVContentLightMetadata *metadata = (AVContentLightMetadata *)side_data->data;
  1199. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORMAXCLL,
  1200. metadata->MaxCLL);
  1201. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORMAXFALL,
  1202. metadata->MaxFALL);
  1203. }
  1204. side_data = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data,
  1205. AV_PKT_DATA_MASTERING_DISPLAY_METADATA);
  1206. if (side_data) {
  1207. const AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)side_data->data;
  1208. ebml_writer_open_master(writer, MATROSKA_ID_VIDEOCOLORMASTERINGMETA);
  1209. if (metadata->has_primaries) {
  1210. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_RX,
  1211. av_q2d(metadata->display_primaries[0][0]));
  1212. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_RY,
  1213. av_q2d(metadata->display_primaries[0][1]));
  1214. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_GX,
  1215. av_q2d(metadata->display_primaries[1][0]));
  1216. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_GY,
  1217. av_q2d(metadata->display_primaries[1][1]));
  1218. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_BX,
  1219. av_q2d(metadata->display_primaries[2][0]));
  1220. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_BY,
  1221. av_q2d(metadata->display_primaries[2][1]));
  1222. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_WHITEX,
  1223. av_q2d(metadata->white_point[0]));
  1224. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_WHITEY,
  1225. av_q2d(metadata->white_point[1]));
  1226. }
  1227. if (metadata->has_luminance) {
  1228. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX,
  1229. av_q2d(metadata->max_luminance));
  1230. ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN,
  1231. av_q2d(metadata->min_luminance));
  1232. }
  1233. ebml_writer_close_or_discard_master(writer);
  1234. }
  1235. ebml_writer_close_or_discard_master(writer);
  1236. }
  1237. #define MAX_VIDEO_PROJECTION_ELEMS 6
  1238. static void mkv_handle_rotation(void *logctx, const AVCodecParameters *par,
  1239. double *yaw, double *roll)
  1240. {
  1241. const int32_t *matrix;
  1242. const AVPacketSideData *side_data =
  1243. av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data,
  1244. AV_PKT_DATA_DISPLAYMATRIX);
  1245. if (!side_data)
  1246. return;
  1247. matrix = (int32_t *)side_data->data;
  1248. /* Check whether this is an affine transformation */
  1249. if (matrix[2] || matrix[5])
  1250. goto ignore;
  1251. /* This together with the checks below test whether
  1252. * the upper-left 2x2 matrix is nonsingular. */
  1253. if (!matrix[0] && !matrix[1])
  1254. goto ignore;
  1255. /* We ignore the translation part of the matrix (matrix[6] and matrix[7])
  1256. * as well as any scaling, i.e. we only look at the upper left 2x2 matrix.
  1257. * We only accept matrices that are an exact multiple of an orthogonal one.
  1258. * Apart from the multiple, every such matrix can be obtained by
  1259. * potentially flipping in the x-direction (corresponding to yaw = 180)
  1260. * followed by a rotation of (say) an angle phi in the counterclockwise
  1261. * direction. The upper-left 2x2 matrix then looks like this:
  1262. * | (+/-)cos(phi) (-/+)sin(phi) |
  1263. * scale * | |
  1264. * | sin(phi) cos(phi) |
  1265. * The first set of signs in the first row apply in case of no flipping,
  1266. * the second set applies in case of flipping. */
  1267. /* The casts to int64_t are needed because -INT32_MIN doesn't fit
  1268. * in an int32_t. */
  1269. if (matrix[0] == matrix[4] && -(int64_t)matrix[1] == matrix[3]) {
  1270. /* No flipping case */
  1271. *yaw = 0;
  1272. } else if (-(int64_t)matrix[0] == matrix[4] && matrix[1] == matrix[3]) {
  1273. /* Horizontal flip */
  1274. *yaw = 180;
  1275. } else {
  1276. ignore:
  1277. av_log(logctx, AV_LOG_INFO, "Ignoring display matrix indicating "
  1278. "non-orthogonal transformation.\n");
  1279. return;
  1280. }
  1281. *roll = 180 / M_PI * atan2(matrix[3], matrix[4]);
  1282. /* We do not write a ProjectionType element indicating "rectangular",
  1283. * because this is the default value. */
  1284. }
  1285. static int mkv_handle_spherical(void *logctx, EbmlWriter *writer,
  1286. const AVCodecParameters *par, uint8_t private[],
  1287. double *yaw, double *pitch, double *roll)
  1288. {
  1289. const AVPacketSideData *sd = av_packet_side_data_get(par->coded_side_data,
  1290. par->nb_coded_side_data,
  1291. AV_PKT_DATA_SPHERICAL);
  1292. const AVSphericalMapping *spherical;
  1293. if (!sd)
  1294. return 0;
  1295. spherical = (const AVSphericalMapping *)sd->data;
  1296. if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR &&
  1297. spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE &&
  1298. spherical->projection != AV_SPHERICAL_CUBEMAP) {
  1299. av_log(logctx, AV_LOG_WARNING, "Unknown projection type\n");
  1300. return 0;
  1301. }
  1302. switch (spherical->projection) {
  1303. case AV_SPHERICAL_EQUIRECTANGULAR:
  1304. case AV_SPHERICAL_EQUIRECTANGULAR_TILE:
  1305. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOPROJECTIONTYPE,
  1306. MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
  1307. AV_WB32(private, 0); // version + flags
  1308. if (spherical->projection == AV_SPHERICAL_EQUIRECTANGULAR) {
  1309. AV_WB32(private + 4, 0);
  1310. AV_WB32(private + 8, 0);
  1311. AV_WB32(private + 12, 0);
  1312. AV_WB32(private + 16, 0);
  1313. } else {
  1314. AV_WB32(private + 4, spherical->bound_top);
  1315. AV_WB32(private + 8, spherical->bound_bottom);
  1316. AV_WB32(private + 12, spherical->bound_left);
  1317. AV_WB32(private + 16, spherical->bound_right);
  1318. }
  1319. ebml_writer_add_bin(writer, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
  1320. private, 20);
  1321. break;
  1322. case AV_SPHERICAL_CUBEMAP:
  1323. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOPROJECTIONTYPE,
  1324. MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP);
  1325. AV_WB32(private, 0); // version + flags
  1326. AV_WB32(private + 4, 0); // layout
  1327. AV_WB32(private + 8, spherical->padding);
  1328. ebml_writer_add_bin(writer, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
  1329. private, 12);
  1330. break;
  1331. default:
  1332. av_assert0(0);
  1333. }
  1334. *yaw = (double) spherical->yaw / (1 << 16);
  1335. *pitch = (double) spherical->pitch / (1 << 16);
  1336. *roll = (double) spherical->roll / (1 << 16);
  1337. return 1; /* Projection included */
  1338. }
  1339. static void mkv_write_video_projection(void *logctx, EbmlWriter *wr,
  1340. const AVCodecParameters *par,
  1341. uint8_t private[])
  1342. {
  1343. double yaw = 0, pitch = 0, roll = 0;
  1344. int ret;
  1345. ebml_writer_open_master(wr, MATROSKA_ID_VIDEOPROJECTION);
  1346. ret = mkv_handle_spherical(logctx, wr, par, private, &yaw, &pitch, &roll);
  1347. if (!ret)
  1348. mkv_handle_rotation(logctx, par, &yaw, &roll);
  1349. if (yaw)
  1350. ebml_writer_add_float(wr, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, yaw);
  1351. if (pitch)
  1352. ebml_writer_add_float(wr, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, pitch);
  1353. if (roll)
  1354. ebml_writer_add_float(wr, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, roll);
  1355. ebml_writer_close_or_discard_master(wr);
  1356. }
  1357. #define MAX_FIELD_ORDER_ELEMS 2
  1358. static void mkv_write_field_order(EbmlWriter *writer, int is_webm,
  1359. enum AVFieldOrder field_order)
  1360. {
  1361. switch (field_order) {
  1362. case AV_FIELD_UNKNOWN:
  1363. break;
  1364. case AV_FIELD_PROGRESSIVE:
  1365. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOFLAGINTERLACED,
  1366. MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE);
  1367. break;
  1368. case AV_FIELD_TT:
  1369. case AV_FIELD_BB:
  1370. case AV_FIELD_TB:
  1371. case AV_FIELD_BT:
  1372. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOFLAGINTERLACED,
  1373. MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED);
  1374. if (!is_webm) {
  1375. switch (field_order) {
  1376. case AV_FIELD_TT:
  1377. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOFIELDORDER,
  1378. MATROSKA_VIDEO_FIELDORDER_TT);
  1379. break;
  1380. case AV_FIELD_BB:
  1381. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOFIELDORDER,
  1382. MATROSKA_VIDEO_FIELDORDER_BB);
  1383. break;
  1384. case AV_FIELD_TB:
  1385. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOFIELDORDER,
  1386. MATROSKA_VIDEO_FIELDORDER_TB);
  1387. break;
  1388. case AV_FIELD_BT:
  1389. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOFIELDORDER,
  1390. MATROSKA_VIDEO_FIELDORDER_BT);
  1391. break;
  1392. }
  1393. }
  1394. }
  1395. }
  1396. #define MAX_STEREO_MODE_ELEMS 1
  1397. static int mkv_write_stereo_mode(AVFormatContext *s, EbmlWriter *writer,
  1398. const AVCodecParameters *par,
  1399. const AVStream *st, int is_webm,
  1400. int *h_width, int *h_height)
  1401. {
  1402. const char *error_message_addendum = "";
  1403. const AVDictionaryEntry *tag;
  1404. MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB;
  1405. /* The following macros create bitfields where the ith bit
  1406. * indicates whether the MatroskaVideoStereoModeType with that value
  1407. * uses double width/height or is WebM compatible. */
  1408. #define FLAG(STEREOMODETYPE, BOOL) | (BOOL) << (STEREOMODETYPE)
  1409. #define WDIV1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
  1410. FLAG(STEREOMODETYPE, WDIV)
  1411. #define WDIV2(STEREOMODETYPE, WDIV, HDIV, WEBM) \
  1412. FLAG(STEREOMODETYPE, WDIV)
  1413. // The zero in the following line consumes the first '|'.
  1414. const unsigned width_bitfield = 0 STEREOMODE_STEREO3D_MAPPING(WDIV1, WDIV2);
  1415. #define HDIV1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
  1416. FLAG(STEREOMODETYPE, HDIV)
  1417. #define HDIV2(STEREOMODETYPE, WDIV, HDIV, WEBM) \
  1418. FLAG(STEREOMODETYPE, HDIV)
  1419. const unsigned height_bitfield = 0 STEREOMODE_STEREO3D_MAPPING(HDIV1, HDIV2);
  1420. #define WEBM1(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
  1421. FLAG(STEREOMODETYPE, WEBM)
  1422. #define WEBM2(STEREOMODETYPE, WDIV, HDIV, WEBM) \
  1423. FLAG(STEREOMODETYPE, WEBM)
  1424. const unsigned webm_bitfield = 0 STEREOMODE_STEREO3D_MAPPING(WEBM1, WEBM2);
  1425. *h_width = 1;
  1426. *h_height = 1;
  1427. if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
  1428. (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
  1429. for (int i = 0; i < MATROSKA_VIDEO_STEREOMODE_TYPE_NB; i++)
  1430. if (!strcmp(tag->value, ff_matroska_video_stereo_mode[i])){
  1431. format = i;
  1432. break;
  1433. }
  1434. if (format == MATROSKA_VIDEO_STEREOMODE_TYPE_NB) {
  1435. long stereo_mode = strtol(tag->value, NULL, 0);
  1436. if ((unsigned long)stereo_mode >= MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
  1437. goto fail;
  1438. format = stereo_mode;
  1439. }
  1440. } else {
  1441. const AVPacketSideData *sd;
  1442. const AVStereo3D *stereo;
  1443. /* The following macro presumes all MATROSKA_VIDEO_STEREOMODE_TYPE_*
  1444. * values to be in the range 0..254. */
  1445. #define STEREOMODE(STEREOMODETYPE, STEREO3DTYPE, FLAGS, WDIV, HDIV, WEBM) \
  1446. [(STEREO3DTYPE)][!!((FLAGS) & AV_STEREO3D_FLAG_INVERT)] = (STEREOMODETYPE) + 1,
  1447. #define NOTHING(STEREOMODETYPE, WDIV, HDIV, WEBM)
  1448. static const unsigned char conversion_table[][2] = {
  1449. STEREOMODE_STEREO3D_MAPPING(STEREOMODE, NOTHING)
  1450. };
  1451. int fmt;
  1452. sd = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data,
  1453. AV_PKT_DATA_STEREO3D);
  1454. if (!sd)
  1455. return 0;
  1456. stereo = (const AVStereo3D*)sd->data;
  1457. /* A garbage AVStereo3D or something with no Matroska analogon. */
  1458. if ((unsigned)stereo->type >= FF_ARRAY_ELEMS(conversion_table))
  1459. return 0;
  1460. fmt = conversion_table[stereo->type][!!(stereo->flags & AV_STEREO3D_FLAG_INVERT)];
  1461. /* Format with no Matroska analogon; ignore it */
  1462. if (!fmt)
  1463. return 0;
  1464. format = fmt - 1;
  1465. }
  1466. // if webm, do not write unsupported modes
  1467. if (is_webm && !(webm_bitfield >> format)) {
  1468. error_message_addendum = " for WebM";
  1469. goto fail;
  1470. }
  1471. *h_width = 1 << ((width_bitfield >> format) & 1);
  1472. *h_height = 1 << ((height_bitfield >> format) & 1);
  1473. // write StereoMode if format is valid
  1474. ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOSTEREOMODE, format);
  1475. return 0;
  1476. fail:
  1477. av_log(s, AV_LOG_ERROR,
  1478. "The specified stereo mode is not valid%s.\n",
  1479. error_message_addendum);
  1480. return AVERROR(EINVAL);
  1481. }
  1482. static void mkv_write_blockadditionmapping(AVFormatContext *s, const MatroskaMuxContext *mkv,
  1483. const AVCodecParameters *par, AVIOContext *pb,
  1484. mkv_track *track, const AVStream *st)
  1485. {
  1486. #if CONFIG_MATROSKA_MUXER
  1487. const AVDOVIDecoderConfigurationRecord *dovi;
  1488. const AVPacketSideData *sd;
  1489. if (IS_SEEKABLE(s->pb, mkv)) {
  1490. track->blockadditionmapping_offset = avio_tell(pb);
  1491. // We can't know at this point if there will be a block with BlockAdditions, so
  1492. // we either write the default value here, or a void element. Either of them will
  1493. // be overwritten when finishing the track.
  1494. put_ebml_uint(pb, MATROSKA_ID_TRACKMAXBLKADDID, 0);
  1495. if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
  1496. // Similarly, reserve space for an eventual
  1497. // HDR10+ ITU T.35 metadata BlockAdditionMapping.
  1498. put_ebml_void(pb, 3 /* BlockAdditionMapping */
  1499. + 4 /* BlockAddIDValue */
  1500. + 4 /* BlockAddIDType */);
  1501. }
  1502. }
  1503. sd = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data,
  1504. AV_PKT_DATA_DOVI_CONF);
  1505. if (!sd)
  1506. return;
  1507. dovi = (const AVDOVIDecoderConfigurationRecord *)sd->data;
  1508. if (dovi->dv_profile <= 10) {
  1509. ebml_master mapping;
  1510. uint8_t buf[ISOM_DVCC_DVVC_SIZE];
  1511. uint32_t type;
  1512. uint64_t expected_size = (2 + 1 + (sizeof(DVCC_DVVC_BLOCK_TYPE_NAME) - 1))
  1513. + (2 + 1 + 4) + (2 + 1 + ISOM_DVCC_DVVC_SIZE);
  1514. if (dovi->dv_profile > 7) {
  1515. type = MATROSKA_BLOCK_ADD_ID_TYPE_DVVC;
  1516. } else {
  1517. type = MATROSKA_BLOCK_ADD_ID_TYPE_DVCC;
  1518. }
  1519. ff_isom_put_dvcc_dvvc(s, buf, dovi);
  1520. mapping = start_ebml_master(pb, MATROSKA_ID_TRACKBLKADDMAPPING, expected_size);
  1521. put_ebml_string(pb, MATROSKA_ID_BLKADDIDNAME, DVCC_DVVC_BLOCK_TYPE_NAME);
  1522. put_ebml_uint(pb, MATROSKA_ID_BLKADDIDTYPE, type);
  1523. put_ebml_binary(pb, MATROSKA_ID_BLKADDIDEXTRADATA, buf, sizeof(buf));
  1524. end_ebml_master(pb, mapping);
  1525. }
  1526. #endif
  1527. }
  1528. static int mkv_write_track_video(AVFormatContext *s, MatroskaMuxContext *mkv,
  1529. const AVStream *st, const AVCodecParameters *par,
  1530. AVIOContext *pb)
  1531. {
  1532. const AVDictionaryEntry *tag;
  1533. int display_width_div = 1, display_height_div = 1;
  1534. uint8_t color_space[4], projection_private[20];
  1535. const AVPacketSideData *sd;
  1536. EBML_WRITER(MAX_FIELD_ORDER_ELEMS + MAX_STEREO_MODE_ELEMS +
  1537. MAX_VIDEO_COLOR_ELEMS + MAX_VIDEO_PROJECTION_ELEMS + 12);
  1538. int cropped_width = par->width, cropped_height = par->height;
  1539. int ret;
  1540. ebml_writer_open_master(&writer, MATROSKA_ID_TRACKVIDEO);
  1541. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEOPIXELWIDTH , par->width);
  1542. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEOPIXELHEIGHT, par->height);
  1543. mkv_write_field_order(&writer, IS_WEBM(mkv), par->field_order);
  1544. // check both side data and metadata for stereo information,
  1545. // write the result to the bitstream if any is found
  1546. ret = mkv_write_stereo_mode(s, &writer, par, st, IS_WEBM(mkv),
  1547. &display_width_div,
  1548. &display_height_div);
  1549. if (ret < 0)
  1550. return ret;
  1551. if (par->format == AV_PIX_FMT_YUVA420P ||
  1552. ((tag = av_dict_get(st->metadata, "alpha_mode", NULL, 0)) ||
  1553. (tag = av_dict_get( s->metadata, "alpha_mode", NULL, 0))) && strtol(tag->value, NULL, 0))
  1554. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEOALPHAMODE, 1);
  1555. sd = av_packet_side_data_get(par->coded_side_data,
  1556. par->nb_coded_side_data,
  1557. AV_PKT_DATA_FRAME_CROPPING);
  1558. if (sd && sd->size == sizeof(uint32_t) * 4) {
  1559. uint64_t top, bottom, left, right;
  1560. top = AV_RL32(sd->data + 0);
  1561. bottom = AV_RL32(sd->data + 4);
  1562. left = AV_RL32(sd->data + 8);
  1563. right = AV_RL32(sd->data + 12);
  1564. if ((left + right) >= par->width ||
  1565. (top + bottom) >= par->height) {
  1566. av_log(s, AV_LOG_ERROR, "Invalid cropping dimensions in stream side data\n");
  1567. return AVERROR(EINVAL);
  1568. }
  1569. if (bottom)
  1570. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEOPIXELCROPB, bottom);
  1571. if (top)
  1572. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEOPIXELCROPT, top);
  1573. if (left)
  1574. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEOPIXELCROPL, left);
  1575. if (right)
  1576. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEOPIXELCROPR, right);
  1577. cropped_width -= left + right;
  1578. cropped_height -= top + bottom;
  1579. }
  1580. // write DisplayWidth and DisplayHeight, they contain the size of
  1581. // a single source view and/or the display aspect ratio
  1582. if (st->sample_aspect_ratio.num) {
  1583. int64_t d_width = av_rescale(cropped_width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
  1584. if (d_width > INT_MAX) {
  1585. av_log(s, AV_LOG_ERROR, "Overflow in display width\n");
  1586. return AVERROR(EINVAL);
  1587. }
  1588. if (d_width != cropped_width || display_width_div != 1 || display_height_div != 1) {
  1589. if (IS_WEBM(mkv) || display_width_div != 1 || display_height_div != 1) {
  1590. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYWIDTH,
  1591. d_width / display_width_div);
  1592. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYHEIGHT,
  1593. cropped_height / display_height_div);
  1594. } else {
  1595. AVRational display_aspect_ratio;
  1596. av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
  1597. cropped_width * (int64_t)st->sample_aspect_ratio.num,
  1598. cropped_height * (int64_t)st->sample_aspect_ratio.den,
  1599. 1024 * 1024);
  1600. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYWIDTH,
  1601. display_aspect_ratio.num);
  1602. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYHEIGHT,
  1603. display_aspect_ratio.den);
  1604. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYUNIT,
  1605. MATROSKA_VIDEO_DISPLAYUNIT_DAR);
  1606. }
  1607. }
  1608. } else if (display_width_div != 1 || display_height_div != 1) {
  1609. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYWIDTH,
  1610. cropped_width / display_width_div);
  1611. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYHEIGHT,
  1612. cropped_height / display_height_div);
  1613. } else if (!IS_WEBM(mkv))
  1614. ebml_writer_add_uint(&writer, MATROSKA_ID_VIDEODISPLAYUNIT,
  1615. MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN);
  1616. if (par->codec_id == AV_CODEC_ID_RAWVIDEO) {
  1617. AV_WL32(color_space, par->codec_tag);
  1618. ebml_writer_add_bin(&writer, MATROSKA_ID_VIDEOCOLORSPACE,
  1619. color_space, sizeof(color_space));
  1620. }
  1621. mkv_write_video_color(&writer, st, par);
  1622. mkv_write_video_projection(s, &writer, par, projection_private);
  1623. return ebml_writer_write(&writer, pb);
  1624. }
  1625. static void mkv_write_default_duration(mkv_track *track, AVIOContext *pb,
  1626. AVRational duration)
  1627. {
  1628. put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION,
  1629. 1000000000LL * duration.num / duration.den);
  1630. track->default_duration_low = 1000LL * duration.num / duration.den;
  1631. track->default_duration_high = track->default_duration_low +
  1632. !!(1000LL * duration.num % duration.den);
  1633. }
  1634. static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
  1635. AVStream *st, mkv_track *track, AVIOContext *pb,
  1636. int is_default)
  1637. {
  1638. AVCodecParameters *par = st->codecpar;
  1639. ebml_master subinfo, track_master;
  1640. int native_id = 0;
  1641. int qt_id = 0;
  1642. int bit_depth;
  1643. int sample_rate = par->sample_rate;
  1644. int output_sample_rate = 0;
  1645. int j, ret;
  1646. const AVDictionaryEntry *tag;
  1647. if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT)
  1648. return 0;
  1649. track_master = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
  1650. put_ebml_uint(pb, MATROSKA_ID_TRACKNUMBER, track->track_num);
  1651. put_ebml_uid (pb, MATROSKA_ID_TRACKUID, track->uid);
  1652. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGLACING, 0); // no lacing (yet)
  1653. if ((tag = av_dict_get(st->metadata, "title", NULL, 0)))
  1654. put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value);
  1655. tag = av_dict_get(st->metadata, "language", NULL, 0);
  1656. put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE,
  1657. tag && tag->value[0] ? tag->value : "und");
  1658. // The default value for TRACKFLAGDEFAULT is 1, so add element
  1659. // if we need to clear it.
  1660. if (!is_default)
  1661. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, 0);
  1662. if (st->disposition & AV_DISPOSITION_FORCED)
  1663. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1);
  1664. if (IS_WEBM(mkv)) {
  1665. const char *codec_id;
  1666. if (par->codec_id != AV_CODEC_ID_WEBVTT) {
  1667. for (j = 0; ff_webm_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
  1668. if (ff_webm_codec_tags[j].id == par->codec_id) {
  1669. codec_id = ff_webm_codec_tags[j].str;
  1670. native_id = 1;
  1671. break;
  1672. }
  1673. }
  1674. } else {
  1675. if (st->disposition & AV_DISPOSITION_CAPTIONS) {
  1676. codec_id = "D_WEBVTT/CAPTIONS";
  1677. native_id = MATROSKA_TRACK_TYPE_SUBTITLE;
  1678. } else if (st->disposition & AV_DISPOSITION_DESCRIPTIONS) {
  1679. codec_id = "D_WEBVTT/DESCRIPTIONS";
  1680. native_id = MATROSKA_TRACK_TYPE_METADATA;
  1681. } else if (st->disposition & AV_DISPOSITION_METADATA) {
  1682. codec_id = "D_WEBVTT/METADATA";
  1683. native_id = MATROSKA_TRACK_TYPE_METADATA;
  1684. } else {
  1685. codec_id = "D_WEBVTT/SUBTITLES";
  1686. native_id = MATROSKA_TRACK_TYPE_SUBTITLE;
  1687. }
  1688. }
  1689. if (!native_id) {
  1690. av_log(s, AV_LOG_ERROR,
  1691. "Only VP8 or VP9 or AV1 video and Vorbis or Opus audio and WebVTT subtitles are supported for WebM.\n");
  1692. return AVERROR(EINVAL);
  1693. }
  1694. put_ebml_string(pb, MATROSKA_ID_CODECID, codec_id);
  1695. } else {
  1696. if (st->disposition & AV_DISPOSITION_COMMENT)
  1697. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGCOMMENTARY, 1);
  1698. if (st->disposition & AV_DISPOSITION_HEARING_IMPAIRED)
  1699. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGHEARINGIMPAIRED, 1);
  1700. if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED)
  1701. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGVISUALIMPAIRED, 1);
  1702. if (st->disposition & (AV_DISPOSITION_ORIGINAL | AV_DISPOSITION_DUB) &&
  1703. (st->disposition & (AV_DISPOSITION_ORIGINAL | AV_DISPOSITION_DUB))
  1704. != (AV_DISPOSITION_ORIGINAL | AV_DISPOSITION_DUB))
  1705. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGORIGINAL,
  1706. !!(st->disposition & AV_DISPOSITION_ORIGINAL));
  1707. // look for a codec ID string specific to mkv to use,
  1708. // if none are found, use AVI codes
  1709. if (par->codec_id == AV_CODEC_ID_JPEG2000) {
  1710. /* JPEG2000 is actually supported natively in Matroska,
  1711. * yet we use the VfW way to mux it for compatibility
  1712. * with old demuxers. (FIXME: Are they really important?) */
  1713. } else if (par->codec_id != AV_CODEC_ID_RAWVIDEO || par->codec_tag) {
  1714. for (j = 0; ff_mkv_codec_tags[j].id != AV_CODEC_ID_NONE; j++) {
  1715. if (ff_mkv_codec_tags[j].id == par->codec_id) {
  1716. put_ebml_string(pb, MATROSKA_ID_CODECID, ff_mkv_codec_tags[j].str);
  1717. native_id = 1;
  1718. break;
  1719. }
  1720. }
  1721. } else {
  1722. if (mkv->allow_raw_vfw) {
  1723. native_id = 0;
  1724. } else {
  1725. av_log(s, AV_LOG_ERROR, "Raw RGB is not supported Natively in Matroska, you can use AVI or NUT or\n"
  1726. "If you would like to store it anyway using VFW mode, enable allow_raw_vfw (-allow_raw_vfw 1)\n");
  1727. return AVERROR(EINVAL);
  1728. }
  1729. }
  1730. }
  1731. switch (par->codec_type) {
  1732. AVRational frame_rate;
  1733. int audio_frame_samples;
  1734. case AVMEDIA_TYPE_VIDEO:
  1735. mkv->have_video = 1;
  1736. put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
  1737. frame_rate = (AVRational){ 0, 1 };
  1738. if (st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0)
  1739. frame_rate = st->avg_frame_rate;
  1740. else if (st->r_frame_rate.num > 0 && st->r_frame_rate.den > 0)
  1741. frame_rate = st->r_frame_rate;
  1742. if (frame_rate.num > 0)
  1743. mkv_write_default_duration(track, pb, av_inv_q(frame_rate));
  1744. if (CONFIG_MATROSKA_MUXER && !native_id &&
  1745. ff_codec_get_tag(ff_codec_movvideo_tags, par->codec_id) &&
  1746. ((!ff_codec_get_tag(ff_codec_bmp_tags, par->codec_id) && par->codec_id != AV_CODEC_ID_RAWVIDEO) ||
  1747. par->codec_id == AV_CODEC_ID_SVQ1 ||
  1748. par->codec_id == AV_CODEC_ID_SVQ3 ||
  1749. par->codec_id == AV_CODEC_ID_CINEPAK))
  1750. qt_id = 1;
  1751. if (qt_id)
  1752. put_ebml_string(pb, MATROSKA_ID_CODECID, "V_QUICKTIME");
  1753. else if (!native_id) {
  1754. // if there is no mkv-specific codec ID, use VFW mode
  1755. put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC");
  1756. track->write_dts = 1;
  1757. ffformatcontext(s)->avoid_negative_ts_use_pts = 0;
  1758. }
  1759. ret = mkv_write_track_video(s, mkv, st, par, pb);
  1760. if (ret < 0)
  1761. return ret;
  1762. break;
  1763. case AVMEDIA_TYPE_AUDIO:
  1764. if (par->initial_padding) {
  1765. int64_t codecdelay = av_rescale_q(par->initial_padding,
  1766. (AVRational){ 1, par->sample_rate },
  1767. (AVRational){ 1, 1000000000 });
  1768. if (codecdelay < 0) {
  1769. av_log(s, AV_LOG_ERROR, "Initial padding is invalid\n");
  1770. return AVERROR(EINVAL);
  1771. }
  1772. put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay);
  1773. track->ts_offset = av_rescale_q(par->initial_padding,
  1774. (AVRational){ 1, par->sample_rate },
  1775. st->time_base);
  1776. ffstream(st)->lowest_ts_allowed = -track->ts_offset;
  1777. }
  1778. if (par->codec_id == AV_CODEC_ID_OPUS)
  1779. put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL);
  1780. #if CONFIG_MATROSKA_MUXER
  1781. else if (par->codec_id == AV_CODEC_ID_AAC) {
  1782. ret = get_aac_sample_rates(s, mkv, par->extradata, par->extradata_size,
  1783. &sample_rate, &output_sample_rate);
  1784. if (ret < 0)
  1785. return ret;
  1786. }
  1787. #endif
  1788. put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
  1789. audio_frame_samples = av_get_audio_frame_duration2(par, 0);
  1790. if (audio_frame_samples)
  1791. mkv_write_default_duration(track, pb, (AVRational){ audio_frame_samples,
  1792. par->sample_rate });
  1793. if (!native_id)
  1794. // no mkv-specific ID, use ACM mode
  1795. put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM");
  1796. subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 6 + 4 * 9);
  1797. put_ebml_uint(pb, MATROSKA_ID_AUDIOCHANNELS, par->ch_layout.nb_channels);
  1798. track->sample_rate_offset = avio_tell(pb);
  1799. put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
  1800. if (output_sample_rate)
  1801. put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
  1802. bit_depth = av_get_bits_per_sample(par->codec_id);
  1803. if (!bit_depth && par->codec_id != AV_CODEC_ID_ADPCM_G726) {
  1804. if (par->bits_per_raw_sample)
  1805. bit_depth = par->bits_per_raw_sample;
  1806. else
  1807. bit_depth = av_get_bytes_per_sample(par->format) << 3;
  1808. }
  1809. if (!bit_depth)
  1810. bit_depth = par->bits_per_coded_sample;
  1811. if (bit_depth)
  1812. put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
  1813. end_ebml_master(pb, subinfo);
  1814. break;
  1815. case AVMEDIA_TYPE_SUBTITLE:
  1816. if (!native_id) {
  1817. av_log(s, AV_LOG_ERROR, "Subtitle codec %s (%d) is not supported.\n",
  1818. avcodec_get_name(par->codec_id), par->codec_id);
  1819. return AVERROR(ENOSYS);
  1820. }
  1821. if (!IS_WEBM(mkv) && st->disposition & AV_DISPOSITION_DESCRIPTIONS)
  1822. put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGTEXTDESCRIPTIONS, 1);
  1823. if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT)
  1824. native_id = MATROSKA_TRACK_TYPE_SUBTITLE;
  1825. put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, native_id);
  1826. break;
  1827. default:
  1828. av_log(s, AV_LOG_ERROR, "Only audio, video, and subtitles are supported for Matroska.\n");
  1829. return AVERROR(EINVAL);
  1830. }
  1831. if (!IS_WEBM(mkv))
  1832. mkv_write_blockadditionmapping(s, mkv, par, pb, track, st);
  1833. if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) {
  1834. uint8_t *codecpriv;
  1835. int codecpriv_size, max_payload_size;
  1836. track->codecpriv_offset = avio_tell(pb);
  1837. ret = mkv_assemble_codecprivate(s, mkv->tmp_bc, par,
  1838. par->extradata, par->extradata_size,
  1839. native_id, qt_id,
  1840. &codecpriv, &codecpriv_size, &max_payload_size);
  1841. if (ret < 0)
  1842. goto fail;
  1843. mkv_put_codecprivate(pb, max_payload_size, codecpriv, codecpriv_size);
  1844. track->codecpriv_size = max_payload_size;
  1845. }
  1846. end_ebml_master(pb, track_master);
  1847. ret = 0;
  1848. fail:
  1849. ffio_reset_dyn_buf(mkv->tmp_bc);
  1850. return ret;
  1851. }
  1852. static int mkv_write_tracks(AVFormatContext *s)
  1853. {
  1854. MatroskaMuxContext *mkv = s->priv_data;
  1855. AVIOContext *pb = s->pb;
  1856. int video_default_idx = -1, audio_default_idx = -1, subtitle_default_idx = -1;
  1857. int i, ret;
  1858. if (mkv->nb_attachments == s->nb_streams)
  1859. return 0;
  1860. ret = start_ebml_master_crc32(&mkv->track.bc, mkv);
  1861. if (ret < 0)
  1862. return ret;
  1863. if (mkv->default_mode != DEFAULT_MODE_PASSTHROUGH) {
  1864. int video_idx = -1, audio_idx = -1, subtitle_idx = -1;
  1865. for (i = s->nb_streams - 1; i >= 0; i--) {
  1866. AVStream *st = s->streams[i];
  1867. switch (st->codecpar->codec_type) {
  1868. #define CASE(type, variable) \
  1869. case AVMEDIA_TYPE_ ## type: \
  1870. variable ## _idx = i; \
  1871. if (st->disposition & AV_DISPOSITION_DEFAULT) \
  1872. variable ## _default_idx = i; \
  1873. break;
  1874. CASE(VIDEO, video)
  1875. CASE(AUDIO, audio)
  1876. CASE(SUBTITLE, subtitle)
  1877. #undef CASE
  1878. }
  1879. }
  1880. video_default_idx = FFMAX(video_default_idx, video_idx);
  1881. audio_default_idx = FFMAX(audio_default_idx, audio_idx);
  1882. if (mkv->default_mode != DEFAULT_MODE_INFER_NO_SUBS)
  1883. subtitle_default_idx = FFMAX(subtitle_default_idx, subtitle_idx);
  1884. }
  1885. for (i = 0; i < s->nb_streams; i++) {
  1886. AVStream *st = s->streams[i];
  1887. int is_default = st->disposition & AV_DISPOSITION_DEFAULT ||
  1888. i == video_default_idx || i == audio_default_idx ||
  1889. i == subtitle_default_idx;
  1890. ret = mkv_write_track(s, mkv, st, &mkv->tracks[i],
  1891. mkv->track.bc, is_default);
  1892. if (ret < 0)
  1893. return ret;
  1894. }
  1895. return end_ebml_master_crc32_tentatively(pb, &mkv->track, mkv,
  1896. MATROSKA_ID_TRACKS);
  1897. }
  1898. static int mkv_write_simpletag(AVIOContext *pb, const AVDictionaryEntry *t)
  1899. {
  1900. EBML_WRITER(4);
  1901. uint8_t *key = av_strdup(t->key);
  1902. uint8_t *p = key;
  1903. const uint8_t *lang = NULL;
  1904. int ret;
  1905. if (!key)
  1906. return AVERROR(ENOMEM);
  1907. if ((p = strrchr(p, '-')) &&
  1908. (lang = ff_convert_lang_to(p + 1, AV_LANG_ISO639_2_BIBL)))
  1909. *p = 0;
  1910. p = key;
  1911. while (*p) {
  1912. if (*p == ' ')
  1913. *p = '_';
  1914. else if (*p >= 'a' && *p <= 'z')
  1915. *p -= 'a' - 'A';
  1916. p++;
  1917. }
  1918. ebml_writer_open_master(&writer, MATROSKA_ID_SIMPLETAG);
  1919. ebml_writer_add_string(&writer, MATROSKA_ID_TAGNAME, key);
  1920. if (lang)
  1921. ebml_writer_add_string(&writer, MATROSKA_ID_TAGLANG, lang);
  1922. ebml_writer_add_string(&writer, MATROSKA_ID_TAGSTRING, t->value);
  1923. ret = ebml_writer_write(&writer, pb);
  1924. av_freep(&key);
  1925. return ret;
  1926. }
  1927. static void mkv_write_tag_targets(MatroskaMuxContext *mkv, AVIOContext *pb,
  1928. uint32_t elementid, uint64_t uid)
  1929. {
  1930. ebml_master targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS,
  1931. 4 + 1 + 8);
  1932. if (elementid)
  1933. put_ebml_uid(pb, elementid, uid);
  1934. end_ebml_master(pb, targets);
  1935. }
  1936. static int mkv_check_tag_name(const char *name, uint32_t elementid)
  1937. {
  1938. return av_strcasecmp(name, "title") &&
  1939. av_strcasecmp(name, "stereo_mode") &&
  1940. av_strcasecmp(name, "creation_time") &&
  1941. av_strcasecmp(name, "encoding_tool") &&
  1942. av_strcasecmp(name, "duration") &&
  1943. (elementid != MATROSKA_ID_TAGTARGETS_TRACKUID ||
  1944. av_strcasecmp(name, "language")) &&
  1945. (elementid != MATROSKA_ID_TAGTARGETS_ATTACHUID ||
  1946. (av_strcasecmp(name, "filename") &&
  1947. av_strcasecmp(name, "mimetype")));
  1948. }
  1949. static int mkv_write_tag(MatroskaMuxContext *mkv, const AVDictionary *m,
  1950. AVIOContext **pb, unsigned reserved_size,
  1951. uint32_t elementid, uint64_t uid)
  1952. {
  1953. const AVDictionaryEntry *t = NULL;
  1954. AVIOContext *const tmp_bc = mkv->tmp_bc;
  1955. uint8_t *buf;
  1956. int ret = 0, size, tag_written = 0;
  1957. mkv_write_tag_targets(mkv, tmp_bc, elementid, uid);
  1958. while ((t = av_dict_iterate(m, t))) {
  1959. if (mkv_check_tag_name(t->key, elementid)) {
  1960. ret = mkv_write_simpletag(tmp_bc, t);
  1961. if (ret < 0)
  1962. goto end;
  1963. tag_written = 1;
  1964. }
  1965. }
  1966. if (reserved_size)
  1967. put_ebml_void(tmp_bc, reserved_size);
  1968. else if (!tag_written)
  1969. goto end;
  1970. size = avio_get_dyn_buf(tmp_bc, &buf);
  1971. if (tmp_bc->error) {
  1972. ret = tmp_bc->error;
  1973. goto end;
  1974. }
  1975. if (!*pb) {
  1976. ret = start_ebml_master_crc32(pb, mkv);
  1977. if (ret < 0)
  1978. goto end;
  1979. }
  1980. put_ebml_binary(*pb, MATROSKA_ID_TAG, buf, size);
  1981. end:
  1982. ffio_reset_dyn_buf(tmp_bc);
  1983. return ret;
  1984. }
  1985. static int mkv_write_tags(AVFormatContext *s)
  1986. {
  1987. MatroskaMuxContext *mkv = s->priv_data;
  1988. int i, ret, seekable = IS_SEEKABLE(s->pb, mkv);
  1989. mkv->wrote_tags = 1;
  1990. ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL);
  1991. ret = mkv_write_tag(mkv, s->metadata, &mkv->tags.bc, 0, 0, 0);
  1992. if (ret < 0)
  1993. return ret;
  1994. for (i = 0; i < s->nb_streams; i++) {
  1995. const AVStream *st = s->streams[i];
  1996. mkv_track *track = &mkv->tracks[i];
  1997. if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT)
  1998. continue;
  1999. ret = mkv_write_tag(mkv, st->metadata, &mkv->tags.bc,
  2000. seekable ? DURATION_SIMPLETAG_SIZE : 0,
  2001. MATROSKA_ID_TAGTARGETS_TRACKUID, track->uid);
  2002. if (ret < 0)
  2003. return ret;
  2004. if (seekable)
  2005. track->duration_offset = avio_tell(mkv->tags.bc) - DURATION_SIMPLETAG_SIZE;
  2006. }
  2007. if (mkv->nb_attachments && !IS_WEBM(mkv)) {
  2008. for (i = 0; i < s->nb_streams; i++) {
  2009. const mkv_track *track = &mkv->tracks[i];
  2010. const AVStream *st = s->streams[i];
  2011. if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT)
  2012. continue;
  2013. ret = mkv_write_tag(mkv, st->metadata, &mkv->tags.bc, 0,
  2014. MATROSKA_ID_TAGTARGETS_ATTACHUID, track->uid);
  2015. if (ret < 0)
  2016. return ret;
  2017. }
  2018. }
  2019. if (mkv->tags.bc) {
  2020. return end_ebml_master_crc32_tentatively(s->pb, &mkv->tags, mkv,
  2021. MATROSKA_ID_TAGS);
  2022. }
  2023. return 0;
  2024. }
  2025. static int mkv_new_chapter_ids_needed(const AVFormatContext *s)
  2026. {
  2027. for (unsigned i = 0; i < s->nb_chapters; i++) {
  2028. if (!s->chapters[i]->id)
  2029. return 1;
  2030. for (unsigned j = 0; j < i; j++)
  2031. if (s->chapters[j]->id == s->chapters[i]->id)
  2032. return 1;
  2033. }
  2034. return 0;
  2035. }
  2036. static int mkv_write_chapters(AVFormatContext *s)
  2037. {
  2038. MatroskaMuxContext *mkv = s->priv_data;
  2039. AVIOContext *dyn_cp = NULL, *dyn_tags = NULL, **tags, *pb = s->pb;
  2040. ebml_master editionentry;
  2041. AVRational scale = {1, 1E9};
  2042. int ret, create_new_ids;
  2043. if (!s->nb_chapters || mkv->wrote_chapters)
  2044. return 0;
  2045. ret = start_ebml_master_crc32(&dyn_cp, mkv);
  2046. if (ret < 0)
  2047. return ret;
  2048. editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0);
  2049. if (!IS_WEBM(mkv)) {
  2050. put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1);
  2051. /* If mkv_write_tags() has already been called, then any tags
  2052. * corresponding to chapters will be put into a new Tags element. */
  2053. tags = mkv->wrote_tags ? &dyn_tags : &mkv->tags.bc;
  2054. } else
  2055. tags = NULL;
  2056. create_new_ids = mkv_new_chapter_ids_needed(s);
  2057. for (unsigned i = 0; i < s->nb_chapters; i++) {
  2058. AVChapter *const c = s->chapters[i];
  2059. int64_t chapterstart = av_rescale_q(c->start, c->time_base, scale);
  2060. int64_t chapterend = av_rescale_q(c->end, c->time_base, scale);
  2061. const AVDictionaryEntry *t;
  2062. uint64_t uid = create_new_ids ? i + 1ULL : c->id;
  2063. EBML_WRITER(7);
  2064. if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) {
  2065. av_log(s, AV_LOG_ERROR,
  2066. "Invalid chapter start (%"PRId64") or end (%"PRId64").\n",
  2067. chapterstart, chapterend);
  2068. ret = AVERROR_INVALIDDATA;
  2069. goto fail;
  2070. }
  2071. ebml_writer_open_master(&writer, MATROSKA_ID_CHAPTERATOM);
  2072. ebml_writer_add_uint(&writer, MATROSKA_ID_CHAPTERUID, uid);
  2073. ebml_writer_add_uint(&writer, MATROSKA_ID_CHAPTERTIMESTART, chapterstart);
  2074. ebml_writer_add_uint(&writer, MATROSKA_ID_CHAPTERTIMEEND, chapterend);
  2075. if ((t = av_dict_get(c->metadata, "title", NULL, 0))) {
  2076. ebml_writer_open_master(&writer, MATROSKA_ID_CHAPTERDISPLAY);
  2077. ebml_writer_add_string(&writer, MATROSKA_ID_CHAPSTRING, t->value);
  2078. ebml_writer_add_string(&writer, MATROSKA_ID_CHAPLANG , "und");
  2079. }
  2080. ret = ebml_writer_write(&writer, dyn_cp);
  2081. if (ret < 0)
  2082. goto fail;
  2083. if (tags) {
  2084. ff_metadata_conv(&c->metadata, ff_mkv_metadata_conv, NULL);
  2085. ret = mkv_write_tag(mkv, c->metadata, tags, 0,
  2086. MATROSKA_ID_TAGTARGETS_CHAPTERUID, uid);
  2087. if (ret < 0)
  2088. goto fail;
  2089. }
  2090. }
  2091. end_ebml_master(dyn_cp, editionentry);
  2092. mkv->wrote_chapters = 1;
  2093. ret = end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0, 0, 1);
  2094. if (ret < 0)
  2095. goto fail;
  2096. if (dyn_tags)
  2097. return end_ebml_master_crc32(pb, &dyn_tags, mkv,
  2098. MATROSKA_ID_TAGS, 0, 0, 1);
  2099. return 0;
  2100. fail:
  2101. if (tags) {
  2102. /* tags == &mkv->tags.bc can only happen if mkv->tags.bc was
  2103. * initially NULL, so we never free older tags. */
  2104. ffio_free_dyn_buf(tags);
  2105. }
  2106. ffio_free_dyn_buf(&dyn_cp);
  2107. return ret;
  2108. }
  2109. static const char *get_mimetype(const AVStream *st)
  2110. {
  2111. const AVDictionaryEntry *t;
  2112. if (t = av_dict_get(st->metadata, "mimetype", NULL, 0))
  2113. return t->value;
  2114. if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
  2115. const AVCodecDescriptor *desc = avcodec_descriptor_get(st->codecpar->codec_id);
  2116. if (desc && desc->mime_types) {
  2117. return desc->mime_types[0];
  2118. } else if (st->codecpar->codec_id == AV_CODEC_ID_TEXT)
  2119. return "text/plain";
  2120. }
  2121. return NULL;
  2122. }
  2123. static int mkv_write_attachments(AVFormatContext *s)
  2124. {
  2125. MatroskaMuxContext *mkv = s->priv_data;
  2126. AVIOContext *dyn_cp = NULL, *pb = s->pb;
  2127. int i, ret;
  2128. if (!mkv->nb_attachments)
  2129. return 0;
  2130. ret = start_ebml_master_crc32(&dyn_cp, mkv);
  2131. if (ret < 0)
  2132. return ret;
  2133. for (i = 0; i < s->nb_streams; i++) {
  2134. const AVStream *st = s->streams[i];
  2135. mkv_track *track = &mkv->tracks[i];
  2136. EBML_WRITER(6);
  2137. const AVDictionaryEntry *t;
  2138. const char *mimetype;
  2139. if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT)
  2140. continue;
  2141. ebml_writer_open_master(&writer, MATROSKA_ID_ATTACHEDFILE);
  2142. if (t = av_dict_get(st->metadata, "title", NULL, 0))
  2143. ebml_writer_add_string(&writer, MATROSKA_ID_FILEDESC, t->value);
  2144. if (!(t = av_dict_get(st->metadata, "filename", NULL, 0))) {
  2145. av_log(s, AV_LOG_ERROR, "Attachment stream %d has no filename tag.\n", i);
  2146. ffio_free_dyn_buf(&dyn_cp);
  2147. return AVERROR(EINVAL);
  2148. }
  2149. ebml_writer_add_string(&writer, MATROSKA_ID_FILENAME, t->value);
  2150. mimetype = get_mimetype(st);
  2151. av_assert0(mimetype);
  2152. ebml_writer_add_string(&writer, MATROSKA_ID_FILEMIMETYPE, mimetype);
  2153. ebml_writer_add_bin(&writer, MATROSKA_ID_FILEDATA,
  2154. st->codecpar->extradata, st->codecpar->extradata_size);
  2155. ebml_writer_add_uid(&writer, MATROSKA_ID_FILEUID, track->uid);
  2156. ret = ebml_writer_write(&writer, dyn_cp);
  2157. if (ret < 0) {
  2158. ffio_free_dyn_buf(&dyn_cp);
  2159. return ret;
  2160. }
  2161. }
  2162. return end_ebml_master_crc32(pb, &dyn_cp, mkv,
  2163. MATROSKA_ID_ATTACHMENTS, 0, 0, 1);
  2164. }
  2165. static int64_t get_metadata_duration(AVFormatContext *s)
  2166. {
  2167. const AVDictionaryEntry *duration = av_dict_get(s->metadata, "DURATION",
  2168. NULL, 0);
  2169. int64_t max = 0;
  2170. int64_t us;
  2171. if (duration && (av_parse_time(&us, duration->value, 1) == 0) && us > 0) {
  2172. av_log(s, AV_LOG_DEBUG, "get_metadata_duration found duration in context metadata: %" PRId64 "\n", us);
  2173. return us;
  2174. }
  2175. for (unsigned i = 0; i < s->nb_streams; i++) {
  2176. int64_t us;
  2177. duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0);
  2178. if (duration && (av_parse_time(&us, duration->value, 1) == 0))
  2179. max = FFMAX(max, us);
  2180. }
  2181. av_log(s, AV_LOG_DEBUG, "get_metadata_duration returned: %" PRId64 "\n", max);
  2182. return max;
  2183. }
  2184. static void ebml_write_header(AVIOContext *pb,
  2185. const char *doctype, int version)
  2186. {
  2187. EBML_WRITER(8);
  2188. ebml_writer_open_master(&writer, EBML_ID_HEADER);
  2189. ebml_writer_add_uint (&writer, EBML_ID_EBMLVERSION, 1);
  2190. ebml_writer_add_uint (&writer, EBML_ID_EBMLREADVERSION, 1);
  2191. ebml_writer_add_uint (&writer, EBML_ID_EBMLMAXIDLENGTH, 4);
  2192. ebml_writer_add_uint (&writer, EBML_ID_EBMLMAXSIZELENGTH, 8);
  2193. ebml_writer_add_string(&writer, EBML_ID_DOCTYPE, doctype);
  2194. ebml_writer_add_uint (&writer, EBML_ID_DOCTYPEVERSION, version);
  2195. ebml_writer_add_uint (&writer, EBML_ID_DOCTYPEREADVERSION, 2);
  2196. /* The size is bounded, so no need to check this. */
  2197. ebml_writer_write(&writer, pb);
  2198. }
  2199. static int mkv_write_info(AVFormatContext *s)
  2200. {
  2201. MatroskaMuxContext *mkv = s->priv_data;
  2202. const AVDictionaryEntry *tag;
  2203. int64_t creation_time;
  2204. AVIOContext *pb;
  2205. int ret = start_ebml_master_crc32(&mkv->info.bc, mkv);
  2206. if (ret < 0)
  2207. return ret;
  2208. pb = mkv->info.bc;
  2209. put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
  2210. if ((tag = av_dict_get(s->metadata, "title", NULL, 0)))
  2211. put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value);
  2212. if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
  2213. put_ebml_string(pb, MATROSKA_ID_MUXINGAPP, LIBAVFORMAT_IDENT);
  2214. if ((tag = av_dict_get(s->metadata, "encoding_tool", NULL, 0)))
  2215. put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, tag->value);
  2216. else
  2217. put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
  2218. if (!IS_WEBM(mkv))
  2219. put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 16);
  2220. } else {
  2221. const char *ident = "Lavf";
  2222. put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , ident);
  2223. put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, ident);
  2224. }
  2225. if (ff_parse_creation_time_metadata(s, &creation_time, 0) > 0) {
  2226. // Adjust time so it's relative to 2001-01-01 and convert to nanoseconds.
  2227. int64_t date_utc = (creation_time - 978307200000000LL) * 1000;
  2228. uint8_t date_utc_buf[8];
  2229. AV_WB64(date_utc_buf, date_utc);
  2230. put_ebml_binary(pb, MATROSKA_ID_DATEUTC, date_utc_buf, 8);
  2231. }
  2232. // reserve space for the duration
  2233. mkv->duration = 0;
  2234. mkv->duration_offset = avio_tell(pb);
  2235. if (!mkv->is_live) {
  2236. int64_t metadata_duration = get_metadata_duration(s);
  2237. if (s->duration > 0) {
  2238. int64_t scaledDuration = av_rescale(s->duration, 1000, AV_TIME_BASE);
  2239. put_ebml_float(pb, MATROSKA_ID_DURATION, scaledDuration);
  2240. av_log(s, AV_LOG_DEBUG, "Write early duration from recording time = %" PRIu64 "\n", scaledDuration);
  2241. } else if (metadata_duration > 0) {
  2242. int64_t scaledDuration = av_rescale(metadata_duration, 1000, AV_TIME_BASE);
  2243. put_ebml_float(pb, MATROSKA_ID_DURATION, scaledDuration);
  2244. av_log(s, AV_LOG_DEBUG, "Write early duration from metadata = %" PRIu64 "\n", scaledDuration);
  2245. } else if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
  2246. put_ebml_void(pb, 11); // assumes double-precision float to be written
  2247. }
  2248. }
  2249. return end_ebml_master_crc32_tentatively(s->pb, &mkv->info,
  2250. mkv, MATROSKA_ID_INFO);
  2251. }
  2252. static int mkv_write_header(AVFormatContext *s)
  2253. {
  2254. MatroskaMuxContext *mkv = s->priv_data;
  2255. AVIOContext *pb = s->pb;
  2256. int ret, version = 2;
  2257. ret = avio_open_dyn_buf(&mkv->tmp_bc);
  2258. if (ret < 0)
  2259. return ret;
  2260. if (!IS_WEBM(mkv) ||
  2261. av_dict_get(s->metadata, "stereo_mode", NULL, 0) ||
  2262. av_dict_get(s->metadata, "alpha_mode", NULL, 0))
  2263. version = 4;
  2264. for (unsigned i = 0; i < s->nb_streams; i++) {
  2265. if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_OPUS ||
  2266. av_dict_get(s->streams[i]->metadata, "stereo_mode", NULL, 0) ||
  2267. av_dict_get(s->streams[i]->metadata, "alpha_mode", NULL, 0))
  2268. version = 4;
  2269. }
  2270. ebml_write_header(pb, s->oformat->name, version);
  2271. put_ebml_id(pb, MATROSKA_ID_SEGMENT);
  2272. put_ebml_size_unknown(pb, 8);
  2273. mkv->segment_offset = avio_tell(pb);
  2274. // We write a SeekHead at the beginning to point to all other level
  2275. // one elements (except Clusters).
  2276. mkv_start_seekhead(mkv, pb);
  2277. ret = mkv_write_info(s);
  2278. if (ret < 0)
  2279. return ret;
  2280. ret = mkv_write_tracks(s);
  2281. if (ret < 0)
  2282. return ret;
  2283. ret = mkv_write_chapters(s);
  2284. if (ret < 0)
  2285. return ret;
  2286. if (!IS_WEBM(mkv)) {
  2287. ret = mkv_write_attachments(s);
  2288. if (ret < 0)
  2289. return ret;
  2290. }
  2291. /* Must come after mkv_write_chapters() to write chapter tags
  2292. * into the same Tags element as the other tags. */
  2293. ret = mkv_write_tags(s);
  2294. if (ret < 0)
  2295. return ret;
  2296. if (!IS_SEEKABLE(pb, mkv)) {
  2297. ret = mkv_write_seekhead(pb, mkv, 0, avio_tell(pb));
  2298. if (ret < 0)
  2299. return ret;
  2300. }
  2301. if (s->metadata_header_padding > 0) {
  2302. if (s->metadata_header_padding == 1)
  2303. s->metadata_header_padding++;
  2304. put_ebml_void(pb, s->metadata_header_padding);
  2305. }
  2306. if (mkv->reserve_cues_space || mkv->move_cues_to_front) {
  2307. if (IS_SEEKABLE(pb, mkv)) {
  2308. mkv->cues_pos = avio_tell(pb);
  2309. if (mkv->reserve_cues_space >= 1) {
  2310. if (mkv->reserve_cues_space == 1)
  2311. mkv->reserve_cues_space++;
  2312. put_ebml_void(pb, mkv->reserve_cues_space);
  2313. }
  2314. } else
  2315. mkv->reserve_cues_space = -1;
  2316. }
  2317. mkv->cluster_pos = -1;
  2318. // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
  2319. // after 4k and on a keyframe
  2320. if (IS_SEEKABLE(pb, mkv)) {
  2321. if (mkv->cluster_time_limit < 0)
  2322. mkv->cluster_time_limit = 5000;
  2323. if (mkv->cluster_size_limit < 0)
  2324. mkv->cluster_size_limit = 5 * 1024 * 1024;
  2325. } else {
  2326. if (mkv->cluster_time_limit < 0)
  2327. mkv->cluster_time_limit = 1000;
  2328. if (mkv->cluster_size_limit < 0)
  2329. mkv->cluster_size_limit = 32 * 1024;
  2330. }
  2331. return 0;
  2332. }
  2333. #if CONFIG_MATROSKA_MUXER
  2334. static int mkv_reformat_h2645(MatroskaMuxContext *mkv, AVIOContext *pb,
  2335. const AVPacket *pkt, int *size)
  2336. {
  2337. int ret;
  2338. if (pb) {
  2339. ff_nal_units_write_list(&mkv->cur_block.h2645_nalu_list, pb, pkt->data);
  2340. } else {
  2341. ret = ff_nal_units_create_list(&mkv->cur_block.h2645_nalu_list, pkt->data, pkt->size);
  2342. if (ret < 0)
  2343. return ret;
  2344. *size = ret;
  2345. }
  2346. return 0;
  2347. }
  2348. static int mkv_reformat_wavpack(MatroskaMuxContext *mkv, AVIOContext *pb,
  2349. const AVPacket *pkt, int *size)
  2350. {
  2351. const uint8_t *src = pkt->data;
  2352. int srclen = pkt->size;
  2353. int offset = 0;
  2354. int ret;
  2355. while (srclen >= WV_HEADER_SIZE) {
  2356. WvHeader header;
  2357. ret = ff_wv_parse_header(&header, src);
  2358. if (ret < 0)
  2359. return ret;
  2360. src += WV_HEADER_SIZE;
  2361. srclen -= WV_HEADER_SIZE;
  2362. if (srclen < header.blocksize)
  2363. return AVERROR_INVALIDDATA;
  2364. offset += 4 * !!header.initial + 8 + 4 * !(header.initial && header.final);
  2365. if (pb) {
  2366. if (header.initial)
  2367. avio_wl32(pb, header.samples);
  2368. avio_wl32(pb, header.flags);
  2369. avio_wl32(pb, header.crc);
  2370. if (!(header.initial && header.final))
  2371. avio_wl32(pb, header.blocksize);
  2372. avio_write(pb, src, header.blocksize);
  2373. }
  2374. src += header.blocksize;
  2375. srclen -= header.blocksize;
  2376. offset += header.blocksize;
  2377. }
  2378. *size = offset;
  2379. return 0;
  2380. }
  2381. #endif
  2382. static int mkv_reformat_av1(MatroskaMuxContext *mkv, AVIOContext *pb,
  2383. const AVPacket *pkt, int *size)
  2384. {
  2385. int ret = ff_av1_filter_obus(pb, pkt->data, pkt->size);
  2386. if (ret < 0)
  2387. return ret;
  2388. *size = ret;
  2389. return 0;
  2390. }
  2391. static int webm_reformat_vtt(MatroskaMuxContext *mkv, AVIOContext *pb,
  2392. const AVPacket *pkt, int *size)
  2393. {
  2394. const uint8_t *id, *settings;
  2395. size_t id_size, settings_size;
  2396. unsigned total = pkt->size + 2U;
  2397. if (total > INT_MAX)
  2398. return AVERROR(ERANGE);
  2399. id = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_IDENTIFIER,
  2400. &id_size);
  2401. settings = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_SETTINGS,
  2402. &settings_size);
  2403. if (id_size > INT_MAX - total || settings_size > INT_MAX - (total += id_size))
  2404. return AVERROR(ERANGE);
  2405. *size = total += settings_size;
  2406. if (pb) {
  2407. avio_write(pb, id, id_size);
  2408. avio_w8(pb, '\n');
  2409. avio_write(pb, settings, settings_size);
  2410. avio_w8(pb, '\n');
  2411. avio_write(pb, pkt->data, pkt->size);
  2412. }
  2413. return 0;
  2414. }
  2415. static void mkv_write_blockadditional(EbmlWriter *writer, const uint8_t *buf,
  2416. size_t size, uint64_t additional_id)
  2417. {
  2418. ebml_writer_open_master(writer, MATROSKA_ID_BLOCKMORE);
  2419. ebml_writer_add_uint(writer, MATROSKA_ID_BLOCKADDID, additional_id);
  2420. ebml_writer_add_bin (writer, MATROSKA_ID_BLOCKADDITIONAL, buf, size);
  2421. ebml_writer_close_master(writer);
  2422. }
  2423. static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv,
  2424. AVIOContext *pb, const AVCodecParameters *par,
  2425. mkv_track *track, const AVPacket *pkt,
  2426. int keyframe, int64_t ts, uint64_t duration,
  2427. int force_blockgroup, int64_t relative_packet_pos)
  2428. {
  2429. uint8_t t35_buf[6 + AV_HDR_PLUS_MAX_PAYLOAD_SIZE];
  2430. uint8_t *side_data;
  2431. size_t side_data_size;
  2432. uint64_t additional_id;
  2433. unsigned track_number = track->track_num;
  2434. EBML_WRITER(12);
  2435. int ret;
  2436. mkv->cur_block.track = track;
  2437. mkv->cur_block.pkt = pkt;
  2438. mkv->cur_block.rel_ts = ts - mkv->cluster_pts;
  2439. mkv->cur_block.flags = 0;
  2440. /* Open a BlockGroup with a Block now; it will later be converted
  2441. * to a SimpleBlock if possible. */
  2442. ebml_writer_open_master(&writer, MATROSKA_ID_BLOCKGROUP);
  2443. ebml_writer_add_block(&writer, mkv);
  2444. if (duration > 0 && (par->codec_type == AVMEDIA_TYPE_SUBTITLE ||
  2445. /* If the packet's duration is inconsistent with the default duration,
  2446. * add an explicit duration element. */
  2447. track->default_duration_high > 0 &&
  2448. duration != track->default_duration_high &&
  2449. duration != track->default_duration_low))
  2450. ebml_writer_add_uint(&writer, MATROSKA_ID_BLOCKDURATION, duration);
  2451. av_log(logctx, AV_LOG_DEBUG,
  2452. "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", "
  2453. "duration %" PRId64 " at relative offset %" PRId64 " in cluster "
  2454. "at offset %" PRId64 ". TrackNumber %u, keyframe %d\n",
  2455. pkt->size, pkt->pts, pkt->dts, pkt->duration, relative_packet_pos,
  2456. mkv->cluster_pos, track_number, keyframe != 0);
  2457. side_data = av_packet_get_side_data(pkt,
  2458. AV_PKT_DATA_SKIP_SAMPLES,
  2459. &side_data_size);
  2460. if (side_data && side_data_size >= 10) {
  2461. int64_t discard_padding = AV_RL32(side_data + 4);
  2462. if (discard_padding) {
  2463. discard_padding = av_rescale_q(discard_padding,
  2464. (AVRational){1, par->sample_rate},
  2465. (AVRational){1, 1000000000});
  2466. ebml_writer_add_sint(&writer, MATROSKA_ID_DISCARDPADDING, discard_padding);
  2467. }
  2468. }
  2469. ebml_writer_open_master(&writer, MATROSKA_ID_BLOCKADDITIONS);
  2470. side_data = av_packet_get_side_data(pkt,
  2471. AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
  2472. &side_data_size);
  2473. if (side_data && side_data_size >= 8 &&
  2474. // Only the Codec-specific BlockMore (id == 1) is currently supported.
  2475. (additional_id = AV_RB64(side_data)) == MATROSKA_BLOCK_ADD_ID_TYPE_OPAQUE) {
  2476. mkv_write_blockadditional(&writer, side_data + 8, side_data_size - 8,
  2477. additional_id);
  2478. track->max_blockaddid = FFMAX(track->max_blockaddid, additional_id);
  2479. }
  2480. if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
  2481. side_data = av_packet_get_side_data(pkt,
  2482. AV_PKT_DATA_DYNAMIC_HDR10_PLUS,
  2483. &side_data_size);
  2484. if (side_data && side_data_size) {
  2485. uint8_t *payload = t35_buf;
  2486. size_t payload_size = sizeof(t35_buf) - 6;
  2487. bytestream_put_byte(&payload, ITU_T_T35_COUNTRY_CODE_US);
  2488. bytestream_put_be16(&payload, ITU_T_T35_PROVIDER_CODE_SAMSUNG);
  2489. bytestream_put_be16(&payload, 0x01); // provider_oriented_code
  2490. bytestream_put_byte(&payload, 0x04); // application_identifier
  2491. ret = av_dynamic_hdr_plus_to_t35((AVDynamicHDRPlus *)side_data, &payload,
  2492. &payload_size);
  2493. if (ret < 0)
  2494. return ret;
  2495. mkv_write_blockadditional(&writer, t35_buf, payload_size + 6,
  2496. MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
  2497. track->max_blockaddid = FFMAX(track->max_blockaddid,
  2498. MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
  2499. }
  2500. }
  2501. ebml_writer_close_or_discard_master(&writer);
  2502. if (!force_blockgroup && writer.nb_elements == 2) {
  2503. /* Nothing except the BlockGroup + Block. Can use a SimpleBlock. */
  2504. writer.elements++; // Skip the BlockGroup.
  2505. writer.nb_elements--;
  2506. av_assert2(writer.elements[0].id == MATROSKA_ID_BLOCK);
  2507. writer.elements[0].id = MATROSKA_ID_SIMPLEBLOCK;
  2508. if (keyframe)
  2509. mkv->cur_block.flags |= 1 << 7;
  2510. } else if (!keyframe)
  2511. ebml_writer_add_sint(&writer, MATROSKA_ID_BLOCKREFERENCE,
  2512. track->last_timestamp - ts);
  2513. return ebml_writer_write(&writer, pb);
  2514. }
  2515. static int mkv_end_cluster(AVFormatContext *s)
  2516. {
  2517. MatroskaMuxContext *mkv = s->priv_data;
  2518. int ret;
  2519. if (!mkv->have_video) {
  2520. for (unsigned i = 0; i < s->nb_streams; i++)
  2521. mkv->tracks[i].has_cue = 0;
  2522. }
  2523. mkv->cluster_pos = -1;
  2524. ret = end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv,
  2525. MATROSKA_ID_CLUSTER, 0, 1, 0);
  2526. if (ret < 0)
  2527. return ret;
  2528. avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
  2529. return 0;
  2530. }
  2531. static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt)
  2532. {
  2533. MatroskaMuxContext *mkv = s->priv_data;
  2534. mkv_track *track = &mkv->tracks[pkt->stream_index];
  2535. AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
  2536. uint8_t *side_data;
  2537. size_t side_data_size;
  2538. int ret;
  2539. side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA,
  2540. &side_data_size);
  2541. switch (par->codec_id) {
  2542. #if CONFIG_MATROSKA_MUXER
  2543. case AV_CODEC_ID_AAC:
  2544. if (side_data_size && mkv->track.bc) {
  2545. int output_sample_rate = 0;
  2546. ret = get_aac_sample_rates(s, mkv, side_data, side_data_size,
  2547. &track->sample_rate, &output_sample_rate);
  2548. if (ret < 0)
  2549. return ret;
  2550. if (!output_sample_rate)
  2551. output_sample_rate = track->sample_rate; // Space is already reserved, so it's this or a void element.
  2552. ret = mkv_update_codecprivate(s, mkv, side_data, side_data_size,
  2553. par, mkv->track.bc, track, 0);
  2554. if (ret < 0)
  2555. return ret;
  2556. avio_seek(mkv->track.bc, track->sample_rate_offset, SEEK_SET);
  2557. put_ebml_float(mkv->track.bc, MATROSKA_ID_AUDIOSAMPLINGFREQ, track->sample_rate);
  2558. put_ebml_float(mkv->track.bc, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
  2559. } else if (!par->extradata_size && !track->sample_rate) {
  2560. // No extradata (codecpar or packet side data).
  2561. av_log(s, AV_LOG_ERROR, "Error parsing AAC extradata, unable to determine samplerate.\n");
  2562. return AVERROR(EINVAL);
  2563. }
  2564. break;
  2565. case AV_CODEC_ID_FLAC:
  2566. if (side_data_size && mkv->track.bc) {
  2567. if (side_data_size != par->extradata_size) {
  2568. av_log(s, AV_LOG_ERROR, "Invalid FLAC STREAMINFO metadata for output stream %d\n",
  2569. pkt->stream_index);
  2570. return AVERROR(EINVAL);
  2571. }
  2572. ret = mkv_update_codecprivate(s, mkv, side_data, side_data_size,
  2573. par, mkv->track.bc, track, 0);
  2574. if (ret < 0)
  2575. return ret;
  2576. }
  2577. break;
  2578. #endif
  2579. // FIXME: Remove the following once libaom starts propagating proper extradata during init()
  2580. // See https://bugs.chromium.org/p/aomedia/issues/detail?id=2208
  2581. case AV_CODEC_ID_AV1:
  2582. if (side_data_size && mkv->track.bc && !par->extradata_size) {
  2583. // If the reserved space doesn't suffice, only write
  2584. // the first four bytes of the av1C.
  2585. ret = mkv_update_codecprivate(s, mkv, side_data, side_data_size,
  2586. par, mkv->track.bc, track, 4);
  2587. if (ret < 0)
  2588. return ret;
  2589. } else if (!par->extradata_size)
  2590. return AVERROR_INVALIDDATA;
  2591. break;
  2592. default:
  2593. if (side_data_size)
  2594. av_log(s, AV_LOG_DEBUG, "Ignoring new extradata in a packet for stream %d.\n", pkt->stream_index);
  2595. break;
  2596. }
  2597. return 0;
  2598. }
  2599. static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt)
  2600. {
  2601. MatroskaMuxContext *mkv = s->priv_data;
  2602. AVIOContext *pb;
  2603. AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
  2604. mkv_track *track = &mkv->tracks[pkt->stream_index];
  2605. int is_sub = par->codec_type == AVMEDIA_TYPE_SUBTITLE;
  2606. /* All subtitle blocks are considered to be keyframes. */
  2607. int keyframe = is_sub || !!(pkt->flags & AV_PKT_FLAG_KEY);
  2608. int64_t duration = FFMAX(pkt->duration, 0);
  2609. int64_t cue_duration = is_sub ? duration : 0;
  2610. int ret;
  2611. int64_t ts = track->write_dts ? pkt->dts : pkt->pts;
  2612. int64_t relative_packet_pos;
  2613. if (ts == AV_NOPTS_VALUE) {
  2614. av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n");
  2615. return AVERROR(EINVAL);
  2616. }
  2617. ts += track->ts_offset;
  2618. if (mkv->cluster_pos != -1) {
  2619. int64_t cluster_time = ts - mkv->cluster_pts;
  2620. if ((int16_t)cluster_time != cluster_time) {
  2621. ret = mkv_end_cluster(s);
  2622. if (ret < 0)
  2623. return ret;
  2624. av_log(s, AV_LOG_WARNING, "Starting new cluster due to timestamp\n");
  2625. }
  2626. }
  2627. if (mkv->cluster_pos == -1) {
  2628. ret = start_ebml_master_crc32(&mkv->cluster_bc, mkv);
  2629. if (ret < 0)
  2630. return ret;
  2631. mkv->cluster_bc->direct = 1;
  2632. mkv->cluster_pos = avio_tell(s->pb);
  2633. put_ebml_uint(mkv->cluster_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
  2634. mkv->cluster_pts = FFMAX(0, ts);
  2635. av_log(s, AV_LOG_DEBUG,
  2636. "Starting new cluster with timestamp "
  2637. "%" PRId64 " at offset %" PRId64 " bytes\n",
  2638. mkv->cluster_pts, mkv->cluster_pos);
  2639. }
  2640. pb = mkv->cluster_bc;
  2641. relative_packet_pos = avio_tell(pb);
  2642. /* The WebM spec requires WebVTT to be muxed in BlockGroups;
  2643. * so we force it even for packets without duration. */
  2644. ret = mkv_write_block(s, mkv, pb, par, track, pkt,
  2645. keyframe, ts, duration,
  2646. par->codec_id == AV_CODEC_ID_WEBVTT,
  2647. relative_packet_pos);
  2648. if (ret < 0)
  2649. return ret;
  2650. if (keyframe && IS_SEEKABLE(s->pb, mkv) &&
  2651. (par->codec_type == AVMEDIA_TYPE_VIDEO ||
  2652. par->codec_type == AVMEDIA_TYPE_SUBTITLE ||
  2653. !mkv->have_video && !track->has_cue)) {
  2654. ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts,
  2655. mkv->cluster_pos, relative_packet_pos,
  2656. cue_duration);
  2657. if (ret < 0)
  2658. return ret;
  2659. track->has_cue = 1;
  2660. }
  2661. track->last_timestamp = ts;
  2662. mkv->duration = FFMAX(mkv->duration, ts + duration);
  2663. track->duration = FFMAX(track->duration, ts + duration);
  2664. return 0;
  2665. }
  2666. static int mkv_write_packet(AVFormatContext *s, const AVPacket *pkt)
  2667. {
  2668. MatroskaMuxContext *mkv = s->priv_data;
  2669. int codec_type = s->streams[pkt->stream_index]->codecpar->codec_type;
  2670. int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
  2671. int cluster_size;
  2672. int64_t cluster_time;
  2673. int ret;
  2674. int start_new_cluster;
  2675. ret = mkv_check_new_extra_data(s, pkt);
  2676. if (ret < 0)
  2677. return ret;
  2678. if (mkv->cluster_pos != -1) {
  2679. if (mkv->tracks[pkt->stream_index].write_dts)
  2680. cluster_time = pkt->dts - mkv->cluster_pts;
  2681. else
  2682. cluster_time = pkt->pts - mkv->cluster_pts;
  2683. cluster_time += mkv->tracks[pkt->stream_index].ts_offset;
  2684. cluster_size = avio_tell(mkv->cluster_bc);
  2685. if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) {
  2686. // WebM DASH specification states that the first block of
  2687. // every Cluster has to be a key frame. So for DASH video,
  2688. // we only create a Cluster on seeing key frames.
  2689. start_new_cluster = keyframe;
  2690. } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO &&
  2691. cluster_time > mkv->cluster_time_limit) {
  2692. // For DASH audio, we create a Cluster based on cluster_time_limit.
  2693. start_new_cluster = 1;
  2694. } else if (!mkv->is_dash &&
  2695. (cluster_size > mkv->cluster_size_limit ||
  2696. cluster_time > mkv->cluster_time_limit ||
  2697. (codec_type == AVMEDIA_TYPE_VIDEO && keyframe &&
  2698. cluster_size > 4 * 1024))) {
  2699. start_new_cluster = 1;
  2700. } else
  2701. start_new_cluster = 0;
  2702. if (start_new_cluster) {
  2703. ret = mkv_end_cluster(s);
  2704. if (ret < 0)
  2705. return ret;
  2706. }
  2707. }
  2708. if (mkv->cluster_pos == -1)
  2709. avio_write_marker(s->pb,
  2710. av_rescale_q(pkt->dts, s->streams[pkt->stream_index]->time_base, AV_TIME_BASE_Q),
  2711. keyframe && (mkv->have_video ? codec_type == AVMEDIA_TYPE_VIDEO : 1) ? AVIO_DATA_MARKER_SYNC_POINT : AVIO_DATA_MARKER_BOUNDARY_POINT);
  2712. // check if we have an audio packet cached
  2713. if (mkv->cur_audio_pkt->size > 0) {
  2714. ret = mkv_write_packet_internal(s, mkv->cur_audio_pkt);
  2715. av_packet_unref(mkv->cur_audio_pkt);
  2716. if (ret < 0) {
  2717. av_log(s, AV_LOG_ERROR,
  2718. "Could not write cached audio packet ret:%d\n", ret);
  2719. return ret;
  2720. }
  2721. }
  2722. // buffer an audio packet to ensure the packet containing the video
  2723. // keyframe's timecode is contained in the same cluster for WebM
  2724. if (codec_type == AVMEDIA_TYPE_AUDIO) {
  2725. if (pkt->size > 0)
  2726. ret = av_packet_ref(mkv->cur_audio_pkt, pkt);
  2727. } else
  2728. ret = mkv_write_packet_internal(s, pkt);
  2729. return ret;
  2730. }
  2731. static int mkv_write_flush_packet(AVFormatContext *s, AVPacket *pkt)
  2732. {
  2733. MatroskaMuxContext *mkv = s->priv_data;
  2734. if (!pkt) {
  2735. if (mkv->cluster_pos != -1) {
  2736. int ret = mkv_end_cluster(s);
  2737. if (ret < 0)
  2738. return ret;
  2739. av_log(s, AV_LOG_DEBUG,
  2740. "Flushing cluster at offset %" PRIu64 " bytes\n",
  2741. avio_tell(s->pb));
  2742. }
  2743. return 1;
  2744. }
  2745. return mkv_write_packet(s, pkt);
  2746. }
  2747. static int mkv_write_trailer(AVFormatContext *s)
  2748. {
  2749. MatroskaMuxContext *mkv = s->priv_data;
  2750. AVIOContext *pb = s->pb;
  2751. int64_t endpos, ret64;
  2752. int ret, ret2 = 0;
  2753. // check if we have an audio packet cached
  2754. if (mkv->cur_audio_pkt->size > 0) {
  2755. ret = mkv_write_packet_internal(s, mkv->cur_audio_pkt);
  2756. if (ret < 0) {
  2757. av_log(s, AV_LOG_ERROR,
  2758. "Could not write cached audio packet ret:%d\n", ret);
  2759. return ret;
  2760. }
  2761. }
  2762. if (mkv->cluster_pos != -1) {
  2763. ret = end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv,
  2764. MATROSKA_ID_CLUSTER, 0, 0, 0);
  2765. if (ret < 0)
  2766. return ret;
  2767. }
  2768. ret = mkv_write_chapters(s);
  2769. if (ret < 0)
  2770. return ret;
  2771. if (!IS_SEEKABLE(pb, mkv))
  2772. return 0;
  2773. endpos = avio_tell(pb);
  2774. if (mkv->cues.num_entries && mkv->reserve_cues_space >= 0) {
  2775. AVIOContext *cues = NULL;
  2776. uint64_t size, offset = 0;
  2777. int length_size = 0;
  2778. redo_cues:
  2779. ret = start_ebml_master_crc32(&cues, mkv);
  2780. if (ret < 0)
  2781. return ret;
  2782. ret = mkv_assemble_cues(s->streams, cues, mkv->tmp_bc, &mkv->cues,
  2783. mkv->tracks, s->nb_streams, offset);
  2784. if (ret < 0) {
  2785. ffio_free_dyn_buf(&cues);
  2786. return ret;
  2787. }
  2788. if (mkv->reserve_cues_space || mkv->move_cues_to_front) {
  2789. size = avio_tell(cues);
  2790. length_size = ebml_length_size(size);
  2791. size += 4 + length_size;
  2792. if (offset + mkv->reserve_cues_space < size) {
  2793. if (mkv->move_cues_to_front) {
  2794. offset = size - mkv->reserve_cues_space;
  2795. ffio_reset_dyn_buf(cues);
  2796. goto redo_cues;
  2797. }
  2798. av_log(s, AV_LOG_WARNING,
  2799. "Insufficient space reserved for Cues: "
  2800. "%d < %"PRIu64". No Cues will be output.\n",
  2801. mkv->reserve_cues_space, size);
  2802. ret2 = AVERROR(EINVAL);
  2803. goto after_cues;
  2804. } else {
  2805. if (offset) {
  2806. ret = ff_format_shift_data(s, mkv->cues_pos + mkv->reserve_cues_space,
  2807. offset);
  2808. if (ret < 0) {
  2809. ffio_free_dyn_buf(&cues);
  2810. return ret;
  2811. }
  2812. endpos += offset;
  2813. }
  2814. if ((ret64 = avio_seek(pb, mkv->cues_pos, SEEK_SET)) < 0) {
  2815. ffio_free_dyn_buf(&cues);
  2816. return ret64;
  2817. }
  2818. if (mkv->reserve_cues_space == size + 1) {
  2819. /* There is no way to reserve a single byte because
  2820. * the minimal size of an EBML Void element is 2
  2821. * (1 byte ID, 1 byte length field). This problem
  2822. * is solved by writing the Cues' length field on
  2823. * one byte more than necessary. */
  2824. length_size++;
  2825. size++;
  2826. }
  2827. }
  2828. }
  2829. ret = end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES,
  2830. length_size, 0, 1);
  2831. if (ret < 0)
  2832. return ret;
  2833. if (mkv->reserve_cues_space) {
  2834. if (size < mkv->reserve_cues_space)
  2835. put_ebml_void(pb, mkv->reserve_cues_space - size);
  2836. } else if (!mkv->move_cues_to_front)
  2837. endpos = avio_tell(pb);
  2838. }
  2839. after_cues:
  2840. /* Lengths greater than (1ULL << 56) - 1 can't be represented
  2841. * via an EBML number, so leave the unknown length field. */
  2842. if (endpos - mkv->segment_offset < (1ULL << 56) - 1) {
  2843. if ((ret64 = avio_seek(pb, mkv->segment_offset - 8, SEEK_SET)) < 0)
  2844. return ret64;
  2845. put_ebml_length(pb, endpos - mkv->segment_offset, 8);
  2846. }
  2847. ret = mkv_write_seekhead(pb, mkv, 1, mkv->info.pos);
  2848. if (ret < 0)
  2849. return ret;
  2850. if (mkv->info.bc) {
  2851. // update the duration
  2852. av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
  2853. avio_seek(mkv->info.bc, mkv->duration_offset, SEEK_SET);
  2854. put_ebml_float(mkv->info.bc, MATROSKA_ID_DURATION, mkv->duration);
  2855. ret = end_ebml_master_crc32(pb, &mkv->info.bc, mkv,
  2856. MATROSKA_ID_INFO, 0, 0, 0);
  2857. if (ret < 0)
  2858. return ret;
  2859. }
  2860. if (mkv->track.bc) {
  2861. // write Tracks master
  2862. if (!IS_WEBM(mkv)) {
  2863. AVIOContext *track_bc = mkv->track.bc;
  2864. for (unsigned i = 0; i < s->nb_streams; i++) {
  2865. const mkv_track *track = &mkv->tracks[i];
  2866. if (!track->max_blockaddid)
  2867. continue;
  2868. // We reserved a single byte to write this value.
  2869. av_assert0(track->max_blockaddid <= 0xFF);
  2870. avio_seek(track_bc, track->blockadditionmapping_offset, SEEK_SET);
  2871. put_ebml_uint(track_bc, MATROSKA_ID_TRACKMAXBLKADDID,
  2872. track->max_blockaddid);
  2873. if (track->max_blockaddid == MATROSKA_BLOCK_ADD_ID_ITU_T_T35) {
  2874. ebml_master mapping_master = start_ebml_master(track_bc, MATROSKA_ID_TRACKBLKADDMAPPING, 8);
  2875. put_ebml_uint(track_bc, MATROSKA_ID_BLKADDIDTYPE,
  2876. MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35);
  2877. put_ebml_uint(track_bc, MATROSKA_ID_BLKADDIDVALUE,
  2878. MATROSKA_BLOCK_ADD_ID_ITU_T_T35);
  2879. end_ebml_master(track_bc, mapping_master);
  2880. }
  2881. }
  2882. }
  2883. avio_seek(pb, mkv->track.pos, SEEK_SET);
  2884. ret = end_ebml_master_crc32(pb, &mkv->track.bc, mkv,
  2885. MATROSKA_ID_TRACKS, 0, 0, 0);
  2886. if (ret < 0)
  2887. return ret;
  2888. }
  2889. // update stream durations
  2890. if (mkv->tags.bc) {
  2891. AVIOContext *tags_bc = mkv->tags.bc;
  2892. int i;
  2893. for (i = 0; i < s->nb_streams; ++i) {
  2894. const AVStream *st = s->streams[i];
  2895. const mkv_track *track = &mkv->tracks[i];
  2896. if (track->duration_offset > 0) {
  2897. double duration_sec = track->duration * av_q2d(st->time_base);
  2898. char duration_string[DURATION_STRING_LENGTH + 1] = "";
  2899. ebml_master simpletag;
  2900. av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i,
  2901. track->duration);
  2902. avio_seek(tags_bc, track->duration_offset, SEEK_SET);
  2903. simpletag = start_ebml_master(tags_bc, MATROSKA_ID_SIMPLETAG,
  2904. 2 + 1 + 8 + 23);
  2905. put_ebml_string(tags_bc, MATROSKA_ID_TAGNAME, "DURATION");
  2906. snprintf(duration_string, sizeof(duration_string), "%02d:%02d:%012.9f",
  2907. (int) duration_sec / 3600, ((int) duration_sec / 60) % 60,
  2908. fmod(duration_sec, 60));
  2909. put_ebml_binary(tags_bc, MATROSKA_ID_TAGSTRING,
  2910. duration_string, DURATION_STRING_LENGTH);
  2911. end_ebml_master(tags_bc, simpletag);
  2912. }
  2913. }
  2914. avio_seek(pb, mkv->tags.pos, SEEK_SET);
  2915. ret = end_ebml_master_crc32(pb, &mkv->tags.bc, mkv,
  2916. MATROSKA_ID_TAGS, 0, 0, 0);
  2917. if (ret < 0)
  2918. return ret;
  2919. }
  2920. avio_seek(pb, endpos, SEEK_SET);
  2921. return ret2;
  2922. }
  2923. static uint64_t mkv_get_uid(const mkv_track *tracks, int i, AVLFG *c)
  2924. {
  2925. while (1) {
  2926. uint64_t uid;
  2927. int k;
  2928. uid = (uint64_t)av_lfg_get(c) << 32;
  2929. uid |= av_lfg_get(c);
  2930. if (!uid)
  2931. continue;
  2932. for (k = 0; k < i; k++) {
  2933. if (tracks[k].uid == uid)
  2934. break;
  2935. }
  2936. if (k == i)
  2937. return uid;
  2938. }
  2939. }
  2940. static int mkv_init(struct AVFormatContext *s)
  2941. {
  2942. FFFormatContext *const si = ffformatcontext(s);
  2943. MatroskaMuxContext *mkv = s->priv_data;
  2944. AVLFG c;
  2945. unsigned nb_tracks = 0;
  2946. int i;
  2947. mkv->ctx = s;
  2948. for (i = 0; i < s->nb_streams; i++) {
  2949. if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_ATRAC3 ||
  2950. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_COOK ||
  2951. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_RA_288 ||
  2952. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_SIPR ||
  2953. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_RV10 ||
  2954. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_RV20 ||
  2955. s->streams[i]->codecpar->codec_id == AV_CODEC_ID_RV30) {
  2956. av_log(s, AV_LOG_ERROR,
  2957. "The Matroska muxer does not yet support muxing %s\n",
  2958. avcodec_get_name(s->streams[i]->codecpar->codec_id));
  2959. return AVERROR_PATCHWELCOME;
  2960. }
  2961. }
  2962. if (s->avoid_negative_ts < 0) {
  2963. s->avoid_negative_ts = 1;
  2964. si->avoid_negative_ts_use_pts = 1;
  2965. }
  2966. if (!CONFIG_MATROSKA_MUXER ||
  2967. (CONFIG_WEBM_MUXER && !strcmp(s->oformat->name, "webm"))) {
  2968. mkv->mode = MODE_WEBM;
  2969. mkv->write_crc = 0;
  2970. } else
  2971. mkv->mode = MODE_MATROSKAv2;
  2972. mkv->cur_audio_pkt = ffformatcontext(s)->pkt;
  2973. mkv->tracks = av_calloc(s->nb_streams, sizeof(*mkv->tracks));
  2974. if (!mkv->tracks)
  2975. return AVERROR(ENOMEM);
  2976. if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
  2977. av_lfg_init(&c, av_get_random_seed());
  2978. // Calculate the SegmentUID now in order not to waste our random seed.
  2979. for (i = 0; i < 4; i++)
  2980. mkv->segment_uid[i] = av_lfg_get(&c);
  2981. }
  2982. for (i = 0; i < s->nb_streams; i++) {
  2983. AVStream *st = s->streams[i];
  2984. const AVCodecParameters *const par = st->codecpar;
  2985. mkv_track *track = &mkv->tracks[i];
  2986. switch (par->codec_id) {
  2987. #if CONFIG_MATROSKA_MUXER
  2988. case AV_CODEC_ID_WAVPACK:
  2989. track->reformat = mkv_reformat_wavpack;
  2990. break;
  2991. case AV_CODEC_ID_H264:
  2992. case AV_CODEC_ID_HEVC:
  2993. case AV_CODEC_ID_VVC:
  2994. if (((par->codec_id == AV_CODEC_ID_H264 && par->extradata_size > 0) ||
  2995. (par->codec_id == AV_CODEC_ID_HEVC && par->extradata_size > 6) ||
  2996. (par->codec_id == AV_CODEC_ID_VVC && par->extradata_size >= 6)) &&
  2997. (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1))
  2998. track->reformat = mkv_reformat_h2645;
  2999. break;
  3000. case AV_CODEC_ID_PRORES:
  3001. /* Matroska specification requires to remove
  3002. * the first QuickTime atom. */
  3003. track->offset = 8;
  3004. break;
  3005. #endif
  3006. case AV_CODEC_ID_AV1:
  3007. track->reformat = mkv_reformat_av1;
  3008. break;
  3009. case AV_CODEC_ID_WEBVTT:
  3010. track->reformat = webm_reformat_vtt;
  3011. break;
  3012. }
  3013. if (s->flags & AVFMT_FLAG_BITEXACT) {
  3014. track->uid = i + 1;
  3015. } else {
  3016. track->uid = mkv_get_uid(mkv->tracks, i, &c);
  3017. }
  3018. // ms precision is the de-facto standard timescale for mkv files
  3019. avpriv_set_pts_info(st, 64, 1, 1000);
  3020. if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
  3021. if (IS_WEBM(mkv)) {
  3022. av_log(s, AV_LOG_WARNING, "Stream %d will be ignored "
  3023. "as WebM doesn't support attachments.\n", i);
  3024. } else if (!get_mimetype(st)) {
  3025. av_log(s, AV_LOG_ERROR, "Attachment stream %d has no mimetype "
  3026. "tag and it cannot be deduced from the codec id.\n", i);
  3027. return AVERROR(EINVAL);
  3028. }
  3029. mkv->nb_attachments++;
  3030. continue;
  3031. }
  3032. nb_tracks++;
  3033. track->track_num = mkv->is_dash ? mkv->dash_track_number : nb_tracks;
  3034. track->track_num_size = ebml_num_size(track->track_num);
  3035. }
  3036. if (mkv->is_dash && nb_tracks != 1)
  3037. return AVERROR(EINVAL);
  3038. return 0;
  3039. }
  3040. static int mkv_check_bitstream(AVFormatContext *s, AVStream *st,
  3041. const AVPacket *pkt)
  3042. {
  3043. int ret = 1;
  3044. if (CONFIG_MATROSKA_MUXER && st->codecpar->codec_id == AV_CODEC_ID_AAC) {
  3045. if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0)
  3046. ret = ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL);
  3047. } else if (st->codecpar->codec_id == AV_CODEC_ID_VP9) {
  3048. ret = ff_stream_add_bitstream_filter(st, "vp9_superframe", NULL);
  3049. } else if (CONFIG_MATROSKA_MUXER &&
  3050. st->codecpar->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE) {
  3051. ret = ff_stream_add_bitstream_filter(st, "pgs_frame_merge", NULL);
  3052. }
  3053. return ret;
  3054. }
  3055. static const AVCodecTag additional_audio_tags[] = {
  3056. { AV_CODEC_ID_ALAC, 0XFFFFFFFF },
  3057. { AV_CODEC_ID_ATRAC1, 0xFFFFFFFF },
  3058. { AV_CODEC_ID_MLP, 0xFFFFFFFF },
  3059. { AV_CODEC_ID_OPUS, 0xFFFFFFFF },
  3060. { AV_CODEC_ID_PCM_S16BE, 0xFFFFFFFF },
  3061. { AV_CODEC_ID_PCM_S24BE, 0xFFFFFFFF },
  3062. { AV_CODEC_ID_PCM_S32BE, 0xFFFFFFFF },
  3063. { AV_CODEC_ID_QDMC, 0xFFFFFFFF },
  3064. { AV_CODEC_ID_QDM2, 0xFFFFFFFF },
  3065. { AV_CODEC_ID_RA_144, 0xFFFFFFFF },
  3066. { AV_CODEC_ID_TRUEHD, 0xFFFFFFFF },
  3067. { AV_CODEC_ID_NONE, 0xFFFFFFFF }
  3068. };
  3069. static const AVCodecTag additional_subtitle_tags[] = {
  3070. { AV_CODEC_ID_DVB_SUBTITLE, 0xFFFFFFFF },
  3071. { AV_CODEC_ID_DVD_SUBTITLE, 0xFFFFFFFF },
  3072. { AV_CODEC_ID_HDMV_PGS_SUBTITLE, 0xFFFFFFFF },
  3073. { AV_CODEC_ID_ARIB_CAPTION, 0xFFFFFFFF },
  3074. { AV_CODEC_ID_NONE, 0xFFFFFFFF }
  3075. };
  3076. #define OFFSET(x) offsetof(MatroskaMuxContext, x)
  3077. #define FLAGS AV_OPT_FLAG_ENCODING_PARAM
  3078. static const AVOption options[] = {
  3079. { "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 },
  3080. { "cues_to_front", "move Cues (the index) to the front by shifting data if necessary", OFFSET(move_cues_to_front), AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1, FLAGS },
  3081. { "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 },
  3082. { "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 },
  3083. { "dash", "create a WebM file conforming to WebM DASH specification", OFFSET(is_dash), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
  3084. { "dash_track_number", "track number for the DASH stream", OFFSET(dash_track_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, INT_MAX, FLAGS },
  3085. { "live", "write files assuming it is a live stream", OFFSET(is_live), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
  3086. { "allow_raw_vfw", "allow raw VFW mode", OFFSET(allow_raw_vfw), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
  3087. { "flipped_raw_rgb", "store raw RGB bitmaps in VFW mode in bottom-up mode", OFFSET(flipped_raw_rgb), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
  3088. { "write_crc32", "write a CRC32 element inside every Level 1 element", OFFSET(write_crc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
  3089. { "default_mode", "control how a track's FlagDefault is inferred", OFFSET(default_mode), AV_OPT_TYPE_INT, { .i64 = DEFAULT_MODE_PASSTHROUGH }, DEFAULT_MODE_INFER, DEFAULT_MODE_PASSTHROUGH, FLAGS, .unit = "default_mode" },
  3090. { "infer", "for each track type, mark each track of disposition default as default; if none exists, mark the first track as default", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_INFER }, 0, 0, FLAGS, .unit = "default_mode" },
  3091. { "infer_no_subs", "for each track type, mark each track of disposition default as default; for audio and video: if none exists, mark the first track as default", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_INFER_NO_SUBS }, 0, 0, FLAGS, .unit = "default_mode" },
  3092. { "passthrough", "use the disposition flag as-is", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_PASSTHROUGH }, 0, 0, FLAGS, .unit = "default_mode" },
  3093. { NULL },
  3094. };
  3095. static const AVClass matroska_webm_class = {
  3096. .class_name = "matroska/webm muxer",
  3097. .item_name = av_default_item_name,
  3098. .option = options,
  3099. .version = LIBAVUTIL_VERSION_INT,
  3100. };
  3101. #if CONFIG_MATROSKA_MUXER
  3102. static int mkv_query_codec(enum AVCodecID codec_id, int std_compliance)
  3103. {
  3104. for (int i = 0; ff_mkv_codec_tags[i].id != AV_CODEC_ID_NONE; i++)
  3105. if (ff_mkv_codec_tags[i].id == codec_id)
  3106. return 1;
  3107. if (std_compliance < FF_COMPLIANCE_NORMAL) {
  3108. enum AVMediaType type = avcodec_get_type(codec_id);
  3109. // mkv theoretically supports any video/audio through VFW/ACM
  3110. if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO)
  3111. return 1;
  3112. }
  3113. return 0;
  3114. }
  3115. const FFOutputFormat ff_matroska_muxer = {
  3116. .p.name = "matroska",
  3117. .p.long_name = NULL_IF_CONFIG_SMALL("Matroska"),
  3118. .p.mime_type = "video/x-matroska",
  3119. .p.extensions = "mkv",
  3120. .priv_data_size = sizeof(MatroskaMuxContext),
  3121. .p.audio_codec = CONFIG_LIBVORBIS_ENCODER ?
  3122. AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
  3123. .p.video_codec = CONFIG_LIBX264_ENCODER ?
  3124. AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4,
  3125. .init = mkv_init,
  3126. .deinit = mkv_deinit,
  3127. .write_header = mkv_write_header,
  3128. .write_packet = mkv_write_flush_packet,
  3129. .write_trailer = mkv_write_trailer,
  3130. .p.flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
  3131. AVFMT_TS_NONSTRICT,
  3132. .p.codec_tag = (const AVCodecTag* const []){
  3133. ff_codec_bmp_tags, ff_codec_wav_tags,
  3134. additional_audio_tags, additional_subtitle_tags, 0
  3135. },
  3136. .p.subtitle_codec = AV_CODEC_ID_ASS,
  3137. .query_codec = mkv_query_codec,
  3138. .check_bitstream = mkv_check_bitstream,
  3139. .p.priv_class = &matroska_webm_class,
  3140. .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH,
  3141. };
  3142. #endif
  3143. #if CONFIG_WEBM_MUXER
  3144. static int webm_query_codec(enum AVCodecID codec_id, int std_compliance)
  3145. {
  3146. for (int i = 0; ff_webm_codec_tags[i].id != AV_CODEC_ID_NONE; i++)
  3147. if (ff_webm_codec_tags[i].id == codec_id)
  3148. return 1;
  3149. return 0;
  3150. }
  3151. const FFOutputFormat ff_webm_muxer = {
  3152. .p.name = "webm",
  3153. .p.long_name = NULL_IF_CONFIG_SMALL("WebM"),
  3154. .p.mime_type = "video/webm",
  3155. .p.extensions = "webm",
  3156. .priv_data_size = sizeof(MatroskaMuxContext),
  3157. .p.audio_codec = CONFIG_LIBOPUS_ENCODER ? AV_CODEC_ID_OPUS : AV_CODEC_ID_VORBIS,
  3158. .p.video_codec = CONFIG_LIBVPX_VP9_ENCODER? AV_CODEC_ID_VP9 : AV_CODEC_ID_VP8,
  3159. .p.subtitle_codec = AV_CODEC_ID_WEBVTT,
  3160. .init = mkv_init,
  3161. .deinit = mkv_deinit,
  3162. .write_header = mkv_write_header,
  3163. .write_packet = mkv_write_flush_packet,
  3164. .write_trailer = mkv_write_trailer,
  3165. .query_codec = webm_query_codec,
  3166. .check_bitstream = mkv_check_bitstream,
  3167. .p.flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
  3168. AVFMT_TS_NONSTRICT,
  3169. .p.priv_class = &matroska_webm_class,
  3170. .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH,
  3171. };
  3172. #endif
  3173. #if CONFIG_MATROSKA_AUDIO_MUXER
  3174. const FFOutputFormat ff_matroska_audio_muxer = {
  3175. .p.name = "matroska",
  3176. .p.long_name = NULL_IF_CONFIG_SMALL("Matroska Audio"),
  3177. .p.mime_type = "audio/x-matroska",
  3178. .p.extensions = "mka",
  3179. .priv_data_size = sizeof(MatroskaMuxContext),
  3180. .p.audio_codec = CONFIG_LIBVORBIS_ENCODER ?
  3181. AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
  3182. .p.video_codec = AV_CODEC_ID_NONE,
  3183. .init = mkv_init,
  3184. .deinit = mkv_deinit,
  3185. .write_header = mkv_write_header,
  3186. .write_packet = mkv_write_flush_packet,
  3187. .write_trailer = mkv_write_trailer,
  3188. .check_bitstream = mkv_check_bitstream,
  3189. .p.flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
  3190. .p.codec_tag = (const AVCodecTag* const []){
  3191. ff_codec_wav_tags, additional_audio_tags, 0
  3192. },
  3193. .p.priv_class = &matroska_webm_class,
  3194. .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH,
  3195. };
  3196. #endif