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