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