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

2444 lines
95KB

  1. /*
  2. * MXF muxer
  3. * Copyright (c) 2008 GUCAS, Zhentan Feng <spyfeng at gmail dot com>
  4. * Copyright (c) 2008 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
  5. *
  6. * This file is part of FFmpeg.
  7. *
  8. * FFmpeg is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * FFmpeg 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 GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with FFmpeg; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. /*
  23. * References
  24. * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value
  25. * SMPTE 377M MXF File Format Specifications
  26. * SMPTE 379M MXF Generic Container
  27. * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container
  28. * SMPTE 422M Mapping JPEG 2000 Codestreams into the MXF Generic Container
  29. * SMPTE RP210: SMPTE Metadata Dictionary
  30. * SMPTE RP224: Registry of SMPTE Universal Labels
  31. */
  32. #include <inttypes.h>
  33. #include <math.h>
  34. #include <time.h>
  35. #include "libavutil/opt.h"
  36. #include "libavutil/random_seed.h"
  37. #include "libavutil/timecode.h"
  38. #include "libavutil/avassert.h"
  39. #include "libavutil/time_internal.h"
  40. #include "libavcodec/bytestream.h"
  41. #include "libavcodec/dnxhddata.h"
  42. #include "libavcodec/h264.h"
  43. #include "libavcodec/internal.h"
  44. #include "audiointerleave.h"
  45. #include "avformat.h"
  46. #include "avio_internal.h"
  47. #include "internal.h"
  48. #include "mxf.h"
  49. #include "config.h"
  50. extern AVOutputFormat ff_mxf_d10_muxer;
  51. extern AVOutputFormat ff_mxf_opatom_muxer;
  52. #define EDIT_UNITS_PER_BODY 250
  53. #define KAG_SIZE 512
  54. typedef struct MXFLocalTagPair {
  55. int local_tag;
  56. UID uid;
  57. } MXFLocalTagPair;
  58. typedef struct MXFIndexEntry {
  59. uint8_t flags;
  60. uint64_t offset;
  61. unsigned slice_offset; ///< offset of audio slice
  62. uint16_t temporal_ref;
  63. } MXFIndexEntry;
  64. typedef struct MXFStreamContext {
  65. AudioInterleaveContext aic;
  66. UID track_essence_element_key;
  67. int index; ///< index in mxf_essence_container_uls table
  68. const UID *codec_ul;
  69. int order; ///< interleaving order if dts are equal
  70. int interlaced; ///< whether picture is interlaced
  71. int field_dominance; ///< tff=1, bff=2
  72. int component_depth;
  73. int temporal_reordering;
  74. AVRational aspect_ratio; ///< display aspect ratio
  75. int closed_gop; ///< gop is closed, used in mpeg-2 frame parsing
  76. int video_bit_rate;
  77. } MXFStreamContext;
  78. typedef struct MXFContainerEssenceEntry {
  79. UID container_ul;
  80. UID element_ul;
  81. UID codec_ul;
  82. void (*write_desc)(AVFormatContext *, AVStream *);
  83. } MXFContainerEssenceEntry;
  84. static const struct {
  85. enum AVCodecID id;
  86. int index;
  87. } mxf_essence_mappings[] = {
  88. { AV_CODEC_ID_MPEG2VIDEO, 0 },
  89. { AV_CODEC_ID_PCM_S24LE, 1 },
  90. { AV_CODEC_ID_PCM_S16LE, 1 },
  91. { AV_CODEC_ID_DVVIDEO, 15 },
  92. { AV_CODEC_ID_DNXHD, 24 },
  93. { AV_CODEC_ID_JPEG2000, 34 },
  94. { AV_CODEC_ID_H264, 35 },
  95. { AV_CODEC_ID_NONE }
  96. };
  97. static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st);
  98. static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st);
  99. static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st);
  100. static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st);
  101. static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st);
  102. static const MXFContainerEssenceEntry mxf_essence_container_uls[] = {
  103. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 },
  104. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  105. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
  106. mxf_write_mpegvideo_desc },
  107. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 },
  108. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x03,0x00 },
  109. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  110. mxf_write_aes3_desc },
  111. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 },
  112. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x01,0x00 },
  113. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  114. mxf_write_wav_desc },
  115. // D-10 625/50 PAL 50mb/s
  116. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
  117. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
  118. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 },
  119. mxf_write_cdci_desc },
  120. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
  121. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
  122. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  123. mxf_write_generic_sound_desc },
  124. // D-10 525/60 NTSC 50mb/s
  125. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
  126. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
  127. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 },
  128. mxf_write_cdci_desc },
  129. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
  130. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
  131. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  132. mxf_write_generic_sound_desc },
  133. // D-10 625/50 PAL 40mb/s
  134. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
  135. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
  136. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 },
  137. mxf_write_cdci_desc },
  138. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
  139. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
  140. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  141. mxf_write_generic_sound_desc },
  142. // D-10 525/60 NTSC 40mb/s
  143. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
  144. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
  145. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 },
  146. mxf_write_cdci_desc },
  147. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
  148. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
  149. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  150. mxf_write_generic_sound_desc },
  151. // D-10 625/50 PAL 30mb/s
  152. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
  153. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
  154. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 },
  155. mxf_write_cdci_desc },
  156. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
  157. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
  158. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  159. mxf_write_generic_sound_desc },
  160. // D-10 525/60 NTSC 30mb/s
  161. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
  162. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
  163. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 },
  164. mxf_write_cdci_desc },
  165. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
  166. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
  167. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
  168. mxf_write_generic_sound_desc },
  169. // DV Unknown
  170. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x7F,0x01 },
  171. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  172. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x00,0x00,0x00 },
  173. mxf_write_cdci_desc },
  174. // DV25 525/60
  175. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x40,0x01 },
  176. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  177. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x01,0x00 },
  178. mxf_write_cdci_desc },
  179. // DV25 625/50
  180. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x41,0x01 },
  181. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  182. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 },
  183. mxf_write_cdci_desc },
  184. // DV50 525/60
  185. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x50,0x01 },
  186. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  187. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x03,0x00 },
  188. mxf_write_cdci_desc },
  189. // DV50 625/50
  190. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x51,0x01 },
  191. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  192. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 },
  193. mxf_write_cdci_desc },
  194. // DV100 1080/60
  195. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x60,0x01 },
  196. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  197. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x05,0x00 },
  198. mxf_write_cdci_desc },
  199. // DV100 1080/50
  200. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x61,0x01 },
  201. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  202. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x06,0x00 },
  203. mxf_write_cdci_desc },
  204. // DV100 720/60
  205. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x62,0x01 },
  206. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  207. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x07,0x00 },
  208. mxf_write_cdci_desc },
  209. // DV100 720/50
  210. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x63,0x01 },
  211. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
  212. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x08,0x00 },
  213. mxf_write_cdci_desc },
  214. // DNxHD 1080p 10bit high
  215. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  216. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  217. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x01,0x00,0x00 },
  218. mxf_write_cdci_desc },
  219. // DNxHD 1080p 8bit medium
  220. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  221. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  222. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x03,0x00,0x00 },
  223. mxf_write_cdci_desc },
  224. // DNxHD 1080p 8bit high
  225. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  226. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  227. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x04,0x00,0x00 },
  228. mxf_write_cdci_desc },
  229. // DNxHD 1080i 10bit high
  230. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  231. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  232. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x07,0x00,0x00 },
  233. mxf_write_cdci_desc },
  234. // DNxHD 1080i 8bit medium
  235. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  236. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  237. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x08,0x00,0x00 },
  238. mxf_write_cdci_desc },
  239. // DNxHD 1080i 8bit high
  240. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  241. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  242. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x09,0x00,0x00 },
  243. mxf_write_cdci_desc },
  244. // DNxHD 720p 10bit
  245. { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  246. { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  247. { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x10,0x00,0x00 },
  248. mxf_write_cdci_desc },
  249. // DNxHD 720p 8bit high
  250. { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  251. { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  252. { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x11,0x00,0x00 },
  253. mxf_write_cdci_desc },
  254. // DNxHD 720p 8bit medium
  255. { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  256. { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  257. { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x12,0x00,0x00 },
  258. mxf_write_cdci_desc },
  259. // DNxHD 720p 8bit low
  260. { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
  261. { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  262. { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x13,0x00,0x00 },
  263. mxf_write_cdci_desc },
  264. // JPEG2000
  265. { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 },
  266. { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x08,0x00 },
  267. { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 },
  268. mxf_write_cdci_desc },
  269. // H.264
  270. { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x0D,0x01,0x03,0x01,0x02,0x10,0x60,0x01 },
  271. { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
  272. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
  273. mxf_write_mpegvideo_desc },
  274. { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
  275. { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
  276. { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
  277. NULL },
  278. };
  279. typedef struct MXFContext {
  280. AVClass *av_class;
  281. int64_t footer_partition_offset;
  282. int essence_container_count;
  283. AVRational time_base;
  284. int header_written;
  285. MXFIndexEntry *index_entries;
  286. unsigned edit_units_count;
  287. uint64_t timestamp; ///< timestamp, as year(16),month(8),day(8),hour(8),minutes(8),msec/4(8)
  288. uint8_t slice_count; ///< index slice count minus 1 (1 if no audio, 0 otherwise)
  289. int last_indexed_edit_unit;
  290. uint64_t *body_partition_offset;
  291. unsigned body_partitions_count;
  292. int last_key_index; ///< index of last key frame
  293. uint64_t duration;
  294. AVTimecode tc; ///< timecode context
  295. AVStream *timecode_track;
  296. int timecode_base; ///< rounded time code base (25 or 30)
  297. int edit_unit_byte_count; ///< fixed edit unit byte count
  298. uint64_t body_offset;
  299. uint32_t instance_number;
  300. uint8_t umid[16]; ///< unique material identifier
  301. int channel_count;
  302. } MXFContext;
  303. static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd };
  304. static const uint8_t umid_ul[] = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13 };
  305. /**
  306. * complete key for operation pattern, partitions, and primer pack
  307. */
  308. static const uint8_t op1a_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x01,0x09,0x00 };
  309. static const uint8_t opatom_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x02,0x01,0x10,0x03,0x00,0x00 };
  310. static const uint8_t footer_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }; // ClosedComplete
  311. static const uint8_t primer_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x05,0x01,0x00 };
  312. static const uint8_t index_table_segment_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 };
  313. static const uint8_t random_index_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x11,0x01,0x00 };
  314. static const uint8_t header_open_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x02,0x01,0x00 }; // OpenIncomplete
  315. static const uint8_t header_closed_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x02,0x04,0x00 }; // ClosedComplete
  316. static const uint8_t klv_fill_key[] = { 0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x03,0x01,0x02,0x10,0x01,0x00,0x00,0x00 };
  317. static const uint8_t body_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }; // ClosedComplete
  318. /**
  319. * partial key for header metadata
  320. */
  321. static const uint8_t header_metadata_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01 };
  322. static const uint8_t multiple_desc_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x0D,0x01,0x03,0x01,0x02,0x7F,0x01,0x00 };
  323. /**
  324. * SMPTE RP210 http://www.smpte-ra.org/mdd/index.html
  325. */
  326. static const MXFLocalTagPair mxf_local_tag_batch[] = {
  327. // preface set
  328. { 0x3C0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x02,0x00,0x00,0x00,0x00}}, /* Instance UID */
  329. { 0x3B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x04,0x00,0x00}}, /* Last Modified Date */
  330. { 0x3B05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x01,0x05,0x00,0x00,0x00}}, /* Version */
  331. { 0x3B06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x04,0x00,0x00}}, /* Identifications reference */
  332. { 0x3B03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x01,0x00,0x00}}, /* Content Storage reference */
  333. { 0x3B09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x03,0x00,0x00,0x00,0x00}}, /* Operational Pattern UL */
  334. { 0x3B0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x01,0x00,0x00}}, /* Essence Containers UL batch */
  335. { 0x3B0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x02,0x00,0x00}}, /* DM Schemes UL batch */
  336. // Identification
  337. { 0x3C09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x01,0x00,0x00,0x00}}, /* This Generation UID */
  338. { 0x3C01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x02,0x01,0x00,0x00}}, /* Company Name */
  339. { 0x3C02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x03,0x01,0x00,0x00}}, /* Product Name */
  340. { 0x3C04, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x05,0x01,0x00,0x00}}, /* Version String */
  341. { 0x3C05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x07,0x00,0x00,0x00}}, /* Product ID */
  342. { 0x3C06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x03,0x00,0x00}}, /* Modification Date */
  343. // Content Storage
  344. { 0x1901, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x01,0x00,0x00}}, /* Package strong reference batch */
  345. { 0x1902, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x02,0x00,0x00}}, /* Package strong reference batch */
  346. // Essence Container Data
  347. { 0x2701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x06,0x01,0x00,0x00,0x00}}, /* Linked Package UID */
  348. { 0x3F07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x04,0x00,0x00,0x00,0x00}}, /* BodySID */
  349. // Package
  350. { 0x4401, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x10,0x00,0x00,0x00,0x00}}, /* Package UID */
  351. { 0x4405, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x01,0x03,0x00,0x00}}, /* Package Creation Date */
  352. { 0x4404, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x05,0x00,0x00}}, /* Package Modified Date */
  353. { 0x4403, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x05,0x00,0x00}}, /* Tracks Strong reference array */
  354. { 0x4701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x03,0x00,0x00}}, /* Descriptor */
  355. // Track
  356. { 0x4801, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00}}, /* Track ID */
  357. { 0x4804, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x04,0x01,0x03,0x00,0x00,0x00,0x00}}, /* Track Number */
  358. { 0x4B01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x30,0x04,0x05,0x00,0x00,0x00,0x00}}, /* Edit Rate */
  359. { 0x4B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x03,0x00,0x00}}, /* Origin */
  360. { 0x4803, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x04,0x00,0x00}}, /* Sequence reference */
  361. // Sequence
  362. { 0x0201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x07,0x01,0x00,0x00,0x00,0x00,0x00}}, /* Data Definition UL */
  363. { 0x0202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x02,0x01,0x01,0x03,0x00,0x00}}, /* Duration */
  364. { 0x1001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x09,0x00,0x00}}, /* Structural Components reference array */
  365. // Source Clip
  366. { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x04,0x00,0x00}}, /* Start position */
  367. { 0x1101, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x01,0x00,0x00,0x00}}, /* SourcePackageID */
  368. { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, /* SourceTrackID */
  369. // Timecode Component
  370. { 0x1501, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x05,0x00,0x00}}, /* Start Time Code */
  371. { 0x1502, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x04,0x01,0x01,0x02,0x06,0x00,0x00}}, /* Rounded Time Code Base */
  372. { 0x1503, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x04,0x01,0x01,0x05,0x00,0x00,0x00}}, /* Drop Frame */
  373. // File Descriptor
  374. { 0x3F01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x04,0x06,0x0B,0x00,0x00}}, /* Sub Descriptors reference array */
  375. { 0x3006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x06,0x01,0x01,0x03,0x05,0x00,0x00,0x00}}, /* Linked Track ID */
  376. { 0x3001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x00,0x00,0x00,0x00}}, /* SampleRate */
  377. { 0x3004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x01,0x02,0x00,0x00}}, /* Essence Container */
  378. // Generic Picture Essence Descriptor
  379. { 0x320C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Frame Layout */
  380. { 0x320D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x03,0x02,0x05,0x00,0x00,0x00}}, /* Video Line Map */
  381. { 0x3203, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x02,0x00,0x00,0x00}}, /* Stored Width */
  382. { 0x3202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x01,0x00,0x00,0x00}}, /* Stored Height */
  383. { 0x3209, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0C,0x00,0x00,0x00}}, /* Display Width */
  384. { 0x3208, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0B,0x00,0x00,0x00}}, /* Display Height */
  385. { 0x320E, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x00,0x00,0x00}}, /* Aspect Ratio */
  386. { 0x3201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, /* Picture Essence Coding */
  387. { 0x3212, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x03,0x01,0x06,0x00,0x00,0x00}}, /* Field Dominance (Opt) */
  388. // CDCI Picture Essence Descriptor
  389. { 0x3301, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x05,0x03,0x0A,0x00,0x00,0x00}}, /* Component Depth */
  390. { 0x3302, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x05,0x00,0x00,0x00}}, /* Horizontal Subsampling */
  391. // Generic Sound Essence Descriptor
  392. { 0x3D02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Locked/Unlocked */
  393. { 0x3D03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x01,0x01,0x00,0x00}}, /* Audio sampling rate */
  394. { 0x3D07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x01,0x01,0x04,0x00,0x00,0x00}}, /* ChannelCount */
  395. { 0x3D01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x03,0x04,0x00,0x00,0x00}}, /* Quantization bits */
  396. { 0x3D06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x02,0x04,0x02,0x00,0x00,0x00,0x00}}, /* Sound Essence Compression */
  397. // Index Table Segment
  398. { 0x3F0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x05,0x30,0x04,0x06,0x00,0x00,0x00,0x00}}, /* Index Edit Rate */
  399. { 0x3F0C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x0A,0x00,0x00}}, /* Index Start Position */
  400. { 0x3F0D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x02,0x01,0x01,0x02,0x00,0x00}}, /* Index Duration */
  401. { 0x3F05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x06,0x02,0x01,0x00,0x00,0x00,0x00}}, /* Edit Unit Byte Count */
  402. { 0x3F06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x05,0x00,0x00,0x00,0x00}}, /* IndexSID */
  403. { 0x3F08, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x04,0x04,0x01,0x01,0x00,0x00,0x00}}, /* Slice Count */
  404. { 0x3F09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x01,0x06,0x00,0x00,0x00}}, /* Delta Entry Array */
  405. { 0x3F0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x02,0x05,0x00,0x00,0x00}}, /* Index Entry Array */
  406. // MPEG video Descriptor
  407. { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, /* BitRate */
  408. { 0x8007, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0A,0x00,0x00}}, /* ProfileAndLevel */
  409. // Wave Audio Essence Descriptor
  410. { 0x3D09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x03,0x05,0x00,0x00,0x00}}, /* Average Bytes Per Second */
  411. { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */
  412. };
  413. static void mxf_write_uuid(AVIOContext *pb, enum MXFMetadataSetType type, int value)
  414. {
  415. avio_write(pb, uuid_base, 12);
  416. avio_wb16(pb, type);
  417. avio_wb16(pb, value);
  418. }
  419. static void mxf_write_umid(AVFormatContext *s, int type)
  420. {
  421. MXFContext *mxf = s->priv_data;
  422. avio_write(s->pb, umid_ul, 13);
  423. avio_wb24(s->pb, mxf->instance_number);
  424. avio_write(s->pb, mxf->umid, 15);
  425. avio_w8(s->pb, type);
  426. }
  427. static void mxf_write_refs_count(AVIOContext *pb, int ref_count)
  428. {
  429. avio_wb32(pb, ref_count);
  430. avio_wb32(pb, 16);
  431. }
  432. static int klv_ber_length(uint64_t len)
  433. {
  434. if (len < 128)
  435. return 1;
  436. else
  437. return (av_log2(len) >> 3) + 2;
  438. }
  439. static int klv_encode_ber_length(AVIOContext *pb, uint64_t len)
  440. {
  441. // Determine the best BER size
  442. int size;
  443. if (len < 128) {
  444. //short form
  445. avio_w8(pb, len);
  446. return 1;
  447. }
  448. size = (av_log2(len) >> 3) + 1;
  449. // long form
  450. avio_w8(pb, 0x80 + size);
  451. while(size) {
  452. size--;
  453. avio_w8(pb, len >> 8 * size & 0xff);
  454. }
  455. return 0;
  456. }
  457. static void klv_encode_ber4_length(AVIOContext *pb, int len)
  458. {
  459. avio_w8(pb, 0x80 + 3);
  460. avio_wb24(pb, len);
  461. }
  462. static void klv_encode_ber9_length(AVIOContext *pb, uint64_t len)
  463. {
  464. avio_w8(pb, 0x80 + 8);
  465. avio_wb64(pb, len);
  466. }
  467. /*
  468. * Get essence container ul index
  469. */
  470. static int mxf_get_essence_container_ul_index(enum AVCodecID id)
  471. {
  472. int i;
  473. for (i = 0; mxf_essence_mappings[i].id; i++)
  474. if (mxf_essence_mappings[i].id == id)
  475. return mxf_essence_mappings[i].index;
  476. return -1;
  477. }
  478. static void mxf_write_primer_pack(AVFormatContext *s)
  479. {
  480. AVIOContext *pb = s->pb;
  481. int local_tag_number, i = 0;
  482. local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch);
  483. avio_write(pb, primer_pack_key, 16);
  484. klv_encode_ber_length(pb, local_tag_number * 18 + 8);
  485. avio_wb32(pb, local_tag_number); // local_tag num
  486. avio_wb32(pb, 18); // item size, always 18 according to the specs
  487. for (i = 0; i < local_tag_number; i++) {
  488. avio_wb16(pb, mxf_local_tag_batch[i].local_tag);
  489. avio_write(pb, mxf_local_tag_batch[i].uid, 16);
  490. }
  491. }
  492. static void mxf_write_local_tag(AVIOContext *pb, int size, int tag)
  493. {
  494. avio_wb16(pb, tag);
  495. avio_wb16(pb, size);
  496. }
  497. static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value)
  498. {
  499. avio_write(pb, header_metadata_key, 13);
  500. avio_wb24(pb, value);
  501. }
  502. static void mxf_free(AVFormatContext *s)
  503. {
  504. int i;
  505. for (i = 0; i < s->nb_streams; i++) {
  506. AVStream *st = s->streams[i];
  507. av_freep(&st->priv_data);
  508. }
  509. }
  510. static const MXFCodecUL *mxf_get_data_definition_ul(int type)
  511. {
  512. const MXFCodecUL *uls = ff_mxf_data_definition_uls;
  513. while (uls->uid[0]) {
  514. if (type == uls->id)
  515. break;
  516. uls++;
  517. }
  518. return uls;
  519. }
  520. //one EC -> one descriptor. N ECs -> MultipleDescriptor + N descriptors
  521. #define DESCRIPTOR_COUNT(essence_container_count) \
  522. (essence_container_count > 1 ? essence_container_count + 1 : essence_container_count)
  523. static void mxf_write_essence_container_refs(AVFormatContext *s)
  524. {
  525. MXFContext *c = s->priv_data;
  526. AVIOContext *pb = s->pb;
  527. int i;
  528. mxf_write_refs_count(pb, DESCRIPTOR_COUNT(c->essence_container_count));
  529. av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count);
  530. for (i = 0; i < c->essence_container_count; i++) {
  531. MXFStreamContext *sc = s->streams[i]->priv_data;
  532. avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
  533. }
  534. if (c->essence_container_count > 1)
  535. avio_write(pb, multiple_desc_ul, 16);
  536. }
  537. static void mxf_write_preface(AVFormatContext *s)
  538. {
  539. MXFContext *mxf = s->priv_data;
  540. AVIOContext *pb = s->pb;
  541. mxf_write_metadata_key(pb, 0x012f00);
  542. PRINT_KEY(s, "preface key", pb->buf_ptr - 16);
  543. klv_encode_ber_length(pb, 130 + 16LL * DESCRIPTOR_COUNT(mxf->essence_container_count));
  544. // write preface set uid
  545. mxf_write_local_tag(pb, 16, 0x3C0A);
  546. mxf_write_uuid(pb, Preface, 0);
  547. PRINT_KEY(s, "preface uid", pb->buf_ptr - 16);
  548. // last modified date
  549. mxf_write_local_tag(pb, 8, 0x3B02);
  550. avio_wb64(pb, mxf->timestamp);
  551. // write version
  552. mxf_write_local_tag(pb, 2, 0x3B05);
  553. avio_wb16(pb, 258); // v1.2
  554. // write identification_refs
  555. mxf_write_local_tag(pb, 16 + 8, 0x3B06);
  556. mxf_write_refs_count(pb, 1);
  557. mxf_write_uuid(pb, Identification, 0);
  558. // write content_storage_refs
  559. mxf_write_local_tag(pb, 16, 0x3B03);
  560. mxf_write_uuid(pb, ContentStorage, 0);
  561. // operational pattern
  562. mxf_write_local_tag(pb, 16, 0x3B09);
  563. if (s->oformat == &ff_mxf_opatom_muxer)
  564. avio_write(pb, opatom_ul, 16);
  565. else
  566. avio_write(pb, op1a_ul, 16);
  567. // write essence_container_refs
  568. mxf_write_local_tag(pb, 8 + 16LL * DESCRIPTOR_COUNT(mxf->essence_container_count), 0x3B0A);
  569. mxf_write_essence_container_refs(s);
  570. // write dm_scheme_refs
  571. mxf_write_local_tag(pb, 8, 0x3B0B);
  572. avio_wb64(pb, 0);
  573. }
  574. /*
  575. * Write a local tag containing an ascii string as utf-16
  576. */
  577. static void mxf_write_local_tag_utf16(AVIOContext *pb, int tag, const char *value)
  578. {
  579. int i, size = strlen(value);
  580. mxf_write_local_tag(pb, size*2, tag);
  581. for (i = 0; i < size; i++)
  582. avio_wb16(pb, value[i]);
  583. }
  584. static void mxf_write_identification(AVFormatContext *s)
  585. {
  586. MXFContext *mxf = s->priv_data;
  587. AVIOContext *pb = s->pb;
  588. const char *company = "FFmpeg";
  589. const char *product = s->oformat != &ff_mxf_opatom_muxer ? "OP1a Muxer" : "OPAtom Muxer";
  590. const char *version;
  591. int length;
  592. mxf_write_metadata_key(pb, 0x013000);
  593. PRINT_KEY(s, "identification key", pb->buf_ptr - 16);
  594. version = s->flags & AVFMT_FLAG_BITEXACT ?
  595. "0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION);
  596. length = 84 + (strlen(company)+strlen(product)+strlen(version))*2; // utf-16
  597. klv_encode_ber_length(pb, length);
  598. // write uid
  599. mxf_write_local_tag(pb, 16, 0x3C0A);
  600. mxf_write_uuid(pb, Identification, 0);
  601. PRINT_KEY(s, "identification uid", pb->buf_ptr - 16);
  602. // write generation uid
  603. mxf_write_local_tag(pb, 16, 0x3C09);
  604. mxf_write_uuid(pb, Identification, 1);
  605. mxf_write_local_tag_utf16(pb, 0x3C01, company); // Company Name
  606. mxf_write_local_tag_utf16(pb, 0x3C02, product); // Product Name
  607. mxf_write_local_tag_utf16(pb, 0x3C04, version); // Version String
  608. // write product uid
  609. mxf_write_local_tag(pb, 16, 0x3C05);
  610. mxf_write_uuid(pb, Identification, 2);
  611. // modification date
  612. mxf_write_local_tag(pb, 8, 0x3C06);
  613. avio_wb64(pb, mxf->timestamp);
  614. }
  615. static void mxf_write_content_storage(AVFormatContext *s)
  616. {
  617. AVIOContext *pb = s->pb;
  618. mxf_write_metadata_key(pb, 0x011800);
  619. PRINT_KEY(s, "content storage key", pb->buf_ptr - 16);
  620. klv_encode_ber_length(pb, 92);
  621. // write uid
  622. mxf_write_local_tag(pb, 16, 0x3C0A);
  623. mxf_write_uuid(pb, ContentStorage, 0);
  624. PRINT_KEY(s, "content storage uid", pb->buf_ptr - 16);
  625. // write package reference
  626. mxf_write_local_tag(pb, 16 * 2 + 8, 0x1901);
  627. mxf_write_refs_count(pb, 2);
  628. mxf_write_uuid(pb, MaterialPackage, 0);
  629. mxf_write_uuid(pb, SourcePackage, 0);
  630. // write essence container data
  631. mxf_write_local_tag(pb, 8 + 16, 0x1902);
  632. mxf_write_refs_count(pb, 1);
  633. mxf_write_uuid(pb, EssenceContainerData, 0);
  634. }
  635. static void mxf_write_track(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
  636. {
  637. MXFContext *mxf = s->priv_data;
  638. AVIOContext *pb = s->pb;
  639. MXFStreamContext *sc = st->priv_data;
  640. mxf_write_metadata_key(pb, 0x013b00);
  641. PRINT_KEY(s, "track key", pb->buf_ptr - 16);
  642. klv_encode_ber_length(pb, 80);
  643. // write track uid
  644. mxf_write_local_tag(pb, 16, 0x3C0A);
  645. mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, st->index);
  646. PRINT_KEY(s, "track uid", pb->buf_ptr - 16);
  647. // write track id
  648. mxf_write_local_tag(pb, 4, 0x4801);
  649. avio_wb32(pb, st->index+2);
  650. // write track number
  651. mxf_write_local_tag(pb, 4, 0x4804);
  652. if (type == MaterialPackage)
  653. avio_wb32(pb, 0); // track number of material package is 0
  654. else
  655. avio_write(pb, sc->track_essence_element_key + 12, 4);
  656. mxf_write_local_tag(pb, 8, 0x4B01);
  657. avio_wb32(pb, mxf->time_base.den);
  658. avio_wb32(pb, mxf->time_base.num);
  659. // write origin
  660. mxf_write_local_tag(pb, 8, 0x4B02);
  661. avio_wb64(pb, 0);
  662. // write sequence refs
  663. mxf_write_local_tag(pb, 16, 0x4803);
  664. mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
  665. }
  666. static const uint8_t smpte_12m_timecode_track_data_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x01,0x01,0x00,0x00,0x00 };
  667. static void mxf_write_common_fields(AVFormatContext *s, AVStream *st)
  668. {
  669. MXFContext *mxf = s->priv_data;
  670. AVIOContext *pb = s->pb;
  671. // find data define uls
  672. mxf_write_local_tag(pb, 16, 0x0201);
  673. if (st == mxf->timecode_track)
  674. avio_write(pb, smpte_12m_timecode_track_data_ul, 16);
  675. else {
  676. const MXFCodecUL *data_def_ul = mxf_get_data_definition_ul(st->codec->codec_type);
  677. avio_write(pb, data_def_ul->uid, 16);
  678. }
  679. // write duration
  680. mxf_write_local_tag(pb, 8, 0x0202);
  681. avio_wb64(pb, mxf->duration);
  682. }
  683. static void mxf_write_sequence(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
  684. {
  685. MXFContext *mxf = s->priv_data;
  686. AVIOContext *pb = s->pb;
  687. enum MXFMetadataSetType component;
  688. mxf_write_metadata_key(pb, 0x010f00);
  689. PRINT_KEY(s, "sequence key", pb->buf_ptr - 16);
  690. klv_encode_ber_length(pb, 80);
  691. mxf_write_local_tag(pb, 16, 0x3C0A);
  692. mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
  693. PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
  694. mxf_write_common_fields(s, st);
  695. // write structural component
  696. mxf_write_local_tag(pb, 16 + 8, 0x1001);
  697. mxf_write_refs_count(pb, 1);
  698. if (st == mxf->timecode_track)
  699. component = TimecodeComponent;
  700. else
  701. component = SourceClip;
  702. if (type == SourcePackage)
  703. component += TypeBottom;
  704. mxf_write_uuid(pb, component, st->index);
  705. }
  706. static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
  707. {
  708. MXFContext *mxf = s->priv_data;
  709. AVIOContext *pb = s->pb;
  710. mxf_write_metadata_key(pb, 0x011400);
  711. klv_encode_ber_length(pb, 75);
  712. // UID
  713. mxf_write_local_tag(pb, 16, 0x3C0A);
  714. mxf_write_uuid(pb, type == MaterialPackage ? TimecodeComponent :
  715. TimecodeComponent + TypeBottom, st->index);
  716. mxf_write_common_fields(s, st);
  717. // Start Time Code
  718. mxf_write_local_tag(pb, 8, 0x1501);
  719. avio_wb64(pb, mxf->tc.start);
  720. // Rounded Time Code Base
  721. mxf_write_local_tag(pb, 2, 0x1502);
  722. avio_wb16(pb, mxf->timecode_base);
  723. // Drop Frame
  724. mxf_write_local_tag(pb, 1, 0x1503);
  725. avio_w8(pb, !!(mxf->tc.flags & AV_TIMECODE_FLAG_DROPFRAME));
  726. }
  727. static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
  728. {
  729. AVIOContext *pb = s->pb;
  730. int i;
  731. mxf_write_metadata_key(pb, 0x011100);
  732. PRINT_KEY(s, "sturctural component key", pb->buf_ptr - 16);
  733. klv_encode_ber_length(pb, 108);
  734. // write uid
  735. mxf_write_local_tag(pb, 16, 0x3C0A);
  736. mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, st->index);
  737. PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
  738. mxf_write_common_fields(s, st);
  739. // write start_position
  740. mxf_write_local_tag(pb, 8, 0x1201);
  741. avio_wb64(pb, 0);
  742. // write source package uid, end of the reference
  743. mxf_write_local_tag(pb, 32, 0x1101);
  744. if (type == SourcePackage) {
  745. for (i = 0; i < 4; i++)
  746. avio_wb64(pb, 0);
  747. } else
  748. mxf_write_umid(s, 1);
  749. // write source track id
  750. mxf_write_local_tag(pb, 4, 0x1102);
  751. if (type == SourcePackage)
  752. avio_wb32(pb, 0);
  753. else
  754. avio_wb32(pb, st->index+2);
  755. }
  756. static void mxf_write_multi_descriptor(AVFormatContext *s)
  757. {
  758. MXFContext *mxf = s->priv_data;
  759. AVIOContext *pb = s->pb;
  760. const uint8_t *ul;
  761. int i;
  762. mxf_write_metadata_key(pb, 0x014400);
  763. PRINT_KEY(s, "multiple descriptor key", pb->buf_ptr - 16);
  764. klv_encode_ber_length(pb, 64 + 16LL * s->nb_streams);
  765. mxf_write_local_tag(pb, 16, 0x3C0A);
  766. mxf_write_uuid(pb, MultipleDescriptor, 0);
  767. PRINT_KEY(s, "multi_desc uid", pb->buf_ptr - 16);
  768. // write sample rate
  769. mxf_write_local_tag(pb, 8, 0x3001);
  770. avio_wb32(pb, mxf->time_base.den);
  771. avio_wb32(pb, mxf->time_base.num);
  772. // write essence container ul
  773. mxf_write_local_tag(pb, 16, 0x3004);
  774. if (mxf->essence_container_count > 1)
  775. ul = multiple_desc_ul;
  776. else {
  777. MXFStreamContext *sc = s->streams[0]->priv_data;
  778. ul = mxf_essence_container_uls[sc->index].container_ul;
  779. }
  780. avio_write(pb, ul, 16);
  781. // write sub descriptor refs
  782. mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x3F01);
  783. mxf_write_refs_count(pb, s->nb_streams);
  784. for (i = 0; i < s->nb_streams; i++)
  785. mxf_write_uuid(pb, SubDescriptor, i);
  786. }
  787. static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
  788. {
  789. MXFContext *mxf = s->priv_data;
  790. MXFStreamContext *sc = st->priv_data;
  791. AVIOContext *pb = s->pb;
  792. avio_write(pb, key, 16);
  793. klv_encode_ber4_length(pb, size+20+8+12+20);
  794. mxf_write_local_tag(pb, 16, 0x3C0A);
  795. mxf_write_uuid(pb, SubDescriptor, st->index);
  796. mxf_write_local_tag(pb, 4, 0x3006);
  797. avio_wb32(pb, st->index+2);
  798. mxf_write_local_tag(pb, 8, 0x3001);
  799. avio_wb32(pb, mxf->time_base.den);
  800. avio_wb32(pb, mxf->time_base.num);
  801. mxf_write_local_tag(pb, 16, 0x3004);
  802. avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
  803. }
  804. static const UID mxf_mpegvideo_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 };
  805. static const UID mxf_wav_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 };
  806. static const UID mxf_aes3_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 };
  807. static const UID mxf_cdci_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x28,0x00 };
  808. static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x42,0x00 };
  809. static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
  810. {
  811. MXFStreamContext *sc = st->priv_data;
  812. AVIOContext *pb = s->pb;
  813. int stored_height = (st->codec->height+15)/16*16;
  814. int display_height;
  815. int f1, f2;
  816. unsigned desc_size = size+8+8+8+8+8+8+5+16+sc->interlaced*4+12+20;
  817. if (sc->interlaced && sc->field_dominance)
  818. desc_size += 5;
  819. mxf_write_generic_desc(s, st, key, desc_size);
  820. mxf_write_local_tag(pb, 4, 0x3203);
  821. avio_wb32(pb, st->codec->width);
  822. mxf_write_local_tag(pb, 4, 0x3202);
  823. avio_wb32(pb, stored_height>>sc->interlaced);
  824. mxf_write_local_tag(pb, 4, 0x3209);
  825. avio_wb32(pb, st->codec->width);
  826. if (st->codec->height == 608) // PAL + VBI
  827. display_height = 576;
  828. else if (st->codec->height == 512) // NTSC + VBI
  829. display_height = 486;
  830. else
  831. display_height = st->codec->height;
  832. mxf_write_local_tag(pb, 4, 0x3208);
  833. avio_wb32(pb, display_height>>sc->interlaced);
  834. // component depth
  835. mxf_write_local_tag(pb, 4, 0x3301);
  836. avio_wb32(pb, sc->component_depth);
  837. // horizontal subsampling
  838. mxf_write_local_tag(pb, 4, 0x3302);
  839. avio_wb32(pb, 2);
  840. // frame layout
  841. mxf_write_local_tag(pb, 1, 0x320C);
  842. avio_w8(pb, sc->interlaced);
  843. // video line map
  844. switch (st->codec->height) {
  845. case 576: f1 = 23; f2 = st->codec->codec_id == AV_CODEC_ID_DVVIDEO ? 335 : 336; break;
  846. case 608: f1 = 7; f2 = 320; break;
  847. case 480: f1 = 20; f2 = st->codec->codec_id == AV_CODEC_ID_DVVIDEO ? 285 : 283; break;
  848. case 512: f1 = 7; f2 = 270; break;
  849. case 720: f1 = 26; f2 = 0; break; // progressive
  850. case 1080: f1 = 21; f2 = 584; break;
  851. default: f1 = 0; f2 = 0; break;
  852. }
  853. if (!sc->interlaced) {
  854. f2 = 0;
  855. f1 *= 2;
  856. }
  857. mxf_write_local_tag(pb, 12+sc->interlaced*4, 0x320D);
  858. avio_wb32(pb, sc->interlaced ? 2 : 1);
  859. avio_wb32(pb, 4);
  860. avio_wb32(pb, f1);
  861. if (sc->interlaced)
  862. avio_wb32(pb, f2);
  863. mxf_write_local_tag(pb, 8, 0x320E);
  864. avio_wb32(pb, sc->aspect_ratio.num);
  865. avio_wb32(pb, sc->aspect_ratio.den);
  866. mxf_write_local_tag(pb, 16, 0x3201);
  867. avio_write(pb, *sc->codec_ul, 16);
  868. if (sc->interlaced && sc->field_dominance) {
  869. mxf_write_local_tag(pb, 1, 0x3212);
  870. avio_w8(pb, sc->field_dominance);
  871. }
  872. }
  873. static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st)
  874. {
  875. mxf_write_cdci_common(s, st, mxf_cdci_descriptor_key, 0);
  876. }
  877. static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
  878. {
  879. AVIOContext *pb = s->pb;
  880. MXFStreamContext *sc = st->priv_data;
  881. int profile_and_level = (st->codec->profile<<4) | st->codec->level;
  882. if (st->codec->codec_id != AV_CODEC_ID_H264) {
  883. mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 8+5);
  884. // bit rate
  885. mxf_write_local_tag(pb, 4, 0x8000);
  886. avio_wb32(pb, sc->video_bit_rate);
  887. // profile and level
  888. mxf_write_local_tag(pb, 1, 0x8007);
  889. if (!st->codec->profile)
  890. profile_and_level |= 0x80; // escape bit
  891. avio_w8(pb, profile_and_level);
  892. } else {
  893. mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 0);
  894. }
  895. }
  896. static void mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
  897. {
  898. AVIOContext *pb = s->pb;
  899. MXFContext *mxf = s->priv_data;
  900. int show_warnings = !mxf->footer_partition_offset;
  901. mxf_write_generic_desc(s, st, key, size+5+12+8+8);
  902. // audio locked
  903. mxf_write_local_tag(pb, 1, 0x3D02);
  904. avio_w8(pb, 1);
  905. // write audio sampling rate
  906. mxf_write_local_tag(pb, 8, 0x3D03);
  907. avio_wb32(pb, st->codec->sample_rate);
  908. avio_wb32(pb, 1);
  909. mxf_write_local_tag(pb, 4, 0x3D07);
  910. if (mxf->channel_count == -1) {
  911. if (show_warnings && (s->oformat == &ff_mxf_d10_muxer) && (st->codec->channels != 4) && (st->codec->channels != 8))
  912. av_log(s, AV_LOG_WARNING, "the number of audio channels shall be 4 or 8 : the output will not comply to MXF D-10 specs, use -d10_channelcount to fix this\n");
  913. avio_wb32(pb, st->codec->channels);
  914. } else if (s->oformat == &ff_mxf_d10_muxer) {
  915. if (show_warnings && (mxf->channel_count < st->codec->channels))
  916. av_log(s, AV_LOG_WARNING, "d10_channelcount < actual number of audio channels : some channels will be discarded\n");
  917. if (show_warnings && (mxf->channel_count != 4) && (mxf->channel_count != 8))
  918. av_log(s, AV_LOG_WARNING, "d10_channelcount shall be set to 4 or 8 : the output will not comply to MXF D-10 specs\n");
  919. avio_wb32(pb, mxf->channel_count);
  920. } else {
  921. if (show_warnings && mxf->channel_count != -1)
  922. av_log(s, AV_LOG_ERROR, "-d10_channelcount requires MXF D-10 and will be ignored\n");
  923. avio_wb32(pb, st->codec->channels);
  924. }
  925. mxf_write_local_tag(pb, 4, 0x3D01);
  926. avio_wb32(pb, av_get_bits_per_sample(st->codec->codec_id));
  927. }
  928. static void mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
  929. {
  930. AVIOContext *pb = s->pb;
  931. mxf_write_generic_sound_common(s, st, key, size+6+8);
  932. mxf_write_local_tag(pb, 2, 0x3D0A);
  933. avio_wb16(pb, st->codec->block_align);
  934. // avg bytes per sec
  935. mxf_write_local_tag(pb, 4, 0x3D09);
  936. avio_wb32(pb, st->codec->block_align*st->codec->sample_rate);
  937. }
  938. static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
  939. {
  940. mxf_write_wav_common(s, st, mxf_wav_descriptor_key, 0);
  941. }
  942. static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st)
  943. {
  944. mxf_write_wav_common(s, st, mxf_aes3_descriptor_key, 0);
  945. }
  946. static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st)
  947. {
  948. mxf_write_generic_sound_common(s, st, mxf_generic_sound_descriptor_key, 0);
  949. }
  950. static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
  951. {
  952. MXFContext *mxf = s->priv_data;
  953. AVIOContext *pb = s->pb;
  954. int i, track_count = s->nb_streams+1;
  955. if (type == MaterialPackage) {
  956. mxf_write_metadata_key(pb, 0x013600);
  957. PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
  958. klv_encode_ber_length(pb, 92 + 16*track_count);
  959. } else {
  960. mxf_write_metadata_key(pb, 0x013700);
  961. PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
  962. klv_encode_ber_length(pb, 112 + 16*track_count); // 20 bytes length for descriptor reference
  963. }
  964. // write uid
  965. mxf_write_local_tag(pb, 16, 0x3C0A);
  966. mxf_write_uuid(pb, type, 0);
  967. av_log(s,AV_LOG_DEBUG, "package type:%d\n", type);
  968. PRINT_KEY(s, "package uid", pb->buf_ptr - 16);
  969. // write package umid
  970. mxf_write_local_tag(pb, 32, 0x4401);
  971. mxf_write_umid(s, type == SourcePackage);
  972. PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
  973. // package creation date
  974. mxf_write_local_tag(pb, 8, 0x4405);
  975. avio_wb64(pb, mxf->timestamp);
  976. // package modified date
  977. mxf_write_local_tag(pb, 8, 0x4404);
  978. avio_wb64(pb, mxf->timestamp);
  979. // write track refs
  980. mxf_write_local_tag(pb, track_count*16 + 8, 0x4403);
  981. mxf_write_refs_count(pb, track_count);
  982. mxf_write_uuid(pb, type == MaterialPackage ? Track :
  983. Track + TypeBottom, -1); // timecode track
  984. for (i = 0; i < s->nb_streams; i++)
  985. mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i);
  986. // write multiple descriptor reference
  987. if (type == SourcePackage) {
  988. mxf_write_local_tag(pb, 16, 0x4701);
  989. if (s->nb_streams > 1) {
  990. mxf_write_uuid(pb, MultipleDescriptor, 0);
  991. mxf_write_multi_descriptor(s);
  992. } else
  993. mxf_write_uuid(pb, SubDescriptor, 0);
  994. }
  995. // write timecode track
  996. mxf_write_track(s, mxf->timecode_track, type);
  997. mxf_write_sequence(s, mxf->timecode_track, type);
  998. mxf_write_timecode_component(s, mxf->timecode_track, type);
  999. for (i = 0; i < s->nb_streams; i++) {
  1000. AVStream *st = s->streams[i];
  1001. mxf_write_track(s, st, type);
  1002. mxf_write_sequence(s, st, type);
  1003. mxf_write_structural_component(s, st, type);
  1004. if (type == SourcePackage) {
  1005. MXFStreamContext *sc = st->priv_data;
  1006. mxf_essence_container_uls[sc->index].write_desc(s, st);
  1007. }
  1008. }
  1009. }
  1010. static int mxf_write_essence_container_data(AVFormatContext *s)
  1011. {
  1012. AVIOContext *pb = s->pb;
  1013. mxf_write_metadata_key(pb, 0x012300);
  1014. klv_encode_ber_length(pb, 72);
  1015. mxf_write_local_tag(pb, 16, 0x3C0A); // Instance UID
  1016. mxf_write_uuid(pb, EssenceContainerData, 0);
  1017. mxf_write_local_tag(pb, 32, 0x2701); // Linked Package UID
  1018. mxf_write_umid(s, 1);
  1019. mxf_write_local_tag(pb, 4, 0x3F07); // BodySID
  1020. avio_wb32(pb, 1);
  1021. mxf_write_local_tag(pb, 4, 0x3F06); // IndexSID
  1022. avio_wb32(pb, 2);
  1023. return 0;
  1024. }
  1025. static int mxf_write_header_metadata_sets(AVFormatContext *s)
  1026. {
  1027. mxf_write_preface(s);
  1028. mxf_write_identification(s);
  1029. mxf_write_content_storage(s);
  1030. mxf_write_package(s, MaterialPackage);
  1031. mxf_write_package(s, SourcePackage);
  1032. mxf_write_essence_container_data(s);
  1033. return 0;
  1034. }
  1035. static unsigned klv_fill_size(uint64_t size)
  1036. {
  1037. unsigned pad = KAG_SIZE - (size & (KAG_SIZE-1));
  1038. if (pad < 20) // smallest fill item possible
  1039. return pad + KAG_SIZE;
  1040. else
  1041. return pad & (KAG_SIZE-1);
  1042. }
  1043. static void mxf_write_index_table_segment(AVFormatContext *s)
  1044. {
  1045. MXFContext *mxf = s->priv_data;
  1046. AVIOContext *pb = s->pb;
  1047. int i, j, temporal_reordering = 0;
  1048. int key_index = mxf->last_key_index;
  1049. av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count);
  1050. if (!mxf->edit_units_count && !mxf->edit_unit_byte_count)
  1051. return;
  1052. avio_write(pb, index_table_segment_key, 16);
  1053. if (mxf->edit_unit_byte_count) {
  1054. klv_encode_ber_length(pb, 80);
  1055. } else {
  1056. klv_encode_ber_length(pb, 85 + 12+(s->nb_streams+1LL)*6 +
  1057. 12+mxf->edit_units_count*(11+mxf->slice_count*4LL));
  1058. }
  1059. // instance id
  1060. mxf_write_local_tag(pb, 16, 0x3C0A);
  1061. mxf_write_uuid(pb, IndexTableSegment, 0);
  1062. // index edit rate
  1063. mxf_write_local_tag(pb, 8, 0x3F0B);
  1064. avio_wb32(pb, mxf->time_base.den);
  1065. avio_wb32(pb, mxf->time_base.num);
  1066. // index start position
  1067. mxf_write_local_tag(pb, 8, 0x3F0C);
  1068. avio_wb64(pb, mxf->last_indexed_edit_unit);
  1069. // index duration
  1070. mxf_write_local_tag(pb, 8, 0x3F0D);
  1071. if (mxf->edit_unit_byte_count)
  1072. avio_wb64(pb, 0); // index table covers whole container
  1073. else
  1074. avio_wb64(pb, mxf->edit_units_count);
  1075. // edit unit byte count
  1076. mxf_write_local_tag(pb, 4, 0x3F05);
  1077. avio_wb32(pb, mxf->edit_unit_byte_count);
  1078. // index sid
  1079. mxf_write_local_tag(pb, 4, 0x3F06);
  1080. avio_wb32(pb, 2);
  1081. // body sid
  1082. mxf_write_local_tag(pb, 4, 0x3F07);
  1083. avio_wb32(pb, 1);
  1084. if (!mxf->edit_unit_byte_count) {
  1085. // real slice count - 1
  1086. mxf_write_local_tag(pb, 1, 0x3F08);
  1087. avio_w8(pb, mxf->slice_count);
  1088. // delta entry array
  1089. mxf_write_local_tag(pb, 8 + (s->nb_streams+1)*6, 0x3F09);
  1090. avio_wb32(pb, s->nb_streams+1); // num of entries
  1091. avio_wb32(pb, 6); // size of one entry
  1092. // write system item delta entry
  1093. avio_w8(pb, 0);
  1094. avio_w8(pb, 0); // slice entry
  1095. avio_wb32(pb, 0); // element delta
  1096. for (i = 0; i < s->nb_streams; i++) {
  1097. AVStream *st = s->streams[i];
  1098. MXFStreamContext *sc = st->priv_data;
  1099. avio_w8(pb, sc->temporal_reordering);
  1100. if (sc->temporal_reordering)
  1101. temporal_reordering = 1;
  1102. if (i == 0) { // video track
  1103. avio_w8(pb, 0); // slice number
  1104. avio_wb32(pb, KAG_SIZE); // system item size including klv fill
  1105. } else { // audio track
  1106. unsigned audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size;
  1107. audio_frame_size += klv_fill_size(audio_frame_size);
  1108. avio_w8(pb, 1);
  1109. avio_wb32(pb, (i-1)*audio_frame_size); // element delta
  1110. }
  1111. }
  1112. mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+mxf->slice_count*4), 0x3F0A);
  1113. avio_wb32(pb, mxf->edit_units_count); // num of entries
  1114. avio_wb32(pb, 11+mxf->slice_count*4); // size of one entry
  1115. for (i = 0; i < mxf->edit_units_count; i++) {
  1116. int temporal_offset = 0;
  1117. if (!(mxf->index_entries[i].flags & 0x33)) { // I frame
  1118. mxf->last_key_index = key_index;
  1119. key_index = i;
  1120. }
  1121. if (temporal_reordering) {
  1122. int pic_num_in_gop = i - key_index;
  1123. if (pic_num_in_gop != mxf->index_entries[i].temporal_ref) {
  1124. for (j = key_index; j < mxf->edit_units_count; j++) {
  1125. if (pic_num_in_gop == mxf->index_entries[j].temporal_ref)
  1126. break;
  1127. }
  1128. if (j == mxf->edit_units_count)
  1129. av_log(s, AV_LOG_WARNING, "missing frames\n");
  1130. temporal_offset = j - key_index - pic_num_in_gop;
  1131. }
  1132. }
  1133. avio_w8(pb, temporal_offset);
  1134. if ((mxf->index_entries[i].flags & 0x30) == 0x30) { // back and forward prediction
  1135. avio_w8(pb, mxf->last_key_index - i);
  1136. } else {
  1137. avio_w8(pb, key_index - i); // key frame offset
  1138. if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward
  1139. mxf->last_key_index = key_index;
  1140. }
  1141. if (!(mxf->index_entries[i].flags & 0x33) && // I frame
  1142. mxf->index_entries[i].flags & 0x40 && !temporal_offset)
  1143. mxf->index_entries[i].flags |= 0x80; // random access
  1144. avio_w8(pb, mxf->index_entries[i].flags);
  1145. // stream offset
  1146. avio_wb64(pb, mxf->index_entries[i].offset);
  1147. if (s->nb_streams > 1)
  1148. avio_wb32(pb, mxf->index_entries[i].slice_offset);
  1149. }
  1150. mxf->last_key_index = key_index - mxf->edit_units_count;
  1151. mxf->last_indexed_edit_unit += mxf->edit_units_count;
  1152. mxf->edit_units_count = 0;
  1153. }
  1154. }
  1155. static void mxf_write_klv_fill(AVFormatContext *s)
  1156. {
  1157. unsigned pad = klv_fill_size(avio_tell(s->pb));
  1158. if (pad) {
  1159. avio_write(s->pb, klv_fill_key, 16);
  1160. pad -= 16 + 4;
  1161. klv_encode_ber4_length(s->pb, pad);
  1162. ffio_fill(s->pb, 0, pad);
  1163. av_assert1(!(avio_tell(s->pb) & (KAG_SIZE-1)));
  1164. }
  1165. }
  1166. static int mxf_write_partition(AVFormatContext *s, int bodysid,
  1167. int indexsid,
  1168. const uint8_t *key, int write_metadata)
  1169. {
  1170. MXFContext *mxf = s->priv_data;
  1171. AVIOContext *pb = s->pb;
  1172. int64_t header_byte_count_offset;
  1173. unsigned index_byte_count = 0;
  1174. uint64_t partition_offset = avio_tell(pb);
  1175. int err;
  1176. if (!mxf->edit_unit_byte_count && mxf->edit_units_count)
  1177. index_byte_count = 85 + 12+(s->nb_streams+1)*6 +
  1178. 12+mxf->edit_units_count*(11+mxf->slice_count*4);
  1179. else if (mxf->edit_unit_byte_count && indexsid)
  1180. index_byte_count = 80;
  1181. if (index_byte_count) {
  1182. // add encoded ber length
  1183. index_byte_count += 16 + klv_ber_length(index_byte_count);
  1184. index_byte_count += klv_fill_size(index_byte_count);
  1185. }
  1186. if (key && !memcmp(key, body_partition_key, 16)) {
  1187. if ((err = av_reallocp_array(&mxf->body_partition_offset, mxf->body_partitions_count + 1,
  1188. sizeof(*mxf->body_partition_offset))) < 0) {
  1189. mxf->body_partitions_count = 0;
  1190. return err;
  1191. }
  1192. mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset;
  1193. }
  1194. // write klv
  1195. if (key)
  1196. avio_write(pb, key, 16);
  1197. else
  1198. avio_write(pb, body_partition_key, 16);
  1199. klv_encode_ber_length(pb, 88 + 16LL * DESCRIPTOR_COUNT(mxf->essence_container_count));
  1200. // write partition value
  1201. avio_wb16(pb, 1); // majorVersion
  1202. avio_wb16(pb, 2); // minorVersion
  1203. avio_wb32(pb, KAG_SIZE); // KAGSize
  1204. avio_wb64(pb, partition_offset); // ThisPartition
  1205. if (key && !memcmp(key, body_partition_key, 16) && mxf->body_partitions_count > 1)
  1206. avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); // PreviousPartition
  1207. else if (key && !memcmp(key, footer_partition_key, 16) && mxf->body_partitions_count)
  1208. avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); // PreviousPartition
  1209. else
  1210. avio_wb64(pb, 0);
  1211. avio_wb64(pb, mxf->footer_partition_offset); // footerPartition
  1212. // set offset
  1213. header_byte_count_offset = avio_tell(pb);
  1214. avio_wb64(pb, 0); // headerByteCount, update later
  1215. // indexTable
  1216. avio_wb64(pb, index_byte_count); // indexByteCount
  1217. avio_wb32(pb, index_byte_count ? indexsid : 0); // indexSID
  1218. // BodyOffset
  1219. if (bodysid && mxf->edit_units_count && mxf->body_partitions_count && s->oformat != &ff_mxf_opatom_muxer)
  1220. avio_wb64(pb, mxf->body_offset);
  1221. else
  1222. avio_wb64(pb, 0);
  1223. avio_wb32(pb, bodysid); // bodySID
  1224. // operational pattern
  1225. if (s->oformat == &ff_mxf_opatom_muxer)
  1226. avio_write(pb, opatom_ul, 16);
  1227. else
  1228. avio_write(pb, op1a_ul, 16);
  1229. // essence container
  1230. mxf_write_essence_container_refs(s);
  1231. if (write_metadata) {
  1232. // mark the start of the headermetadata and calculate metadata size
  1233. int64_t pos, start;
  1234. unsigned header_byte_count;
  1235. mxf_write_klv_fill(s);
  1236. start = avio_tell(s->pb);
  1237. mxf_write_primer_pack(s);
  1238. mxf_write_header_metadata_sets(s);
  1239. pos = avio_tell(s->pb);
  1240. header_byte_count = pos - start + klv_fill_size(pos);
  1241. // update header_byte_count
  1242. avio_seek(pb, header_byte_count_offset, SEEK_SET);
  1243. avio_wb64(pb, header_byte_count);
  1244. avio_seek(pb, pos, SEEK_SET);
  1245. }
  1246. if(key)
  1247. avio_flush(pb);
  1248. return 0;
  1249. }
  1250. static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st,
  1251. AVPacket *pkt)
  1252. {
  1253. MXFContext *mxf = s->priv_data;
  1254. MXFStreamContext *sc = st->priv_data;
  1255. int i, cid;
  1256. uint8_t* header_cid;
  1257. int frame_size = 0;
  1258. if (mxf->header_written)
  1259. return 1;
  1260. if (pkt->size < 43)
  1261. return -1;
  1262. header_cid = pkt->data + 0x28;
  1263. cid = header_cid[0] << 24 | header_cid[1] << 16 | header_cid[2] << 8 | header_cid[3];
  1264. if ((frame_size = avpriv_dnxhd_get_frame_size(cid)) < 0)
  1265. return -1;
  1266. switch (cid) {
  1267. case 1235:
  1268. sc->index = 24;
  1269. sc->component_depth = 10;
  1270. break;
  1271. case 1237:
  1272. sc->index = 25;
  1273. break;
  1274. case 1238:
  1275. sc->index = 26;
  1276. break;
  1277. case 1241:
  1278. sc->index = 27;
  1279. sc->component_depth = 10;
  1280. break;
  1281. case 1242:
  1282. sc->index = 28;
  1283. break;
  1284. case 1243:
  1285. sc->index = 29;
  1286. break;
  1287. case 1250:
  1288. sc->index = 30;
  1289. sc->component_depth = 10;
  1290. break;
  1291. case 1251:
  1292. sc->index = 31;
  1293. break;
  1294. case 1252:
  1295. sc->index = 32;
  1296. break;
  1297. case 1253:
  1298. sc->index = 33;
  1299. break;
  1300. default:
  1301. return -1;
  1302. }
  1303. sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
  1304. sc->aspect_ratio = (AVRational){ 16, 9 };
  1305. if(s->oformat == &ff_mxf_opatom_muxer){
  1306. mxf->edit_unit_byte_count = frame_size;
  1307. return 1;
  1308. }
  1309. mxf->edit_unit_byte_count = KAG_SIZE;
  1310. for (i = 0; i < s->nb_streams; i++) {
  1311. AVStream *st = s->streams[i];
  1312. MXFStreamContext *sc = st->priv_data;
  1313. if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
  1314. mxf->edit_unit_byte_count += 16 + 4 + sc->aic.samples[0]*sc->aic.sample_size;
  1315. mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
  1316. } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
  1317. mxf->edit_unit_byte_count += 16 + 4 + frame_size;
  1318. mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
  1319. }
  1320. }
  1321. return 1;
  1322. }
  1323. static int mxf_parse_dv_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
  1324. {
  1325. MXFContext *mxf = s->priv_data;
  1326. MXFStreamContext *sc = st->priv_data;
  1327. uint8_t *vs_pack, *vsc_pack;
  1328. int i, ul_index, frame_size, stype, pal;
  1329. if (mxf->header_written)
  1330. return 1;
  1331. // Check for minimal frame size
  1332. if (pkt->size < 120000)
  1333. return -1;
  1334. vs_pack = pkt->data + 80*5 + 48;
  1335. vsc_pack = pkt->data + 80*5 + 53;
  1336. stype = vs_pack[3] & 0x1f;
  1337. pal = (vs_pack[3] >> 5) & 0x1;
  1338. if ((vs_pack[2] & 0x07) == 0x02)
  1339. sc->aspect_ratio = (AVRational){ 16, 9 };
  1340. else
  1341. sc->aspect_ratio = (AVRational){ 4, 3 };
  1342. sc->interlaced = (vsc_pack[3] >> 4) & 0x01;
  1343. // TODO: fix dv encoder to set proper FF/FS value in VSC pack
  1344. // and set field dominance accordingly
  1345. // av_log(s, AV_LOG_DEBUG, "DV vsc pack ff/ss = %x\n", vsc_pack[2] >> 6);
  1346. switch (stype) {
  1347. case 0x18: // DV100 720p
  1348. ul_index = 6 + pal;
  1349. frame_size = pal ? 288000 : 240000;
  1350. if (sc->interlaced) {
  1351. av_log(s, AV_LOG_ERROR, "source marked as interlaced but codec profile is progressive\n");
  1352. sc->interlaced = 0;
  1353. }
  1354. break;
  1355. case 0x14: // DV100 1080i
  1356. ul_index = 4 + pal;
  1357. frame_size = pal ? 576000 : 480000;
  1358. break;
  1359. case 0x04: // DV50
  1360. ul_index = 2 + pal;
  1361. frame_size = pal ? 288000 : 240000;
  1362. break;
  1363. default: // DV25
  1364. ul_index = 0 + pal;
  1365. frame_size = pal ? 144000 : 120000;
  1366. }
  1367. sc->index = ul_index + 16;
  1368. sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
  1369. if(s->oformat == &ff_mxf_opatom_muxer) {
  1370. mxf->edit_unit_byte_count = frame_size;
  1371. return 1;
  1372. }
  1373. mxf->edit_unit_byte_count = KAG_SIZE;
  1374. for (i = 0; i < s->nb_streams; i++) {
  1375. AVStream *st = s->streams[i];
  1376. MXFStreamContext *sc = st->priv_data;
  1377. if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
  1378. mxf->edit_unit_byte_count += 16 + 4 + sc->aic.samples[0]*sc->aic.sample_size;
  1379. mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
  1380. } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
  1381. mxf->edit_unit_byte_count += 16 + 4 + frame_size;
  1382. mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
  1383. }
  1384. }
  1385. return 1;
  1386. }
  1387. static const struct {
  1388. UID uid;
  1389. int frame_size;
  1390. int profile;
  1391. uint8_t interlaced;
  1392. } mxf_h264_codec_uls[] = {
  1393. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x20,0x01 }, 0, 110, 0 }, // AVC High 10 Intra
  1394. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 232960, 0, 1 }, // AVC Intra 50 1080i60
  1395. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 281088, 0, 1 }, // AVC Intra 50 1080i50
  1396. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 232960, 0, 0 }, // AVC Intra 50 1080p30
  1397. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 281088, 0, 0 }, // AVC Intra 50 1080p25
  1398. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x08 }, 116736, 0, 0 }, // AVC Intra 50 720p60
  1399. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x09 }, 140800, 0, 0 }, // AVC Intra 50 720p50
  1400. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x30,0x01 }, 0, 122, 0 }, // AVC High 422 Intra
  1401. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x01 }, 472576, 0, 1 }, // AVC Intra 100 1080i60
  1402. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x02 }, 568832, 0, 1 }, // AVC Intra 100 1080i50
  1403. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x03 }, 472576, 0, 0 }, // AVC Intra 100 1080p30
  1404. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x04 }, 568832, 0, 0 }, // AVC Intra 100 1080p25
  1405. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x08 }, 236544, 0, 0 }, // AVC Intra 100 720p60
  1406. {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x09 }, 284672, 0, 0 }, // AVC Intra 100 720p50
  1407. };
  1408. static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st,
  1409. AVPacket *pkt, MXFIndexEntry *e)
  1410. {
  1411. MXFContext *mxf = s->priv_data;
  1412. MXFStreamContext *sc = st->priv_data;
  1413. static const int mxf_h264_num_codec_uls = sizeof(mxf_h264_codec_uls) / sizeof(mxf_h264_codec_uls[0]);
  1414. const uint8_t *buf = pkt->data;
  1415. const uint8_t *buf_end = pkt->data + pkt->size;
  1416. uint32_t state = -1;
  1417. int extra_size = 512; // support AVC Intra files without SPS/PPS header
  1418. int i, frame_size;
  1419. uint8_t uid_found;
  1420. if (pkt->size > extra_size)
  1421. buf_end -= pkt->size - extra_size; // no need to parse beyond SPS/PPS header
  1422. for (;;) {
  1423. buf = avpriv_find_start_code(buf, buf_end, &state);
  1424. if (buf >= buf_end)
  1425. break;
  1426. --buf;
  1427. switch (state & 0x1f) {
  1428. case NAL_SPS:
  1429. st->codec->profile = buf[1];
  1430. e->flags |= 0x40;
  1431. break;
  1432. case NAL_PPS:
  1433. if (e->flags & 0x40) { // sequence header present
  1434. e->flags |= 0x80; // random access
  1435. extra_size = 0;
  1436. buf = buf_end;
  1437. }
  1438. break;
  1439. default:
  1440. break;
  1441. }
  1442. }
  1443. if (mxf->header_written)
  1444. return 1;
  1445. sc->aspect_ratio = (AVRational){ 16, 9 }; // 16:9 is mandatory for broadcast HD
  1446. sc->component_depth = 10; // AVC Intra is always 10 Bit
  1447. sc->interlaced = st->codec->field_order != AV_FIELD_PROGRESSIVE ? 1 : 0;
  1448. if (sc->interlaced)
  1449. sc->field_dominance = 1; // top field first is mandatory for AVC Intra
  1450. uid_found = 0;
  1451. frame_size = pkt->size + extra_size;
  1452. for (i = 0; i < mxf_h264_num_codec_uls; i++) {
  1453. if (frame_size == mxf_h264_codec_uls[i].frame_size && sc->interlaced == mxf_h264_codec_uls[i].interlaced) {
  1454. sc->codec_ul = &mxf_h264_codec_uls[i].uid;
  1455. return 1;
  1456. } else if (st->codec->profile == mxf_h264_codec_uls[i].profile) {
  1457. sc->codec_ul = &mxf_h264_codec_uls[i].uid;
  1458. uid_found = 1;
  1459. }
  1460. }
  1461. if (!uid_found) {
  1462. av_log(s, AV_LOG_ERROR, "AVC Intra 50/100 supported only\n");
  1463. return 0;
  1464. }
  1465. return 1;
  1466. }
  1467. static const UID mxf_mpeg2_codec_uls[] = {
  1468. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x10,0x00 }, // MP-ML I-Frame
  1469. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, // MP-ML Long GOP
  1470. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, // 422P-ML I-Frame
  1471. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, // 422P-ML Long GOP
  1472. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x02,0x00 }, // MP-HL I-Frame
  1473. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, // MP-HL Long GOP
  1474. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, // 422P-HL I-Frame
  1475. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, // 422P-HL Long GOP
  1476. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x05,0x02,0x00 }, // MP@H-14 I-Frame
  1477. { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x05,0x03,0x00 }, // MP@H-14 Long GOP
  1478. };
  1479. static const UID *mxf_get_mpeg2_codec_ul(AVCodecContext *avctx)
  1480. {
  1481. int long_gop = avctx->gop_size > 1 || avctx->has_b_frames;
  1482. if (avctx->profile == 4) { // Main
  1483. if (avctx->level == 8) // Main
  1484. return &mxf_mpeg2_codec_uls[0+long_gop];
  1485. else if (avctx->level == 4) // High
  1486. return &mxf_mpeg2_codec_uls[4+long_gop];
  1487. else if (avctx->level == 6) // High 14
  1488. return &mxf_mpeg2_codec_uls[8+long_gop];
  1489. } else if (avctx->profile == 0) { // 422
  1490. if (avctx->level == 5) // Main
  1491. return &mxf_mpeg2_codec_uls[2+long_gop];
  1492. else if (avctx->level == 2) // High
  1493. return &mxf_mpeg2_codec_uls[6+long_gop];
  1494. }
  1495. return NULL;
  1496. }
  1497. static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st,
  1498. AVPacket *pkt, MXFIndexEntry *e)
  1499. {
  1500. MXFStreamContext *sc = st->priv_data;
  1501. uint32_t c = -1;
  1502. int i;
  1503. for(i = 0; i < pkt->size - 4; i++) {
  1504. c = (c<<8) + pkt->data[i];
  1505. if (c == 0x1b5) {
  1506. if ((pkt->data[i+1] & 0xf0) == 0x10) { // seq ext
  1507. st->codec->profile = pkt->data[i+1] & 0x07;
  1508. st->codec->level = pkt->data[i+2] >> 4;
  1509. } else if (i + 5 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x80) { // pict coding ext
  1510. sc->interlaced = !(pkt->data[i+5] & 0x80); // progressive frame
  1511. if (sc->interlaced)
  1512. sc->field_dominance = 1 + !(pkt->data[i+4] & 0x80); // top field first
  1513. break;
  1514. }
  1515. } else if (c == 0x1b8) { // gop
  1516. if (pkt->data[i+4]>>6 & 0x01) { // closed
  1517. sc->closed_gop = 1;
  1518. if (e->flags & 0x40) // sequence header present
  1519. e->flags |= 0x80; // random access
  1520. }
  1521. } else if (c == 0x1b3) { // seq
  1522. e->flags |= 0x40;
  1523. switch ((pkt->data[i+4]>>4) & 0xf) {
  1524. case 2: sc->aspect_ratio = (AVRational){ 4, 3}; break;
  1525. case 3: sc->aspect_ratio = (AVRational){ 16, 9}; break;
  1526. case 4: sc->aspect_ratio = (AVRational){221,100}; break;
  1527. default:
  1528. av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
  1529. st->codec->width, st->codec->height, 1024*1024);
  1530. }
  1531. } else if (c == 0x100) { // pic
  1532. int pict_type = (pkt->data[i+2]>>3) & 0x07;
  1533. e->temporal_ref = (pkt->data[i+1]<<2) | (pkt->data[i+2]>>6);
  1534. if (pict_type == 2) { // P frame
  1535. e->flags |= 0x22;
  1536. sc->closed_gop = 0; // reset closed gop, don't matter anymore
  1537. } else if (pict_type == 3) { // B frame
  1538. if (sc->closed_gop)
  1539. e->flags |= 0x13; // only backward prediction
  1540. else
  1541. e->flags |= 0x33;
  1542. sc->temporal_reordering = -1;
  1543. } else if (!pict_type) {
  1544. av_log(s, AV_LOG_ERROR, "error parsing mpeg2 frame\n");
  1545. return 0;
  1546. }
  1547. }
  1548. }
  1549. if (s->oformat != &ff_mxf_d10_muxer)
  1550. sc->codec_ul = mxf_get_mpeg2_codec_ul(st->codec);
  1551. return !!sc->codec_ul;
  1552. }
  1553. static uint64_t mxf_parse_timestamp(time_t timestamp)
  1554. {
  1555. struct tm tmbuf;
  1556. struct tm *time = gmtime_r(&timestamp, &tmbuf);
  1557. if (!time)
  1558. return 0;
  1559. return (uint64_t)(time->tm_year+1900) << 48 |
  1560. (uint64_t)(time->tm_mon+1) << 40 |
  1561. (uint64_t) time->tm_mday << 32 |
  1562. time->tm_hour << 24 |
  1563. time->tm_min << 16 |
  1564. time->tm_sec << 8;
  1565. }
  1566. static void mxf_gen_umid(AVFormatContext *s)
  1567. {
  1568. MXFContext *mxf = s->priv_data;
  1569. uint32_t seed = av_get_random_seed();
  1570. uint64_t umid = seed + 0x5294713400000000LL;
  1571. AV_WB64(mxf->umid , umid);
  1572. AV_WB64(mxf->umid+8, umid>>8);
  1573. mxf->instance_number = seed & 0xFFFFFF;
  1574. }
  1575. static int mxf_write_header(AVFormatContext *s)
  1576. {
  1577. MXFContext *mxf = s->priv_data;
  1578. int i, ret;
  1579. uint8_t present[FF_ARRAY_ELEMS(mxf_essence_container_uls)] = {0};
  1580. const MXFSamplesPerFrame *spf = NULL;
  1581. AVDictionaryEntry *t;
  1582. int64_t timestamp = 0;
  1583. AVDictionaryEntry *tcr = av_dict_get(s->metadata, "timecode", NULL, 0);
  1584. if (!s->nb_streams)
  1585. return -1;
  1586. if (s->oformat == &ff_mxf_opatom_muxer && s->nb_streams !=1){
  1587. av_log(s, AV_LOG_ERROR, "there must be exactly one stream for mxf opatom\n");
  1588. return -1;
  1589. }
  1590. for (i = 0; i < s->nb_streams; i++) {
  1591. AVStream *st = s->streams[i];
  1592. MXFStreamContext *sc = av_mallocz(sizeof(*sc));
  1593. if (!sc)
  1594. return AVERROR(ENOMEM);
  1595. st->priv_data = sc;
  1596. if ((i == 0) ^ (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)) {
  1597. av_log(s, AV_LOG_ERROR, "there must be exactly one video stream and it must be the first one\n");
  1598. return -1;
  1599. }
  1600. if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
  1601. // TODO: should be avg_frame_rate
  1602. AVRational rate, tbc = st->time_base;
  1603. // Default component depth to 8
  1604. sc->component_depth = 8;
  1605. mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
  1606. spf = ff_mxf_get_samples_per_frame(s, tbc);
  1607. if (!spf) {
  1608. av_log(s, AV_LOG_ERROR, "Unsupported video frame rate %d/%d\n",
  1609. tbc.den, tbc.num);
  1610. return AVERROR(EINVAL);
  1611. }
  1612. mxf->time_base = spf->time_base;
  1613. rate = av_inv_q(mxf->time_base);
  1614. avpriv_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
  1615. if (!tcr)
  1616. tcr = av_dict_get(st->metadata, "timecode", NULL, 0);
  1617. if (tcr)
  1618. ret = av_timecode_init_from_string(&mxf->tc, rate, tcr->value, s);
  1619. else
  1620. ret = av_timecode_init(&mxf->tc, rate, 0, 0, s);
  1621. if (ret < 0)
  1622. return ret;
  1623. sc->video_bit_rate = st->codec->bit_rate ? st->codec->bit_rate : st->codec->rc_max_rate;
  1624. if (s->oformat == &ff_mxf_d10_muxer) {
  1625. if (sc->video_bit_rate == 50000000) {
  1626. if (mxf->time_base.den == 25) sc->index = 3;
  1627. else sc->index = 5;
  1628. } else if (sc->video_bit_rate == 40000000) {
  1629. if (mxf->time_base.den == 25) sc->index = 7;
  1630. else sc->index = 9;
  1631. } else if (sc->video_bit_rate == 30000000) {
  1632. if (mxf->time_base.den == 25) sc->index = 11;
  1633. else sc->index = 13;
  1634. } else {
  1635. av_log(s, AV_LOG_ERROR, "error MXF D-10 only support 30/40/50 mbit/s\n");
  1636. return -1;
  1637. }
  1638. mxf->edit_unit_byte_count = KAG_SIZE; // system element
  1639. mxf->edit_unit_byte_count += 16 + 4 + (uint64_t)sc->video_bit_rate *
  1640. mxf->time_base.num / (8*mxf->time_base.den);
  1641. mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
  1642. mxf->edit_unit_byte_count += 16 + 4 + 4 + spf->samples_per_frame[0]*8*4;
  1643. mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
  1644. }
  1645. } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
  1646. if (st->codec->sample_rate != 48000) {
  1647. av_log(s, AV_LOG_ERROR, "only 48khz is implemented\n");
  1648. return -1;
  1649. }
  1650. avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
  1651. if (s->oformat == &ff_mxf_d10_muxer) {
  1652. if (st->index != 1) {
  1653. av_log(s, AV_LOG_ERROR, "MXF D-10 only support one audio track\n");
  1654. return -1;
  1655. }
  1656. if (st->codec->codec_id != AV_CODEC_ID_PCM_S16LE &&
  1657. st->codec->codec_id != AV_CODEC_ID_PCM_S24LE) {
  1658. av_log(s, AV_LOG_ERROR, "MXF D-10 only support 16 or 24 bits le audio\n");
  1659. }
  1660. sc->index = ((MXFStreamContext*)s->streams[0]->priv_data)->index + 1;
  1661. } else
  1662. mxf->slice_count = 1;
  1663. }
  1664. if (!sc->index) {
  1665. sc->index = mxf_get_essence_container_ul_index(st->codec->codec_id);
  1666. if (sc->index == -1) {
  1667. av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, "
  1668. "codec not currently supported in container\n", i);
  1669. return -1;
  1670. }
  1671. }
  1672. sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
  1673. memcpy(sc->track_essence_element_key, mxf_essence_container_uls[sc->index].element_ul, 15);
  1674. sc->track_essence_element_key[15] = present[sc->index];
  1675. PRINT_KEY(s, "track essence element key", sc->track_essence_element_key);
  1676. if (!present[sc->index])
  1677. mxf->essence_container_count++;
  1678. present[sc->index]++;
  1679. }
  1680. if (s->oformat == &ff_mxf_d10_muxer || s->oformat == &ff_mxf_opatom_muxer) {
  1681. mxf->essence_container_count = 1;
  1682. }
  1683. if (!(s->flags & AVFMT_FLAG_BITEXACT))
  1684. mxf_gen_umid(s);
  1685. for (i = 0; i < s->nb_streams; i++) {
  1686. MXFStreamContext *sc = s->streams[i]->priv_data;
  1687. // update element count
  1688. sc->track_essence_element_key[13] = present[sc->index];
  1689. if (!memcmp(sc->track_essence_element_key, mxf_essence_container_uls[15].element_ul, 13)) // DV
  1690. sc->order = (0x15 << 24) | AV_RB32(sc->track_essence_element_key+13);
  1691. else
  1692. sc->order = AV_RB32(sc->track_essence_element_key+12);
  1693. }
  1694. if (t = av_dict_get(s->metadata, "creation_time", NULL, 0))
  1695. timestamp = ff_iso8601_to_unix_time(t->value);
  1696. if (timestamp)
  1697. mxf->timestamp = mxf_parse_timestamp(timestamp);
  1698. mxf->duration = -1;
  1699. mxf->timecode_track = av_mallocz(sizeof(*mxf->timecode_track));
  1700. if (!mxf->timecode_track)
  1701. return AVERROR(ENOMEM);
  1702. mxf->timecode_track->priv_data = av_mallocz(sizeof(MXFStreamContext));
  1703. if (!mxf->timecode_track->priv_data)
  1704. return AVERROR(ENOMEM);
  1705. mxf->timecode_track->index = -1;
  1706. if (!spf)
  1707. spf = ff_mxf_get_samples_per_frame(s, (AVRational){ 1, 25 });
  1708. if (ff_audio_interleave_init(s, spf->samples_per_frame, mxf->time_base) < 0)
  1709. return -1;
  1710. return 0;
  1711. }
  1712. static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 };
  1713. static const uint8_t system_metadata_package_set_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x43,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x02,0x01 };
  1714. static void mxf_write_system_item(AVFormatContext *s)
  1715. {
  1716. MXFContext *mxf = s->priv_data;
  1717. AVIOContext *pb = s->pb;
  1718. unsigned frame;
  1719. uint32_t time_code;
  1720. frame = mxf->last_indexed_edit_unit + mxf->edit_units_count;
  1721. // write system metadata pack
  1722. avio_write(pb, system_metadata_pack_key, 16);
  1723. klv_encode_ber4_length(pb, 57);
  1724. avio_w8(pb, 0x5c); // UL, user date/time stamp, picture and sound item present
  1725. avio_w8(pb, 0x04); // content package rate
  1726. avio_w8(pb, 0x00); // content package type
  1727. avio_wb16(pb, 0x00); // channel handle
  1728. avio_wb16(pb, (mxf->tc.start + frame) & 0xFFFF); // continuity count, supposed to overflow
  1729. if (mxf->essence_container_count > 1)
  1730. avio_write(pb, multiple_desc_ul, 16);
  1731. else {
  1732. MXFStreamContext *sc = s->streams[0]->priv_data;
  1733. avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
  1734. }
  1735. avio_w8(pb, 0);
  1736. avio_wb64(pb, 0);
  1737. avio_wb64(pb, 0); // creation date/time stamp
  1738. avio_w8(pb, 0x81); // SMPTE 12M time code
  1739. time_code = av_timecode_get_smpte_from_framenum(&mxf->tc, frame);
  1740. avio_wb32(pb, time_code);
  1741. avio_wb32(pb, 0); // binary group data
  1742. avio_wb64(pb, 0);
  1743. // write system metadata package set
  1744. avio_write(pb, system_metadata_package_set_key, 16);
  1745. klv_encode_ber4_length(pb, 35);
  1746. avio_w8(pb, 0x83); // UMID
  1747. avio_wb16(pb, 0x20);
  1748. mxf_write_umid(s, 1);
  1749. }
  1750. static void mxf_write_d10_video_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
  1751. {
  1752. MXFContext *mxf = s->priv_data;
  1753. AVIOContext *pb = s->pb;
  1754. MXFStreamContext *sc = st->priv_data;
  1755. int packet_size = (uint64_t)sc->video_bit_rate*mxf->time_base.num /
  1756. (8*mxf->time_base.den); // frame size
  1757. int pad;
  1758. packet_size += 16 + 4;
  1759. packet_size += klv_fill_size(packet_size);
  1760. klv_encode_ber4_length(pb, pkt->size);
  1761. avio_write(pb, pkt->data, pkt->size);
  1762. // ensure CBR muxing by padding to correct video frame size
  1763. pad = packet_size - pkt->size - 16 - 4;
  1764. if (pad > 20) {
  1765. avio_write(s->pb, klv_fill_key, 16);
  1766. pad -= 16 + 4;
  1767. klv_encode_ber4_length(s->pb, pad);
  1768. ffio_fill(s->pb, 0, pad);
  1769. av_assert1(!(avio_tell(s->pb) & (KAG_SIZE-1)));
  1770. } else {
  1771. av_log(s, AV_LOG_WARNING, "cannot fill d-10 video packet\n");
  1772. ffio_fill(s->pb, 0, pad);
  1773. }
  1774. }
  1775. static void mxf_write_d10_audio_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
  1776. {
  1777. MXFContext *mxf = s->priv_data;
  1778. AVIOContext *pb = s->pb;
  1779. int frame_size = pkt->size / st->codec->block_align;
  1780. uint8_t *samples = pkt->data;
  1781. uint8_t *end = pkt->data + pkt->size;
  1782. int i;
  1783. klv_encode_ber4_length(pb, 4 + frame_size*4*8);
  1784. avio_w8(pb, (frame_size == 1920 ? 0 : (mxf->edit_units_count-1) % 5 + 1));
  1785. avio_wl16(pb, frame_size);
  1786. avio_w8(pb, (1<<st->codec->channels)-1);
  1787. while (samples < end) {
  1788. for (i = 0; i < st->codec->channels; i++) {
  1789. uint32_t sample;
  1790. if (st->codec->codec_id == AV_CODEC_ID_PCM_S24LE) {
  1791. sample = AV_RL24(samples)<< 4;
  1792. samples += 3;
  1793. } else {
  1794. sample = AV_RL16(samples)<<12;
  1795. samples += 2;
  1796. }
  1797. avio_wl32(pb, sample | i);
  1798. }
  1799. for (; i < 8; i++)
  1800. avio_wl32(pb, i);
  1801. }
  1802. }
  1803. static int mxf_write_opatom_body_partition(AVFormatContext *s)
  1804. {
  1805. MXFContext *mxf = s->priv_data;
  1806. AVIOContext *pb = s->pb;
  1807. AVStream *st = s->streams[0];
  1808. MXFStreamContext *sc = st->priv_data;
  1809. const uint8_t *key = NULL;
  1810. int err;
  1811. if (!mxf->header_written)
  1812. key = body_partition_key;
  1813. if ((err = mxf_write_partition(s, 1, 0, key, 0)) < 0)
  1814. return err;
  1815. mxf_write_klv_fill(s);
  1816. avio_write(pb, sc->track_essence_element_key, 16);
  1817. klv_encode_ber9_length(pb, mxf->body_offset);
  1818. return 0;
  1819. }
  1820. static int mxf_write_opatom_packet(AVFormatContext *s, AVPacket *pkt, MXFIndexEntry *ie)
  1821. {
  1822. MXFContext *mxf = s->priv_data;
  1823. AVIOContext *pb = s->pb;
  1824. int err;
  1825. if (!mxf->header_written) {
  1826. if ((err = mxf_write_partition(s, 0, 0, header_open_partition_key, 1)) < 0)
  1827. return err;
  1828. mxf_write_klv_fill(s);
  1829. if ((err = mxf_write_opatom_body_partition(s)) < 0)
  1830. return err;
  1831. mxf->header_written = 1;
  1832. }
  1833. if (!mxf->edit_unit_byte_count) {
  1834. mxf->index_entries[mxf->edit_units_count].offset = mxf->body_offset;
  1835. mxf->index_entries[mxf->edit_units_count].flags = ie->flags;
  1836. mxf->index_entries[mxf->edit_units_count].temporal_ref = ie->temporal_ref;
  1837. }
  1838. mxf->edit_units_count++;
  1839. avio_write(pb, pkt->data, pkt->size);
  1840. mxf->body_offset += pkt->size;
  1841. avio_flush(pb);
  1842. return 0;
  1843. }
  1844. static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
  1845. {
  1846. MXFContext *mxf = s->priv_data;
  1847. AVIOContext *pb = s->pb;
  1848. AVStream *st = s->streams[pkt->stream_index];
  1849. MXFStreamContext *sc = st->priv_data;
  1850. MXFIndexEntry ie = {0};
  1851. int err;
  1852. if (!mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) {
  1853. if ((err = av_reallocp_array(&mxf->index_entries, mxf->edit_units_count
  1854. + EDIT_UNITS_PER_BODY, sizeof(*mxf->index_entries))) < 0) {
  1855. mxf->edit_units_count = 0;
  1856. av_log(s, AV_LOG_ERROR, "could not allocate index entries\n");
  1857. return err;
  1858. }
  1859. }
  1860. if (st->codec->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
  1861. if (!mxf_parse_mpeg2_frame(s, st, pkt, &ie)) {
  1862. av_log(s, AV_LOG_ERROR, "could not get mpeg2 profile and level\n");
  1863. return -1;
  1864. }
  1865. } else if (st->codec->codec_id == AV_CODEC_ID_DNXHD) {
  1866. if (!mxf_parse_dnxhd_frame(s, st, pkt)) {
  1867. av_log(s, AV_LOG_ERROR, "could not get dnxhd profile\n");
  1868. return -1;
  1869. }
  1870. } else if (st->codec->codec_id == AV_CODEC_ID_DVVIDEO) {
  1871. if (!mxf_parse_dv_frame(s, st, pkt)) {
  1872. av_log(s, AV_LOG_ERROR, "could not get dv profile\n");
  1873. return -1;
  1874. }
  1875. } else if (st->codec->codec_id == AV_CODEC_ID_H264) {
  1876. if (!mxf_parse_h264_frame(s, st, pkt, &ie)) {
  1877. av_log(s, AV_LOG_ERROR, "could not get h264 profile\n");
  1878. return -1;
  1879. }
  1880. }
  1881. if (s->oformat == &ff_mxf_opatom_muxer)
  1882. return mxf_write_opatom_packet(s, pkt, &ie);
  1883. if (!mxf->header_written) {
  1884. if (mxf->edit_unit_byte_count) {
  1885. if ((err = mxf_write_partition(s, 1, 2, header_open_partition_key, 1)) < 0)
  1886. return err;
  1887. mxf_write_klv_fill(s);
  1888. mxf_write_index_table_segment(s);
  1889. } else {
  1890. if ((err = mxf_write_partition(s, 0, 0, header_open_partition_key, 1)) < 0)
  1891. return err;
  1892. }
  1893. mxf->header_written = 1;
  1894. }
  1895. if (st->index == 0) {
  1896. if (!mxf->edit_unit_byte_count &&
  1897. (!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) &&
  1898. !(ie.flags & 0x33)) { // I frame, Gop start
  1899. mxf_write_klv_fill(s);
  1900. if ((err = mxf_write_partition(s, 1, 2, body_partition_key, 0)) < 0)
  1901. return err;
  1902. mxf_write_klv_fill(s);
  1903. mxf_write_index_table_segment(s);
  1904. }
  1905. mxf_write_klv_fill(s);
  1906. mxf_write_system_item(s);
  1907. if (!mxf->edit_unit_byte_count) {
  1908. mxf->index_entries[mxf->edit_units_count].offset = mxf->body_offset;
  1909. mxf->index_entries[mxf->edit_units_count].flags = ie.flags;
  1910. mxf->index_entries[mxf->edit_units_count].temporal_ref = ie.temporal_ref;
  1911. mxf->body_offset += KAG_SIZE; // size of system element
  1912. }
  1913. mxf->edit_units_count++;
  1914. } else if (!mxf->edit_unit_byte_count && st->index == 1) {
  1915. mxf->index_entries[mxf->edit_units_count-1].slice_offset =
  1916. mxf->body_offset - mxf->index_entries[mxf->edit_units_count-1].offset;
  1917. }
  1918. mxf_write_klv_fill(s);
  1919. avio_write(pb, sc->track_essence_element_key, 16); // write key
  1920. if (s->oformat == &ff_mxf_d10_muxer) {
  1921. if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
  1922. mxf_write_d10_video_packet(s, st, pkt);
  1923. else
  1924. mxf_write_d10_audio_packet(s, st, pkt);
  1925. } else {
  1926. klv_encode_ber4_length(pb, pkt->size); // write length
  1927. avio_write(pb, pkt->data, pkt->size);
  1928. mxf->body_offset += 16+4+pkt->size + klv_fill_size(16+4+pkt->size);
  1929. }
  1930. avio_flush(pb);
  1931. return 0;
  1932. }
  1933. static void mxf_write_random_index_pack(AVFormatContext *s)
  1934. {
  1935. MXFContext *mxf = s->priv_data;
  1936. AVIOContext *pb = s->pb;
  1937. uint64_t pos = avio_tell(pb);
  1938. int i;
  1939. avio_write(pb, random_index_pack_key, 16);
  1940. klv_encode_ber_length(pb, 28 + 12LL*mxf->body_partitions_count);
  1941. if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer)
  1942. avio_wb32(pb, 1); // BodySID of header partition
  1943. else
  1944. avio_wb32(pb, 0);
  1945. avio_wb64(pb, 0); // offset of header partition
  1946. for (i = 0; i < mxf->body_partitions_count; i++) {
  1947. avio_wb32(pb, 1); // BodySID
  1948. avio_wb64(pb, mxf->body_partition_offset[i]);
  1949. }
  1950. avio_wb32(pb, 0); // BodySID of footer partition
  1951. avio_wb64(pb, mxf->footer_partition_offset);
  1952. avio_wb32(pb, avio_tell(pb) - pos + 4);
  1953. }
  1954. static int mxf_write_footer(AVFormatContext *s)
  1955. {
  1956. MXFContext *mxf = s->priv_data;
  1957. AVIOContext *pb = s->pb;
  1958. int err;
  1959. mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
  1960. mxf_write_klv_fill(s);
  1961. mxf->footer_partition_offset = avio_tell(pb);
  1962. if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) { // no need to repeat index
  1963. if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, 0)) < 0)
  1964. return err;
  1965. } else {
  1966. if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, 0)) < 0)
  1967. return err;
  1968. mxf_write_klv_fill(s);
  1969. mxf_write_index_table_segment(s);
  1970. }
  1971. mxf_write_klv_fill(s);
  1972. mxf_write_random_index_pack(s);
  1973. if (s->pb->seekable) {
  1974. if (s->oformat == &ff_mxf_opatom_muxer){
  1975. /* rewrite body partition to update lengths */
  1976. avio_seek(pb, mxf->body_partition_offset[0], SEEK_SET);
  1977. if ((err = mxf_write_opatom_body_partition(s)) < 0)
  1978. return err;
  1979. }
  1980. avio_seek(pb, 0, SEEK_SET);
  1981. if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) {
  1982. if ((err = mxf_write_partition(s, 1, 2, header_closed_partition_key, 1)) < 0)
  1983. return err;
  1984. mxf_write_klv_fill(s);
  1985. mxf_write_index_table_segment(s);
  1986. } else {
  1987. if ((err = mxf_write_partition(s, 0, 0, header_closed_partition_key, 1)) < 0)
  1988. return err;
  1989. }
  1990. }
  1991. ff_audio_interleave_close(s);
  1992. av_freep(&mxf->index_entries);
  1993. av_freep(&mxf->body_partition_offset);
  1994. av_freep(&mxf->timecode_track->priv_data);
  1995. av_freep(&mxf->timecode_track);
  1996. mxf_free(s);
  1997. return 0;
  1998. }
  1999. static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
  2000. {
  2001. int i, stream_count = 0;
  2002. for (i = 0; i < s->nb_streams; i++)
  2003. stream_count += !!s->streams[i]->last_in_packet_buffer;
  2004. if (stream_count && (s->nb_streams == stream_count || flush)) {
  2005. AVPacketList *pktl = s->internal->packet_buffer;
  2006. if (s->nb_streams != stream_count) {
  2007. AVPacketList *last = NULL;
  2008. // find last packet in edit unit
  2009. while (pktl) {
  2010. if (!stream_count || pktl->pkt.stream_index == 0)
  2011. break;
  2012. last = pktl;
  2013. pktl = pktl->next;
  2014. stream_count--;
  2015. }
  2016. // purge packet queue
  2017. while (pktl) {
  2018. AVPacketList *next = pktl->next;
  2019. if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl)
  2020. s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL;
  2021. av_free_packet(&pktl->pkt);
  2022. av_freep(&pktl);
  2023. pktl = next;
  2024. }
  2025. if (last)
  2026. last->next = NULL;
  2027. else {
  2028. s->internal->packet_buffer = NULL;
  2029. s->internal->packet_buffer_end= NULL;
  2030. goto out;
  2031. }
  2032. pktl = s->internal->packet_buffer;
  2033. }
  2034. *out = pktl->pkt;
  2035. av_dlog(s, "out st:%d dts:%"PRId64"\n", (*out).stream_index, (*out).dts);
  2036. s->internal->packet_buffer = pktl->next;
  2037. if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl)
  2038. s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL;
  2039. if(!s->internal->packet_buffer)
  2040. s->internal->packet_buffer_end= NULL;
  2041. av_freep(&pktl);
  2042. return 1;
  2043. } else {
  2044. out:
  2045. av_init_packet(out);
  2046. return 0;
  2047. }
  2048. }
  2049. static int mxf_compare_timestamps(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
  2050. {
  2051. MXFStreamContext *sc = s->streams[pkt ->stream_index]->priv_data;
  2052. MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data;
  2053. return next->dts > pkt->dts ||
  2054. (next->dts == pkt->dts && sc->order < sc2->order);
  2055. }
  2056. static int mxf_interleave(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
  2057. {
  2058. return ff_audio_rechunk_interleave(s, out, pkt, flush,
  2059. mxf_interleave_get_packet, mxf_compare_timestamps);
  2060. }
  2061. static const AVOption d10_options[] = {
  2062. { "d10_channelcount", "Force/set channelcount in generic sound essence descriptor",
  2063. offsetof(MXFContext, channel_count), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 8, AV_OPT_FLAG_ENCODING_PARAM},
  2064. { NULL },
  2065. };
  2066. static const AVClass mxf_d10_muxer_class = {
  2067. .class_name = "MXF-D10 muxer",
  2068. .item_name = av_default_item_name,
  2069. .option = d10_options,
  2070. .version = LIBAVUTIL_VERSION_INT,
  2071. };
  2072. AVOutputFormat ff_mxf_muxer = {
  2073. .name = "mxf",
  2074. .long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format)"),
  2075. .mime_type = "application/mxf",
  2076. .extensions = "mxf",
  2077. .priv_data_size = sizeof(MXFContext),
  2078. .audio_codec = AV_CODEC_ID_PCM_S16LE,
  2079. .video_codec = AV_CODEC_ID_MPEG2VIDEO,
  2080. .write_header = mxf_write_header,
  2081. .write_packet = mxf_write_packet,
  2082. .write_trailer = mxf_write_footer,
  2083. .flags = AVFMT_NOTIMESTAMPS,
  2084. .interleave_packet = mxf_interleave,
  2085. };
  2086. AVOutputFormat ff_mxf_d10_muxer = {
  2087. .name = "mxf_d10",
  2088. .long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format) D-10 Mapping"),
  2089. .mime_type = "application/mxf",
  2090. .priv_data_size = sizeof(MXFContext),
  2091. .audio_codec = AV_CODEC_ID_PCM_S16LE,
  2092. .video_codec = AV_CODEC_ID_MPEG2VIDEO,
  2093. .write_header = mxf_write_header,
  2094. .write_packet = mxf_write_packet,
  2095. .write_trailer = mxf_write_footer,
  2096. .flags = AVFMT_NOTIMESTAMPS,
  2097. .interleave_packet = mxf_interleave,
  2098. .priv_class = &mxf_d10_muxer_class,
  2099. };
  2100. AVOutputFormat ff_mxf_opatom_muxer = {
  2101. .name = "mxf_opatom",
  2102. .long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format) Operational Pattern Atom"),
  2103. .mime_type = "application/mxf",
  2104. .extensions = "mxf",
  2105. .priv_data_size = sizeof(MXFContext),
  2106. .audio_codec = AV_CODEC_ID_PCM_S16LE,
  2107. .video_codec = AV_CODEC_ID_DNXHD,
  2108. .write_header = mxf_write_header,
  2109. .write_packet = mxf_write_packet,
  2110. .write_trailer = mxf_write_footer,
  2111. .flags = AVFMT_NOTIMESTAMPS,
  2112. .interleave_packet = mxf_interleave,
  2113. };