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