FFmpeg
mxfenc.c
Go to the documentation of this file.
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 /*
24  * signal_standard, color_siting, store_user_comments, sample rate and klv_fill_key version
25  * fixes sponsored by NOA GmbH
26  */
27 
28 /*
29  * References
30  * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value
31  * SMPTE 377M MXF File Format Specifications
32  * SMPTE 379M MXF Generic Container
33  * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container
34  * SMPTE 422M Mapping JPEG 2000 Codestreams into the MXF Generic Container
35  * SMPTE ST2019-4 (2009 or later) Mapping VC-3 Coding Units into the MXF Generic Container
36  * SMPTE RP210: SMPTE Metadata Dictionary
37  * SMPTE RP224: Registry of SMPTE Universal Labels
38  */
39 
40 #include <inttypes.h>
41 #include <time.h>
42 
44 #include "libavutil/mem.h"
45 #include "libavutil/opt.h"
46 #include "libavutil/random_seed.h"
47 #include "libavutil/timecode.h"
48 #include "libavutil/avassert.h"
50 #include "libavutil/pixdesc.h"
52 #include "libavcodec/defs.h"
53 #include "libavcodec/bytestream.h"
54 #include "libavcodec/golomb.h"
55 #include "libavcodec/h264.h"
56 #include "libavcodec/jpeg2000.h"
58 #include "libavcodec/rangecoder.h"
59 #include "libavcodec/startcode.h"
60 #include "avformat.h"
61 #include "avio_internal.h"
62 #include "internal.h"
63 #include "avc.h"
64 #include "nal.h"
65 #include "mux.h"
66 #include "mxf.h"
67 #include "config.h"
68 #include "version.h"
69 
72 
73 #define IS_D10(s) ((s)->oformat == &ff_mxf_d10_muxer.p)
74 #define IS_OPATOM(s) ((s)->oformat == &ff_mxf_opatom_muxer.p)
75 
76 #define EDIT_UNITS_PER_BODY 250
77 #define KAG_SIZE 512
78 
79 typedef struct MXFIndexEntry {
80  uint64_t offset;
81  unsigned slice_offset; ///< offset of audio slice
82  uint16_t temporal_ref;
83  uint8_t flags;
85 
86 typedef struct j2k_info_t {
87  uint16_t j2k_cap; ///< j2k required decoder capabilities
88  uint16_t j2k_rsiz; ///< j2k required decoder capabilities (Rsiz)
89  uint32_t j2k_xsiz; ///< j2k width of the reference grid (Xsiz)
90  uint32_t j2k_ysiz; ///< j2k height of the reference grid (Ysiz)
91  uint32_t j2k_x0siz; ///< j2k horizontal offset from the origin of the reference grid to the left side of the image (X0siz)
92  uint32_t j2k_y0siz; ///< j2k vertical offset from the origin of the reference grid to the left side of the image (Y0siz)
93  uint32_t j2k_xtsiz; ///< j2k width of one reference tile with respect to the reference grid (XTsiz)
94  uint32_t j2k_ytsiz; ///< j2k height of one reference tile with respect to the reference grid (YTsiz)
95  uint32_t j2k_xt0siz; ///< j2k horizontal offset from the origin of the reference grid to the left side of the first tile (XT0siz)
96  uint32_t j2k_yt0siz; ///< j2k vertical offset from the origin of the reference grid to the left side of the first tile (YT0siz)
97  uint8_t j2k_comp_desc[12]; ///< j2k components descriptor (Ssiz(i), XRsiz(i), YRsiz(i))
98 } j2k_info_t;
99 
100 typedef struct MXFStreamContext {
101  int64_t pkt_cnt; ///< pkt counter for muxed packets
103  int index; ///< index in mxf_essence_container_uls table
104  const UID *codec_ul;
106  int order; ///< interleaving order if dts are equal
107  int interlaced; ///< whether picture is interlaced
108  int field_dominance; ///< tff=1, bff=2
115  AVRational aspect_ratio; ///< display aspect ratio
116  int closed_gop; ///< gop is closed, used in mpeg-2 frame parsing
119  int frame_size; ///< frame size in bytes
120  int seq_closed_gop; ///< all gops in sequence are closed, used in mpeg-2 descriptor
121  int max_gop; ///< maximum gop size, used by mpeg-2 descriptor
122  int b_picture_count; ///< maximum number of consecutive b pictures, used in mpeg-2 descriptor
123  int low_delay; ///< low delay, used in mpeg-2 descriptor
125  int micro_version; ///< format micro_version, used in ffv1 descriptor
128 
129 typedef struct MXFContainerEssenceEntry {
135 
136 typedef struct MXFPackage {
137  char *name;
139  int instance;
140  struct MXFPackage *ref;
141 } MXFPackage;
142 
143 enum ULIndex {
156 };
157 
158 static const struct {
159  enum AVCodecID id;
161 } mxf_essence_mappings[] = {
171  { AV_CODEC_ID_NONE }
172 };
173 
174 static int mxf_write_wav_desc(AVFormatContext *s, AVStream *st);
182 
184  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 },
185  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
186  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
188  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 },
189  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x03,0x00 },
190  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
192  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 },
193  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x01,0x00 },
194  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
196  // D-10 Video
197  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
198  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
199  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 },
201  // D-10 Audio
202  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
203  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
204  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
206  // DV
207  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x7F,0x01 },
208  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
209  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x00,0x00,0x00 },
211  // DNxHD
212  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
213  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x0C,0x00 },
214  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x01,0x00,0x00 },
216  // JPEG2000
217  { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 },
218  { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x08,0x00 },
219  { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 },
221  // H.264
222  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x0D,0x01,0x03,0x01,0x02,0x10,0x60,0x01 },
223  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
224  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
226  // S436M ANC
227  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x0D,0x01,0x03,0x01,0x02,0x0e,0x00,0x00 },
228  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x17,0x01,0x02,0x00 },
229  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x01,0x5C,0x00 },
231  // ProRes
232  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x1c,0x01,0x00 },
233  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x17,0x00 },
234  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x03,0x00 },
236  // FFV1
237  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x23,0x01,0x00 },
238  { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x1d,0x00 },
239  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x09,0x00,0x00 },
241  { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
242  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
243  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
244  NULL },
245 };
246 
247 static const UID mxf_d10_codec_uls[] = {
248  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, // D-10 625/50 PAL 50mb/s
249  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 }, // D-10 525/50 NTSC 50mb/s
250  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 }, // D-10 625/50 PAL 40mb/s
251  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 }, // D-10 525/50 NTSC 40mb/s
252  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, // D-10 625/50 PAL 30mb/s
253  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 }, // D-10 525/50 NTSC 30mb/s
254 };
255 
256 static const UID mxf_d10_container_uls[] = {
257  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, // D-10 625/50 PAL 50mb/s
258  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 }, // D-10 525/50 NTSC 50mb/s
259  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 }, // D-10 625/50 PAL 40mb/s
260  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, // D-10 525/50 NTSC 40mb/s
261  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, // D-10 625/50 PAL 30mb/s
262  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 }, // D-10 525/50 NTSC 30mb/s
263 };
264 
265 
266 static const UID mxf_ffv1_codec_uls[] = {
267  { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x03,0x09,0x01,0x00 }, // FFV1 version 0
268  { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x03,0x09,0x02,0x00 }, // FFV1 version 1
269  { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x03,0x09,0x03,0x00 }, // FFV1 version 2 (was only experimental)
270  { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x03,0x09,0x04,0x00 }, // FFV1 version 3
271  { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x03,0x09,0x05,0x00 }, // FFV1 version 4
272 };
273 
274 static const uint8_t product_uid[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd,0x00,0x0c,0x00,0x02};
275 static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff };
276 static const uint8_t umid_ul[] = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13 };
277 
278 /**
279  * complete key for operation pattern, partitions, and primer pack
280  */
281 static const uint8_t op1a_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x01,0x09,0x00 };
282 static const uint8_t opatom_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x02,0x01,0x10,0x03,0x00,0x00 };
283 static const uint8_t footer_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }; // ClosedComplete
284 static const uint8_t primer_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x05,0x01,0x00 };
285 static const uint8_t index_table_segment_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 };
286 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
287 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
288 static const uint8_t klv_fill_key[] = { 0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x10,0x01,0x00,0x00,0x00 };
289 static const uint8_t body_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }; // ClosedComplete
290 
291 /**
292  * partial key for header metadata
293  */
294 static const uint8_t header_metadata_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01 };
295 static const uint8_t multiple_desc_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x0D,0x01,0x03,0x01,0x02,0x7F,0x01,0x00 };
296 
297 /**
298  * SMPTE RP210 http://www.smpte-ra.org/mdd/index.html
299  * https://smpte-ra.org/sites/default/files/Labels.xml
300  */
302  // preface set
303  { 0x3C0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x02,0x00,0x00,0x00,0x00}}, /* Instance UID */
304  { 0x3B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x04,0x00,0x00}}, /* Last Modified Date */
305  { 0x3B05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x01,0x05,0x00,0x00,0x00}}, /* Version */
306  { 0x3B07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x01,0x04,0x00,0x00,0x00}}, /* Object Model Version */
307  { 0x3B06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x04,0x00,0x00}}, /* Identifications reference */
308  { 0x3B03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x01,0x00,0x00}}, /* Content Storage reference */
309  { 0x3B09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x03,0x00,0x00,0x00,0x00}}, /* Operational Pattern UL */
310  { 0x3B0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x01,0x00,0x00}}, /* Essence Containers UL batch */
311  { 0x3B0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x02,0x00,0x00}}, /* DM Schemes UL batch */
312  // Identification
313  { 0x3C09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x01,0x00,0x00,0x00}}, /* This Generation UID */
314  { 0x3C01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x02,0x01,0x00,0x00}}, /* Company Name */
315  { 0x3C02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x03,0x01,0x00,0x00}}, /* Product Name */
316  { 0x3C03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x04,0x00,0x00,0x00}}, /* Product Version */
317  { 0x3C04, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x05,0x01,0x00,0x00}}, /* Version String */
318  { 0x3C05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x07,0x00,0x00,0x00}}, /* Product ID */
319  { 0x3C06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x03,0x00,0x00}}, /* Modification Date */
320  { 0x3C07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x0A,0x00,0x00,0x00}}, /* Toolkit Version */
321  { 0x3C08, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x06,0x01,0x00,0x00}}, /* Platform */
322  // Content Storage
323  { 0x1901, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x01,0x00,0x00}}, /* Package strong reference batch */
324  { 0x1902, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x02,0x00,0x00}}, /* Package strong reference batch */
325  // Essence Container Data
326  { 0x2701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x06,0x01,0x00,0x00,0x00}}, /* Linked Package UID */
327  { 0x3F07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x04,0x00,0x00,0x00,0x00}}, /* BodySID */
328  // Package
329  { 0x4401, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x10,0x00,0x00,0x00,0x00}}, /* Package UID */
330  { 0x4405, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x01,0x03,0x00,0x00}}, /* Package Creation Date */
331  { 0x4404, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x05,0x00,0x00}}, /* Package Modified Date */
332  { 0x4402, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x03,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Package Name */
333  { 0x4403, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x05,0x00,0x00}}, /* Tracks Strong reference array */
334  { 0x4701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x03,0x00,0x00}}, /* Descriptor */
335  // Track
336  { 0x4801, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00}}, /* Track ID */
337  { 0x4804, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x04,0x01,0x03,0x00,0x00,0x00,0x00}}, /* Track Number */
338  { 0x4B01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x30,0x04,0x05,0x00,0x00,0x00,0x00}}, /* Edit Rate */
339  { 0x4B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x03,0x00,0x00}}, /* Origin */
340  { 0x4803, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x04,0x00,0x00}}, /* Sequence reference */
341  // Sequence
342  { 0x0201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x07,0x01,0x00,0x00,0x00,0x00,0x00}}, /* Data Definition UL */
343  { 0x0202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x02,0x01,0x01,0x03,0x00,0x00}}, /* Duration */
344  { 0x1001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x09,0x00,0x00}}, /* Structural Components reference array */
345  // Source Clip
346  { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x04,0x00,0x00}}, /* Start position */
347  { 0x1101, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x01,0x00,0x00,0x00}}, /* SourcePackageID */
348  { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, /* SourceTrackID */
349  // Timecode Component
350  { 0x1501, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x05,0x00,0x00}}, /* Start Time Code */
351  { 0x1502, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x04,0x01,0x01,0x02,0x06,0x00,0x00}}, /* Rounded Time Code Base */
352  { 0x1503, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x04,0x01,0x01,0x05,0x00,0x00,0x00}}, /* Drop Frame */
353  // File Descriptor
354  { 0x3F01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x04,0x06,0x0B,0x00,0x00}}, /* Sub Descriptors reference array */
355  { 0x3006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x06,0x01,0x01,0x03,0x05,0x00,0x00,0x00}}, /* Linked Track ID */
356  { 0x3001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x00,0x00,0x00,0x00}}, /* SampleRate */
357  { 0x3002, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x06,0x01,0x02,0x00,0x00,0x00,0x00}}, /* ContainerDuration */
358  { 0x3004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x01,0x02,0x00,0x00}}, /* Essence Container */
359  // Generic Picture Essence Descriptor
360  { 0x320C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Frame Layout */
361  { 0x320D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x03,0x02,0x05,0x00,0x00,0x00}}, /* Video Line Map */
362  { 0x3203, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x02,0x00,0x00,0x00}}, /* Stored Width */
363  { 0x3202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x01,0x00,0x00,0x00}}, /* Stored Height */
364  { 0x3216, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x03,0x02,0x08,0x00,0x00,0x00}}, /* Stored F2 Offset */
365  { 0x3205, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x08,0x00,0x00,0x00}}, /* Sampled Width */
366  { 0x3204, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x07,0x00,0x00,0x00}}, /* Sampled Height */
367  { 0x3206, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x09,0x00,0x00,0x00}}, /* Sampled X Offset */
368  { 0x3207, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0A,0x00,0x00,0x00}}, /* Sampled Y Offset */
369  { 0x3209, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0C,0x00,0x00,0x00}}, /* Display Width */
370  { 0x3208, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0B,0x00,0x00,0x00}}, /* Display Height */
371  { 0x320A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0D,0x00,0x00,0x00}}, /* Display X offset */
372  { 0x320B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0E,0x00,0x00,0x00}}, /* Presentation Y offset */
373  { 0x3217, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x03,0x02,0x07,0x00,0x00,0x00}}, /* Display F2 offset */
374  { 0x320E, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x00,0x00,0x00}}, /* Aspect Ratio */
375  { 0x3210, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x02,0x01,0x01,0x01,0x02,0x00}}, /* Transfer characteristic */
376  { 0x321A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x02,0x01,0x01,0x03,0x01,0x00}}, /* Coding Equations (color space) */
377  { 0x3219, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x09,0x04,0x01,0x02,0x01,0x01,0x06,0x01,0x00}}, /* Color Primaries */
378  { 0x3213, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x18,0x01,0x02,0x00,0x00,0x00,0x00}}, /* Image Start Offset */
379  { 0x3214, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x18,0x01,0x03,0x00,0x00,0x00,0x00}}, /* Image End Offset */
380  { 0x3201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, /* Picture Essence Coding */
381  { 0x3212, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x03,0x01,0x06,0x00,0x00,0x00}}, /* Field Dominance (Opt) */
382  { 0x3215, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x05,0x01,0x13,0x00,0x00,0x00,0x00}}, /* Signal Standard */
383  // CDCI Picture Essence Descriptor
384  { 0x3301, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x05,0x03,0x0A,0x00,0x00,0x00}}, /* Component Depth */
385  { 0x3302, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x05,0x00,0x00,0x00}}, /* Horizontal Subsampling */
386  { 0x3308, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x05,0x01,0x10,0x00,0x00,0x00}}, /* Vertical Subsampling */
387  { 0x3303, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x06,0x00,0x00,0x00}}, /* Color Siting */
388  { 0x3307, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x18,0x01,0x04,0x00,0x00,0x00,0x00}}, /* Padding Bits */
389  { 0x3304, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x03,0x03,0x00,0x00,0x00}}, /* Black Ref level */
390  { 0x3305, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x03,0x04,0x00,0x00,0x00}}, /* White Ref level */
391  { 0x3306, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x05,0x03,0x05,0x00,0x00,0x00}}, /* Color Range */
392  // Generic Sound Essence Descriptor
393  { 0x3D02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Locked/Unlocked */
394  { 0x3D03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x01,0x01,0x00,0x00}}, /* Audio sampling rate */
395  { 0x3D04, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x02,0x01,0x01,0x03,0x00,0x00,0x00}}, /* Audio Ref Level */
396  { 0x3D07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x01,0x01,0x04,0x00,0x00,0x00}}, /* ChannelCount */
397  { 0x3D01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x03,0x04,0x00,0x00,0x00}}, /* Quantization bits */
398  { 0x3D06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x02,0x04,0x02,0x00,0x00,0x00,0x00}}, /* Sound Essence Compression */
399  // Index Table Segment
400  { 0x3F0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x05,0x30,0x04,0x06,0x00,0x00,0x00,0x00}}, /* Index Edit Rate */
401  { 0x3F0C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x0A,0x00,0x00}}, /* Index Start Position */
402  { 0x3F0D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x02,0x01,0x01,0x02,0x00,0x00}}, /* Index Duration */
403  { 0x3F05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x06,0x02,0x01,0x00,0x00,0x00,0x00}}, /* Edit Unit Byte Count */
404  { 0x3F06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x05,0x00,0x00,0x00,0x00}}, /* IndexSID */
405  { 0x3F08, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x04,0x04,0x01,0x01,0x00,0x00,0x00}}, /* Slice Count */
406  { 0x3F09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x01,0x06,0x00,0x00,0x00}}, /* Delta Entry Array */
407  { 0x3F0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x02,0x05,0x00,0x00,0x00}}, /* Index Entry Array */
408  // MPEG video Descriptor
409  { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, /* BitRate */
410  { 0x8003, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x05,0x00,0x00}}, /* LowDelay */
411  { 0x8004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x06,0x00,0x00}}, /* ClosedGOP */
412  { 0x8006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x08,0x00,0x00}}, /* MaxGOP */
413  { 0x8007, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0A,0x00,0x00}}, /* ProfileAndLevel */
414  { 0x8008, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x09,0x00,0x00}}, /* BPictureCount */
415  // Wave Audio Essence Descriptor
416  { 0x3D09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x03,0x05,0x00,0x00,0x00}}, /* Average Bytes Per Second */
417  { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */
418  // mxf_user_comments_local_tag
419  { 0x4406, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x02,0x01,0x02,0x0C,0x00,0x00,0x00}}, /* User Comments */
420  { 0x5001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x02,0x01,0x02,0x09,0x01,0x00,0x00}}, /* Name */
421  { 0x5003, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x02,0x01,0x02,0x0A,0x01,0x00,0x00}}, /* Value */
422  // mxf_avc_subdescriptor_local_tags
423  { 0x8100, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x04,0x06,0x10,0x00,0x00}}, /* SubDescriptors */
424  { 0x8200, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x06,0x01,0x0E,0x00,0x00}}, /* AVC Decoding Delay */
425  { 0x8201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x06,0x01,0x0A,0x00,0x00}}, /* AVC Profile */
426  { 0x8202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x06,0x01,0x0D,0x00,0x00}}, /* AVC Level */
427  // ff_mxf_mastering_display_local_tags
432  // FFV1
433  { 0xDFD9, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x0C,0x06,0x00,0x00,0x00}}, /* FFV1 Micro-version */
434  { 0xDFDA, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x0C,0x05,0x00,0x00,0x00}}, /* FFV1 Version */
435  { 0xDFDB, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x0C,0x01,0x00,0x00,0x00}}, /* FFV1 Initialization Metadata */
436  // ff_mxf_jpeg2000_local_tags
437  { 0x8400, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x04,0x06,0x10,0x00,0x00}}, /* Sub Descriptors / Opt Ordered array of strong references to sub descriptor sets */
438  { 0x8401, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x01,0x00,0x00,0x00}}, /* Rsiz: An enumerated value that defines the decoder capabilities */
439  { 0x8402, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x02,0x00,0x00,0x00}}, /* Xsiz: Width of the reference grid */
440  { 0x8403, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x03,0x00,0x00,0x00}}, /* Ysiz: Height of the reference grid */
441  { 0x8404, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x04,0x00,0x00,0x00}}, /* X0siz: Horizontal offset from the origin of the reference grid to the left side of the image area */
442  { 0x8405, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x05,0x00,0x00,0x00}}, /* Y0siz: Vertical offset from the origin of the reference grid to the left side of the image area */
443  { 0x8406, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x06,0x00,0x00,0x00}}, /* XTsiz: Width of one reference tile with respect to the reference grid */
444  { 0x8407, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x07,0x00,0x00,0x00}}, /* YTsiz: Height of one reference tile with respect to the reference grid */
445  { 0x8408, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x08,0x00,0x00,0x00}}, /* XT0siz: Horizontal offset from the origin of the reference grid to the left side of the first tile */
446  { 0x8409, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x09,0x00,0x00,0x00}}, /* YT0siz: Vertical offset from the origin of the reference grid to the left side of the first tile */
447  { 0x840A, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x0A,0x00,0x00,0x00}}, /* Csiz: The number of components in the picture */
448  { 0x840B, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x0B,0x00,0x00,0x00}}, /* Ssizi, XRSizi, YRSizi: Array of picture components where each component comprises 3 bytes named Ssizi, XRSizi, YRSizi. The array of 3-byte groups is preceded by the array header comprising a 4-byte value of the number of components followed by a 4-byte value of 3. */
449  { 0x840C, {0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x0E,0x00,0x00,0x00}}, /* The nature and order of the image components in the compressed domain as carried in the J2C codestream. */
450 };
451 
452 #define MXF_NUM_TAGS FF_ARRAY_ELEMS(mxf_local_tag_batch)
453 
454 typedef struct MXFContext {
462  uint64_t timestamp; ///< timestamp, as year(16),month(8),day(8),hour(8),minutes(8),msec/4(8)
463  uint8_t slice_count; ///< index slice count minus 1 (1 if no audio, 0 otherwise)
467  int last_key_index; ///< index of last key frame
468  uint64_t duration;
469  AVTimecode tc; ///< timecode context
471  int timecode_base; ///< rounded time code base (25 or 30)
472  int edit_unit_byte_count; ///< fixed edit unit byte count
473  int content_package_rate; ///< content package rate in system element, see SMPTE 326M
474  uint64_t body_offset;
475  uint32_t instance_number;
476  uint8_t umid[16]; ///< unique material identifier
482  int track_instance_count; // used to generate MXFTrack uuids
483  int cbr_index; ///< use a constant bitrate index
484  uint8_t unused_tags[MXF_NUM_TAGS]; ///< local tags that we know will not be used
486 } MXFContext;
487 
489 {
490  avio_write(pb, uuid_base, 10);
491  avio_wb16(pb, type);
492  avio_wb32(pb, value);
493 }
494 
496 {
497  MXFContext *mxf = s->priv_data;
498  avio_write(s->pb, umid_ul, 13);
499  avio_wb24(s->pb, mxf->instance_number);
500  avio_write(s->pb, mxf->umid, 15);
501  avio_w8(s->pb, type);
502 }
503 
504 static void mxf_write_refs_count(AVIOContext *pb, int ref_count)
505 {
506  avio_wb32(pb, ref_count);
507  avio_wb32(pb, 16);
508 }
509 
510 static int klv_ber_length(uint64_t len)
511 {
512  if (len < 128)
513  return 1;
514  else
515  return (av_log2(len) >> 3) + 2;
516 }
517 
518 static int klv_encode_ber_length(AVIOContext *pb, uint64_t len)
519 {
520  // Determine the best BER size
521  int size = klv_ber_length(len);
522  if (size == 1) {
523  //short form
524  avio_w8(pb, len);
525  return 1;
526  }
527 
528  size --;
529  // long form
530  avio_w8(pb, 0x80 + size);
531  while(size) {
532  size--;
533  avio_w8(pb, len >> 8 * size & 0xff);
534  }
535  return 0;
536 }
537 
539 {
540  avio_w8(pb, 0x80 + 3);
541  avio_wb24(pb, len);
542 }
543 
544 static void klv_encode_ber9_length(AVIOContext *pb, uint64_t len)
545 {
546  avio_w8(pb, 0x80 + 8);
547  avio_wb64(pb, len);
548 }
549 
550 /*
551  * Get essence container ul index
552  */
554 {
555  int i;
556  for (i = 0; mxf_essence_mappings[i].id; i++)
557  if (mxf_essence_mappings[i].id == id)
558  return mxf_essence_mappings[i].index;
559  return -1;
560 }
561 
563 {
564  for (int i = 0; i < MXF_NUM_TAGS; i++) {
565  if (mxf_local_tag_batch[i].local_tag == tag) {
566  return &mxf_local_tag_batch[i];
567  }
568  }
569 
570  // this assert can only be hit during development
571  av_assert0(0 && "you forgot to add your new tag to mxf_local_tag_batch");
572  return NULL;
573 }
574 
575 static void mxf_mark_tag_unused(MXFContext *mxf, int tag)
576 {
578  mxf->unused_tags[pair - mxf_local_tag_batch] = 1;
579 }
580 
582 {
583  MXFContext *mxf = s->priv_data;
584  AVIOContext *pb = s->pb;
585  int local_tag_number = MXF_NUM_TAGS, i;
586  int will_have_avc_tags = 0, will_have_mastering_tags = 0, will_have_ffv1_tags = 0, will_have_jpeg2000_tags = 0;
587 
588  for (i = 0; i < s->nb_streams; i++) {
589  MXFStreamContext *sc = s->streams[i]->priv_data;
590  if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_H264 && !sc->avc_intra) {
591  will_have_avc_tags = 1;
592  }
593  if (av_packet_side_data_get(s->streams[i]->codecpar->coded_side_data,
594  s->streams[i]->codecpar->nb_coded_side_data,
596  will_have_mastering_tags = 1;
597  }
598  if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_FFV1) {
599  will_have_ffv1_tags = 1;
600  }
601  if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_JPEG2000){
602  will_have_jpeg2000_tags = 1;
603  }
604  }
605 
606  if (!mxf->store_user_comments) {
607  mxf_mark_tag_unused(mxf, 0x4406);
608  mxf_mark_tag_unused(mxf, 0x5001);
609  mxf_mark_tag_unused(mxf, 0x5003);
610  }
611 
612  if (!will_have_avc_tags && !will_have_ffv1_tags) {
613  mxf_mark_tag_unused(mxf, 0x8100);
614  }
615 
616  if (!will_have_avc_tags) {
617  mxf_mark_tag_unused(mxf, 0x8200);
618  mxf_mark_tag_unused(mxf, 0x8201);
619  mxf_mark_tag_unused(mxf, 0x8202);
620  }
621 
622  if (!will_have_mastering_tags) {
623  mxf_mark_tag_unused(mxf, 0x8301);
624  mxf_mark_tag_unused(mxf, 0x8302);
625  mxf_mark_tag_unused(mxf, 0x8303);
626  mxf_mark_tag_unused(mxf, 0x8304);
627  }
628 
629  if (!will_have_ffv1_tags) {
630  mxf_mark_tag_unused(mxf, 0xDFD9);
631  mxf_mark_tag_unused(mxf, 0xDFDA);
632  mxf_mark_tag_unused(mxf, 0xDFDB);
633  }
634 
635  if (!will_have_jpeg2000_tags) {
636  mxf_mark_tag_unused(mxf, 0x8400);
637  mxf_mark_tag_unused(mxf, 0x8401);
638  mxf_mark_tag_unused(mxf, 0x8402);
639  mxf_mark_tag_unused(mxf, 0x8403);
640  mxf_mark_tag_unused(mxf, 0x8404);
641  mxf_mark_tag_unused(mxf, 0x8405);
642  mxf_mark_tag_unused(mxf, 0x8406);
643  mxf_mark_tag_unused(mxf, 0x8407);
644  mxf_mark_tag_unused(mxf, 0x8408);
645  mxf_mark_tag_unused(mxf, 0x8409);
646  mxf_mark_tag_unused(mxf, 0x840A);
647  mxf_mark_tag_unused(mxf, 0x840B);
648  mxf_mark_tag_unused(mxf, 0x840C);
649  }
650 
651  for (i = 0; i < MXF_NUM_TAGS; i++) {
652  if (mxf->unused_tags[i]) {
653  local_tag_number--;
654  }
655  }
656 
657  avio_write(pb, primer_pack_key, 16);
658  klv_encode_ber_length(pb, local_tag_number * 18 + 8);
659 
660  avio_wb32(pb, local_tag_number); // local_tag num
661  avio_wb32(pb, 18); // item size, always 18 according to the specs
662 
663  for (i = 0; i < MXF_NUM_TAGS; i++) {
664  if (mxf->unused_tags[i] == 0) {
665  avio_wb16(pb, mxf_local_tag_batch[i].local_tag);
667  }
668  }
669 }
670 
672 {
673  MXFContext *mxf = s->priv_data;
674  AVIOContext *pb = s->pb;
676 
677  // make sure the tag was not declared unnecessary upfront
678  av_assert0(mxf->unused_tags[pair - mxf_local_tag_batch] == 0);
679 
680  avio_wb16(pb, tag);
681  avio_wb16(pb, size);
682 }
683 
684 static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value)
685 {
687  avio_wb24(pb, value);
688 }
689 
690 static const MXFCodecUL *mxf_get_codec_ul_by_id(const MXFCodecUL *uls, int id)
691 {
692  while (uls->uid[0]) {
693  if (id == uls->id)
694  break;
695  uls++;
696  }
697  return uls;
698 }
699 
700 //one EC -> one descriptor. N ECs -> MultipleDescriptor + N descriptors
701 #define DESCRIPTOR_COUNT(essence_container_count) \
702  (essence_container_count > 1 ? essence_container_count + 1 : essence_container_count)
703 
705 {
706  MXFContext *c = s->priv_data;
707  AVIOContext *pb = s->pb;
708  int i;
709 
710  mxf_write_refs_count(pb, DESCRIPTOR_COUNT(c->essence_container_count));
711  av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count);
712  for (i = 0; i < s->nb_streams; i++) {
713  MXFStreamContext *sc = s->streams[i]->priv_data;
714  // check first track of essence container type and only write it once
715  if (sc->track_essence_element_key[15] != 0)
716  continue;
717  avio_write(pb, *sc->container_ul, 16);
718  if (c->essence_container_count == 1)
719  break;
720  }
721 
722  if (c->essence_container_count > 1)
723  avio_write(pb, multiple_desc_ul, 16);
724 }
725 
727 {
728  MXFContext *mxf = s->priv_data;
729  AVIOContext *pb = s->pb;
730 
731  mxf_write_metadata_key(pb, 0x012f00);
732  PRINT_KEY(s, "preface key", pb->buf_ptr - 16);
734 
735  // write preface set uid
736  mxf_write_local_tag(s, 16, 0x3C0A);
737  mxf_write_uuid(pb, Preface, 0);
738  PRINT_KEY(s, "preface uid", pb->buf_ptr - 16);
739 
740  // last modified date
741  mxf_write_local_tag(s, 8, 0x3B02);
742  avio_wb64(pb, mxf->timestamp);
743 
744  // write version
745  mxf_write_local_tag(s, 2, 0x3B05);
746  avio_wb16(pb, 259); // v1.3
747 
748  // Object Model Version
749  mxf_write_local_tag(s, 4, 0x3B07);
750  avio_wb32(pb, 1);
751 
752  // write identification_refs
753  mxf_write_local_tag(s, 16 + 8, 0x3B06);
754  mxf_write_refs_count(pb, 1);
756 
757  // write content_storage_refs
758  mxf_write_local_tag(s, 16, 0x3B03);
760 
761  // operational pattern
762  mxf_write_local_tag(s, 16, 0x3B09);
763  if (IS_OPATOM(s))
764  avio_write(pb, opatom_ul, 16);
765  else
766  avio_write(pb, op1a_ul, 16);
767 
768  // write essence_container_refs
771 
772  // write dm_scheme_refs
773  mxf_write_local_tag(s, 8, 0x3B0B);
774  avio_wb64(pb, 0);
775 }
776 
777 /*
778  * Returns the length of the UTF-16 string, in 16-bit characters, that would result
779  * from decoding the utf-8 string.
780  */
781 static uint64_t mxf_utf16len(const char *utf8_str)
782 {
783  const uint8_t *q = utf8_str;
784  uint64_t size = 0;
785  while (*q) {
786  uint32_t ch;
787  GET_UTF8(ch, *q++, goto invalid;)
788  if (ch < 0x10000)
789  size++;
790  else
791  size += 2;
792  continue;
793 invalid:
794  av_log(NULL, AV_LOG_ERROR, "Invalid UTF8 sequence in mxf_utf16len\n\n");
795  }
796  size += 1;
797  return size;
798 }
799 
800 /*
801  * Returns the calculated length a local tag containing an utf-8 string as utf-16
802  */
803 static int mxf_utf16_local_tag_length(const char *utf8_str)
804 {
805  uint64_t size;
806 
807  if (!utf8_str)
808  return 0;
809 
810  size = mxf_utf16len(utf8_str);
811  if (size >= UINT16_MAX/2) {
812  av_log(NULL, AV_LOG_ERROR, "utf16 local tag size %"PRIx64" invalid (too large), ignoring\n", size);
813  return 0;
814  }
815 
816  return 4 + size * 2;
817 }
818 
819 /*
820  * Write a local tag containing an utf-8 string as utf-16
821  */
822 static void mxf_write_local_tag_utf16(AVFormatContext *s, int tag, const char *value)
823 {
824  AVIOContext *pb = s->pb;
825  uint64_t size = mxf_utf16len(value);
826 
827  if (size >= UINT16_MAX/2) {
828  av_log(NULL, AV_LOG_ERROR, "utf16 local tag size %"PRIx64" invalid (too large), ignoring\n", size);
829  return;
830  }
831 
833  avio_put_str16be(pb, value);
834 }
835 
837  AVIOContext *pb = s->pb;
838 
839  if (s->flags & AVFMT_FLAG_BITEXACT) {
840  avio_wb16(pb, 0); // major
841  avio_wb16(pb, 0); // minor
842  avio_wb16(pb, 0); // tertiary
843  } else {
844  avio_wb16(pb, LIBAVFORMAT_VERSION_MAJOR); // major
845  avio_wb16(pb, LIBAVFORMAT_VERSION_MINOR); // minor
846  avio_wb16(pb, LIBAVFORMAT_VERSION_MICRO); // tertiary
847  }
848  avio_wb16(pb, 0); // patch
849  avio_wb16(pb, 0); // release
850 }
851 
852 #define PLATFORM_IDENT "Lavf " AV_STRINGIFY((OS_NAME))
854 {
855  MXFContext *mxf = s->priv_data;
856  AVIOContext *pb = s->pb;
857  AVDictionaryEntry *com_entry = av_dict_get(s->metadata, "company_name", NULL, 0);
858  AVDictionaryEntry *product_entry = av_dict_get(s->metadata, "product_name", NULL, 0);
859  AVDictionaryEntry *version_entry = av_dict_get(s->metadata, "product_version", NULL, 0);
860  const char *company = com_entry ? com_entry->value : "FFmpeg";
861  const char *product = product_entry ? product_entry->value : !IS_OPATOM(s) ? "OP1a Muxer" : "OPAtom Muxer";
862  const char *platform = s->flags & AVFMT_FLAG_BITEXACT ? "Lavf" : PLATFORM_IDENT;
863  const char *version = version_entry ? version_entry->value :
864  s->flags & AVFMT_FLAG_BITEXACT ? "0.0.0" :
866  int length;
867 
868  mxf_write_metadata_key(pb, 0x013000);
869  PRINT_KEY(s, "identification key", pb->buf_ptr - 16);
870 
871  length = 100 +mxf_utf16_local_tag_length(company) +
872  mxf_utf16_local_tag_length(product) +
873  mxf_utf16_local_tag_length(platform) +
875  klv_encode_ber_length(pb, length);
876 
877  // write uid
878  mxf_write_local_tag(s, 16, 0x3C0A);
880  PRINT_KEY(s, "identification uid", pb->buf_ptr - 16);
881 
882  // write generation uid
883  mxf_write_local_tag(s, 16, 0x3C09);
885  mxf_write_local_tag_utf16(s, 0x3C01, company); // Company Name
886  mxf_write_local_tag_utf16(s, 0x3C02, product); // Product Name
887 
888  mxf_write_local_tag(s, 10, 0x3C03); // Product Version
889  store_version(s);
890 
891  mxf_write_local_tag_utf16(s, 0x3C04, version); // Version String
892  mxf_write_local_tag_utf16(s, 0x3C08, platform); // Platform
893 
894  // write product uid
895  mxf_write_local_tag(s, 16, 0x3C05);
896  avio_write(pb, product_uid, 16);
897 
898  // modification date
899  mxf_write_local_tag(s, 8, 0x3C06);
900  avio_wb64(pb, mxf->timestamp);
901 
902  mxf_write_local_tag(s, 10, 0x3C07); // Toolkit Version
903  store_version(s);
904 }
905 
906 static void mxf_write_content_storage(AVFormatContext *s, MXFPackage *packages, int package_count)
907 {
908  AVIOContext *pb = s->pb;
909  int i;
910 
911  mxf_write_metadata_key(pb, 0x011800);
912  PRINT_KEY(s, "content storage key", pb->buf_ptr - 16);
913  klv_encode_ber_length(pb, 60 + (16 * package_count));
914 
915  // write uid
916  mxf_write_local_tag(s, 16, 0x3C0A);
918  PRINT_KEY(s, "content storage uid", pb->buf_ptr - 16);
919 
920  // write package reference
921  mxf_write_local_tag(s, 16 * package_count + 8, 0x1901);
922  mxf_write_refs_count(pb, package_count);
923  for (i = 0; i < package_count; i++) {
924  mxf_write_uuid(pb, packages[i].type, packages[i].instance);
925  }
926 
927  // write essence container data
928  mxf_write_local_tag(s, 8 + 16, 0x1902);
929  mxf_write_refs_count(pb, 1);
931 }
932 
934 {
935  MXFContext *mxf = s->priv_data;
936  AVIOContext *pb = s->pb;
937  MXFStreamContext *sc = st->priv_data;
938 
939  mxf_write_metadata_key(pb, 0x013b00);
940  PRINT_KEY(s, "track key", pb->buf_ptr - 16);
941  klv_encode_ber_length(pb, 80);
942 
943  // write track uid
944  mxf_write_local_tag(s, 16, 0x3C0A);
946  PRINT_KEY(s, "track uid", pb->buf_ptr - 16);
947 
948  // write track id
949  mxf_write_local_tag(s, 4, 0x4801);
950  avio_wb32(pb, st->index+2);
951 
952  // write track number
953  mxf_write_local_tag(s, 4, 0x4804);
954  if (package->type == MaterialPackage)
955  avio_wb32(pb, 0); // track number of material package is 0
956  else
957  avio_write(pb, sc->track_essence_element_key + 12, 4);
958 
959  // write edit rate
960  mxf_write_local_tag(s, 8, 0x4B01);
961 
962  if (st == mxf->timecode_track && IS_OPATOM(s)) {
963  avio_wb32(pb, mxf->tc.rate.num);
964  avio_wb32(pb, mxf->tc.rate.den);
965  } else {
966  avio_wb32(pb, mxf->time_base.den);
967  avio_wb32(pb, mxf->time_base.num);
968  }
969 
970  // write origin
971  mxf_write_local_tag(s, 8, 0x4B02);
972  avio_wb64(pb, 0);
973 
974  // write sequence refs
975  mxf_write_local_tag(s, 16, 0x4803);
977 }
978 
979 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 };
980 
982 {
983  MXFContext *mxf = s->priv_data;
984  AVIOContext *pb = s->pb;
985 
986  // find data define uls
987  mxf_write_local_tag(s, 16, 0x0201);
988  if (st == mxf->timecode_track)
990  else {
992  avio_write(pb, data_def_ul->uid, 16);
993  }
994 
995  // write duration
996  mxf_write_local_tag(s, 8, 0x0202);
997 
998  if (st != mxf->timecode_track && IS_OPATOM(s) && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
999  avio_wb64(pb, mxf->body_offset / mxf->edit_unit_byte_count);
1000  } else {
1001  avio_wb64(pb, mxf->duration);
1002  }
1003 }
1004 
1006 {
1007  MXFContext *mxf = s->priv_data;
1008  AVIOContext *pb = s->pb;
1009  enum MXFMetadataSetType component;
1010 
1011  mxf_write_metadata_key(pb, 0x010f00);
1012  PRINT_KEY(s, "sequence key", pb->buf_ptr - 16);
1013  klv_encode_ber_length(pb, 80);
1014 
1015  mxf_write_local_tag(s, 16, 0x3C0A);
1017 
1018  PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
1020 
1021  // write structural component
1022  mxf_write_local_tag(s, 16 + 8, 0x1001);
1023  mxf_write_refs_count(pb, 1);
1024  if (st == mxf->timecode_track)
1025  component = TimecodeComponent;
1026  else
1027  component = SourceClip;
1028 
1029  mxf_write_uuid(pb, component, mxf->track_instance_count);
1030 }
1031 
1033 {
1034  MXFContext *mxf = s->priv_data;
1035  AVIOContext *pb = s->pb;
1036 
1037  mxf_write_metadata_key(pb, 0x011400);
1038  klv_encode_ber_length(pb, 75);
1039 
1040  // UID
1041  mxf_write_local_tag(s, 16, 0x3C0A);
1043 
1045 
1046  // Start Time Code
1047  mxf_write_local_tag(s, 8, 0x1501);
1048  avio_wb64(pb, mxf->tc.start);
1049 
1050  // Rounded Time Code Base
1051  mxf_write_local_tag(s, 2, 0x1502);
1052  avio_wb16(pb, mxf->timecode_base);
1053 
1054  // Drop Frame
1055  mxf_write_local_tag(s, 1, 0x1503);
1056  avio_w8(pb, !!(mxf->tc.flags & AV_TIMECODE_FLAG_DROPFRAME));
1057 }
1058 
1060 {
1061  MXFContext *mxf = s->priv_data;
1062  AVIOContext *pb = s->pb;
1063 
1064  mxf_write_metadata_key(pb, 0x011100);
1065  PRINT_KEY(s, "sturctural component key", pb->buf_ptr - 16);
1066  klv_encode_ber_length(pb, 108);
1067 
1068  // write uid
1069  mxf_write_local_tag(s, 16, 0x3C0A);
1071 
1072  PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
1074 
1075  // write start_position
1076  mxf_write_local_tag(s, 8, 0x1201);
1077  avio_wb64(pb, 0);
1078 
1079  // write source package uid, end of the reference
1080  mxf_write_local_tag(s, 32, 0x1101);
1081  if (!package->ref) {
1082  ffio_fill(pb, 0, 32);
1083  } else
1084  mxf_write_umid(s, package->ref->instance);
1085 
1086  // write source track id
1087  mxf_write_local_tag(s, 4, 0x1102);
1088  if (package->type == SourcePackage && !package->ref)
1089  avio_wb32(pb, 0);
1090  else
1091  avio_wb32(pb, st->index+2);
1092 }
1093 
1095 {
1096  AVIOContext *pb = s->pb;
1097 
1098  mxf_write_metadata_key(pb, 0x012e00);
1099  PRINT_KEY(s, "tape descriptor key", pb->buf_ptr - 16);
1100  klv_encode_ber_length(pb, 20);
1101  mxf_write_local_tag(s, 16, 0x3C0A);
1103  PRINT_KEY(s, "tape_desc uid", pb->buf_ptr - 16);
1104 }
1105 
1106 
1108 {
1109  MXFContext *mxf = s->priv_data;
1110  AVIOContext *pb = s->pb;
1111  const uint8_t *ul;
1112  int i;
1113 
1114  mxf_write_metadata_key(pb, 0x014400);
1115  PRINT_KEY(s, "multiple descriptor key", pb->buf_ptr - 16);
1116  klv_encode_ber_length(pb, 64 + 16LL * s->nb_streams);
1117 
1118  mxf_write_local_tag(s, 16, 0x3C0A);
1120  PRINT_KEY(s, "multi_desc uid", pb->buf_ptr - 16);
1121 
1122  // write sample rate
1123  mxf_write_local_tag(s, 8, 0x3001);
1124  avio_wb32(pb, mxf->time_base.den);
1125  avio_wb32(pb, mxf->time_base.num);
1126 
1127  // write essence container ul
1128  mxf_write_local_tag(s, 16, 0x3004);
1129  if (mxf->essence_container_count > 1)
1130  ul = multiple_desc_ul;
1131  else {
1132  MXFStreamContext *sc = s->streams[0]->priv_data;
1133  ul = *sc->container_ul;
1134  }
1135  avio_write(pb, ul, 16);
1136 
1137  // write sub descriptor refs
1138  mxf_write_local_tag(s, s->nb_streams * 16 + 8, 0x3F01);
1139  mxf_write_refs_count(pb, s->nb_streams);
1140  for (i = 0; i < s->nb_streams; i++)
1142 }
1143 
1145 {
1146  MXFContext *mxf = s->priv_data;
1147  MXFStreamContext *sc = st->priv_data;
1148  AVIOContext *pb = s->pb;
1149  int64_t pos;
1150 
1151  avio_write(pb, key, 16);
1152  klv_encode_ber4_length(pb, 0);
1153  pos = avio_tell(pb);
1154 
1155  mxf_write_local_tag(s, 16, 0x3C0A);
1157 
1158  mxf_write_local_tag(s, 4, 0x3006);
1159  avio_wb32(pb, st->index+2);
1160 
1161  mxf_write_local_tag(s, 8, 0x3001);
1162  if (IS_D10(s)) {
1163  avio_wb32(pb, mxf->time_base.den);
1164  avio_wb32(pb, mxf->time_base.num);
1165  } else {
1166  if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16LE ||
1168  avio_wb32(pb, st->codecpar->sample_rate);
1169  avio_wb32(pb, 1);
1170  } else {
1171  avio_wb32(pb, mxf->time_base.den);
1172  avio_wb32(pb, mxf->time_base.num);
1173  }
1174  }
1175 
1176  mxf_write_local_tag(s, 16, 0x3004);
1177  avio_write(pb, *sc->container_ul, 16);
1178 
1179  return pos;
1180 }
1181 
1182 static const UID mxf_s436m_anc_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x5c,0x00 };
1183 static const UID mxf_mpegvideo_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 };
1184 static const UID mxf_wav_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 };
1185 static const UID mxf_aes3_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 };
1186 static const UID mxf_cdci_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x28,0x00 };
1187 static const UID mxf_rgba_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x29,0x00 };
1188 static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x42,0x00 };
1189 
1190 static const UID mxf_avc_subdescriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x6E,0x00 };
1191 static const UID mxf_ffv1_subdescriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x81,0x03 };
1192 static const UID mxf_jpeg2000_subdescriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x5A,0x00};
1193 
1194 static inline uint16_t rescale_mastering_chroma(AVRational q)
1195 {
1197 }
1198 
1199 static inline uint32_t rescale_mastering_luma(AVRational q)
1200 {
1202 }
1203 
1205 {
1206  MXFStreamContext *sc = st->priv_data;
1207  AVIOContext *pb = s->pb;
1208  int stored_width = st->codecpar->width;
1209  int stored_height = st->codecpar->height;
1210  int display_width;
1211  int display_height;
1212  int f1, f2;
1213  const MXFCodecUL *color_primaries_ul;
1214  const MXFCodecUL *color_trc_ul;
1215  const MXFCodecUL *color_space_ul;
1217  const AVPacketSideData *side_data;
1218 
1222 
1223  if (st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO) {
1224  if (st->codecpar->height == 1080)
1225  stored_width = 1920;
1226  else if (st->codecpar->height == 720)
1227  stored_width = 1280;
1228  }
1229  display_width = stored_width;
1230 
1231  switch (st->codecpar->codec_id) {
1233  case AV_CODEC_ID_H264:
1234  //Based on 16x16 macroblocks
1235  stored_width = (stored_width+15)/16*16;
1236  stored_height = (stored_height+15)/16*16;
1237  break;
1238  default:
1239  break;
1240  }
1241 
1242  //Stored width
1243  mxf_write_local_tag(s, 4, 0x3203);
1244  avio_wb32(pb, stored_width);
1245 
1246  //Stored height
1247  mxf_write_local_tag(s, 4, 0x3202);
1248  avio_wb32(pb, stored_height>>sc->interlaced);
1249 
1250  if (IS_D10(s)) {
1251  //Stored F2 Offset
1252  mxf_write_local_tag(s, 4, 0x3216);
1253  avio_wb32(pb, 0);
1254 
1255  //Image Start Offset
1256  mxf_write_local_tag(s, 4, 0x3213);
1257  avio_wb32(pb, 0);
1258 
1259  //Image End Offset
1260  mxf_write_local_tag(s, 4, 0x3214);
1261  avio_wb32(pb, 0);
1262  }
1263 
1264  //Sampled width
1265  mxf_write_local_tag(s, 4, 0x3205);
1266  avio_wb32(pb, display_width);
1267 
1268  //Samples height
1269  mxf_write_local_tag(s, 4, 0x3204);
1270  avio_wb32(pb, st->codecpar->height>>sc->interlaced);
1271 
1272  //Sampled X Offset
1273  mxf_write_local_tag(s, 4, 0x3206);
1274  avio_wb32(pb, 0);
1275 
1276  //Sampled Y Offset
1277  mxf_write_local_tag(s, 4, 0x3207);
1278  avio_wb32(pb, 0);
1279 
1280  //Display width
1281  mxf_write_local_tag(s, 4, 0x3209);
1282  avio_wb32(pb, display_width);
1283 
1284  if (st->codecpar->height == 608) // PAL + VBI
1285  display_height = 576;
1286  else if (st->codecpar->height == 512) // NTSC + VBI
1287  display_height = 486;
1288  else
1289  display_height = st->codecpar->height;
1290 
1291  //Display height
1292  mxf_write_local_tag(s, 4, 0x3208);
1293  avio_wb32(pb, display_height>>sc->interlaced);
1294 
1295  // display X offset
1296  mxf_write_local_tag(s, 4, 0x320A);
1297  avio_wb32(pb, 0);
1298 
1299  // display Y offset
1300  mxf_write_local_tag(s, 4, 0x320B);
1301  avio_wb32(pb, (st->codecpar->height - display_height)>>sc->interlaced);
1302 
1303  if (sc->interlaced) {
1304  //Display F2 Offset
1305  mxf_write_local_tag(s, 4, 0x3217);
1306  avio_wb32(pb, -((st->codecpar->height - display_height)&1));
1307  }
1308 
1309  if (key != mxf_rgba_descriptor_key) {
1310  // component depth
1311  mxf_write_local_tag(s, 4, 0x3301);
1312  avio_wb32(pb, sc->component_depth);
1313 
1314  // horizontal subsampling
1315  mxf_write_local_tag(s, 4, 0x3302);
1316  avio_wb32(pb, sc->h_chroma_sub_sample);
1317 
1318  // vertical subsampling
1319  mxf_write_local_tag(s, 4, 0x3308);
1320  avio_wb32(pb, sc->v_chroma_sub_sample);
1321 
1322  // color siting
1323  mxf_write_local_tag(s, 1, 0x3303);
1324  avio_w8(pb, sc->color_siting);
1325 
1326  // Padding Bits
1327  mxf_write_local_tag(s, 2, 0x3307);
1328  avio_wb16(pb, 0);
1329 
1331  int black = 0,
1332  white = (1<<sc->component_depth) - 1,
1333  color = (1<<sc->component_depth);
1334  if (st->codecpar->color_range == AVCOL_RANGE_MPEG) {
1335  black = 1 << (sc->component_depth - 4);
1336  white = 235 << (sc->component_depth - 8);
1337  color = (14 << (sc->component_depth - 4)) + 1;
1338  }
1339  mxf_write_local_tag(s, 4, 0x3304);
1340  avio_wb32(pb, black);
1341  mxf_write_local_tag(s, 4, 0x3305);
1342  avio_wb32(pb, white);
1343  mxf_write_local_tag(s, 4, 0x3306);
1344  avio_wb32(pb, color);
1345  }
1346  }
1347 
1348  if (sc->signal_standard) {
1349  mxf_write_local_tag(s, 1, 0x3215);
1350  avio_w8(pb, sc->signal_standard);
1351  }
1352 
1353  // frame layout
1354  mxf_write_local_tag(s, 1, 0x320C);
1355  avio_w8(pb, sc->interlaced);
1356 
1357  // video line map
1358  switch (st->codecpar->height) {
1359  case 576: f1 = 23; f2 = st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO ? 335 : 336; break;
1360  case 608: f1 = 7; f2 = 320; break;
1361  case 480: f1 = 20; f2 = st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO ? 285 : 283; break;
1362  case 512: f1 = 7; f2 = 270; break;
1363  case 720: f1 = 26; f2 = 0; break; // progressive
1364  case 1080: f1 = 21; f2 = 584; break;
1365  default: f1 = 0; f2 = 0; break;
1366  }
1367 
1368  if (!sc->interlaced && f2) {
1369  f2 = 0;
1370  f1 *= 2;
1371  }
1372 
1373 
1374  mxf_write_local_tag(s, 16, 0x320D);
1375  avio_wb32(pb, 2);
1376  avio_wb32(pb, 4);
1377  avio_wb32(pb, f1);
1378  avio_wb32(pb, f2);
1379 
1380  mxf_write_local_tag(s, 8, 0x320E);
1381  avio_wb32(pb, sc->aspect_ratio.num);
1382  avio_wb32(pb, sc->aspect_ratio.den);
1383 
1384  if (color_primaries_ul->uid[0]) {
1385  mxf_write_local_tag(s, 16, 0x3219);
1386  avio_write(pb, color_primaries_ul->uid, 16);
1387  };
1388 
1389  if (color_trc_ul->uid[0]) {
1390  mxf_write_local_tag(s, 16, 0x3210);
1391  avio_write(pb, color_trc_ul->uid, 16);
1392  };
1393 
1394  if (color_space_ul->uid[0]) {
1395  mxf_write_local_tag(s, 16, 0x321A);
1396  avio_write(pb, color_space_ul->uid, 16);
1397  };
1398 
1399  mxf_write_local_tag(s, 16, 0x3201);
1400  avio_write(pb, *sc->codec_ul, 16);
1401 
1402  // Mastering Display metadata
1406  if (side_data) {
1407  const AVMasteringDisplayMetadata *metadata = (const AVMasteringDisplayMetadata*)side_data->data;
1408  if (metadata->has_primaries) {
1409  mxf_write_local_tag(s, 12, 0x8301);
1416  mxf_write_local_tag(s, 4, 0x8302);
1417  avio_wb16(pb, rescale_mastering_chroma(metadata->white_point[0]));
1418  avio_wb16(pb, rescale_mastering_chroma(metadata->white_point[1]));
1419  } else {
1420  av_log(NULL, AV_LOG_VERBOSE, "Not writing mastering display primaries. Missing data.\n");
1421  }
1422  if (metadata->has_luminance) {
1423  mxf_write_local_tag(s, 4, 0x8303);
1425  mxf_write_local_tag(s, 4, 0x8304);
1427  } else {
1428  av_log(NULL, AV_LOG_VERBOSE, "Not writing mastering display luminances. Missing data.\n");
1429  }
1430  }
1431 
1432  if (sc->interlaced && sc->field_dominance) {
1433  mxf_write_local_tag(s, 1, 0x3212);
1434  avio_w8(pb, sc->field_dominance);
1435  }
1436 
1437  if (st->codecpar->codec_id == AV_CODEC_ID_H264 && !sc->avc_intra) {
1438  // write avc sub descriptor ref
1439  mxf_write_local_tag(s, 8 + 16, 0x8100);
1440  mxf_write_refs_count(pb, 1);
1442  }
1443 
1444  if (st->codecpar->codec_id == AV_CODEC_ID_FFV1) {
1445  // write ffv1 sub descriptor ref
1446  mxf_write_local_tag(s, 8 + 16, 0x8100);
1447  mxf_write_refs_count(pb, 1);
1449  }
1450 
1451  return pos;
1452 }
1453 
1455 {
1456  int64_t cur_pos = avio_tell(pb);
1457  int size = cur_pos - pos;
1458  avio_seek(pb, pos - 4, SEEK_SET);
1460  avio_seek(pb, cur_pos, SEEK_SET);
1461 }
1462 
1464 {
1465  AVIOContext *pb = s->pb;
1466  int64_t pos;
1467 
1469  klv_encode_ber4_length(pb, 0);
1470  pos = avio_tell(pb);
1471 
1472  mxf_write_local_tag(s, 16, 0x3C0A);
1474 
1475  mxf_write_local_tag(s, 1, 0x8200);
1476  avio_w8(pb, 0xFF); // AVC Decoding Delay, unknown
1477 
1478  mxf_write_local_tag(s, 1, 0x8201);
1479  avio_w8(pb, st->codecpar->profile); // AVC Profile
1480 
1481  mxf_write_local_tag(s, 1, 0x8202);
1482  avio_w8(pb, st->codecpar->level); // AVC Level
1483 
1484  mxf_update_klv_size(s->pb, pos);
1485 }
1486 
1488 {
1489  MXFStreamContext *sc = st->priv_data;
1490  AVIOContext *pb = s->pb;
1491  int64_t pos;
1492  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(st->codecpar->format);
1493 
1494  if (!pix_desc) {
1495  av_log(s, AV_LOG_ERROR, "Pixel format not set - not writing JPEG2000SubDescriptor\n");
1496  return AVERROR(EINVAL);
1497  }
1498 
1499  /* JPEG2000 subdescriptor key */
1501  klv_encode_ber4_length(pb, 0);
1502  pos = avio_tell(pb);
1503 
1504  mxf_write_local_tag(s, 16, 0x3C0A);
1506 
1507  /* Value defining the decoder capabilities (rsiz) */
1508  mxf_write_local_tag(s, 2, 0x8401);
1509  avio_wb16(pb, sc->j2k_info.j2k_rsiz);
1510  /* Width of the JPEG2000 reference grid (Xsiz) */
1511  mxf_write_local_tag(s, 4, 0x8402);
1512  avio_wb32(pb, st->codecpar->width);
1513  /* Height of the JPEG2000 reference grid (Ysiz) */
1514  mxf_write_local_tag(s, 4, 0x8403);
1515  avio_wb32(pb, st->codecpar->height);
1516  /* Horizontal offset from the reference grid origin to the left side of the image area (X0siz) */
1517  mxf_write_local_tag(s, 4, 0x8404);
1518  avio_wb32(pb, sc->j2k_info.j2k_x0siz);
1519  /* Vertical offset from the reference grid origin to the left side of the image area (Y0siz) */
1520  mxf_write_local_tag(s, 4, 0x8405);
1521  avio_wb32(pb, sc->j2k_info.j2k_y0siz);
1522  /* Width of one reference tile with respect to the reference grid (XTsiz) */
1523  mxf_write_local_tag(s, 4, 0x8406);
1524  avio_wb32(pb, sc->j2k_info.j2k_xtsiz);
1525  /* Height of one reference tile with respect to the reference grid (YTsiz) */
1526  mxf_write_local_tag(s, 4, 0x8407);
1527  avio_wb32(pb, sc->j2k_info.j2k_ytsiz);
1528  /* Horizontal offset from the origin of the reference grid to the left side of the first tile (XT0siz) */
1529  mxf_write_local_tag(s, 4, 0x8408);
1530  avio_wb32(pb, sc->j2k_info.j2k_xt0siz);
1531  /* Vertical offset from the origin of the reference grid to the left side of the first tile (YT0siz) */
1532  mxf_write_local_tag(s, 4, 0x8409);
1533  avio_wb32(pb, sc->j2k_info.j2k_yt0siz);
1534  /* Image components number (Csiz) */
1535  mxf_write_local_tag(s, 2, 0x840A);
1536  avio_wb16(pb, pix_desc->nb_components);
1537  /* Array of picture components where each component comprises 3 bytes named Ssiz(i) (Pixel bitdepth - 1),
1538  XRSiz(i) (Horizontal sampling), YRSiz(i) (Vertical sampling). The array of 3-byte groups is preceded
1539  by the array header comprising a 4-byte value of the number of components followed by a 4-byte
1540  value of 3. */
1541  mxf_write_local_tag(s, 8 + 3*pix_desc->nb_components, 0x840B);
1542  avio_wb32(pb, pix_desc->nb_components);
1543  avio_wb32(pb, 3);
1544  avio_write(pb, sc->j2k_info.j2k_comp_desc, 3*pix_desc->nb_components);
1545 
1546  mxf_update_klv_size(pb, pos);
1547  return 0;
1548 }
1549 
1551 {
1553  mxf_update_klv_size(s->pb, pos);
1554 
1555  if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
1556  mxf_write_avc_subdesc(s, st);
1557  }
1558  if (st->codecpar->codec_id == AV_CODEC_ID_JPEG2000) {
1559  return mxf_write_jpeg2000_subdesc(s, st);
1560  }
1561  return 0;
1562 }
1563 
1565 {
1566  MXFStreamContext *sc = st->priv_data;
1567  if (sc->avc_intra) {
1569  } else {
1571  mxf_update_klv_size(s->pb, pos);
1572  mxf_write_avc_subdesc(s, st);
1573  }
1574  return 0;
1575 }
1576 
1578 {
1579  AVIOContext *pb = s->pb;
1580  MXFStreamContext *sc = st->priv_data;
1581  int64_t pos;
1582 
1584  klv_encode_ber4_length(pb, 0);
1585  pos = avio_tell(pb);
1586 
1587  mxf_write_local_tag(s, 16, 0x3C0A);
1589 
1590  if (st->codecpar->extradata_size) {
1592  avio_write(pb, st->codecpar->extradata, st->codecpar->extradata_size); // FFV1InitializationMetadata
1593  }
1594 
1595  mxf_write_local_tag(s, 2, 0xDFDA);
1596  avio_wb16(pb, (*sc->codec_ul)[14]); // FFV1Version
1597 
1598  if (st->codecpar->extradata_size) {
1599  mxf_write_local_tag(s, 2, 0xDFD9);
1600  avio_wb16(pb, sc->micro_version); // FFV1MicroVersion
1601  }
1602 
1603  mxf_update_klv_size(s->pb, pos);
1604  return 0;
1605 }
1606 
1608 {
1609  int is_rgb, pos;
1611  av_assert0(desc);
1612  is_rgb = desc->flags & AV_PIX_FMT_FLAG_RGB;
1613 
1615  mxf_update_klv_size(s->pb, pos);
1616  return mxf_write_ffv1_subdesc(s, st);
1617 }
1618 
1620 {
1622  mxf_update_klv_size(s->pb, pos);
1623  return 0;
1624 }
1625 
1627 {
1628  AVIOContext *pb = s->pb;
1629  MXFStreamContext *sc = st->priv_data;
1630  int profile_and_level = (st->codecpar->profile<<4) | st->codecpar->level;
1632 
1633  if (st->codecpar->codec_id != AV_CODEC_ID_H264) {
1634  // bit rate
1635  mxf_write_local_tag(s, 4, 0x8000);
1636  avio_wb32(pb, sc->video_bit_rate);
1637 
1638  // profile and level
1639  mxf_write_local_tag(s, 1, 0x8007);
1640  if (!st->codecpar->profile)
1641  profile_and_level |= 0x80; // escape bit
1642  avio_w8(pb, profile_and_level);
1643 
1644  // low delay
1645  mxf_write_local_tag(s, 1, 0x8003);
1646  avio_w8(pb, sc->low_delay);
1647 
1648  // closed gop
1649  mxf_write_local_tag(s, 1, 0x8004);
1650  avio_w8(pb, sc->seq_closed_gop);
1651 
1652  // max gop
1653  mxf_write_local_tag(s, 2, 0x8006);
1654  avio_wb16(pb, sc->max_gop);
1655 
1656  // b picture count
1657  mxf_write_local_tag(s, 2, 0x8008);
1658  avio_wb16(pb, sc->b_picture_count);
1659  }
1660 
1661  mxf_update_klv_size(pb, pos);
1662  return 0;
1663 }
1664 
1666 {
1667  AVIOContext *pb = s->pb;
1668  MXFContext *mxf = s->priv_data;
1669  int show_warnings = !mxf->footer_partition_offset;
1671 
1672  if (IS_OPATOM(s)) {
1673  mxf_write_local_tag(s, 8, 0x3002);
1674  avio_wb64(pb, mxf->body_offset / mxf->edit_unit_byte_count);
1675  }
1676 
1677  // audio locked
1678  mxf_write_local_tag(s, 1, 0x3D02);
1679  avio_w8(pb, 1);
1680 
1681  // write audio sampling rate
1682  mxf_write_local_tag(s, 8, 0x3D03);
1683  avio_wb32(pb, st->codecpar->sample_rate);
1684  avio_wb32(pb, 1);
1685 
1686  if (IS_D10(s)) {
1687  mxf_write_local_tag(s, 1, 0x3D04);
1688  avio_w8(pb, 0);
1689  }
1690 
1691  mxf_write_local_tag(s, 4, 0x3D07);
1692  if (mxf->channel_count == -1) {
1693  if (show_warnings && IS_D10(s) &&
1694  (st->codecpar->ch_layout.nb_channels != 4) &&
1695  (st->codecpar->ch_layout.nb_channels != 8))
1696  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");
1698  } else if (IS_D10(s)) {
1699  if (show_warnings && (mxf->channel_count < st->codecpar->ch_layout.nb_channels))
1700  av_log(s, AV_LOG_WARNING, "d10_channelcount < actual number of audio channels : some channels will be discarded\n");
1701  if (show_warnings && (mxf->channel_count != 4) && (mxf->channel_count != 8))
1702  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");
1703  avio_wb32(pb, mxf->channel_count);
1704  } else {
1706  }
1707 
1708  mxf_write_local_tag(s, 4, 0x3D01);
1710 
1711  return pos;
1712 }
1713 
1715 {
1716  AVIOContext *pb = s->pb;
1718 
1719  mxf_write_local_tag(s, 2, 0x3D0A);
1720  avio_wb16(pb, st->codecpar->block_align);
1721 
1722  // avg bytes per sec
1723  mxf_write_local_tag(s, 4, 0x3D09);
1725 
1726  return pos;
1727 }
1728 
1730 {
1732  mxf_update_klv_size(s->pb, pos);
1733  return 0;
1734 }
1735 
1737 {
1739  mxf_update_klv_size(s->pb, pos);
1740  return 0;
1741 }
1742 
1744 {
1746  mxf_update_klv_size(s->pb, pos);
1747  return 0;
1748 }
1749 
1750 static const uint8_t mxf_indirect_value_utf16le[] = { 0x4c,0x00,0x02,0x10,0x01,0x00,0x00,0x00,0x00,0x06,0x0e,0x2b,0x34,0x01,0x04,0x01,0x01 };
1751 
1752 static int mxf_write_tagged_value(AVFormatContext *s, const char* name, const char* value)
1753 {
1754  MXFContext *mxf = s->priv_data;
1755  AVIOContext *pb = s->pb;
1756  int name_size = mxf_utf16_local_tag_length(name);
1757  int indirect_value_size = 13 + mxf_utf16_local_tag_length(value);
1758 
1759  if (!name_size || indirect_value_size == 13)
1760  return 1;
1761 
1762  mxf_write_metadata_key(pb, 0x013f00);
1763  klv_encode_ber_length(pb, 24 + name_size + indirect_value_size);
1764 
1765  // write instance UID
1766  mxf_write_local_tag(s, 16, 0x3C0A);
1768 
1769  // write name
1770  mxf_write_local_tag_utf16(s, 0x5001, name); // Name
1771 
1772  // write indirect value
1773  mxf_write_local_tag(s, indirect_value_size, 0x5003);
1775  avio_put_str16le(pb, value);
1776 
1777  mxf->tagged_value_count++;
1778  return 0;
1779 }
1780 
1782 {
1783  MXFContext *mxf = s->priv_data;
1784  AVDictionaryEntry *t = NULL;
1785  int count = 0;
1786 
1787  while ((t = av_dict_get(m, "comment_", t, AV_DICT_IGNORE_SUFFIX))) {
1788  if (mxf->tagged_value_count >= UINT16_MAX) {
1789  av_log(s, AV_LOG_ERROR, "too many tagged values, ignoring remaining\n");
1790  return count;
1791  }
1792 
1793  if (mxf_write_tagged_value(s, t->key + 8, t->value) == 0)
1794  count++;
1795  }
1796  return count;
1797 }
1798 
1800 {
1801  MXFContext *mxf = s->priv_data;
1802  AVIOContext *pb = s->pb;
1803  int i, track_count = s->nb_streams+1;
1804  int name_size = mxf_utf16_local_tag_length(package->name);
1805  int user_comment_count = 0;
1806 
1807  if (package->type == MaterialPackage) {
1808  if (mxf->store_user_comments)
1809  user_comment_count = mxf_write_user_comments(s, s->metadata);
1810  mxf_write_metadata_key(pb, 0x013600);
1811  PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
1812  klv_encode_ber_length(pb, 92 + name_size + (16*track_count) + (16*user_comment_count) + 12LL*mxf->store_user_comments);
1813  } else {
1814  mxf_write_metadata_key(pb, 0x013700);
1815  PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
1816  klv_encode_ber_length(pb, 112 + name_size + (16*track_count) + 12LL*mxf->store_user_comments); // 20 bytes length for descriptor reference
1817  }
1818 
1819  // write uid
1820  mxf_write_local_tag(s, 16, 0x3C0A);
1821  mxf_write_uuid(pb, package->type, package->instance);
1822  av_log(s, AV_LOG_DEBUG, "package type:%d\n", package->type);
1823  PRINT_KEY(s, "package uid", pb->buf_ptr - 16);
1824 
1825  // write package umid
1826  mxf_write_local_tag(s, 32, 0x4401);
1827  mxf_write_umid(s, package->instance);
1828  PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
1829 
1830  // package name
1831  if (name_size)
1832  mxf_write_local_tag_utf16(s, 0x4402, package->name);
1833 
1834  // package creation date
1835  mxf_write_local_tag(s, 8, 0x4405);
1836  avio_wb64(pb, mxf->timestamp);
1837 
1838  // package modified date
1839  mxf_write_local_tag(s, 8, 0x4404);
1840  avio_wb64(pb, mxf->timestamp);
1841 
1842  // write track refs
1843  mxf_write_local_tag(s, track_count*16 + 8, 0x4403);
1844  mxf_write_refs_count(pb, track_count);
1845  // these are the uuids of the tracks the will be written in mxf_write_track
1846  for (i = 0; i < track_count; i++)
1848 
1849  // write user comment refs
1850  if (mxf->store_user_comments) {
1851  mxf_write_local_tag(s, user_comment_count*16 + 8, 0x4406);
1852  mxf_write_refs_count(pb, user_comment_count);
1853  for (i = 0; i < user_comment_count; i++)
1854  mxf_write_uuid(pb, TaggedValue, mxf->tagged_value_count - user_comment_count + i);
1855  }
1856 
1857  // write multiple descriptor reference
1858  if (package->type == SourcePackage && package->instance == 1) {
1859  mxf_write_local_tag(s, 16, 0x4701);
1860  if (s->nb_streams > 1) {
1863  } else
1864  mxf_write_uuid(pb, SubDescriptor, 0);
1865  } else if (package->type == SourcePackage && package->instance == 2) {
1866  mxf_write_local_tag(s, 16, 0x4701);
1869  }
1870 
1871  /*
1872  * for every 1 track in a package there is 1 sequence and 1 component.
1873  * all 3 of these elements share the same instance number for generating
1874  * there instance uuids. mxf->track_instance_count stores this value.
1875  * mxf->track_instance_count is incremented after a group of all 3 of
1876  * these elements are written.
1877  */
1878 
1879  // write timecode track
1880  mxf_write_track(s, mxf->timecode_track, package);
1881  mxf_write_sequence(s, mxf->timecode_track, package);
1883  mxf->track_instance_count++;
1884 
1885  for (i = 0; i < s->nb_streams; i++) {
1886  AVStream *st = s->streams[i];
1887  mxf_write_track(s, st, package);
1888  mxf_write_sequence(s, st, package);
1889  mxf_write_structural_component(s, st, package);
1890  mxf->track_instance_count++;
1891 
1892  if (package->type == SourcePackage && package->instance == 1) {
1893  MXFStreamContext *sc = st->priv_data;
1895  if (ret < 0)
1896  return ret;
1897  }
1898  }
1899 
1900  return 0;
1901 }
1902 
1904 {
1905  AVIOContext *pb = s->pb;
1906 
1907  mxf_write_metadata_key(pb, 0x012300);
1908  klv_encode_ber_length(pb, 72);
1909 
1910  mxf_write_local_tag(s, 16, 0x3C0A); // Instance UID
1912 
1913  mxf_write_local_tag(s, 32, 0x2701); // Linked Package UID
1914  mxf_write_umid(s, 1);
1915 
1916  mxf_write_local_tag(s, 4, 0x3F07); // BodySID
1917  avio_wb32(pb, 1);
1918 
1919  mxf_write_local_tag(s, 4, 0x3F06); // IndexSID
1920  avio_wb32(pb, 2);
1921 
1922  return 0;
1923 }
1924 
1926 {
1927  MXFContext *mxf = s->priv_data;
1929  AVStream *st = NULL;
1930  int i;
1931  MXFPackage packages[3] = {{0}};
1932  int package_count = 2;
1933  packages[0].type = MaterialPackage;
1934  packages[1].type = SourcePackage;
1935  packages[1].instance = 1;
1936  packages[0].ref = &packages[1];
1937 
1938 
1939  if (entry = av_dict_get(s->metadata, "material_package_name", NULL, 0))
1940  packages[0].name = entry->value;
1941 
1942  if (entry = av_dict_get(s->metadata, "file_package_name", NULL, 0)) {
1943  packages[1].name = entry->value;
1944  } else {
1945  /* check if any of the streams contain a file_package_name */
1946  for (i = 0; i < s->nb_streams; i++) {
1947  st = s->streams[i];
1948  if (entry = av_dict_get(st->metadata, "file_package_name", NULL, 0)) {
1949  packages[1].name = entry->value;
1950  break;
1951  }
1952  }
1953  }
1954 
1955  entry = av_dict_get(s->metadata, "reel_name", NULL, 0);
1956  if (entry) {
1957  packages[2].name = entry->value;
1958  packages[2].type = SourcePackage;
1959  packages[2].instance = 2;
1960  packages[1].ref = &packages[2];
1961  package_count = 3;
1962  }
1963 
1966  mxf_write_content_storage(s, packages, package_count);
1967  mxf->track_instance_count = 0;
1968  for (i = 0; i < package_count; i++) {
1969  int ret = mxf_write_package(s, &packages[i]);
1970  if (ret < 0)
1971  return ret;
1972  }
1974  return 0;
1975 }
1976 
1977 static unsigned klv_fill_size(uint64_t size)
1978 {
1979  unsigned pad = KAG_SIZE - (size & (KAG_SIZE-1));
1980  if (pad < 20) // smallest fill item possible
1981  return pad + KAG_SIZE;
1982  else
1983  return pad & (KAG_SIZE-1);
1984 }
1985 
1987 {
1988  MXFContext *mxf = s->priv_data;
1989  AVIOContext *pb = s->pb;
1990  int i, j, temporal_reordering = 0;
1991  int key_index = mxf->last_key_index;
1992  int prev_non_b_picture = 0;
1993  int audio_frame_size = 0;
1994  int64_t pos;
1995 
1996  av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count);
1997 
1998  if (!mxf->edit_units_count && !mxf->edit_unit_byte_count)
1999  return;
2000 
2002 
2003  klv_encode_ber4_length(pb, 0);
2004  pos = avio_tell(pb);
2005 
2006  // instance id
2007  mxf_write_local_tag(s, 16, 0x3C0A);
2009 
2010  // index edit rate
2011  mxf_write_local_tag(s, 8, 0x3F0B);
2012  avio_wb32(pb, mxf->time_base.den);
2013  avio_wb32(pb, mxf->time_base.num);
2014 
2015  // index start position
2016  mxf_write_local_tag(s, 8, 0x3F0C);
2018 
2019  // index duration
2020  mxf_write_local_tag(s, 8, 0x3F0D);
2021  if (mxf->edit_unit_byte_count)
2022  avio_wb64(pb, 0); // index table covers whole container
2023  else
2024  avio_wb64(pb, mxf->edit_units_count);
2025 
2026  // edit unit byte count
2027  mxf_write_local_tag(s, 4, 0x3F05);
2028  avio_wb32(pb, mxf->edit_unit_byte_count);
2029 
2030  // index sid
2031  mxf_write_local_tag(s, 4, 0x3F06);
2032  avio_wb32(pb, 2);
2033 
2034  // body sid
2035  mxf_write_local_tag(s, 4, 0x3F07);
2036  avio_wb32(pb, 1);
2037 
2038  // real slice count - 1
2039  mxf_write_local_tag(s, 1, 0x3F08);
2040  avio_w8(pb, !mxf->edit_unit_byte_count); // only one slice for CBR
2041 
2042  // delta entry array
2043  mxf_write_local_tag(s, 8 + (s->nb_streams+1)*6, 0x3F09);
2044  avio_wb32(pb, s->nb_streams+1); // num of entries
2045  avio_wb32(pb, 6); // size of one entry
2046  // write system item delta entry
2047  avio_w8(pb, 0);
2048  avio_w8(pb, 0); // slice entry
2049  avio_wb32(pb, 0); // element delta
2050  // write each stream delta entry
2051  for (i = 0; i < s->nb_streams; i++) {
2052  AVStream *st = s->streams[i];
2053  MXFStreamContext *sc = st->priv_data;
2054  avio_w8(pb, sc->temporal_reordering);
2055  if (sc->temporal_reordering)
2056  temporal_reordering = 1;
2057  if (mxf->edit_unit_byte_count) {
2058  avio_w8(pb, 0); // slice number
2059  avio_wb32(pb, sc->slice_offset);
2060  } else if (i == 0) { // video track
2061  avio_w8(pb, 0); // slice number
2062  avio_wb32(pb, KAG_SIZE); // system item size including klv fill
2063  } else { // audio or data track
2064  if (!audio_frame_size) {
2065  audio_frame_size = sc->frame_size;
2066  audio_frame_size += klv_fill_size(audio_frame_size);
2067  }
2068  avio_w8(pb, 1);
2069  avio_wb32(pb, (i-1)*audio_frame_size); // element delta
2070  }
2071  }
2072 
2073  if (!mxf->edit_unit_byte_count) {
2074  MXFStreamContext *sc = s->streams[0]->priv_data;
2075  mxf_write_local_tag(s, 8 + mxf->edit_units_count*15, 0x3F0A);
2076  avio_wb32(pb, mxf->edit_units_count); // num of entries
2077  avio_wb32(pb, 15); // size of one entry
2078 
2079  for (i = 0; i < mxf->edit_units_count; i++) {
2080  int temporal_offset = 0;
2081 
2082  if (!(mxf->index_entries[i].flags & 0x33)) { // I-frame
2083  sc->max_gop = FFMAX(sc->max_gop, i - mxf->last_key_index);
2084  mxf->last_key_index = key_index;
2085  key_index = i;
2086  }
2087 
2088  if (temporal_reordering) {
2089  int pic_num_in_gop = i - key_index;
2090  if (pic_num_in_gop != mxf->index_entries[i].temporal_ref) {
2091  for (j = key_index; j < mxf->edit_units_count; j++) {
2092  if (pic_num_in_gop == mxf->index_entries[j].temporal_ref)
2093  break;
2094  }
2095  if (j == mxf->edit_units_count)
2096  av_log(s, AV_LOG_WARNING, "missing frames\n");
2097  temporal_offset = j - key_index - pic_num_in_gop;
2098  }
2099  }
2100  avio_w8(pb, temporal_offset);
2101 
2102  if ((mxf->index_entries[i].flags & 0x30) == 0x30) { // back and forward prediction
2103  sc->b_picture_count = FFMAX(sc->b_picture_count, i - prev_non_b_picture);
2104  avio_w8(pb, mxf->last_key_index - i);
2105  } else {
2106  avio_w8(pb, key_index - i); // key frame offset
2107  if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward
2108  mxf->last_key_index = key_index;
2109  prev_non_b_picture = i;
2110  }
2111 
2112  if (!(mxf->index_entries[i].flags & 0x33) && // I-frame
2113  mxf->index_entries[i].flags & 0x40 && !temporal_offset)
2114  mxf->index_entries[i].flags |= 0x80; // random access
2115  avio_w8(pb, mxf->index_entries[i].flags);
2116  // stream offset
2117  avio_wb64(pb, mxf->index_entries[i].offset);
2118  if (s->nb_streams > 1)
2120  else
2121  avio_wb32(pb, 0);
2122  }
2123 
2124  mxf->last_key_index = key_index - mxf->edit_units_count;
2126  mxf->edit_units_count = 0;
2127  }
2128 
2129  mxf_update_klv_size(pb, pos);
2130 }
2131 
2133 {
2134  unsigned pad = klv_fill_size(avio_tell(s->pb));
2135  if (pad) {
2136  avio_write(s->pb, klv_fill_key, 16);
2137  pad -= 16 + 4;
2138  klv_encode_ber4_length(s->pb, pad);
2139  ffio_fill(s->pb, 0, pad);
2140  av_assert1(!(avio_tell(s->pb) & (KAG_SIZE-1)));
2141  }
2142 }
2143 
2144 static int mxf_write_partition(AVFormatContext *s, int bodysid,
2145  int indexsid,
2146  const uint8_t *key, int write_metadata)
2147 {
2148  MXFContext *mxf = s->priv_data;
2149  AVIOContext *pb = s->pb;
2150  int64_t header_byte_count_offset;
2151  unsigned index_byte_count = 0;
2152  uint64_t partition_offset = avio_tell(pb);
2153  int err;
2154 
2155  if (!mxf->edit_unit_byte_count && mxf->edit_units_count)
2156  index_byte_count = 85 + 12+(s->nb_streams+1)*6 +
2157  12+mxf->edit_units_count*15;
2158  else if (mxf->edit_unit_byte_count && indexsid)
2159  index_byte_count = 80;
2160 
2161  if (index_byte_count) {
2162  index_byte_count += 16 + 4; // add encoded ber4 length
2163  index_byte_count += klv_fill_size(index_byte_count);
2164  }
2165 
2166  if (key && !memcmp(key, body_partition_key, 16)) {
2168  sizeof(*mxf->body_partition_offset))) < 0) {
2169  mxf->body_partitions_count = 0;
2170  return err;
2171  }
2172  mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset;
2173  }
2174 
2175  // write klv
2176  if (key)
2177  avio_write(pb, key, 16);
2178  else
2179  avio_write(pb, body_partition_key, 16);
2180 
2182 
2183  // write partition value
2184  avio_wb16(pb, 1); // majorVersion
2185  avio_wb16(pb, 3); // minorVersion
2186  avio_wb32(pb, KAG_SIZE); // KAGSize
2187 
2188  avio_wb64(pb, partition_offset); // ThisPartition
2189 
2190  if (key && !memcmp(key, body_partition_key, 16) && mxf->body_partitions_count > 1)
2191  avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); // PreviousPartition
2192  else if (key && !memcmp(key, footer_partition_key, 16) && mxf->body_partitions_count)
2193  avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); // PreviousPartition
2194  else
2195  avio_wb64(pb, 0);
2196 
2197  avio_wb64(pb, mxf->footer_partition_offset); // footerPartition
2198 
2199  // set offset
2200  header_byte_count_offset = avio_tell(pb);
2201  avio_wb64(pb, 0); // headerByteCount, update later
2202 
2203  // indexTable
2204  avio_wb64(pb, index_byte_count); // indexByteCount
2205  avio_wb32(pb, index_byte_count ? indexsid : 0); // indexSID
2206 
2207  // BodyOffset
2208  if (bodysid && mxf->edit_units_count && mxf->body_partitions_count && !IS_OPATOM(s))
2209  avio_wb64(pb, mxf->body_offset);
2210  else
2211  avio_wb64(pb, 0);
2212 
2213  avio_wb32(pb, bodysid); // bodySID
2214 
2215  // operational pattern
2216  if (IS_OPATOM(s))
2217  avio_write(pb, opatom_ul, 16);
2218  else
2219  avio_write(pb, op1a_ul, 16);
2220 
2221  // essence container
2223 
2224  if (write_metadata) {
2225  // mark the start of the headermetadata and calculate metadata size
2226  int64_t pos, start;
2227  unsigned header_byte_count;
2228 
2230  start = avio_tell(s->pb);
2234  pos = avio_tell(s->pb);
2235  header_byte_count = pos - start + klv_fill_size(pos);
2236 
2237  // update header_byte_count
2238  avio_seek(pb, header_byte_count_offset, SEEK_SET);
2239  avio_wb64(pb, header_byte_count);
2240  avio_seek(pb, pos, SEEK_SET);
2241  }
2242 
2243  if(key)
2245 
2246  return 0;
2247 }
2248 
2249 static const struct {
2250  int profile;
2252 } mxf_prores_codec_uls[] = {
2253  { AV_PROFILE_PRORES_PROXY, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x01,0x00 } },
2254  { AV_PROFILE_PRORES_LT, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x02,0x00 } },
2255  { AV_PROFILE_PRORES_STANDARD, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x03,0x00 } },
2256  { AV_PROFILE_PRORES_HQ, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x04,0x00 } },
2257  { AV_PROFILE_PRORES_4444, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x05,0x00 } },
2258  { AV_PROFILE_PRORES_XQ, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x06,0x00 } },
2259 };
2260 
2262 {
2263  MXFContext *mxf = s->priv_data;
2264  MXFStreamContext *sc = st->priv_data;
2265  int i, profile;
2266 
2267  if (mxf->header_written)
2268  return 1;
2269 
2270  profile = st->codecpar->profile;
2271  for (i = 0; i < FF_ARRAY_ELEMS(mxf_prores_codec_uls); i++) {
2273  sc->codec_ul = &mxf_prores_codec_uls[i].codec_ul;
2274  break;
2275  }
2276  }
2278  return 0;
2279 
2280  sc->frame_size = pkt->size;
2281 
2282  return 1;
2283 }
2284 
2285 static const struct {
2286  uint16_t cid;
2287  uint8_t interlaced;
2288  UID codec_ul;
2289 } mxf_dnxhd_codec_uls[] = {
2290  { 1235, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x01,0x00,0x00 } }, // 1080p 10bit HIGH
2291  { 1237, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x03,0x00,0x00 } }, // 1080p 8bit MED
2292  { 1238, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x04,0x00,0x00 } }, // 1080p 8bit HIGH
2293  { 1241, 1, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x07,0x00,0x00 } }, // 1080i 10bit HIGH
2294  { 1242, 1, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x08,0x00,0x00 } }, // 1080i 8bit MED
2295  { 1243, 1, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x09,0x00,0x00 } }, // 1080i 8bit HIGH
2296  { 1244, 1, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x0a,0x00,0x00 } }, // 1080i 8bit TR
2297  { 1250, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x10,0x00,0x00 } }, // 720p 10bit
2298  { 1251, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x11,0x00,0x00 } }, // 720p 8bit HIGH
2299  { 1252, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x12,0x00,0x00 } }, // 720p 8bit MED
2300  { 1253, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x13,0x00,0x00 } }, // 720p 8bit LOW
2301  { 1256, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x16,0x00,0x00 } }, // 1080p 10bit 444
2302  { 1258, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x18,0x00,0x00 } }, // 720p 8bit TR
2303  { 1259, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x19,0x00,0x00 } }, // 1080p 8bit TR
2304  { 1260, 1, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x1a,0x00,0x00 } }, // 1080i 8bit TR MBAFF
2305  { 1270, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x24,0x00,0x00 } }, // DNXHR 444
2306  { 1271, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x25,0x00,0x00 } }, // DNXHR HQX
2307  { 1272, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x26,0x00,0x00 } }, // DNXHR HQ
2308  { 1273, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x27,0x00,0x00 } }, // DNXHR SQ
2309  { 1274, 0, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x28,0x00,0x00 } }, // DNXHR LB
2310 };
2311 
2313 {
2314  MXFContext *mxf = s->priv_data;
2315  MXFStreamContext *sc = st->priv_data;
2316  int i, cid;
2317 
2318  if (mxf->header_written)
2319  return 1;
2320 
2321  if (pkt->size < 43)
2322  return 0;
2323 
2324  cid = AV_RB32(pkt->data + 0x28);
2325  for (i = 0; i < FF_ARRAY_ELEMS(mxf_dnxhd_codec_uls); i++) {
2326  if (cid == mxf_dnxhd_codec_uls[i].cid) {
2327  sc->codec_ul = &mxf_dnxhd_codec_uls[i].codec_ul;
2328  sc->interlaced = mxf_dnxhd_codec_uls[i].interlaced;
2329  break;
2330  }
2331  }
2333  return 0;
2334 
2335  sc->component_depth = 0;
2336  switch (pkt->data[0x21] >> 5) {
2337  case 1: sc->component_depth = 8; break;
2338  case 2: sc->component_depth = 10; break;
2339  case 3: sc->component_depth = 12; break;
2340  }
2341  if (!sc->component_depth)
2342  return 0;
2343 
2344  if (cid >= 1270) { // RI raster
2346  st->codecpar->width, st->codecpar->height,
2347  INT_MAX);
2348  } else {
2349  sc->aspect_ratio = (AVRational){ 16, 9 };
2350  }
2351 
2352  sc->frame_size = pkt->size;
2353 
2354  return 1;
2355 }
2356 
2357 static const struct {
2359  const UID codec_ul;
2360 } mxf_dv_uls[] = {
2361  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x01,0x01 }, // IEC DV25 525/60
2362  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x01,0x00 } },
2363  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x02,0x01 }, // IEC DV25 626/50
2364  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 } },
2365  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x40,0x01 }, // DV25 525/60
2366  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x01,0x00 }, },
2367  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, // DV25 625/50
2368  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 }, },
2369  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x50,0x01 }, // DV50 525/60
2370  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x03,0x00 }, },
2371  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x51,0x01 }, // DV50 625/50
2372  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 }, },
2373  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x60,0x01 }, // DV100 1080/60
2374  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x05,0x00 }, },
2375  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x61,0x01 }, // DV100 1080/50
2376  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x06,0x00 }, },
2377  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x62,0x01 }, // DV100 720/60
2378  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x07,0x00 }, },
2379  { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x63,0x01 }, // DV100 720/50
2380  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x08,0x00 }, },
2381 };
2382 
2384 {
2385  MXFContext *mxf = s->priv_data;
2386  MXFStreamContext *sc = st->priv_data;
2387  const uint8_t *vs_pack, *vsc_pack;
2388  int apt, ul_index, stype, pal;
2389 
2390  if (mxf->header_written)
2391  return 1;
2392 
2393  // Check for minimal frame size
2394  if (pkt->size < 120000)
2395  return -1;
2396 
2397  apt = pkt->data[4] & 0x7;
2398  vs_pack = pkt->data + 80*5 + 48;
2399  vsc_pack = pkt->data + 80*5 + 53;
2400  stype = vs_pack[3] & 0x1f;
2401  pal = (vs_pack[3] >> 5) & 0x1;
2402 
2403  if ((vsc_pack[2] & 0x07) == 0x02) {
2404  sc->aspect_ratio = (AVRational){ 16, 9 };
2405  } else {
2406  sc->aspect_ratio = (AVRational){ 4, 3 };
2407  }
2408 
2409  sc->interlaced = (vsc_pack[3] >> 4) & 0x01;
2410  // TODO: fix dv encoder to set proper FF/FS value in VSC pack
2411  // and set field dominance accordingly
2412  // av_log(s, AV_LOG_DEBUG, "DV vsc pack ff/ss = %x\n", vsc_pack[2] >> 6);
2413 
2414  switch (stype) {
2415  case 0x18: // DV100 720p
2416  ul_index = 8+pal;
2417  if (sc->interlaced) {
2418  av_log(s, AV_LOG_ERROR, "source marked as interlaced but codec profile is progressive\n");
2419  sc->interlaced = 0;
2420  }
2421  break;
2422  case 0x14: // DV100 1080i
2423  ul_index = 6+pal;
2424  break;
2425  case 0x04: // DV50
2426  ul_index = 4+pal;
2427  break;
2428  default: // DV25
2429  if (!apt) { // IEC
2430  ul_index = 0+pal;
2431  } else {
2432  ul_index = 2+pal;
2433  }
2434  }
2435 
2436  sc->container_ul = &mxf_dv_uls[ul_index].container_ul;
2437  sc->codec_ul = &mxf_dv_uls[ul_index].codec_ul;
2438 
2439  sc->frame_size = pkt->size;
2440 
2441  return 1;
2442 }
2443 
2444 static const struct {
2447  uint8_t profile;
2448  uint8_t interlaced;
2449  int8_t intra_only; // 1 or 0 when there are separate UIDs for Long GOP and Intra, -1 when Intra/LGOP detection can be ignored
2450 } mxf_h264_codec_uls[] = {
2451  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x11,0x01 }, 0, 66, 0, -1 }, // AVC Baseline
2452  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x20,0x01 }, 0, 77, 0, -1 }, // AVC Main
2453  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x30,0x01 }, 0, 88, 0, -1 }, // AVC Extended
2454  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x40,0x01 }, 0, 100, 0, -1 }, // AVC High
2455  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x50,0x01 }, 0, 110, 0, 0 }, // AVC High 10
2456  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x60,0x01 }, 0, 122, 0, 0 }, // AVC High 422
2457  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x70,0x01 }, 0, 244, 0, 0 }, // AVC High 444
2458  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x20,0x01 }, 0, 110, 0, 1 }, // AVC High 10 Intra
2459  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 232960, 110, 1, 1 }, // AVC High 10 Intra RP2027 Class 50 1080/59.94i
2460  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 281088, 110, 1, 1 }, // AVC High 10 Intra RP2027 Class 50 1080/50i
2461  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 232960, 110, 0, 1 }, // AVC High 10 Intra RP2027 Class 50 1080/29.97p
2462  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 281088, 110, 0, 1 }, // AVC High 10 Intra RP2027 Class 50 1080/25p
2463  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x08 }, 116736, 110, 0, 1 }, // AVC High 10 Intra RP2027 Class 50 720/59.94p
2464  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x09 }, 140800, 110, 0, 1 }, // AVC High 10 Intra RP2027 Class 50 720/50p
2465  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x30,0x01 }, 0, 122, 0, 1 }, // AVC High 422 Intra
2466  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x01 }, 472576, 122, 1, 1 }, // AVC High 422 Intra RP2027 Class 100 1080/59.94i
2467  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x02 }, 568832, 122, 1, 1 }, // AVC High 422 Intra RP2027 Class 100 1080/50i
2468  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x03 }, 472576, 122, 0, 1 }, // AVC High 422 Intra RP2027 Class 100 1080/29.97p
2469  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x04 }, 568832, 122, 0, 1 }, // AVC High 422 Intra RP2027 Class 100 1080/25p
2470  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x08 }, 236544, 122, 0, 1 }, // AVC High 422 Intra RP2027 Class 100 720/59.94p
2471  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x09 }, 284672, 122, 0, 1 }, // AVC High 422 Intra RP2027 Class 100 720/50p
2472  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x01,0x32,0x40,0x01 }, 0, 244, 0, 1 }, // AVC High 444 Intra
2473  {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x01,0x32,0x50,0x01 }, 0, 44, 0, -1 }, // AVC CAVLC 444
2474 };
2475 
2477  AVPacket *pkt, MXFIndexEntry *e)
2478 {
2479  MXFContext *mxf = s->priv_data;
2480  MXFStreamContext *sc = st->priv_data;
2481  H264SPS seq, *const sps = &seq;
2482  GetBitContext gb;
2483  const uint8_t *buf = pkt->data;
2484  const uint8_t *buf_end = pkt->data + pkt->size;
2485  const uint8_t *nal_end;
2486  const UID *codec_ul = NULL;
2487  uint32_t state = -1;
2488  int extra_size = 512; // support AVC Intra files without SPS/PPS header
2489  int i, frame_size, slice_type, has_sps = 0, intra_only = 0, ret;
2490 
2491  for (;;) {
2492  buf = avpriv_find_start_code(buf, buf_end, &state);
2493  if (buf >= buf_end)
2494  break;
2495 
2496  switch (state & 0x1f) {
2497  case H264_NAL_SPS:
2498  e->flags |= 0x40;
2499 
2500  if (mxf->header_written)
2501  break;
2502 
2503  nal_end = ff_nal_find_startcode(buf, buf_end);
2504  ret = ff_avc_decode_sps(sps, buf, nal_end - buf);
2505  if (ret < 0) {
2506  av_log(s, AV_LOG_ERROR, "error parsing sps\n");
2507  return 0;
2508  }
2509  has_sps = 1;
2510 
2511  sc->aspect_ratio.num = st->codecpar->width * sps->sar.num;
2512  sc->aspect_ratio.den = st->codecpar->height * sps->sar.den;
2514  sc->aspect_ratio.num, sc->aspect_ratio.den, 1024*1024);
2515  intra_only = (sps->constraint_set_flags >> 3) & 1;
2516  sc->interlaced = !sps->frame_mbs_only_flag;
2517  sc->component_depth = sps->bit_depth_luma;
2518 
2519  buf = nal_end;
2520  break;
2521  case H264_NAL_PPS:
2522  if (e->flags & 0x40) { // sequence header present
2523  e->flags |= 0x80; // random access
2524  extra_size = 0;
2525  }
2526  break;
2527  case H264_NAL_IDR_SLICE:
2528  e->flags |= 0x04; // IDR Picture
2529  buf = buf_end;
2530  break;
2531  case H264_NAL_SLICE:
2532  init_get_bits8(&gb, buf, buf_end - buf);
2533  get_ue_golomb_long(&gb); // skip first_mb_in_slice
2534  slice_type = get_ue_golomb_31(&gb);
2535  switch (slice_type % 5) {
2536  case 0:
2537  e->flags |= 0x20; // P Picture
2538  e->flags |= 0x06; // P Picture
2539  break;
2540  case 1:
2541  e->flags |= 0x30; // B Picture
2542  e->flags |= 0x03; // non-referenced B Picture
2543  break;
2544  }
2545  buf = buf_end;
2546  break;
2547  default:
2548  break;
2549  }
2550  }
2551 
2552  if (mxf->header_written)
2553  return 1;
2554 
2555  if (!has_sps)
2556  sc->interlaced = st->codecpar->field_order != AV_FIELD_PROGRESSIVE ? 1 : 0;
2557  frame_size = pkt->size + extra_size;
2558 
2559  for (i = 0; i < FF_ARRAY_ELEMS(mxf_h264_codec_uls); i++) {
2560  if (frame_size == mxf_h264_codec_uls[i].frame_size && sc->interlaced == mxf_h264_codec_uls[i].interlaced) {
2561  codec_ul = &mxf_h264_codec_uls[i].uid;
2562  sc->component_depth = 10; // AVC Intra is always 10 Bit
2563  sc->aspect_ratio = (AVRational){ 16, 9 }; // 16:9 is mandatory for broadcast HD
2564  st->codecpar->profile = mxf_h264_codec_uls[i].profile;
2565  sc->avc_intra = 1;
2566  mxf->cbr_index = 1;
2567  sc->frame_size = pkt->size;
2568  if (sc->interlaced)
2569  sc->field_dominance = 1; // top field first is mandatory for AVC Intra
2570  break;
2571  } else if (has_sps && mxf_h264_codec_uls[i].frame_size == 0 &&
2572  mxf_h264_codec_uls[i].profile == sps->profile_idc &&
2573  (mxf_h264_codec_uls[i].intra_only < 0 ||
2574  mxf_h264_codec_uls[i].intra_only == intra_only)) {
2575  codec_ul = &mxf_h264_codec_uls[i].uid;
2576  st->codecpar->profile = sps->profile_idc;
2577  st->codecpar->level = sps->level_idc;
2578  // continue to check for avc intra
2579  }
2580  }
2581 
2582  if (!codec_ul) {
2583  av_log(s, AV_LOG_ERROR, "h264 profile not supported\n");
2584  return 0;
2585  }
2586  sc->codec_ul = codec_ul;
2587 
2588  return 1;
2589 }
2590 
2591 static inline int get_ffv1_unsigned_symbol(RangeCoder *c, uint8_t *state) {
2592  if(get_rac(c, state+0))
2593  return 0;
2594  else{
2595  int i, e;
2596  unsigned a;
2597  e= 0;
2598  while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
2599  e++;
2600  if (e > 31)
2601  return AVERROR_INVALIDDATA;
2602  }
2603 
2604  a= 1;
2605  for(i=e-1; i>=0; i--){
2606  a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
2607  }
2608 
2609  return a;
2610  }
2611 }
2612 #define FFV1_CONTEXT_SIZE 32
2614 {
2615  MXFContext *mxf = s->priv_data;
2616  MXFStreamContext *sc = st->priv_data;
2617  uint8_t state[FFV1_CONTEXT_SIZE];
2618  RangeCoder c;
2619  unsigned v;
2620 
2621  sc->frame_size = pkt->size;
2622 
2623  if (mxf->header_written)
2624  return 1;
2625 
2626  memset(state, 128, sizeof(state));
2627  if (st->codecpar->extradata) {
2629  ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
2631  av_assert0(v >= 2);
2632  if (v > 4) {
2633  av_log(s, AV_LOG_ERROR, "unsupported ffv1 version %d\n", v);
2634  return 0;
2635  }
2637  } else {
2638  uint8_t keystate = 128;
2640  ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
2641  get_rac(&c, &keystate); // keyframe
2643  av_assert0(v < 2);
2644  }
2645  sc->codec_ul = &mxf_ffv1_codec_uls[v];
2646 
2648  sc->interlaced = 1;
2650  }
2654  sc->aspect_ratio.num, sc->aspect_ratio.den, INT_MAX);
2655 
2656  return 1;
2657 }
2658 
2660 {
2661  MXFContext *mxf = s->priv_data;
2662  MXFStreamContext *sc = st->priv_data;
2663  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(st->codecpar->format);
2664  GetByteContext g;
2665  uint32_t j2k_ncomponents;
2666 
2667  if (!pix_desc) {
2668  av_log(s, AV_LOG_ERROR, "Pixel format not set\n");
2669  return AVERROR(EINVAL);
2670  }
2671 
2672  if (mxf->header_written)
2673  return 1;
2674 
2676 
2677  while (bytestream2_get_bytes_left(&g) >= 3 && bytestream2_peek_be16(&g) != JPEG2000_SOC)
2678  bytestream2_skip(&g, 1);
2679 
2680  if (bytestream2_get_be16u(&g) != JPEG2000_SOC) {
2681  av_log(s, AV_LOG_ERROR, "Mandatory SOC marker is not present\n");
2682  return AVERROR_INVALIDDATA;
2683  }
2684 
2685  /* Extract usefull size information from the SIZ marker */
2686  if (bytestream2_get_be16u(&g) != JPEG2000_SIZ) {
2687  av_log(s, AV_LOG_ERROR, "Mandatory SIZ marker is not present\n");
2688  return AVERROR_INVALIDDATA;
2689  }
2690  bytestream2_skip(&g, 2); // Skip Lsiz
2691  sc->j2k_info.j2k_cap = bytestream2_get_be16u(&g);
2692  sc->j2k_info.j2k_xsiz = bytestream2_get_be32u(&g);
2693  sc->j2k_info.j2k_ysiz = bytestream2_get_be32u(&g);
2694  sc->j2k_info.j2k_x0siz = bytestream2_get_be32u(&g);
2695  sc->j2k_info.j2k_y0siz = bytestream2_get_be32u(&g);
2696  sc->j2k_info.j2k_xtsiz = bytestream2_get_be32u(&g);
2697  sc->j2k_info.j2k_ytsiz = bytestream2_get_be32u(&g);
2698  sc->j2k_info.j2k_xt0siz = bytestream2_get_be32u(&g);
2699  sc->j2k_info.j2k_yt0siz = bytestream2_get_be32u(&g);
2700  j2k_ncomponents = bytestream2_get_be16u(&g);
2701  if (j2k_ncomponents != pix_desc->nb_components) {
2702  av_log(s, AV_LOG_ERROR, "Incoherence about components image number.\n");
2703  return AVERROR_INVALIDDATA;
2704  }
2705  bytestream2_get_bufferu(&g, sc->j2k_info.j2k_comp_desc, 3 * j2k_ncomponents);
2706 
2707  sc->frame_size = pkt->size;
2708 
2709  return 1;
2710 }
2711 
2712 static const UID mxf_mpeg2_codec_uls[] = {
2713  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x10,0x00 }, // MP-ML I-Frame
2714  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, // MP-ML Long GOP
2715  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, // 422P-ML I-Frame
2716  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, // 422P-ML Long GOP
2717  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x02,0x00 }, // MP-HL I-Frame
2718  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, // MP-HL Long GOP
2719  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, // 422P-HL I-Frame
2720  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, // 422P-HL Long GOP
2721  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x05,0x02,0x00 }, // MP@H-14 I-Frame
2722  { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x05,0x03,0x00 }, // MP@H-14 Long GOP
2723 };
2724 
2726 {
2727  int long_gop = 1;
2728 
2729  if (par->profile == 4) { // Main
2730  if (par->level == 8) // Main
2731  return &mxf_mpeg2_codec_uls[0+long_gop];
2732  else if (par->level == 4) // High
2733  return &mxf_mpeg2_codec_uls[4+long_gop];
2734  else if (par->level == 6) // High 14
2735  return &mxf_mpeg2_codec_uls[8+long_gop];
2736  } else if (par->profile == 0) { // 422
2737  if (par->level == 5) // Main
2738  return &mxf_mpeg2_codec_uls[2+long_gop];
2739  else if (par->level == 2) // High
2740  return &mxf_mpeg2_codec_uls[6+long_gop];
2741  }
2742  return NULL;
2743 }
2744 
2746  AVPacket *pkt, MXFIndexEntry *e)
2747 {
2748  MXFStreamContext *sc = st->priv_data;
2749  uint32_t c = -1;
2750  int i;
2751 
2752  for(i = 0; i < pkt->size - 4; i++) {
2753  c = (c<<8) + pkt->data[i];
2754  if (c == 0x1b5) {
2755  if ((pkt->data[i+1] & 0xf0) == 0x10) { // seq ext
2756  st->codecpar->profile = pkt->data[i+1] & 0x07;
2757  st->codecpar->level = pkt->data[i+2] >> 4;
2758  sc->low_delay = pkt->data[i+6] >> 7;
2759  } else if (i + 5 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x80) { // pict coding ext
2760  sc->interlaced = !(pkt->data[i+5] & 0x80); // progressive frame
2761  if (sc->interlaced)
2762  sc->field_dominance = 1 + !(pkt->data[i+4] & 0x80); // top field first
2763  break;
2764  }
2765  } else if (c == 0x1b8) { // gop
2766  if (pkt->data[i+4]>>6 & 0x01) { // closed
2767  if (sc->seq_closed_gop == -1)
2768  sc->seq_closed_gop = 1;
2769  sc->closed_gop = 1;
2770  if (e->flags & 0x40) // sequence header present
2771  e->flags |= 0x80; // random access
2772  } else {
2773  sc->seq_closed_gop = 0;
2774  sc->closed_gop = 0;
2775  }
2776  } else if (c == 0x1b3) { // seq
2777  e->flags |= 0x40;
2778  switch ((pkt->data[i+4]>>4) & 0xf) {
2779  case 2: sc->aspect_ratio = (AVRational){ 4, 3}; break;
2780  case 3: sc->aspect_ratio = (AVRational){ 16, 9}; break;
2781  case 4: sc->aspect_ratio = (AVRational){221,100}; break;
2782  default:
2784  st->codecpar->width, st->codecpar->height, 1024*1024);
2785  }
2786  } else if (c == 0x100) { // pic
2787  int pict_type = (pkt->data[i+2]>>3) & 0x07;
2788  e->temporal_ref = (pkt->data[i+1]<<2) | (pkt->data[i+2]>>6);
2789  if (pict_type == 2) { // P-frame
2790  e->flags |= 0x22;
2791  sc->closed_gop = 0; // reset closed GOP, don't matter anymore
2792  } else if (pict_type == 3) { // B-frame
2793  if (sc->closed_gop)
2794  e->flags |= 0x13; // only backward prediction
2795  else
2796  e->flags |= 0x33;
2797  sc->temporal_reordering = -1;
2798  } else if (!pict_type) {
2799  av_log(s, AV_LOG_ERROR, "error parsing mpeg2 frame\n");
2800  return 0;
2801  }
2802  }
2803  }
2804  if (!IS_D10(s)) {
2806  if (!codec_ul)
2807  return 0;
2808  sc->codec_ul = codec_ul;
2809  }
2810  return 1;
2811 }
2812 
2813 static uint64_t mxf_parse_timestamp(int64_t timestamp64)
2814 {
2815  time_t timestamp = timestamp64 / 1000000;
2816  struct tm tmbuf;
2817  struct tm *time = gmtime_r(&timestamp, &tmbuf);
2818  if (!time)
2819  return 0;
2820  return (uint64_t)(time->tm_year+1900) << 48 |
2821  (uint64_t)(time->tm_mon+1) << 40 |
2822  (uint64_t) time->tm_mday << 32 |
2823  time->tm_hour << 24 |
2824  time->tm_min << 16 |
2825  time->tm_sec << 8 |
2826  (timestamp64 % 1000000) / 4000;
2827 }
2828 
2830 {
2831  MXFContext *mxf = s->priv_data;
2832  uint32_t seed = av_get_random_seed();
2833  uint64_t umid = seed + 0x5294713400000000LL;
2834 
2835  AV_WB64(mxf->umid , umid);
2836  AV_WB64(mxf->umid+8, umid>>8);
2837 
2838  mxf->instance_number = seed & 0xFFFFFF;
2839 }
2840 
2842 {
2843  MXFContext *mxf = s->priv_data;
2844  AVDictionaryEntry *tcr = av_dict_get(s->metadata, "timecode", NULL, 0);
2845 
2846  if (!ff_mxf_get_content_package_rate(tbc)) {
2847  if (s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) {
2848  av_log(s, AV_LOG_ERROR, "Unsupported frame rate %d/%d. Set -strict option to 'unofficial' or lower in order to allow it!\n", tbc.den, tbc.num);
2849  return AVERROR(EINVAL);
2850  } else {
2851  av_log(s, AV_LOG_WARNING, "Unofficial frame rate %d/%d.\n", tbc.den, tbc.num);
2852  }
2853  }
2854 
2855  mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
2856  if (!tcr)
2857  tcr = av_dict_get(st->metadata, "timecode", NULL, 0);
2858 
2859  if (tcr)
2860  return av_timecode_init_from_string(&mxf->tc, av_inv_q(tbc), tcr->value, s);
2861  else
2862  return av_timecode_init(&mxf->tc, av_inv_q(tbc), 0, 0, s);
2863 }
2864 
2866 {
2867  AVCodecParameters *par = st->codecpar;
2868  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(par->format);
2869 
2871  return par->chroma_location;
2872 
2873  if (pix_desc) {
2874  if (pix_desc->log2_chroma_h == 0) {
2875  return AVCHROMA_LOC_TOPLEFT;
2876  } else if (pix_desc->log2_chroma_w == 1 && pix_desc->log2_chroma_h == 1) {
2878  switch (par->codec_id) {
2879  case AV_CODEC_ID_MJPEG:
2881  }
2882  }
2884  switch (par->codec_id) {
2886  }
2887  }
2888  }
2889  }
2890 
2891  return AVCHROMA_LOC_UNSPECIFIED;
2892 }
2893 
2895 {
2896  MXFContext *mxf = s->priv_data;
2897  int i, ret;
2898  uint8_t present[FF_ARRAY_ELEMS(mxf_essence_container_uls)] = {0};
2899  int64_t timestamp = 0;
2900 
2901  if (IS_OPATOM(s) && s->nb_streams != 1) {
2902  av_log(s, AV_LOG_ERROR, "there must be exactly one stream for mxf opatom\n");
2903  return -1;
2904  }
2905 
2906  if (!av_dict_get(s->metadata, "comment_", NULL, AV_DICT_IGNORE_SUFFIX))
2907  mxf->store_user_comments = 0;
2908 
2909  for (i = 0; i < s->nb_streams; i++) {
2910  AVStream *st = s->streams[i];
2911  MXFStreamContext *sc = av_mallocz(sizeof(*sc));
2912  if (!sc)
2913  return AVERROR(ENOMEM);
2914  st->priv_data = sc;
2915  sc->index = -1;
2916 
2917  if (((i == 0) ^ (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)) && !IS_OPATOM(s)) {
2918  av_log(s, AV_LOG_ERROR, "there must be exactly one video stream and it must be the first one\n");
2919  return -1;
2920  }
2921 
2922  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
2923  const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(st->codecpar->format);
2924  AVRational tbc = (AVRational){ 0, 0 };
2925  if (st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0)
2926  tbc = av_inv_q(st->avg_frame_rate);
2927  else if (st->r_frame_rate.num > 0 && st->r_frame_rate.den > 0)
2928  tbc = av_inv_q(st->r_frame_rate);
2929 
2930  // Default component depth to 8
2931  sc->component_depth = 8;
2932  sc->h_chroma_sub_sample = 2;
2933  sc->v_chroma_sub_sample = 2;
2934  sc->color_siting = 0xFF;
2935 
2938  av_make_q(st->codecpar->width, st->codecpar->height));
2939  }
2940 
2941  if (pix_desc) {
2942  sc->component_depth = pix_desc->comp[0].depth;
2943  sc->h_chroma_sub_sample = 1 << pix_desc->log2_chroma_w;
2944  sc->v_chroma_sub_sample = 1 << pix_desc->log2_chroma_h;
2945  }
2946  switch (choose_chroma_location(s, st)) {
2947  case AVCHROMA_LOC_TOPLEFT: sc->color_siting = 0; break;
2948  case AVCHROMA_LOC_LEFT: sc->color_siting = 6; break;
2949  case AVCHROMA_LOC_TOP: sc->color_siting = 1; break;
2950  case AVCHROMA_LOC_CENTER: sc->color_siting = 3; break;
2951  }
2952 
2954  mxf->time_base = tbc;
2955  avpriv_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
2956  if((ret = mxf_init_timecode(s, st, tbc)) < 0)
2957  return ret;
2958 
2960  sc->seq_closed_gop = -1; // unknown yet
2961  }
2962 
2963  sc->video_bit_rate = st->codecpar->bit_rate;
2964 
2965  if (IS_D10(s) ||
2968  mxf->cbr_index = 1;
2969 
2970  if (IS_D10(s)) {
2971  int ntsc = mxf->time_base.den != 25;
2972  int ul_index;
2973 
2975  av_log(s, AV_LOG_ERROR, "error MXF D-10 only support MPEG-2 Video\n");
2976  return AVERROR(EINVAL);
2977  }
2978  if ((sc->video_bit_rate == 50000000) && (mxf->time_base.den == 25)) {
2979  ul_index = 0;
2980  } else if ((sc->video_bit_rate == 49999840 || sc->video_bit_rate == 50000000) && ntsc) {
2981  ul_index = 1;
2982  } else if (sc->video_bit_rate == 40000000) {
2983  ul_index = 2+ntsc;
2984  } else if (sc->video_bit_rate == 30000000) {
2985  ul_index = 4+ntsc;
2986  } else {
2987  av_log(s, AV_LOG_ERROR, "error MXF D-10 only support 30/40/50 mbit/s\n");
2988  return -1;
2989  }
2990 
2991  sc->codec_ul = &mxf_d10_codec_uls[ul_index];
2992  sc->container_ul = &mxf_d10_container_uls[ul_index];
2993  sc->index = INDEX_D10_VIDEO;
2994  sc->signal_standard = 1;
2995  sc->color_siting = 0;
2996  sc->frame_size = (int64_t)sc->video_bit_rate *
2997  mxf->time_base.num / (8*mxf->time_base.den);
2998  }
2999  if (mxf->signal_standard >= 0)
3000  sc->signal_standard = mxf->signal_standard;
3001  } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
3002  char bsf_arg[32];
3003  if (st->codecpar->sample_rate != 48000) {
3004  av_log(s, AV_LOG_ERROR, "only 48khz is implemented\n");
3005  return -1;
3006  }
3007  avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
3008  if (IS_D10(s)) {
3009  if (st->index != 1) {
3010  av_log(s, AV_LOG_ERROR, "MXF D-10 only support one audio track\n");
3011  return -1;
3012  }
3013  if (st->codecpar->codec_id != AV_CODEC_ID_PCM_S16LE &&
3015  av_log(s, AV_LOG_ERROR, "MXF D-10 only support 16 or 24 bits le audio\n");
3016  }
3017  sc->index = INDEX_D10_AUDIO;
3018  sc->container_ul = ((MXFStreamContext*)s->streams[0]->priv_data)->container_ul;
3019  sc->frame_size = 4 + 8 * av_rescale_rnd(st->codecpar->sample_rate, mxf->time_base.num, mxf->time_base.den, AV_ROUND_UP) * 4;
3020  } else if (IS_OPATOM(s)) {
3021  AVRational tbc = av_inv_q(mxf->audio_edit_rate);
3022 
3023  if (st->codecpar->codec_id != AV_CODEC_ID_PCM_S16LE &&
3025  av_log(s, AV_LOG_ERROR, "Only pcm_s16le and pcm_s24le audio codecs are implemented\n");
3026  return AVERROR_PATCHWELCOME;
3027  }
3028  if (st->codecpar->ch_layout.nb_channels != 1) {
3029  av_log(s, AV_LOG_ERROR, "MXF OPAtom only supports single channel audio\n");
3030  return AVERROR(EINVAL);
3031  }
3032 
3033  mxf->time_base = st->time_base;
3034  if((ret = mxf_init_timecode(s, st, tbc)) < 0)
3035  return ret;
3036 
3038  sc->index = INDEX_WAV;
3039  } else {
3040  mxf->slice_count = 1;
3044  }
3045  snprintf(bsf_arg, sizeof(bsf_arg), "r=%d/%d", mxf->tc.rate.num, mxf->tc.rate.den);
3046  ret = ff_stream_add_bitstream_filter(st, "pcm_rechunk", bsf_arg);
3047  if (ret < 0)
3048  return ret;
3049  } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
3050  AVDictionaryEntry *e = av_dict_get(st->metadata, "data_type", NULL, 0);
3051  if (e && !strcmp(e->value, "vbi_vanc_smpte_436M")) {
3052  sc->index = INDEX_S436M;
3053  } else {
3054  av_log(s, AV_LOG_ERROR, "track %d: unsupported data type\n", i);
3055  return -1;
3056  }
3057  if (st->index != s->nb_streams - 1) {
3058  av_log(s, AV_LOG_ERROR, "data track must be placed last\n");
3059  return -1;
3060  }
3061  }
3062 
3063  if (sc->index == -1) {
3065  if (sc->index == -1) {
3066  av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, "
3067  "codec not currently supported in container\n", i);
3068  return -1;
3069  }
3070  }
3071 
3072  if (!sc->codec_ul)
3074  if (!sc->container_ul)
3076 
3078  sc->track_essence_element_key[15] = present[sc->index];
3079  if (IS_OPATOM(s) && st->codecpar->codec_id == AV_CODEC_ID_DNXHD) {
3080  // clip-wrapping requires 0x0D per ST2019-4:2009 or 0x06 per previous version ST2019-4:2008
3081  // we choose to use 0x06 instead 0x0D to be compatible with AVID systems
3082  // and produce mxf files with the most relevant flavour for opatom
3083  sc->track_essence_element_key[14] = 0x06;
3084  }
3085  PRINT_KEY(s, "track essence element key", sc->track_essence_element_key);
3086 
3087  if (!present[sc->index])
3088  mxf->essence_container_count++;
3089  present[sc->index]++;
3090  }
3091 
3092  if (IS_D10(s) || IS_OPATOM(s)) {
3093  mxf->essence_container_count = 1;
3094  }
3095 
3096  if (!(s->flags & AVFMT_FLAG_BITEXACT))
3097  mxf_gen_umid(s);
3098 
3099  for (i = 0; i < s->nb_streams; i++) {
3100  MXFStreamContext *sc = s->streams[i]->priv_data;
3101  // update element count
3102  sc->track_essence_element_key[13] = present[sc->index];
3104  sc->order = (0x15 << 24) | AV_RB32(sc->track_essence_element_key+13);
3105  else
3106  sc->order = AV_RB32(sc->track_essence_element_key+12);
3107  }
3108 
3109  if (ff_parse_creation_time_metadata(s, &timestamp, 0) > 0)
3110  mxf->timestamp = mxf_parse_timestamp(timestamp);
3111  mxf->duration = -1;
3112 
3113  mxf->timecode_track = av_mallocz(sizeof(*mxf->timecode_track));
3114  if (!mxf->timecode_track)
3115  return AVERROR(ENOMEM);
3117  mxf->timecode_track->index = -1;
3118 
3119  return 0;
3120 }
3121 
3122 static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 };
3123 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 };
3124 
3126 {
3127  MXFContext *mxf = s->priv_data;
3128  AVIOContext *pb = s->pb;
3129  unsigned frame;
3130  uint32_t time_code;
3131  int i, system_item_bitmap = 0x58; // UL, user date/time stamp, picture present
3132 
3134 
3135  // write system metadata pack
3137  klv_encode_ber4_length(pb, 57);
3138 
3139  for (i = 0; i < s->nb_streams; i++) {
3140  if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
3141  system_item_bitmap |= 0x4;
3142  else if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_DATA)
3143  system_item_bitmap |= 0x2;
3144  }
3145  avio_w8(pb, system_item_bitmap);
3146  avio_w8(pb, mxf->content_package_rate); // content package rate
3147  avio_w8(pb, 0x00); // content package type
3148  avio_wb16(pb, 0x00); // channel handle
3149  avio_wb16(pb, frame & 0xFFFF); // continuity count, supposed to overflow
3150  if (mxf->essence_container_count > 1)
3151  avio_write(pb, multiple_desc_ul, 16);
3152  else {
3153  MXFStreamContext *sc = s->streams[0]->priv_data;
3154  avio_write(pb, *sc->container_ul, 16);
3155  }
3156  avio_w8(pb, 0);
3157  avio_wb64(pb, 0);
3158  avio_wb64(pb, 0); // creation date/time stamp
3159 
3160  avio_w8(pb, 0x81); // SMPTE 12M time code
3161  time_code = av_timecode_get_smpte_from_framenum(&mxf->tc, frame);
3162  avio_wb32(pb, time_code);
3163  avio_wb32(pb, 0); // binary group data
3164  avio_wb64(pb, 0);
3165 
3166  // write system metadata package set
3168  klv_encode_ber4_length(pb, 35);
3169  avio_w8(pb, 0x83); // UMID
3170  avio_wb16(pb, 0x20);
3171  mxf_write_umid(s, 1);
3172 }
3173 
3175 {
3176  MXFContext *mxf = s->priv_data;
3177  AVIOContext *pb = s->pb;
3178  int frame_size = pkt->size / st->codecpar->block_align;
3179  const uint8_t *samples = pkt->data;
3180  const uint8_t *const end = pkt->data + pkt->size;
3181  int i;
3182 
3183  klv_encode_ber4_length(pb, 4 + frame_size*4*8);
3184 
3185  avio_w8(pb, (frame_size == 1920 ? 0 : (mxf->edit_units_count-1) % 5 + 1));
3186  avio_wl16(pb, frame_size);
3187  avio_w8(pb, (1 << st->codecpar->ch_layout.nb_channels)-1);
3188 
3189  while (samples < end) {
3190  for (i = 0; i < st->codecpar->ch_layout.nb_channels; i++) {
3191  uint32_t sample;
3192  if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S24LE) {
3193  sample = AV_RL24(samples)<< 4;
3194  samples += 3;
3195  } else {
3196  sample = AV_RL16(samples)<<12;
3197  samples += 2;
3198  }
3199  avio_wl32(pb, sample | i);
3200  }
3201  for (; i < 8; i++)
3202  avio_wl32(pb, i);
3203  }
3204 }
3205 
3207 {
3208  MXFContext *mxf = s->priv_data;
3209  AVIOContext *pb = s->pb;
3210  AVStream *st = s->streams[0];
3211  MXFStreamContext *sc = st->priv_data;
3212  const uint8_t *key = NULL;
3213 
3214  int err;
3215 
3216  if (!mxf->header_written)
3218 
3219  if ((err = mxf_write_partition(s, 1, 0, key, 0)) < 0)
3220  return err;
3224  return 0;
3225 }
3226 
3228 {
3229  MXFContext *mxf = s->priv_data;
3230  AVIOContext *pb = s->pb;
3231 
3232  int err;
3233 
3234  if (!mxf->header_written) {
3235  if ((err = mxf_write_partition(s, 0, 0, header_open_partition_key, 1)) < 0)
3236  return err;
3238 
3239  if ((err = mxf_write_opatom_body_partition(s)) < 0)
3240  return err;
3241  mxf->header_written = 1;
3242  }
3243 
3244  if (!mxf->edit_unit_byte_count) {
3246  mxf->index_entries[mxf->edit_units_count].flags = ie->flags;
3248  }
3249  mxf->edit_units_count++;
3250  avio_write(pb, pkt->data, pkt->size);
3251  mxf->body_offset += pkt->size;
3252 
3253  return 0;
3254 }
3255 
3257 {
3258  MXFContext *mxf = s->priv_data;
3259  int i;
3260 
3261  if (IS_OPATOM(s)) {
3262  MXFStreamContext *sc = s->streams[0]->priv_data;
3263  mxf->edit_unit_byte_count = sc->frame_size;
3264  return;
3265  }
3266 
3267  mxf->edit_unit_byte_count = KAG_SIZE; // system element
3268  for (i = 0; i < s->nb_streams; i++) {
3269  AVStream *st = s->streams[i];
3270  MXFStreamContext *sc = st->priv_data;
3272  mxf->edit_unit_byte_count += 16 + 4 + sc->frame_size;
3274  }
3275 }
3276 
3278 {
3279  MXFContext *mxf = s->priv_data;
3280  AVIOContext *pb = s->pb;
3281  AVStream *st = s->streams[pkt->stream_index];
3282  MXFStreamContext *sc = st->priv_data;
3283  MXFIndexEntry ie = {0};
3284  int err;
3285 
3286  if (!mxf->header_written && pkt->stream_index != 0 &&
3287  !IS_OPATOM(s)) {
3288  av_log(s, AV_LOG_ERROR, "Received non-video packet before "
3289  "header has been written\n");
3290  return AVERROR_INVALIDDATA;
3291  }
3292 
3293  if (!mxf->cbr_index && !mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) {
3294  if ((err = av_reallocp_array(&mxf->index_entries, mxf->edit_units_count
3295  + EDIT_UNITS_PER_BODY, sizeof(*mxf->index_entries))) < 0) {
3296  mxf->edit_units_count = 0;
3297  av_log(s, AV_LOG_ERROR, "could not allocate index entries\n");
3298  return err;
3299  }
3300  }
3301 
3303  if (!mxf_parse_mpeg2_frame(s, st, pkt, &ie)) {
3304  av_log(s, AV_LOG_ERROR, "could not get mpeg2 profile and level\n");
3305  return -1;
3306  }
3307  } else if (st->codecpar->codec_id == AV_CODEC_ID_DNXHD) {
3308  if (!mxf_parse_dnxhd_frame(s, st, pkt)) {
3309  av_log(s, AV_LOG_ERROR, "could not get dnxhd profile\n");
3310  return -1;
3311  }
3312  } else if (st->codecpar->codec_id == AV_CODEC_ID_PRORES) {
3313  if (!mxf_parse_prores_frame(s, st, pkt)) {
3314  av_log(s, AV_LOG_ERROR, "could not get prores profile\n");
3315  return -1;
3316  }
3317  } else if (st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO) {
3318  if (!mxf_parse_dv_frame(s, st, pkt)) {
3319  av_log(s, AV_LOG_ERROR, "could not get dv profile\n");
3320  return -1;
3321  }
3322  } else if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
3323  if (!mxf_parse_h264_frame(s, st, pkt, &ie)) {
3324  av_log(s, AV_LOG_ERROR, "could not get h264 profile\n");
3325  return -1;
3326  }
3327  } else if (st->codecpar->codec_id == AV_CODEC_ID_FFV1) {
3328  if (!mxf_parse_ffv1_frame(s, st, pkt)) {
3329  av_log(s, AV_LOG_ERROR, "could not get ffv1 version\n");
3330  return -1;
3331  }
3332  } else if (st->codecpar->codec_id == AV_CODEC_ID_JPEG2000) {
3333  if (!mxf_parse_jpeg2000_frame(s, st, pkt)) {
3334  av_log(s, AV_LOG_ERROR, "could not get jpeg2000 profile\n");
3335  return -1;
3336  }
3337  }
3338 
3339  if (mxf->cbr_index) {
3340  if (pkt->size != sc->frame_size && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
3341  av_log(s, AV_LOG_ERROR, "track %d: frame size does not match index unit size, %d != %d\n",
3342  st->index, pkt->size, sc->frame_size);
3343  return -1;
3344  }
3345  if (!mxf->header_written)
3347  }
3348 
3349  if (IS_OPATOM(s))
3350  return mxf_write_opatom_packet(s, pkt, &ie);
3351 
3352  if (!mxf->header_written) {
3353  if (mxf->edit_unit_byte_count) {
3354  if ((err = mxf_write_partition(s, 1, 2, header_open_partition_key, 1)) < 0)
3355  return err;
3358  } else {
3359  if ((err = mxf_write_partition(s, 0, 0, header_open_partition_key, 1)) < 0)
3360  return err;
3361  }
3362  mxf->header_written = 1;
3363  }
3364 
3365  if (st->index == 0) {
3366  if (!mxf->edit_unit_byte_count &&
3368  !(ie.flags & 0x33)) { // I-frame, GOP start
3370  if ((err = mxf_write_partition(s, 1, 2, body_partition_key, 0)) < 0)
3371  return err;
3374  }
3375 
3378 
3379  if (!mxf->edit_unit_byte_count) {
3381  mxf->index_entries[mxf->edit_units_count].flags = ie.flags;
3383  mxf->body_offset += KAG_SIZE; // size of system element
3384  }
3385  mxf->edit_units_count++;
3386  } else if (!mxf->edit_unit_byte_count && st->index == 1) {
3387  if (!mxf->edit_units_count) {
3388  av_log(s, AV_LOG_ERROR, "No packets in first stream\n");
3389  return AVERROR_PATCHWELCOME;
3390  }
3392  mxf->body_offset - mxf->index_entries[mxf->edit_units_count-1].offset;
3393  }
3394 
3396  avio_write(pb, sc->track_essence_element_key, 16); // write key
3397  if (IS_D10(s) && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
3399  } else {
3400  klv_encode_ber4_length(pb, pkt->size); // write length
3401  avio_write(pb, pkt->data, pkt->size);
3402  mxf->body_offset += 16+4+pkt->size + klv_fill_size(16+4+pkt->size);
3403  }
3404 
3405  return 0;
3406 }
3407 
3409 {
3410  MXFContext *mxf = s->priv_data;
3411  AVIOContext *pb = s->pb;
3412  uint64_t pos = avio_tell(pb);
3413  int i;
3414 
3416  klv_encode_ber_length(pb, 28 + 12LL*mxf->body_partitions_count);
3417 
3418  if (mxf->edit_unit_byte_count && !IS_OPATOM(s))
3419  avio_wb32(pb, 1); // BodySID of header partition
3420  else
3421  avio_wb32(pb, 0);
3422  avio_wb64(pb, 0); // offset of header partition
3423 
3424  for (i = 0; i < mxf->body_partitions_count; i++) {
3425  avio_wb32(pb, 1); // BodySID
3426  avio_wb64(pb, mxf->body_partition_offset[i]);
3427  }
3428 
3429  avio_wb32(pb, 0); // BodySID of footer partition
3431 
3432  avio_wb32(pb, avio_tell(pb) - pos + 4);
3433 }
3434 
3436 {
3437  MXFContext *mxf = s->priv_data;
3438  AVIOContext *pb = s->pb;
3439  int i, err;
3440 
3441  if (!mxf->header_written ||
3442  (IS_OPATOM(s) && !mxf->body_partition_offset)) {
3443  /* reason could be invalid options/not supported codec/out of memory */
3444  return AVERROR_UNKNOWN;
3445  }
3446 
3448 
3451  if (mxf->edit_unit_byte_count && !IS_OPATOM(s)) { // no need to repeat index
3452  if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, 0)) < 0)
3453  return err;
3454  } else {
3455  if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, 0)) < 0)
3456  return err;
3459  }
3460 
3463 
3464  if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
3465  if (IS_OPATOM(s)) {
3466  /* rewrite body partition to update lengths */
3467  avio_seek(pb, mxf->body_partition_offset[0], SEEK_SET);
3468  if ((err = mxf_write_opatom_body_partition(s)) < 0)
3469  return err;
3470  }
3471 
3472  avio_seek(pb, 0, SEEK_SET);
3473  if (mxf->edit_unit_byte_count && !IS_OPATOM(s)) {
3474  if ((err = mxf_write_partition(s, 1, 2, header_closed_partition_key, 1)) < 0)
3475  return err;
3478  } else {
3479  if ((err = mxf_write_partition(s, 0, 0, header_closed_partition_key, 1)) < 0)
3480  return err;
3481  }
3482  // update footer partition offset
3483  for (i = 0; i < mxf->body_partitions_count; i++) {
3484  avio_seek(pb, mxf->body_partition_offset[i]+44, SEEK_SET);
3486  }
3487  }
3488 
3489  return 0;
3490 }
3491 
3493 {
3494  MXFContext *mxf = s->priv_data;
3495 
3496  av_freep(&mxf->index_entries);
3498  av_freep(&mxf->timecode_track);
3499 }
3500 
3502 {
3503  FFFormatContext *const si = ffformatcontext(s);
3504  int i, stream_count = 0;
3505 
3506  for (i = 0; i < s->nb_streams; i++)
3507  stream_count += !!ffstream(s->streams[i])->last_in_packet_buffer;
3508 
3509  if (stream_count && (s->nb_streams == stream_count || flush)) {
3510  PacketListEntry *pktl = si->packet_buffer.head;
3511  if (s->nb_streams != stream_count) {
3512  PacketListEntry *last = NULL;
3513  // find last packet in edit unit
3514  while (pktl) {
3515  if (!stream_count || pktl->pkt.stream_index == 0)
3516  break;
3517  // update last packet in packet buffer
3518  if (ffstream(s->streams[pktl->pkt.stream_index])->last_in_packet_buffer != pktl)
3519  ffstream(s->streams[pktl->pkt.stream_index])->last_in_packet_buffer = pktl;
3520  last = pktl;
3521  pktl = pktl->next;
3522  stream_count--;
3523  }
3524  // purge packet queue
3525  while (pktl) {
3526  PacketListEntry *next = pktl->next;
3527  av_packet_unref(&pktl->pkt);
3528  av_freep(&pktl);
3529  pktl = next;
3530  }
3531  if (last)
3532  last->next = NULL;
3533  else {
3534  si->packet_buffer.head = NULL;
3535  si->packet_buffer.tail = NULL;
3536  goto out;
3537  }
3538  pktl = si->packet_buffer.head;
3539  }
3540 
3541  if (ffstream(s->streams[pktl->pkt.stream_index])->last_in_packet_buffer == pktl)
3542  ffstream(s->streams[pktl->pkt.stream_index])->last_in_packet_buffer = NULL;
3544  av_log(s, AV_LOG_TRACE, "out st:%d dts:%"PRId64"\n", out->stream_index, out->dts);
3545  return 1;
3546  } else {
3547  out:
3548  return 0;
3549  }
3550 }
3551 
3553  const AVPacket *pkt)
3554 {
3555  MXFStreamContext *sc = s->streams[pkt ->stream_index]->priv_data;
3556  MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data;
3557 
3558  return next->dts > pkt->dts ||
3559  (next->dts == pkt->dts && sc->order < sc2->order);
3560 }
3561 
3563  int flush, int has_packet)
3564 {
3565  int ret;
3566  if (has_packet) {
3567  MXFStreamContext *sc = s->streams[pkt->stream_index]->priv_data;
3568  pkt->pts = pkt->dts = sc->pkt_cnt++;
3570  return ret;
3571  }
3573 }
3574 
3576 {
3577  if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
3578  if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 &&
3579  AV_RB24(pkt->data) != 0x000001)
3580  return ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL);
3581  }
3582  return 1;
3583 }
3584 
3585 #define MXF_COMMON_OPTIONS \
3586  { "signal_standard", "Force/set Signal Standard",\
3587  offsetof(MXFContext, signal_standard), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},\
3588  { "bt601", "ITU-R BT.601 and BT.656, also SMPTE 125M (525 and 625 line interlaced)",\
3589  0, AV_OPT_TYPE_CONST, {.i64 = 1}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},\
3590  { "bt1358", "ITU-R BT.1358 and ITU-R BT.799-3, also SMPTE 293M (525 and 625 line progressive)",\
3591  0, AV_OPT_TYPE_CONST, {.i64 = 2}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},\
3592  { "smpte347m", "SMPTE 347M (540 Mbps mappings)",\
3593  0, AV_OPT_TYPE_CONST, {.i64 = 3}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},\
3594  { "smpte274m", "SMPTE 274M (1125 line)",\
3595  0, AV_OPT_TYPE_CONST, {.i64 = 4}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},\
3596  { "smpte296m", "SMPTE 296M (750 line progressive)",\
3597  0, AV_OPT_TYPE_CONST, {.i64 = 5}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},\
3598  { "smpte349m", "SMPTE 349M (1485 Mbps mappings)",\
3599  0, AV_OPT_TYPE_CONST, {.i64 = 6}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},\
3600  { "smpte428", "SMPTE 428-1 DCDM",\
3601  0, AV_OPT_TYPE_CONST, {.i64 = 7}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, .unit = "signal_standard"},
3602 
3603 
3604 
3605 static const AVOption mxf_options[] = {
3607  { "store_user_comments", "",
3608  offsetof(MXFContext, store_user_comments), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
3609  { NULL },
3610 };
3611 
3612 static const AVClass mxf_muxer_class = {
3613  .class_name = "MXF muxer",
3614  .item_name = av_default_item_name,
3615  .option = mxf_options,
3616  .version = LIBAVUTIL_VERSION_INT,
3617 };
3618 
3619 static const AVOption d10_options[] = {
3620  { "d10_channelcount", "Force/set channelcount in generic sound essence descriptor",
3621  offsetof(MXFContext, channel_count), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 8, AV_OPT_FLAG_ENCODING_PARAM},
3623  { "store_user_comments", "",
3624  offsetof(MXFContext, store_user_comments), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
3625  { NULL },
3626 };
3627 
3629  .class_name = "MXF-D10 muxer",
3630  .item_name = av_default_item_name,
3631  .option = d10_options,
3632  .version = LIBAVUTIL_VERSION_INT,
3633 };
3634 
3635 static const AVOption opatom_options[] = {
3636  { "mxf_audio_edit_rate", "Audio edit rate for timecode",
3637  offsetof(MXFContext, audio_edit_rate), AV_OPT_TYPE_RATIONAL, {.dbl=25}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
3639  { "store_user_comments", "",
3640  offsetof(MXFContext, store_user_comments), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
3641  { NULL },
3642 };
3643 
3645  .class_name = "MXF-OPAtom muxer",
3646  .item_name = av_default_item_name,
3647  .option = opatom_options,
3648  .version = LIBAVUTIL_VERSION_INT,
3649 };
3650 
3652  .p.name = "mxf",
3653  .p.long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format)"),
3654  .p.mime_type = "application/mxf",
3655  .p.extensions = "mxf",
3656  .priv_data_size = sizeof(MXFContext),
3657  .p.audio_codec = AV_CODEC_ID_PCM_S16LE,
3658  .p.video_codec = AV_CODEC_ID_MPEG2VIDEO,
3659  .init = mxf_init,
3660  .write_packet = mxf_write_packet,
3661  .write_trailer = mxf_write_footer,
3662  .deinit = mxf_deinit,
3663  .p.flags = AVFMT_NOTIMESTAMPS,
3664  .interleave_packet = mxf_interleave,
3665  .p.priv_class = &mxf_muxer_class,
3666  .check_bitstream = mxf_check_bitstream,
3667 };
3668 
3670  .p.name = "mxf_d10",
3671  .p.long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format) D-10 Mapping"),
3672  .p.mime_type = "application/mxf",
3673  .priv_data_size = sizeof(MXFContext),
3674  .p.audio_codec = AV_CODEC_ID_PCM_S16LE,
3675  .p.video_codec = AV_CODEC_ID_MPEG2VIDEO,
3676  .init = mxf_init,
3677  .write_packet = mxf_write_packet,
3678  .write_trailer = mxf_write_footer,
3679  .deinit = mxf_deinit,
3680  .p.flags = AVFMT_NOTIMESTAMPS,
3681  .interleave_packet = mxf_interleave,
3682  .p.priv_class = &mxf_d10_muxer_class,
3683 };
3684 
3686  .p.name = "mxf_opatom",
3687  .p.long_name = NULL_IF_CONFIG_SMALL("MXF (Material eXchange Format) Operational Pattern Atom"),
3688  .p.mime_type = "application/mxf",
3689  .p.extensions = "mxf",
3690  .priv_data_size = sizeof(MXFContext),
3691  .p.audio_codec = AV_CODEC_ID_PCM_S16LE,
3692  .p.video_codec = AV_CODEC_ID_DNXHD,
3693  .init = mxf_init,
3694  .write_packet = mxf_write_packet,
3695  .write_trailer = mxf_write_footer,
3696  .deinit = mxf_deinit,
3697  .p.flags = AVFMT_NOTIMESTAMPS,
3698  .interleave_packet = mxf_interleave,
3699  .p.priv_class = &mxf_opatom_muxer_class,
3700  .check_bitstream = mxf_check_bitstream,
3701 };
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:335
H264SPS
Definition: avc.h:32
AVMasteringDisplayMetadata::has_primaries
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
Definition: mastering_display_metadata.h:62
MXFContext::edit_units_count
unsigned edit_units_count
Definition: mxfenc.c:461
primer_pack_key
static const uint8_t primer_pack_key[]
Definition: mxfenc.c:284
MXFStreamContext
Definition: mxfenc.c:100
IS_OPATOM
#define IS_OPATOM(s)
Definition: mxfenc.c:74
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:430
AV_ROUND_UP
@ AV_ROUND_UP
Round toward +infinity.
Definition: mathematics.h:134
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
AVMasteringDisplayMetadata::max_luminance
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:57
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
PacketList::head
PacketListEntry * head
Definition: packet_internal.h:34
entry
#define entry
Definition: aom_film_grain_template.c:66
ff_mxf_color_primaries_uls
const MXFCodecUL ff_mxf_color_primaries_uls[]
Definition: mxf.c:98
AVOutputFormat::name
const char * name
Definition: avformat.h:507
d10_options
static const AVOption d10_options[]
Definition: mxfenc.c:3619
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
uid
UID uid
Definition: mxfenc.c:2445
opt.h
Track
Definition: ismindex.c:70
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
out
FILE * out
Definition: movenc.c:55
mxf_write_random_index_pack
static void mxf_write_random_index_pack(AVFormatContext *s)
Definition: mxfenc.c:3408
mxf_utf16len
static uint64_t mxf_utf16len(const char *utf8_str)
Definition: mxfenc.c:781
color
Definition: vf_paletteuse.c:513
MXFContext::tc
AVTimecode tc
timecode context
Definition: mxfenc.c:469
GetByteContext
Definition: bytestream.h:33
FF_MXF_MasteringDisplayMinimumLuminance
#define FF_MXF_MasteringDisplayMinimumLuminance
Definition: mxf.h:100
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
INDEX_H264
@ INDEX_H264
Definition: mxfenc.c:152
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:123
klv_encode_ber_length
static int klv_encode_ber_length(AVIOContext *pb, uint64_t len)
Definition: mxfenc.c:518
AVCodecParameters::color_space
enum AVColorSpace color_space
Definition: codec_par.h:169
MXFStreamContext::j2k_info
j2k_info_t j2k_info
Definition: mxfenc.c:126
AVStream::priv_data
void * priv_data
Definition: avformat.h:770
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3341
mxf_write_opatom_body_partition
static int mxf_write_opatom_body_partition(AVFormatContext *s)
Definition: mxfenc.c:3206
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:202
AV_PKT_DATA_MASTERING_DISPLAY_METADATA
@ AV_PKT_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata (based on SMPTE-2086:2014).
Definition: packet.h:219
AVMasteringDisplayMetadata::display_primaries
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
Definition: mastering_display_metadata.h:42
mxf_write_local_tag
static void mxf_write_local_tag(AVFormatContext *s, int size, int tag)
Definition: mxfenc.c:671
TaggedValue
@ TaggedValue
Definition: mxf.h:50
AVMasteringDisplayMetadata::has_luminance
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
Definition: mastering_display_metadata.h:67
MXFContext::tagged_value_count
uint32_t tagged_value_count
Definition: mxfenc.c:479
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:479
int64_t
long long int64_t
Definition: coverity.c:34
MXF_COMMON_OPTIONS
#define MXF_COMMON_OPTIONS
Definition: mxfenc.c:3585
j2k_info_t::j2k_rsiz
uint16_t j2k_rsiz
j2k required decoder capabilities (Rsiz)
Definition: mxfenc.c:88
mxf_write_d10_audio_packet
static void mxf_write_d10_audio_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mxfenc.c:3174
FF_MXF_MasteringDisplayPrimaries
#define FF_MXF_MasteringDisplayPrimaries
Definition: mxf.h:97
MXFPackage::type
enum MXFMetadataSetType type
Definition: mxfenc.c:138
DESCRIPTOR_COUNT
#define DESCRIPTOR_COUNT(essence_container_count)
Definition: mxfenc.c:701
pixdesc.h
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:386
AVPacket::data
uint8_t * data
Definition: packet.h:535
header_metadata_key
static const uint8_t header_metadata_key[]
partial key for header metadata
Definition: mxfenc.c:294
ContentStorage
@ ContentStorage
Definition: mxf.h:45
AVComponentDescriptor::depth
int depth
Number of bits in the component.
Definition: pixdesc.h:57
j2k_info_t
Definition: mxfenc.c:86
SourceClip
@ SourceClip
Definition: mxf.h:35
AVOption
AVOption.
Definition: opt.h:429
JPEG2000_SOC
@ JPEG2000_SOC
Definition: jpeg2000.h:39
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:834
MXFPackage::instance
int instance
Definition: mxfenc.c:139
AVTimecode::flags
uint32_t flags
flags such as drop frame, +24 hours support, ...
Definition: timecode.h:43
rangecoder.h
MXFContext::body_offset
uint64_t body_offset
Definition: mxfenc.c:474
MXFStreamContext::frame_size
int frame_size
frame size in bytes
Definition: mxfenc.c:119
AV_DICT_IGNORE_SUFFIX
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key,...
Definition: dict.h:75
MXFIndexEntry
Definition: mxfenc.c:79
mxf_parse_dnxhd_frame
static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mxfenc.c:2312
ff_parse_creation_time_metadata
int ff_parse_creation_time_metadata(AVFormatContext *s, int64_t *timestamp, int return_seconds)
Parse creation_time in AVFormatContext metadata if exists and warn if the parsing fails.
Definition: mux_utils.c:137
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:225
LIBAVFORMAT_VERSION_MICRO
#define LIBAVFORMAT_VERSION_MICRO
Definition: version.h:35
MXFStreamContext::index
int index
index in mxf_essence_container_uls table
Definition: mxfenc.c:103
j2k_info_t::j2k_xsiz
uint32_t j2k_xsiz
j2k width of the reference grid (Xsiz)
Definition: mxfenc.c:89
AVDictionary
Definition: dict.c:32
product_uid
static const uint8_t product_uid[]
Definition: mxfenc.c:274
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
MXFStreamContext::signal_standard
int signal_standard
Definition: mxfenc.c:111
mxf_write_content_storage
static void mxf_write_content_storage(AVFormatContext *s, MXFPackage *packages, int package_count)
Definition: mxfenc.c:906
mxf_rgba_descriptor_key
static const UID mxf_rgba_descriptor_key
Definition: mxfenc.c:1187
AVERROR_UNKNOWN
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:73
mxf_write_h264_desc
static int mxf_write_h264_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1564
AV_OPT_TYPE_RATIONAL
@ AV_OPT_TYPE_RATIONAL
Underlying C type is AVRational.
Definition: opt.h:280
rescale_mastering_luma
static uint32_t rescale_mastering_luma(AVRational q)
Definition: mxfenc.c:1199
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
ff_mxf_d10_muxer
const EXTERN FFOutputFormat ff_mxf_d10_muxer
Definition: mxfenc.c:70
mxf_muxer_class
static const AVClass mxf_muxer_class
Definition: mxfenc.c:3612
MXFContext
Definition: mxfdec.c:300
ff_mxf_color_trc_uls
const MXFCodecUL ff_mxf_color_trc_uls[]
Definition: mxf.c:113
TimecodeComponent
@ TimecodeComponent
Definition: mxf.h:36
MXFContainerEssenceEntry::codec_ul
UID codec_ul
Definition: mxfenc.c:132
INDEX_MPEG2
@ INDEX_MPEG2
Definition: mxfenc.c:144
AV_WB64
#define AV_WB64(p, v)
Definition: intreadwrite.h:429
MXFStreamContext::interlaced
int interlaced
whether picture is interlaced
Definition: mxfenc.c:107
mxf_get_essence_container_ul_index
static int mxf_get_essence_container_ul_index(enum AVCodecID id)
Definition: mxfenc.c:553
FFOutputFormat::p
AVOutputFormat p
The public AVOutputFormat.
Definition: mux.h:65
mxf_avc_subdescriptor_key
static const UID mxf_avc_subdescriptor_key
Definition: mxfenc.c:1190
AV_PROFILE_PRORES_STANDARD
#define AV_PROFILE_PRORES_STANDARD
Definition: defs.h:183
av_get_random_seed
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
Definition: random_seed.c:196
INDEX_DNXHD
@ INDEX_DNXHD
Definition: mxfenc.c:150
MXF_NUM_TAGS
#define MXF_NUM_TAGS
Definition: mxfenc.c:452
mxf_ffv1_codec_uls
static const UID mxf_ffv1_codec_uls[]
Definition: mxfenc.c:266
avio_wl16
void avio_wl16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:437
AVCodecParameters::color_primaries
enum AVColorPrimaries color_primaries
Definition: codec_par.h:167
avio_write_marker
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
Mark the written bytestream as a specific type.
Definition: aviobuf.c:461
golomb.h
exp golomb vlc stuff
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
TapeDescriptor
@ TapeDescriptor
Definition: mxf.h:51
ff_mxf_get_content_package_rate
int ff_mxf_get_content_package_rate(AVRational time_base)
Definition: mxf.c:220
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:203
intra_only
int8_t intra_only
Definition: mxfenc.c:2449
INDEX_JPEG2000
@ INDEX_JPEG2000
Definition: mxfenc.c:151
mxf.h
AV_PROFILE_PRORES_HQ
#define AV_PROFILE_PRORES_HQ
Definition: defs.h:184
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:777
store_version
static void store_version(AVFormatContext *s)
Definition: mxfenc.c:836
KAG_SIZE
#define KAG_SIZE
Definition: mxfenc.c:77
PLATFORM_IDENT
#define PLATFORM_IDENT
Definition: mxfenc.c:852
smpte_12m_timecode_track_data_ul
static const uint8_t smpte_12m_timecode_track_data_ul[]
Definition: mxfenc.c:979
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:347
header_open_partition_key
static const uint8_t header_open_partition_key[]
Definition: mxfenc.c:286
LIBAVFORMAT_VERSION_MAJOR
#define LIBAVFORMAT_VERSION_MAJOR
Definition: version_major.h:32
FFV1_CONTEXT_SIZE
#define FFV1_CONTEXT_SIZE
Definition: mxfenc.c:2612
mxf_write_footer
static int mxf_write_footer(AVFormatContext *s)
Definition: mxfenc.c:3435
mxf_mark_tag_unused
static void mxf_mark_tag_unused(MXFContext *mxf, int tag)
Definition: mxfenc.c:575
timecode.h
MXFStreamContext::track_essence_element_key
UID track_essence_element_key
Definition: mxfenc.c:102
mxf_local_tag_batch
static const MXFLocalTagPair mxf_local_tag_batch[]
SMPTE RP210 http://www.smpte-ra.org/mdd/index.html https://smpte-ra.org/sites/default/files/Labels....
Definition: mxfenc.c:301
GetBitContext
Definition: get_bits.h:108
ff_avc_decode_sps
int ff_avc_decode_sps(H264SPS *sps, const uint8_t *buf, int buf_size)
Definition: avc.c:208
MXFCodecUL::id
int id
Definition: mxf.h:108
AVTimecode::start
int start
timecode frame start (first base frame number)
Definition: timecode.h:42
gmtime_r
#define gmtime_r
Definition: time_internal.h:34
mxf_write_multi_descriptor
static void mxf_write_multi_descriptor(AVFormatContext *s)
Definition: mxfenc.c:1107
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
avpriv_packet_list_get
int avpriv_packet_list_get(PacketList *pkt_buffer, AVPacket *pkt)
Remove the oldest AVPacket in the list and return it.
Definition: packet.c:583
mxf_write_s436m_anc_desc
static int mxf_write_s436m_anc_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1619
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
MXFStreamContext::v_chroma_sub_sample
int v_chroma_sub_sample
Definition: mxfenc.c:113
mxf_ffv1_subdescriptor_key
static const UID mxf_ffv1_subdescriptor_key
Definition: mxfenc.c:1191
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_FIELD_TB
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition: defs.h:205
body_partition_key
static const uint8_t body_partition_key[]
Definition: mxfenc.c:289
MXFContext::header_written
int header_written
Definition: mxfenc.c:459
mxf_write_header_metadata_sets
static int mxf_write_header_metadata_sets(AVFormatContext *s)
Definition: mxfenc.c:1925
av_get_bits_per_sample
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
Definition: utils.c:547
GET_UTF8
#define GET_UTF8(val, GET_BYTE, ERROR)
Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
Definition: common.h:488
AVCodecParameters::color_trc
enum AVColorTransferCharacteristic color_trc
Definition: codec_par.h:168
mxf_check_bitstream
static int mxf_check_bitstream(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
Definition: mxfenc.c:3575
avassert.h
system_metadata_package_set_key
static const uint8_t system_metadata_package_set_key[]
Definition: mxfenc.c:3123
mxf_write_cdci_desc
static int mxf_write_cdci_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1550
mxf_write_sequence
static void mxf_write_sequence(AVFormatContext *s, AVStream *st, MXFPackage *package)
Definition: mxfenc.c:1005
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:235
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
mxf_parse_prores_frame
static int mxf_parse_prores_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mxfenc.c:2261
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:528
PRINT_KEY
#define PRINT_KEY(pc, s, x)
Definition: mxf.h:155
AV_FIELD_UNKNOWN
@ AV_FIELD_UNKNOWN
Definition: defs.h:201
av_timecode_init
int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx)
Init a timecode struct with the passed parameters.
Definition: timecode.c:201
MXFStreamContext::h_chroma_sub_sample
int h_chroma_sub_sample
Definition: mxfenc.c:112
state
static struct @486 state
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:60
mxf_write_ffv1_subdesc
static int mxf_write_ffv1_subdesc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1577
mxf_h264_codec_uls
static const struct @433 mxf_h264_codec_uls[]
ff_mxf_data_definition_uls
const MXFCodecUL ff_mxf_data_definition_uls[]
SMPTE RP224 http://www.smpte-ra.org/mdd/index.html.
Definition: mxf.c:31
mxf_write_user_comments
static int mxf_write_user_comments(AVFormatContext *s, const AVDictionary *m)
Definition: mxfenc.c:1781
MXFStreamContext::temporal_reordering
int temporal_reordering
Definition: mxfenc.c:114
attributes_internal.h
mxf_parse_h264_frame
static int mxf_parse_h264_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt, MXFIndexEntry *e)
Definition: mxfenc.c:2476
mxf_write_cdci_common
static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key)
Definition: mxfenc.c:1204
mxf_write_common_fields
static void mxf_write_common_fields(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:981
mxf_write_identification
static void mxf_write_identification(AVFormatContext *s)
Definition: mxfenc.c:853
MXFContext::slice_count
uint8_t slice_count
index slice count minus 1 (1 if no audio, 0 otherwise)
Definition: mxfenc.c:463
AVMasteringDisplayMetadata::white_point
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
Definition: mastering_display_metadata.h:47
MXFPackage::ref
struct MXFPackage * ref
Definition: mxfenc.c:140
s
#define s(width, name)
Definition: cbs_vp9.c:198
MXFMetadataSetType
MXFMetadataSetType
Definition: mxf.h:32
AVCHROMA_LOC_TOP
@ AVCHROMA_LOC_TOP
Definition: pixfmt.h:774
MultipleDescriptor
@ MultipleDescriptor
Definition: mxf.h:39
MXFContext::timecode_base
int timecode_base
rounded time code base (25 or 30)
Definition: mxfenc.c:471
klv_encode_ber9_length
static void klv_encode_ber9_length(AVIOContext *pb, uint64_t len)
Definition: mxfenc.c:544
INDEX_S436M
@ INDEX_S436M
Definition: mxfenc.c:153
FFFormatContext::packet_buffer
PacketList packet_buffer
This buffer is only needed when packets were already buffered but not decoded, for example to get the...
Definition: internal.h:86
mxf_dnxhd_codec_uls
static const struct @431 mxf_dnxhd_codec_uls[]
AVCodecParameters::sample_aspect_ratio
AVRational sample_aspect_ratio
Video only.
Definition: codec_par.h:144
choose_chroma_location
static enum AVChromaLocation choose_chroma_location(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:2865
g
const char * g
Definition: vf_curves.c:128
AVDictionaryEntry::key
char * key
Definition: dict.h:91
frame_size
int frame_size
Definition: mxfenc.c:2446
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
jpeg2000.h
ULIndex
ULIndex
Definition: mxfenc.c:143
AVCSubDescriptor
@ AVCSubDescriptor
Definition: mxf.h:52
mxf_parse_mpeg2_frame
static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt, MXFIndexEntry *e)
Definition: mxfenc.c:2745
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
mxf_write_track
static void mxf_write_track(AVFormatContext *s, AVStream *st, MXFPackage *package)
Definition: mxfenc.c:933
j2k_info_t::j2k_ysiz
uint32_t j2k_ysiz
j2k height of the reference grid (Ysiz)
Definition: mxfenc.c:90
UID
AVUUID UID
Definition: mxf.h:30
mxf_d10_muxer_class
static const AVClass mxf_d10_muxer_class
Definition: mxfenc.c:3628
mxf_cdci_descriptor_key
static const UID mxf_cdci_descriptor_key
Definition: mxfenc.c:1186
MXFContainerEssenceEntry::write_desc
int(* write_desc)(AVFormatContext *, AVStream *)
Definition: mxfenc.c:133
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
AVPacketSideData::data
uint8_t * data
Definition: packet.h:387
mxf_write_klv_fill
static void mxf_write_klv_fill(AVFormatContext *s)
Definition: mxfenc.c:2132
INDEX_WAV
@ INDEX_WAV
Definition: mxfenc.c:146
mxf_write_aes3_desc
static int mxf_write_aes3_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1736
AV_RL16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
Definition: bytestream.h:94
INDEX_DV
@ INDEX_DV
Definition: mxfenc.c:149
AVPixFmtDescriptor::log2_chroma_w
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:80
mxf_compare_timestamps
static int mxf_compare_timestamps(AVFormatContext *s, const AVPacket *next, const AVPacket *pkt)
Definition: mxfenc.c:3552
mxf_write_opatom_packet
static int mxf_write_opatom_packet(AVFormatContext *s, AVPacket *pkt, MXFIndexEntry *ie)
Definition: mxfenc.c:3227
key
const char * key
Definition: hwcontext_opencl.c:189
H264_NAL_SLICE
@ H264_NAL_SLICE
Definition: h264.h:35
MXFContext::audio_edit_rate
AVRational audio_edit_rate
Definition: mxfenc.c:480
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:86
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
Preface
@ Preface
Definition: mxf.h:43
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
mxf_essence_container_uls
static const MXFContainerEssenceEntry mxf_essence_container_uls[]
Definition: mxfenc.c:183
ff_mxf_color_space_uls
const MXFCodecUL ff_mxf_color_space_uls[]
Definition: mxf.c:134
EXTERN
#define EXTERN
Definition: attributes_internal.h:34
PacketList::tail
PacketListEntry * tail
Definition: packet_internal.h:34
JPEG2000SubDescriptor
@ JPEG2000SubDescriptor
Definition: mxf.h:57
time_internal.h
if
if(ret)
Definition: filter_design.txt:179
FFFormatContext
Definition: internal.h:64
mxf_jpeg2000_subdescriptor_key
static const UID mxf_jpeg2000_subdescriptor_key
Definition: mxfenc.c:1192
MXFContext::duration
uint64_t duration
Definition: mxfenc.c:468
MXFIndexEntry::slice_offset
unsigned slice_offset
offset of audio slice
Definition: mxfenc.c:81
SubDescriptor
@ SubDescriptor
Definition: mxf.h:46
AVFormatContext
Format I/O context.
Definition: avformat.h:1265
mxf_write_tagged_value
static int mxf_write_tagged_value(AVFormatContext *s, const char *name, const char *value)
Definition: mxfenc.c:1752
internal.h
MXFContext::store_user_comments
int store_user_comments
Definition: mxfenc.c:481
FF_MXF_MASTERING_LUMA_DEN
#define FF_MXF_MASTERING_LUMA_DEN
Definition: mxf.h:103
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:768
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
mxf_d10_container_uls
static const UID mxf_d10_container_uls[]
Definition: mxfenc.c:256
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:784
NULL
#define NULL
Definition: coverity.c:32
MaterialPackage
@ MaterialPackage
Definition: mxf.h:33
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
AVPixFmtDescriptor::nb_components
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:71
MXFContext::edit_unit_byte_count
int edit_unit_byte_count
fixed edit unit byte count
Definition: mxfenc.c:472
AVCHROMA_LOC_LEFT
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition: pixfmt.h:771
mxf_write_essence_container_data
static int mxf_write_essence_container_data(AVFormatContext *s)
Definition: mxfenc.c:1903
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVCHROMA_LOC_TOPLEFT
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition: pixfmt.h:773
FF_MXF_MASTERING_CHROMA_DEN
#define FF_MXF_MASTERING_CHROMA_DEN
Definition: mxf.h:102
mxf_interleave_get_packet
static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, int flush)
Definition: mxfenc.c:3501
MXFContainerEssenceEntry
Definition: mxfenc.c:129
uuid_base
static const uint8_t uuid_base[]
Definition: mxfenc.c:275
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:239
avc.h
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:370
MXFStreamContext::b_picture_count
int b_picture_count
maximum number of consecutive b pictures, used in mpeg-2 descriptor
Definition: mxfenc.c:122
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:825
mxf_utf16_local_tag_length
static int mxf_utf16_local_tag_length(const char *utf8_str)
Definition: mxfenc.c:803
MXFContext::signal_standard
int signal_standard
Definition: mxfenc.c:478
avpriv_find_start_code
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
FFOutputFormat
Definition: mux.h:61
mxf_parse_ffv1_frame
static int mxf_parse_ffv1_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mxfenc.c:2613
mxf_write_structural_component
static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, MXFPackage *package)
Definition: mxfenc.c:1059
MXFContext::last_indexed_edit_unit
int last_indexed_edit_unit
Definition: mxfenc.c:464
time.h
MXFStreamContext::max_gop
int max_gop
maximum gop size, used by mpeg-2 descriptor
Definition: mxfenc.c:121
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:179
j2k_info_t::j2k_xtsiz
uint32_t j2k_xtsiz
j2k width of one reference tile with respect to the reference grid (XTsiz)
Definition: mxfenc.c:93
ffio_fill
void ffio_fill(AVIOContext *s, int b, int64_t count)
Definition: aviobuf.c:187
mxf_init
static int mxf_init(AVFormatContext *s)
Definition: mxfenc.c:2894
mxf_mpeg2_codec_uls
static const UID mxf_mpeg2_codec_uls[]
Definition: mxfenc.c:2712
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
PacketListEntry::next
struct PacketListEntry * next
Definition: packet_internal.h:29
mxf_write_index_table_segment
static void mxf_write_index_table_segment(AVFormatContext *s)
Definition: mxfenc.c:1986
MXFStreamContext::codec_ul
const UID * codec_ul
Definition: mxfenc.c:104
seed
static unsigned int seed
Definition: videogen.c:78
j2k_info_t::j2k_ytsiz
uint32_t j2k_ytsiz
j2k height of one reference tile with respect to the reference grid (YTsiz)
Definition: mxfenc.c:94
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:716
AVCodecParameters::level
int level
Definition: codec_par.h:129
INDEX_D10_AUDIO
@ INDEX_D10_AUDIO
Definition: mxfenc.c:148
AVTimecode::rate
AVRational rate
frame rate in rational form
Definition: timecode.h:44
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition: opt.h:352
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AV_PROFILE_PRORES_LT
#define AV_PROFILE_PRORES_LT
Definition: defs.h:182
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
cid
uint16_t cid
Definition: mxfenc.c:2286
AV_CODEC_ID_MPEG1VIDEO
@ AV_CODEC_ID_MPEG1VIDEO
Definition: codec_id.h:53
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
MXFStreamContext::order
int order
interleaving order if dts are equal
Definition: mxfenc.c:106
j2k_info_t::j2k_comp_desc
uint8_t j2k_comp_desc[12]
j2k components descriptor (Ssiz(i), XRsiz(i), YRsiz(i))
Definition: mxfenc.c:97
av_packet_side_data_get
const AVPacketSideData * av_packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Get side information from a side data array.
Definition: packet.c:657
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
mxf_compute_edit_unit_byte_count
static void mxf_compute_edit_unit_byte_count(AVFormatContext *s)
Definition: mxfenc.c:3256
startcode.h
mxf_deinit
static void mxf_deinit(AVFormatContext *s)
Definition: mxfenc.c:3492
av_rescale_rnd
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
Definition: mathematics.c:58
mxf_indirect_value_utf16le
static const uint8_t mxf_indirect_value_utf16le[]
Definition: mxfenc.c:1750
INDEX_FFV1
@ INDEX_FFV1
Definition: mxfenc.c:155
ff_init_range_decoder
av_cold void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size)
Definition: rangecoder.c:53
FF_MXF_MasteringDisplayWhitePointChromaticity
#define FF_MXF_MasteringDisplayWhitePointChromaticity
Definition: mxf.h:98
AV_CODEC_ID_FFV1
@ AV_CODEC_ID_FFV1
Definition: codec_id.h:85
ff_mxf_muxer
const FFOutputFormat ff_mxf_muxer
Definition: mxfenc.c:3651
MXFStreamContext::closed_gop
int closed_gop
gop is closed, used in mpeg-2 frame parsing
Definition: mxfenc.c:116
klv_encode_ber4_length
static void klv_encode_ber4_length(AVIOContext *pb, int len)
Definition: mxfenc.c:538
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AV_CODEC_ID_PCM_S24LE
@ AV_CODEC_ID_PCM_S24LE
Definition: codec_id.h:347
MXFContext::cbr_index
int cbr_index
use a constant bitrate index
Definition: mxfenc.c:483
j2k_info_t::j2k_y0siz
uint32_t j2k_y0siz
j2k vertical offset from the origin of the reference grid to the left side of the image (Y0siz)
Definition: mxfenc.c:92
AVPacket::size
int size
Definition: packet.h:536
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:94
AV_PIX_FMT_FLAG_RGB
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
Definition: pixdesc.h:136
MXFStreamContext::color_siting
int color_siting
Definition: mxfenc.c:110
MXFStreamContext::pkt_cnt
int64_t pkt_cnt
pkt counter for muxed packets
Definition: mxfenc.c:101
sample
#define sample
Definition: flacdsp_template.c:44
mxf_write_packet
static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mxfenc.c:3277
size
int size
Definition: twinvq_data.h:10344
Identification
@ Identification
Definition: mxf.h:44
INDEX_AES3
@ INDEX_AES3
Definition: mxfenc.c:145
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
ff_build_rac_states
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
Definition: rangecoder.c:68
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
mxf_update_klv_size
static void mxf_update_klv_size(AVIOContext *pb, int64_t pos)
Definition: mxfenc.c:1454
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
PacketListEntry::pkt
AVPacket pkt
Definition: packet_internal.h:30
AVCodecParameters::profile
int profile
Codec-specific bitstream restrictions that the stream conforms to.
Definition: codec_par.h:128
AVCHROMA_LOC_UNSPECIFIED
@ AVCHROMA_LOC_UNSPECIFIED
Definition: pixfmt.h:770
MXFContext::time_base
AVRational time_base
Definition: mxfenc.c:458
mxf_write_package
static int mxf_write_package(AVFormatContext *s, MXFPackage *package)
Definition: mxfenc.c:1799
get_ffv1_unsigned_symbol
static int get_ffv1_unsigned_symbol(RangeCoder *c, uint8_t *state)
Definition: mxfenc.c:2591
AV_RL24
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_RL24
Definition: bytestream.h:93
MXFContext::av_class
AVClass * av_class
Definition: mxfenc.c:455
MXFContext::timestamp
uint64_t timestamp
timestamp, as year(16),month(8),day(8),hour(8),minutes(8),msec/4(8)
Definition: mxfenc.c:462
mxf_write_umid
static void mxf_write_umid(AVFormatContext *s, int type)
Definition: mxfenc.c:495
mxf_dv_uls
static const struct @432 mxf_dv_uls[]
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:534
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:201
avio_wb32
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:365
AV_PROFILE_PRORES_4444
#define AV_PROFILE_PRORES_4444
Definition: defs.h:185
mxf_write_jpeg2000_subdesc
static int mxf_write_jpeg2000_subdesc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1487
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition: mem.c:225
mxf_opatom_muxer_class
static const AVClass mxf_opatom_muxer_class
Definition: mxfenc.c:3644
avio_wl32
void avio_wl32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:357
IndexTableSegment
@ IndexTableSegment
Definition: mxf.h:47
mxf_gen_umid
static void mxf_gen_umid(AVFormatContext *s)
Definition: mxfenc.c:2829
mxf_write_system_item
static void mxf_write_system_item(AVFormatContext *s)
Definition: mxfenc.c:3125
FF_COMPLIANCE_UNOFFICIAL
#define FF_COMPLIANCE_UNOFFICIAL
Allow unofficial extensions.
Definition: defs.h:61
MXFStreamContext::micro_version
int micro_version
format micro_version, used in ffv1 descriptor
Definition: mxfenc.c:125
version
version
Definition: libkvazaar.c:315
MXFContext::timecode_track_priv
MXFStreamContext timecode_track_priv
Definition: mxfenc.c:485
AV_PROFILE_PRORES_PROXY
#define AV_PROFILE_PRORES_PROXY
Definition: defs.h:181
MXFContext::body_partition_offset
uint64_t * body_partition_offset
Definition: mxfenc.c:465
multiple_desc_ul
static const uint8_t multiple_desc_ul[]
Definition: mxfenc.c:295
opatom_options
static const AVOption opatom_options[]
Definition: mxfenc.c:3635
AVChromaLocation
AVChromaLocation
Location of chroma samples.
Definition: pixfmt.h:769
footer_partition_key
static const uint8_t footer_partition_key[]
Definition: mxfenc.c:283
av_timecode_get_smpte_from_framenum
uint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum)
Convert frame number to SMPTE 12M binary representation.
Definition: timecode.c:54
MXFContext::footer_partition_offset
int64_t footer_partition_offset
Definition: mxfenc.c:456
AV_CODEC_ID_MJPEG
@ AV_CODEC_ID_MJPEG
Definition: codec_id.h:59
mxf_write_ffv1_desc
static int mxf_write_ffv1_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1607
container_ul
const UID container_ul
Definition: mxfenc.c:2358
mxf_get_codec_ul_by_id
static const MXFCodecUL * mxf_get_codec_ul_by_id(const MXFCodecUL *uls, int id)
Definition: mxfenc.c:690
interlaced
uint8_t interlaced
Definition: mxfenc.c:2287
mxf_write_avc_subdesc
static void mxf_write_avc_subdesc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1463
mxf_lookup_local_tag
static const MXFLocalTagPair * mxf_lookup_local_tag(int tag)
Definition: mxfenc.c:562
PacketListEntry
Definition: packet_internal.h:28
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:528
j2k_info_t::j2k_x0siz
uint32_t j2k_x0siz
j2k horizontal offset from the origin of the reference grid to the left side of the image (X0siz)
Definition: mxfenc.c:91
MXFContext::content_package_rate
int content_package_rate
content package rate in system element, see SMPTE 326M
Definition: mxfenc.c:473
avio_internal.h
klv_fill_size
static unsigned klv_fill_size(uint64_t size)
Definition: mxfenc.c:1977
MXFContext::timecode_track
AVStream * timecode_track
Definition: mxfenc.c:470
codec_ul
UID codec_ul
Definition: mxfenc.c:2251
MXFStreamContext::slice_offset
int slice_offset
Definition: mxfenc.c:118
index
enum ULIndex index
Definition: mxfenc.c:160
AVCodecParameters::height
int height
Definition: codec_par.h:135
AVCodecParameters::block_align
int block_align
Audio only.
Definition: codec_par.h:191
MXFStreamContext::container_ul
const UID * container_ul
Definition: mxfenc.c:105
ff_interleave_add_packet
int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt, int(*compare)(AVFormatContext *, const AVPacket *, const AVPacket *))
Add packet to an AVFormatContext's packet_buffer list, determining its interleaved position using com...
Definition: mux.c:835
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
mxf_parse_dv_frame
static int mxf_parse_dv_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mxfenc.c:2383
j2k_info_t::j2k_xt0siz
uint32_t j2k_xt0siz
j2k horizontal offset from the origin of the reference grid to the left side of the first tile (XT0si...
Definition: mxfenc.c:95
MXFContainerEssenceEntry::element_ul
UID element_ul
Definition: mxfenc.c:131
umid_ul
static const uint8_t umid_ul[]
Definition: mxfenc.c:276
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
MXFIndexEntry::flags
uint8_t flags
Definition: mxfenc.c:83
mxf_d10_codec_uls
static const UID mxf_d10_codec_uls[]
Definition: mxfenc.c:247
mxf_write_timecode_component
static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, MXFPackage *package)
Definition: mxfenc.c:1032
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
system_metadata_pack_key
static const uint8_t system_metadata_pack_key[]
Definition: mxfenc.c:3122
AV_STRINGIFY
#define AV_STRINGIFY(s)
Definition: macros.h:66
AV_CODEC_ID_DVVIDEO
@ AV_CODEC_ID_DVVIDEO
Definition: codec_id.h:76
JPEG2000_SIZ
@ JPEG2000_SIZ
Definition: jpeg2000.h:41
MXFIndexEntry::offset
uint64_t offset
Definition: mxfenc.c:80
ff_mxf_opatom_muxer
const EXTERN FFOutputFormat ff_mxf_opatom_muxer
Definition: mxfenc.c:71
EssenceContainerData
@ EssenceContainerData
Definition: mxf.h:48
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
mxf_write_uuid
static void mxf_write_uuid(AVIOContext *pb, enum MXFMetadataSetType type, int value)
Definition: mxfenc.c:488
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
AVCodecParameters::color_range
enum AVColorRange color_range
Video only.
Definition: codec_par.h:166
AVMasteringDisplayMetadata
Mastering display metadata capable of representing the color volume of the display used to master the...
Definition: mastering_display_metadata.h:38
len
int len
Definition: vorbis_enc_data.h:426
AV_CODEC_ID_JPEG2000
@ AV_CODEC_ID_JPEG2000
Definition: codec_id.h:140
get_rac
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition: rangecoder.h:118
profile
int profile
Definition: mxfenc.c:2250
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
H264_NAL_IDR_SLICE
@ H264_NAL_IDR_SLICE
Definition: h264.h:39
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:81
nal.h
FFStream::last_in_packet_buffer
PacketListEntry * last_in_packet_buffer
last packet in packet_buffer for this stream when muxing.
Definition: internal.h:303
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:733
MXFContext::instance_number
uint32_t instance_number
Definition: mxfenc.c:475
MXFContext::last_key_index
int last_key_index
index of last key frame
Definition: mxfenc.c:467
AVCodecParameters::field_order
enum AVFieldOrder field_order
Video only.
Definition: codec_par.h:161
MXFPackage
Definition: mxfdec.c:267
mxf_interleave
static int mxf_interleave(AVFormatContext *s, AVPacket *pkt, int flush, int has_packet)
Definition: mxfenc.c:3562
version.h
AV_TIMECODE_FLAG_DROPFRAME
@ AV_TIMECODE_FLAG_DROPFRAME
timecode is drop frame
Definition: timecode.h:36
MXFStreamContext::seq_closed_gop
int seq_closed_gop
all gops in sequence are closed, used in mpeg-2 descriptor
Definition: mxfenc.c:120
tag
uint32_t tag
Definition: movenc.c:1911
LIBAVFORMAT_VERSION
#define LIBAVFORMAT_VERSION
Definition: version.h:40
ret
ret
Definition: filter_design.txt:187
mxf_write_wav_common
static int64_t mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key)
Definition: mxfenc.c:1714
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1433
AVStream
Stream structure.
Definition: avformat.h:745
LIBAVFORMAT_VERSION_MINOR
#define LIBAVFORMAT_VERSION_MINOR
Definition: version.h:34
mxf_wav_descriptor_key
static const UID mxf_wav_descriptor_key
Definition: mxfenc.c:1184
op1a_ul
static const uint8_t op1a_ul[]
complete key for operation pattern, partitions, and primer pack
Definition: mxfenc.c:281
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:231
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:80
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
MXFContext::umid
uint8_t umid[16]
unique material identifier
Definition: mxfenc.c:476
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
pos
unsigned int pos
Definition: spdifenc.c:414
avformat.h
MXFLocalTagPair
Definition: mxf.h:89
mxf_write_partition
static int mxf_write_partition(AVFormatContext *s, int bodysid, int indexsid, const uint8_t *key, int write_metadata)
Definition: mxfenc.c:2144
ff_mxf_random_index_pack_key
const uint8_t ff_mxf_random_index_pack_key[16]
Definition: mxf.c:26
AVCodecParameters::chroma_location
enum AVChromaLocation chroma_location
Definition: codec_par.h:170
opatom_ul
static const uint8_t opatom_ul[]
Definition: mxfenc.c:282
avio_put_str16be
int avio_put_str16be(AVIOContext *s, const char *str)
Convert an UTF-8 string to UTF-16BE and write it.
id
enum AVCodecID id
Definition: mxfenc.c:159
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:751
get_ue_golomb_31
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition: golomb.h:120
rescale_mastering_chroma
static uint16_t rescale_mastering_chroma(AVRational q)
Definition: mxfenc.c:1194
klv_fill_key
static const uint8_t klv_fill_key[]
Definition: mxfenc.c:288
random_seed.h
mxf_init_timecode
static int mxf_init_timecode(AVFormatContext *s, AVStream *st, AVRational tbc)
Definition: mxfenc.c:2841
mxf_write_wav_desc
static int mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1729
MXFIndexEntry::temporal_ref
uint16_t temporal_ref
Definition: mxfenc.c:82
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
mxf_write_local_tag_utf16
static void mxf_write_local_tag_utf16(AVFormatContext *s, int tag, const char *value)
Definition: mxfenc.c:822
MXFContext::index_entries
MXFIndexEntry * index_entries
Definition: mxfenc.c:460
AVCHROMA_LOC_CENTER
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
Definition: pixfmt.h:772
MXFStreamContext::low_delay
int low_delay
low delay, used in mpeg-2 descriptor
Definition: mxfenc.c:123
FF_MXF_MasteringDisplayMaximumLuminance
#define FF_MXF_MasteringDisplayMaximumLuminance
Definition: mxf.h:99
AVRational::den
int den
Denominator.
Definition: rational.h:60
MXFStreamContext::video_bit_rate
int video_bit_rate
Definition: mxfenc.c:117
mxf_mpegvideo_descriptor_key
static const UID mxf_mpegvideo_descriptor_key
Definition: mxfenc.c:1183
MXFStreamContext::aspect_ratio
AVRational aspect_ratio
display aspect ratio
Definition: mxfenc.c:115
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
defs.h
MXFContext::track_instance_count
int track_instance_count
Definition: mxfenc.c:482
MXFContext::channel_count
int channel_count
Definition: mxfenc.c:477
klv_ber_length
static int klv_ber_length(uint64_t len)
Definition: mxfenc.c:510
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:879
mxf_essence_mappings
static const struct @429 mxf_essence_mappings[]
MXFContext::essence_container_count
int essence_container_count
Definition: mxfenc.c:457
mxf_get_mpeg2_codec_ul
static const UID * mxf_get_mpeg2_codec_ul(AVCodecParameters *par)
Definition: mxfenc.c:2725
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
SourcePackage
@ SourcePackage
Definition: mxf.h:34
AVMasteringDisplayMetadata::min_luminance
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:52
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
AVPacket::stream_index
int stream_index
Definition: packet.h:537
H264_NAL_PPS
@ H264_NAL_PPS
Definition: h264.h:42
MXFStreamContext::avc_intra
int avc_intra
Definition: mxfenc.c:124
av_clip_uint16
#define av_clip_uint16
Definition: common.h:112
avio_wb64
void avio_wb64(AVIOContext *s, uint64_t val)
Definition: aviobuf.c:431
INDEX_D10_VIDEO
@ INDEX_D10_VIDEO
Definition: mxfenc.c:147
mxf_generic_sound_descriptor_key
static const UID mxf_generic_sound_descriptor_key
Definition: mxfenc.c:1188
mxf_parse_timestamp
static uint64_t mxf_parse_timestamp(int64_t timestamp64)
Definition: mxfenc.c:2813
mxf_write_generic_sound_common
static int64_t mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, const UID key)
Definition: mxfenc.c:1665
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
index_table_segment_key
static const uint8_t index_table_segment_key[]
Definition: mxfenc.c:285
mem.h
header_closed_partition_key
static const uint8_t header_closed_partition_key[]
Definition: mxfenc.c:287
mxf_write_generic_sound_desc
static int mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1743
mxf_write_preface
static void mxf_write_preface(AVFormatContext *s)
Definition: mxfenc.c:726
packet_internal.h
bytestream2_get_bufferu
static av_always_inline unsigned int bytestream2_get_bufferu(GetByteContext *g, uint8_t *dst, unsigned int size)
Definition: bytestream.h:277
INDEX_PRORES
@ INDEX_PRORES
Definition: mxfenc.c:154
mastering_display_metadata.h
get_ue_golomb_long
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
Definition: golomb.h:104
AVCodecParameters::format
int format
Definition: codec_par.h:92
MXFCodecUL
Definition: mxf.h:105
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
avio_wb24
void avio_wb24(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:455
mxf_options
static const AVOption mxf_options[]
Definition: mxfenc.c:3605
MXFContainerEssenceEntry::container_ul
UID container_ul
Definition: mxfenc.c:130
AVDictionaryEntry
Definition: dict.h:90
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:512
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
write_metadata
static void write_metadata(AVFormatContext *s, unsigned int ts)
Definition: flvenc.c:294
mxf_prores_codec_uls
static const struct @430 mxf_prores_codec_uls[]
mxf_write_generic_desc
static int64_t mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID key)
Definition: mxfenc.c:1144
avio_put_str16le
int avio_put_str16le(AVIOContext *s, const char *str)
Convert an UTF-8 string to UTF-16LE and write it.
bytestream.h
AV_PROFILE_PRORES_XQ
#define AV_PROFILE_PRORES_XQ
Definition: defs.h:186
j2k_info_t::j2k_yt0siz
uint32_t j2k_yt0siz
j2k vertical offset from the origin of the reference grid to the left side of the first tile (YT0siz)
Definition: mxfenc.c:96
h264.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
mxf_s436m_anc_descriptor_key
static const UID mxf_s436m_anc_descriptor_key
Definition: mxfenc.c:1182
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:443
EDIT_UNITS_PER_BODY
#define EDIT_UNITS_PER_BODY
Definition: mxfenc.c:76
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
mxf_write_tape_descriptor
static void mxf_write_tape_descriptor(AVFormatContext *s)
Definition: mxfenc.c:1094
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
mxf_aes3_descriptor_key
static const UID mxf_aes3_descriptor_key
Definition: mxfenc.c:1185
mxf_write_essence_container_refs
static void mxf_write_essence_container_refs(AVFormatContext *s)
Definition: mxfenc.c:704
av_timecode_init_from_string
int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx)
Parse timecode representation (hh:mm:ss[:;.
Definition: timecode.c:232
RangeCoder
Definition: mss3.c:63
Sequence
@ Sequence
Definition: mxf.h:38
H264_NAL_SPS
@ H264_NAL_SPS
Definition: h264.h:41
AVDictionaryEntry::value
char * value
Definition: dict.h:92
IS_D10
#define IS_D10(s)
Definition: mxfenc.c:73
AVTimecode
Definition: timecode.h:41
AV_RB24
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
Definition: bytestream.h:97
AVIOContext::buf_ptr
unsigned char * buf_ptr
Current position in the buffer.
Definition: avio.h:227
ff_nal_find_startcode
const uint8_t * ff_nal_find_startcode(const uint8_t *p, const uint8_t *end)
Definition: nal.c:68
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:54
mxf_write_refs_count
static void mxf_write_refs_count(AVIOContext *pb, int ref_count)
Definition: mxfenc.c:504
MXFStreamContext::component_depth
int component_depth
Definition: mxfenc.c:109
snprintf
#define snprintf
Definition: snprintf.h:34
mxf_write_mpegvideo_desc
static int mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
Definition: mxfenc.c:1626
ff_stream_add_bitstream_filter
int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args)
Add a bitstream filter to a stream.
Definition: mux.c:1294
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
mxf_write_primer_pack
static void mxf_write_primer_pack(AVFormatContext *s)
Definition: mxfenc.c:581
MXFCodecUL::uid
UID uid
Definition: mxf.h:106
MXFContext::body_partitions_count
unsigned body_partitions_count
Definition: mxfenc.c:466
MXFStreamContext::field_dominance
int field_dominance
tff=1, bff=2
Definition: mxfenc.c:108
MXFContext::unused_tags
uint8_t unused_tags[MXF_NUM_TAGS]
local tags that we know will not be used
Definition: mxfenc.c:484
AVPixFmtDescriptor::log2_chroma_h
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:89
AV_CODEC_ID_DNXHD
@ AV_CODEC_ID_DNXHD
Definition: codec_id.h:151
j2k_info_t::j2k_cap
uint16_t j2k_cap
j2k required decoder capabilities
Definition: mxfenc.c:87
FFV1SubDescriptor
@ FFV1SubDescriptor
Definition: mxf.h:56
MXFPackage::name
char * name
Definition: mxfdec.c:274
AV_CODEC_ID_PRORES
@ AV_CODEC_ID_PRORES
Definition: codec_id.h:200
mxf_write_metadata_key
static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value)
Definition: mxfenc.c:684
mxf_parse_jpeg2000_frame
static int mxf_parse_jpeg2000_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
Definition: mxfenc.c:2659
AVIO_DATA_MARKER_FLUSH_POINT
@ AVIO_DATA_MARKER_FLUSH_POINT
A point in the output bytestream where the underlying AVIOContext might flush the buffer depending on...
Definition: avio.h:145
mux.h