matroska_ebml.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. /*****************************************************************************
  2. * matroska_ebml.c: matroska muxer utilities
  3. *****************************************************************************
  4. * Copyright (C) 2005-2018 x264 project
  5. *
  6. * Authors: Mike Matsnev <mike@haali.su>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
  21. *
  22. * This program is also available under a commercial proprietary license.
  23. * For more information, contact us at licensing@x264.com.
  24. *****************************************************************************/
  25. #include "output.h"
  26. #include "matroska_ebml.h"
  27. #define CLSIZE 1048576
  28. #define CHECK(x)\
  29. do {\
  30. if( (x) < 0 )\
  31. return -1;\
  32. } while( 0 )
  33. struct mk_context
  34. {
  35. struct mk_context *next, **prev, *parent;
  36. mk_writer *owner;
  37. unsigned id;
  38. void *data;
  39. unsigned d_cur, d_max;
  40. };
  41. typedef struct mk_context mk_context;
  42. struct mk_writer
  43. {
  44. FILE *fp;
  45. unsigned duration_ptr;
  46. mk_context *root, *cluster, *frame;
  47. mk_context *freelist;
  48. mk_context *actlist;
  49. int64_t def_duration;
  50. int64_t timescale;
  51. int64_t cluster_tc_scaled;
  52. int64_t frame_tc, max_frame_tc;
  53. char wrote_header, in_frame, keyframe, skippable;
  54. };
  55. static mk_context *mk_create_context( mk_writer *w, mk_context *parent, unsigned id )
  56. {
  57. mk_context *c;
  58. if( w->freelist )
  59. {
  60. c = w->freelist;
  61. w->freelist = w->freelist->next;
  62. }
  63. else
  64. {
  65. c = calloc( 1, sizeof(mk_context) );
  66. if( !c )
  67. return NULL;
  68. }
  69. c->parent = parent;
  70. c->owner = w;
  71. c->id = id;
  72. if( c->owner->actlist )
  73. c->owner->actlist->prev = &c->next;
  74. c->next = c->owner->actlist;
  75. c->prev = &c->owner->actlist;
  76. c->owner->actlist = c;
  77. return c;
  78. }
  79. static int mk_append_context_data( mk_context *c, const void *data, unsigned size )
  80. {
  81. unsigned ns = c->d_cur + size;
  82. if( ns > c->d_max )
  83. {
  84. void *dp;
  85. unsigned dn = c->d_max ? c->d_max << 1 : 16;
  86. while( ns > dn )
  87. dn <<= 1;
  88. dp = realloc( c->data, dn );
  89. if( !dp )
  90. return -1;
  91. c->data = dp;
  92. c->d_max = dn;
  93. }
  94. memcpy( (char*)c->data + c->d_cur, data, size );
  95. c->d_cur = ns;
  96. return 0;
  97. }
  98. static int mk_write_id( mk_context *c, unsigned id )
  99. {
  100. unsigned char c_id[4] = { id >> 24, id >> 16, id >> 8, id };
  101. if( c_id[0] )
  102. return mk_append_context_data( c, c_id, 4 );
  103. if( c_id[1] )
  104. return mk_append_context_data( c, c_id+1, 3 );
  105. if( c_id[2] )
  106. return mk_append_context_data( c, c_id+2, 2 );
  107. return mk_append_context_data( c, c_id+3, 1 );
  108. }
  109. static int mk_write_size( mk_context *c, unsigned size )
  110. {
  111. unsigned char c_size[5] = { 0x08, size >> 24, size >> 16, size >> 8, size };
  112. if( size < 0x7f )
  113. {
  114. c_size[4] |= 0x80;
  115. return mk_append_context_data( c, c_size+4, 1 );
  116. }
  117. if( size < 0x3fff )
  118. {
  119. c_size[3] |= 0x40;
  120. return mk_append_context_data( c, c_size+3, 2 );
  121. }
  122. if( size < 0x1fffff )
  123. {
  124. c_size[2] |= 0x20;
  125. return mk_append_context_data( c, c_size+2, 3 );
  126. }
  127. if( size < 0x0fffffff )
  128. {
  129. c_size[1] |= 0x10;
  130. return mk_append_context_data( c, c_size+1, 4 );
  131. }
  132. return mk_append_context_data( c, c_size, 5 );
  133. }
  134. static int mk_flush_context_id( mk_context *c )
  135. {
  136. unsigned char ff = 0xff;
  137. if( !c->id )
  138. return 0;
  139. CHECK( mk_write_id( c->parent, c->id ) );
  140. CHECK( mk_append_context_data( c->parent, &ff, 1 ) );
  141. c->id = 0;
  142. return 0;
  143. }
  144. static int mk_flush_context_data( mk_context *c )
  145. {
  146. if( !c->d_cur )
  147. return 0;
  148. if( c->parent )
  149. CHECK( mk_append_context_data( c->parent, c->data, c->d_cur ) );
  150. else if( fwrite( c->data, c->d_cur, 1, c->owner->fp ) != 1 )
  151. return -1;
  152. c->d_cur = 0;
  153. return 0;
  154. }
  155. static int mk_close_context( mk_context *c, unsigned *off )
  156. {
  157. if( c->id )
  158. {
  159. CHECK( mk_write_id( c->parent, c->id ) );
  160. CHECK( mk_write_size( c->parent, c->d_cur ) );
  161. }
  162. if( c->parent && off )
  163. *off += c->parent->d_cur;
  164. CHECK( mk_flush_context_data( c ) );
  165. if( c->next )
  166. c->next->prev = c->prev;
  167. *(c->prev) = c->next;
  168. c->next = c->owner->freelist;
  169. c->owner->freelist = c;
  170. return 0;
  171. }
  172. static void mk_destroy_contexts( mk_writer *w )
  173. {
  174. mk_context *next;
  175. for( mk_context *cur = w->freelist; cur; cur = next )
  176. {
  177. next = cur->next;
  178. free( cur->data );
  179. free( cur );
  180. }
  181. for( mk_context *cur = w->actlist; cur; cur = next )
  182. {
  183. next = cur->next;
  184. free( cur->data );
  185. free( cur );
  186. }
  187. w->freelist = w->actlist = w->root = NULL;
  188. }
  189. static int mk_write_string( mk_context *c, unsigned id, const char *str )
  190. {
  191. size_t len = strlen( str );
  192. CHECK( mk_write_id( c, id ) );
  193. CHECK( mk_write_size( c, len ) );
  194. CHECK( mk_append_context_data( c, str, len ) );
  195. return 0;
  196. }
  197. static int mk_write_bin( mk_context *c, unsigned id, const void *data, unsigned size )
  198. {
  199. CHECK( mk_write_id( c, id ) );
  200. CHECK( mk_write_size( c, size ) );
  201. CHECK( mk_append_context_data( c, data, size ) );
  202. return 0;
  203. }
  204. static int mk_write_uint( mk_context *c, unsigned id, int64_t ui )
  205. {
  206. unsigned char c_ui[8] = { ui >> 56, ui >> 48, ui >> 40, ui >> 32, ui >> 24, ui >> 16, ui >> 8, ui };
  207. unsigned i = 0;
  208. CHECK( mk_write_id( c, id ) );
  209. while( i < 7 && !c_ui[i] )
  210. ++i;
  211. CHECK( mk_write_size( c, 8 - i ) );
  212. CHECK( mk_append_context_data( c, c_ui+i, 8 - i ) );
  213. return 0;
  214. }
  215. static int mk_write_float_raw( mk_context *c, float f )
  216. {
  217. union
  218. {
  219. float f;
  220. unsigned u;
  221. } u;
  222. unsigned char c_f[4];
  223. u.f = f;
  224. c_f[0] = u.u >> 24;
  225. c_f[1] = u.u >> 16;
  226. c_f[2] = u.u >> 8;
  227. c_f[3] = u.u;
  228. return mk_append_context_data( c, c_f, 4 );
  229. }
  230. static int mk_write_float( mk_context *c, unsigned id, float f )
  231. {
  232. CHECK( mk_write_id( c, id ) );
  233. CHECK( mk_write_size( c, 4 ) );
  234. CHECK( mk_write_float_raw( c, f ) );
  235. return 0;
  236. }
  237. mk_writer *mk_create_writer( const char *filename )
  238. {
  239. mk_writer *w = calloc( 1, sizeof(mk_writer) );
  240. if( !w )
  241. return NULL;
  242. w->root = mk_create_context( w, NULL, 0 );
  243. if( !w->root )
  244. {
  245. free( w );
  246. return NULL;
  247. }
  248. if( !strcmp( filename, "-" ) )
  249. w->fp = stdout;
  250. else
  251. w->fp = x264_fopen( filename, "wb" );
  252. if( !w->fp )
  253. {
  254. mk_destroy_contexts( w );
  255. free( w );
  256. return NULL;
  257. }
  258. w->timescale = 1000000;
  259. return w;
  260. }
  261. int mk_write_header( mk_writer *w, const char *writing_app,
  262. const char *codec_id,
  263. const void *codec_private, unsigned codec_private_size,
  264. int64_t default_frame_duration,
  265. int64_t timescale,
  266. unsigned width, unsigned height,
  267. unsigned d_width, unsigned d_height, int display_size_units, int stereo_mode )
  268. {
  269. mk_context *c, *ti, *v;
  270. if( w->wrote_header )
  271. return -1;
  272. w->timescale = timescale;
  273. w->def_duration = default_frame_duration;
  274. if( !(c = mk_create_context( w, w->root, 0x1a45dfa3 )) ) // EBML
  275. return -1;
  276. CHECK( mk_write_uint( c, 0x4286, 1 ) ); // EBMLVersion
  277. CHECK( mk_write_uint( c, 0x42f7, 1 ) ); // EBMLReadVersion
  278. CHECK( mk_write_uint( c, 0x42f2, 4 ) ); // EBMLMaxIDLength
  279. CHECK( mk_write_uint( c, 0x42f3, 8 ) ); // EBMLMaxSizeLength
  280. CHECK( mk_write_string( c, 0x4282, "matroska") ); // DocType
  281. CHECK( mk_write_uint( c, 0x4287, stereo_mode >= 0 ? 3 : 2 ) ); // DocTypeVersion
  282. CHECK( mk_write_uint( c, 0x4285, 2 ) ); // DocTypeReadVersion
  283. CHECK( mk_close_context( c, 0 ) );
  284. if( !(c = mk_create_context( w, w->root, 0x18538067 )) ) // Segment
  285. return -1;
  286. CHECK( mk_flush_context_id( c ) );
  287. CHECK( mk_close_context( c, 0 ) );
  288. if( !(c = mk_create_context( w, w->root, 0x1549a966 )) ) // SegmentInfo
  289. return -1;
  290. CHECK( mk_write_string( c, 0x4d80, "Haali Matroska Writer b0" ) ); // MuxingApp
  291. CHECK( mk_write_string( c, 0x5741, writing_app ) ); // WritingApp
  292. CHECK( mk_write_uint( c, 0x2ad7b1, w->timescale ) ); // TimecodeScale
  293. CHECK( mk_write_float( c, 0x4489, 0) ); // Duration
  294. w->duration_ptr = c->d_cur - 4;
  295. CHECK( mk_close_context( c, &w->duration_ptr ) );
  296. if( !(c = mk_create_context( w, w->root, 0x1654ae6b )) ) // Tracks
  297. return -1;
  298. if( !(ti = mk_create_context( w, c, 0xae )) ) // TrackEntry
  299. return -1;
  300. CHECK( mk_write_uint( ti, 0xd7, 1 ) ); // TrackNumber
  301. CHECK( mk_write_uint( ti, 0x73c5, 1 ) ); // TrackUID
  302. CHECK( mk_write_uint( ti, 0x83, 1 ) ); // TrackType
  303. CHECK( mk_write_uint( ti, 0x9c, 0 ) ); // FlagLacing
  304. CHECK( mk_write_string( ti, 0x86, codec_id ) ); // CodecID
  305. if( codec_private_size )
  306. CHECK( mk_write_bin( ti, 0x63a2, codec_private, codec_private_size ) ); // CodecPrivate
  307. if( default_frame_duration )
  308. CHECK( mk_write_uint( ti, 0x23e383, default_frame_duration ) ); // DefaultDuration
  309. if( !(v = mk_create_context( w, ti, 0xe0 ) ) ) // Video
  310. return -1;
  311. CHECK( mk_write_uint( v, 0xb0, width ) ); // PixelWidth
  312. CHECK( mk_write_uint( v, 0xba, height ) ); // PixelHeight
  313. CHECK( mk_write_uint( v, 0x54b2, display_size_units ) ); // DisplayUnit
  314. CHECK( mk_write_uint( v, 0x54b0, d_width ) ); // DisplayWidth
  315. CHECK( mk_write_uint( v, 0x54ba, d_height ) ); // DisplayHeight
  316. if( stereo_mode >= 0 )
  317. CHECK( mk_write_uint( v, 0x53b8, stereo_mode ) ); // StereoMode
  318. CHECK( mk_close_context( v, 0 ) );
  319. CHECK( mk_close_context( ti, 0 ) );
  320. CHECK( mk_close_context( c, 0 ) );
  321. CHECK( mk_flush_context_data( w->root ) );
  322. w->wrote_header = 1;
  323. return 0;
  324. }
  325. static int mk_close_cluster( mk_writer *w )
  326. {
  327. if( w->cluster == NULL )
  328. return 0;
  329. CHECK( mk_close_context( w->cluster, 0 ) );
  330. w->cluster = NULL;
  331. CHECK( mk_flush_context_data( w->root ) );
  332. return 0;
  333. }
  334. static int mk_flush_frame( mk_writer *w )
  335. {
  336. int64_t delta;
  337. unsigned fsize;
  338. unsigned char c_delta_flags[3];
  339. if( !w->in_frame )
  340. return 0;
  341. delta = w->frame_tc/w->timescale - w->cluster_tc_scaled;
  342. if( delta > 32767ll || delta < -32768ll )
  343. CHECK( mk_close_cluster( w ) );
  344. if( !w->cluster )
  345. {
  346. w->cluster_tc_scaled = w->frame_tc / w->timescale;
  347. w->cluster = mk_create_context( w, w->root, 0x1f43b675 ); // Cluster
  348. if( !w->cluster )
  349. return -1;
  350. CHECK( mk_write_uint( w->cluster, 0xe7, w->cluster_tc_scaled ) ); // Timecode
  351. delta = 0;
  352. }
  353. fsize = w->frame ? w->frame->d_cur : 0;
  354. CHECK( mk_write_id( w->cluster, 0xa3 ) ); // SimpleBlock
  355. CHECK( mk_write_size( w->cluster, fsize + 4 ) ); // Size
  356. CHECK( mk_write_size( w->cluster, 1 ) ); // TrackNumber
  357. c_delta_flags[0] = delta >> 8;
  358. c_delta_flags[1] = delta;
  359. c_delta_flags[2] = (w->keyframe << 7) | w->skippable;
  360. CHECK( mk_append_context_data( w->cluster, c_delta_flags, 3 ) ); // Timecode, Flags
  361. if( w->frame )
  362. {
  363. CHECK( mk_append_context_data( w->cluster, w->frame->data, w->frame->d_cur ) ); // Data
  364. w->frame->d_cur = 0;
  365. }
  366. w->in_frame = 0;
  367. if( w->cluster->d_cur > CLSIZE )
  368. CHECK( mk_close_cluster( w ) );
  369. return 0;
  370. }
  371. int mk_start_frame( mk_writer *w )
  372. {
  373. if( mk_flush_frame( w ) < 0 )
  374. return -1;
  375. w->in_frame = 1;
  376. w->keyframe = 0;
  377. w->skippable = 0;
  378. return 0;
  379. }
  380. int mk_set_frame_flags( mk_writer *w, int64_t timestamp, int keyframe, int skippable )
  381. {
  382. if( !w->in_frame )
  383. return -1;
  384. w->frame_tc = timestamp;
  385. w->keyframe = keyframe != 0;
  386. w->skippable = skippable != 0;
  387. if( w->max_frame_tc < timestamp )
  388. w->max_frame_tc = timestamp;
  389. return 0;
  390. }
  391. int mk_add_frame_data( mk_writer *w, const void *data, unsigned size )
  392. {
  393. if( !w->in_frame )
  394. return -1;
  395. if( !w->frame )
  396. if( !(w->frame = mk_create_context( w, NULL, 0 )) )
  397. return -1;
  398. return mk_append_context_data( w->frame, data, size );
  399. }
  400. int mk_close( mk_writer *w, int64_t last_delta )
  401. {
  402. int ret = 0;
  403. if( mk_flush_frame( w ) < 0 || mk_close_cluster( w ) < 0 )
  404. ret = -1;
  405. if( w->wrote_header && x264_is_regular_file( w->fp ) )
  406. {
  407. int64_t last_frametime = w->def_duration ? w->def_duration : last_delta;
  408. int64_t total_duration = w->max_frame_tc + last_frametime;
  409. if( fseek( w->fp, w->duration_ptr, SEEK_SET ) ||
  410. mk_write_float_raw( w->root, (float)((double)total_duration / w->timescale) ) < 0 ||
  411. mk_flush_context_data( w->root ) < 0 )
  412. ret = -1;
  413. }
  414. mk_destroy_contexts( w );
  415. fclose( w->fp );
  416. free( w );
  417. return ret;
  418. }