00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 #include <math.h>
00036 #include <time.h>
00037 
00038 #include "libavutil/random_seed.h"
00039 #include "libavcodec/bytestream.h"
00040 #include "audiointerleave.h"
00041 #include "avformat.h"
00042 #include "mxf.h"
00043 
00044 static const int NTSC_samples_per_frame[] = { 1602, 1601, 1602, 1601, 1602, 0 };
00045 static const int PAL_samples_per_frame[]  = { 1920, 0 };
00046 
00047 extern AVOutputFormat ff_mxf_d10_muxer;
00048 
00049 #define EDIT_UNITS_PER_BODY 250
00050 #define KAG_SIZE 512
00051 
00052 typedef struct {
00053     int local_tag;
00054     UID uid;
00055 } MXFLocalTagPair;
00056 
00057 typedef struct {
00058     uint8_t flags;
00059     uint64_t offset;
00060     unsigned slice_offset; 
00061     uint16_t temporal_ref;
00062 } MXFIndexEntry;
00063 
00064 typedef struct {
00065     AudioInterleaveContext aic;
00066     UID track_essence_element_key;
00067     int index;               
00068     const UID *codec_ul;
00069     int order;               
00070     int interlaced;          
00071     int temporal_reordering;
00072     AVRational aspect_ratio; 
00073     int closed_gop;          
00074 } MXFStreamContext;
00075 
00076 typedef struct {
00077     UID container_ul;
00078     UID element_ul;
00079     UID codec_ul;
00080     void (*write_desc)(AVFormatContext *, AVStream *);
00081 } MXFContainerEssenceEntry;
00082 
00083 static const struct {
00084     enum CodecID id;
00085     int index;
00086 } mxf_essence_mappings[] = {
00087     { CODEC_ID_MPEG2VIDEO, 0 },
00088     { CODEC_ID_PCM_S24LE,  1 },
00089     { CODEC_ID_PCM_S16LE,  1 },
00090     { CODEC_ID_NONE }
00091 };
00092 
00093 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st);
00094 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st);
00095 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st);
00096 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st);
00097 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st);
00098 
00099 static const MXFContainerEssenceEntry mxf_essence_container_uls[] = {
00100     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 },
00101       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
00102       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
00103       mxf_write_mpegvideo_desc },
00104     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 },
00105       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x03,0x00 },
00106       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00107       mxf_write_aes3_desc },
00108     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 },
00109       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x01,0x00 },
00110       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00111       mxf_write_wav_desc },
00112     
00113     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
00114       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
00115       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 },
00116       mxf_write_cdci_desc },
00117     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
00118       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
00119       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00120       mxf_write_generic_sound_desc },
00121     
00122     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
00123       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
00124       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 },
00125       mxf_write_cdci_desc },
00126     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
00127       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
00128       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00129       mxf_write_generic_sound_desc },
00130     
00131     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
00132       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
00133       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 },
00134       mxf_write_cdci_desc },
00135     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
00136       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
00137       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00138       mxf_write_generic_sound_desc },
00139     
00140     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
00141       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
00142       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 },
00143       mxf_write_cdci_desc },
00144     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
00145       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
00146       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00147       mxf_write_generic_sound_desc },
00148     
00149     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
00150       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
00151       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 },
00152       mxf_write_cdci_desc },
00153     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
00154       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
00155       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00156       mxf_write_generic_sound_desc },
00157     
00158     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
00159       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
00160       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 },
00161       mxf_write_cdci_desc },
00162     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
00163       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
00164       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
00165       mxf_write_generic_sound_desc },
00166     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
00167       { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
00168       { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
00169       NULL },
00170 };
00171 
00172 typedef struct MXFContext {
00173     int64_t footer_partition_offset;
00174     int essence_container_count;
00175     AVRational time_base;
00176     int header_written;
00177     MXFIndexEntry *index_entries;
00178     unsigned edit_units_count;
00179     uint64_t timestamp;   
00180     uint8_t slice_count;  
00181     int last_indexed_edit_unit;
00182     uint64_t *body_partition_offset;
00183     unsigned body_partitions_count;
00184     int last_key_index;  
00185     uint64_t duration;
00186     AVStream *timecode_track;
00187     int timecode_base;       
00188     int timecode_start;      
00189     int timecode_drop_frame; 
00190     int edit_unit_byte_count; 
00191     uint64_t body_offset;
00192     uint32_t instance_number;
00193     uint8_t umid[16];        
00194 } MXFContext;
00195 
00196 static const uint8_t uuid_base[]            = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd };
00197 static const uint8_t umid_ul[]              = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13 };
00198 
00202 static const uint8_t op1a_ul[]                     = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x01,0x09,0x00 };
00203 static const uint8_t footer_partition_key[]        = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }; 
00204 static const uint8_t primer_pack_key[]             = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x05,0x01,0x00 };
00205 static const uint8_t index_table_segment_key[]     = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 };
00206 static const uint8_t random_index_pack_key[]       = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x11,0x01,0x00 };
00207 static const uint8_t header_open_partition_key[]   = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x02,0x01,0x00 }; 
00208 static const uint8_t header_closed_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x02,0x04,0x00 }; 
00209 static const uint8_t klv_fill_key[]                = { 0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x03,0x01,0x02,0x10,0x01,0x00,0x00,0x00 };
00210 static const uint8_t body_partition_key[]          = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }; 
00211 
00215 static const uint8_t header_metadata_key[]  = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01 };
00216 static const uint8_t multiple_desc_ul[]     = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x0D,0x01,0x03,0x01,0x02,0x7F,0x01,0x00 };
00217 
00221 static const MXFLocalTagPair mxf_local_tag_batch[] = {
00222     
00223     { 0x3C0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x02,0x00,0x00,0x00,0x00}}, 
00224     { 0x3B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x04,0x00,0x00}}, 
00225     { 0x3B05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x01,0x05,0x00,0x00,0x00}}, 
00226     { 0x3B06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x04,0x00,0x00}}, 
00227     { 0x3B03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x01,0x00,0x00}}, 
00228     { 0x3B09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x03,0x00,0x00,0x00,0x00}}, 
00229     { 0x3B0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x01,0x00,0x00}}, 
00230     { 0x3B0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x02,0x00,0x00}}, 
00231     
00232     { 0x3C09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x01,0x00,0x00,0x00}}, 
00233     { 0x3C01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x02,0x01,0x00,0x00}}, 
00234     { 0x3C02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x03,0x01,0x00,0x00}}, 
00235     { 0x3C04, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x05,0x01,0x00,0x00}}, 
00236     { 0x3C05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x07,0x00,0x00,0x00}}, 
00237     { 0x3C06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x03,0x00,0x00}}, 
00238     
00239     { 0x1901, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x01,0x00,0x00}}, 
00240     { 0x1902, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x02,0x00,0x00}}, 
00241     
00242     { 0x2701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x06,0x01,0x00,0x00,0x00}}, 
00243     { 0x3F07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x04,0x00,0x00,0x00,0x00}}, 
00244     
00245     { 0x4401, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x10,0x00,0x00,0x00,0x00}}, 
00246     { 0x4405, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x01,0x03,0x00,0x00}}, 
00247     { 0x4404, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x05,0x00,0x00}}, 
00248     { 0x4403, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x05,0x00,0x00}}, 
00249     { 0x4701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x03,0x00,0x00}}, 
00250     
00251     { 0x4801, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00}}, 
00252     { 0x4804, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x04,0x01,0x03,0x00,0x00,0x00,0x00}}, 
00253     { 0x4B01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x30,0x04,0x05,0x00,0x00,0x00,0x00}}, 
00254     { 0x4B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x03,0x00,0x00}}, 
00255     { 0x4803, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x04,0x00,0x00}}, 
00256     
00257     { 0x0201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x07,0x01,0x00,0x00,0x00,0x00,0x00}}, 
00258     { 0x0202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x02,0x01,0x01,0x03,0x00,0x00}}, 
00259     { 0x1001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x09,0x00,0x00}}, 
00260     
00261     { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x04,0x00,0x00}}, 
00262     { 0x1101, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x01,0x00,0x00,0x00}}, 
00263     { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, 
00264     
00265     { 0x1501, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x05,0x00,0x00}}, 
00266     { 0x1502, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x04,0x01,0x01,0x02,0x06,0x00,0x00}}, 
00267     { 0x1503, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x04,0x01,0x01,0x05,0x00,0x00,0x00}}, 
00268     
00269     { 0x3F01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x04,0x06,0x0B,0x00,0x00}}, 
00270     { 0x3006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x06,0x01,0x01,0x03,0x05,0x00,0x00,0x00}}, 
00271     { 0x3001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x00,0x00,0x00,0x00}}, 
00272     { 0x3004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x01,0x02,0x00,0x00}}, 
00273     
00274     { 0x320C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x01,0x04,0x00,0x00,0x00}}, 
00275     { 0x320D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x03,0x02,0x05,0x00,0x00,0x00}}, 
00276     { 0x3203, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x02,0x00,0x00,0x00}}, 
00277     { 0x3202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x01,0x00,0x00,0x00}}, 
00278     { 0x3209, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0C,0x00,0x00,0x00}}, 
00279     { 0x3208, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0B,0x00,0x00,0x00}}, 
00280     { 0x320E, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x00,0x00,0x00}}, 
00281     { 0x3201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, 
00282     
00283     { 0x3301, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x05,0x03,0x0A,0x00,0x00,0x00}}, 
00284     { 0x3302, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x05,0x00,0x00,0x00}}, 
00285     
00286     { 0x3D02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x01,0x04,0x00,0x00,0x00}}, 
00287     { 0x3D03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x01,0x01,0x00,0x00}}, 
00288     { 0x3D07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x01,0x01,0x04,0x00,0x00,0x00}}, 
00289     { 0x3D01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x03,0x04,0x00,0x00,0x00}}, 
00290     { 0x3D06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x02,0x04,0x02,0x00,0x00,0x00,0x00}}, 
00291     
00292     { 0x3F0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x05,0x30,0x04,0x06,0x00,0x00,0x00,0x00}}, 
00293     { 0x3F0C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x0A,0x00,0x00}}, 
00294     { 0x3F0D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x02,0x01,0x01,0x02,0x00,0x00}}, 
00295     { 0x3F05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x06,0x02,0x01,0x00,0x00,0x00,0x00}}, 
00296     { 0x3F06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x05,0x00,0x00,0x00,0x00}}, 
00297     { 0x3F08, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x04,0x04,0x01,0x01,0x00,0x00,0x00}}, 
00298     { 0x3F09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x01,0x06,0x00,0x00,0x00}}, 
00299     { 0x3F0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x02,0x05,0x00,0x00,0x00}}, 
00300     
00301     { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, 
00302     { 0x8007, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0A,0x00,0x00}}, 
00303     
00304     { 0x3D09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x03,0x05,0x00,0x00,0x00}}, 
00305     { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, 
00306 };
00307 
00308 static void mxf_write_uuid(AVIOContext *pb, enum MXFMetadataSetType type, int value)
00309 {
00310     avio_write(pb, uuid_base, 12);
00311     avio_wb16(pb, type);
00312     avio_wb16(pb, value);
00313 }
00314 
00315 static void mxf_write_umid(AVFormatContext *s, int type)
00316 {
00317     MXFContext *mxf = s->priv_data;
00318     avio_write(s->pb, umid_ul, 13);
00319     avio_wb24(s->pb, mxf->instance_number);
00320     avio_write(s->pb, mxf->umid, 15);
00321     avio_w8(s->pb, type);
00322 }
00323 
00324 static void mxf_write_refs_count(AVIOContext *pb, int ref_count)
00325 {
00326     avio_wb32(pb, ref_count);
00327     avio_wb32(pb, 16);
00328 }
00329 
00330 static int klv_ber_length(uint64_t len)
00331 {
00332     if (len < 128)
00333         return 1;
00334     else
00335         return (av_log2(len) >> 3) + 2;
00336 }
00337 
00338 static int klv_encode_ber_length(AVIOContext *pb, uint64_t len)
00339 {
00340     
00341     int size;
00342     if (len < 128) {
00343         
00344         avio_w8(pb, len);
00345         return 1;
00346     }
00347 
00348     size = (av_log2(len) >> 3) + 1;
00349 
00350     
00351     avio_w8(pb, 0x80 + size);
00352     while(size) {
00353         size--;
00354         avio_w8(pb, len >> 8 * size & 0xff);
00355     }
00356     return 0;
00357 }
00358 
00359 static void klv_encode_ber4_length(AVIOContext *pb, int len)
00360 {
00361     avio_w8(pb, 0x80 + 3);
00362     avio_wb24(pb, len);
00363 }
00364 
00365 
00366 
00367 
00368 static int mxf_get_essence_container_ul_index(enum CodecID id)
00369 {
00370     int i;
00371     for (i = 0; mxf_essence_mappings[i].id; i++)
00372         if (mxf_essence_mappings[i].id == id)
00373             return mxf_essence_mappings[i].index;
00374     return -1;
00375 }
00376 
00377 static void mxf_write_primer_pack(AVFormatContext *s)
00378 {
00379     AVIOContext *pb = s->pb;
00380     int local_tag_number, i = 0;
00381 
00382     local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch);
00383 
00384     avio_write(pb, primer_pack_key, 16);
00385     klv_encode_ber_length(pb, local_tag_number * 18 + 8);
00386 
00387     avio_wb32(pb, local_tag_number); 
00388     avio_wb32(pb, 18); 
00389 
00390     for (i = 0; i < local_tag_number; i++) {
00391         avio_wb16(pb, mxf_local_tag_batch[i].local_tag);
00392         avio_write(pb, mxf_local_tag_batch[i].uid, 16);
00393     }
00394 }
00395 
00396 static void mxf_write_local_tag(AVIOContext *pb, int size, int tag)
00397 {
00398     avio_wb16(pb, tag);
00399     avio_wb16(pb, size);
00400 }
00401 
00402 static void mxf_write_metadata_key(AVIOContext *pb, unsigned int value)
00403 {
00404     avio_write(pb, header_metadata_key, 13);
00405     avio_wb24(pb, value);
00406 }
00407 
00408 static void mxf_free(AVFormatContext *s)
00409 {
00410     int i;
00411 
00412     for (i = 0; i < s->nb_streams; i++) {
00413         AVStream *st = s->streams[i];
00414         av_freep(&st->priv_data);
00415     }
00416 }
00417 
00418 static const MXFCodecUL *mxf_get_data_definition_ul(int type)
00419 {
00420     const MXFCodecUL *uls = ff_mxf_data_definition_uls;
00421     while (uls->uid[0]) {
00422         if (type == uls->id)
00423             break;
00424         uls++;
00425     }
00426     return uls;
00427 }
00428 
00429 static void mxf_write_essence_container_refs(AVFormatContext *s)
00430 {
00431     MXFContext *c = s->priv_data;
00432     AVIOContext *pb = s->pb;
00433     int i;
00434 
00435     mxf_write_refs_count(pb, c->essence_container_count);
00436     av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count);
00437     for (i = 0; i < c->essence_container_count; i++) {
00438         MXFStreamContext *sc = s->streams[i]->priv_data;
00439         avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
00440     }
00441 }
00442 
00443 static void mxf_write_preface(AVFormatContext *s)
00444 {
00445     MXFContext *mxf = s->priv_data;
00446     AVIOContext *pb = s->pb;
00447 
00448     mxf_write_metadata_key(pb, 0x012f00);
00449     PRINT_KEY(s, "preface key", pb->buf_ptr - 16);
00450     klv_encode_ber_length(pb, 130 + 16 * mxf->essence_container_count);
00451 
00452     
00453     mxf_write_local_tag(pb, 16, 0x3C0A);
00454     mxf_write_uuid(pb, Preface, 0);
00455     PRINT_KEY(s, "preface uid", pb->buf_ptr - 16);
00456 
00457     
00458     mxf_write_local_tag(pb, 8, 0x3B02);
00459     avio_wb64(pb, mxf->timestamp);
00460 
00461     
00462     mxf_write_local_tag(pb, 2, 0x3B05);
00463     avio_wb16(pb, 258); 
00464 
00465     
00466     mxf_write_local_tag(pb, 16 + 8, 0x3B06);
00467     mxf_write_refs_count(pb, 1);
00468     mxf_write_uuid(pb, Identification, 0);
00469 
00470     
00471     mxf_write_local_tag(pb, 16, 0x3B03);
00472     mxf_write_uuid(pb, ContentStorage, 0);
00473 
00474     
00475     mxf_write_local_tag(pb, 16, 0x3B09);
00476     avio_write(pb, op1a_ul, 16);
00477 
00478     
00479     mxf_write_local_tag(pb, 8 + 16 * mxf->essence_container_count, 0x3B0A);
00480     mxf_write_essence_container_refs(s);
00481 
00482     
00483     mxf_write_local_tag(pb, 8, 0x3B0B);
00484     avio_wb64(pb, 0);
00485 }
00486 
00487 
00488 
00489 
00490 static void mxf_write_local_tag_utf16(AVIOContext *pb, int tag, const char *value)
00491 {
00492     int i, size = strlen(value);
00493     mxf_write_local_tag(pb, size*2, tag);
00494     for (i = 0; i < size; i++)
00495         avio_wb16(pb, value[i]);
00496 }
00497 
00498 static void mxf_write_identification(AVFormatContext *s)
00499 {
00500     MXFContext *mxf = s->priv_data;
00501     AVIOContext *pb = s->pb;
00502     const char *company = "FFmpeg";
00503     const char *product = "OP1a Muxer";
00504     const char *version;
00505     int length;
00506 
00507     mxf_write_metadata_key(pb, 0x013000);
00508     PRINT_KEY(s, "identification key", pb->buf_ptr - 16);
00509 
00510     version = s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT ?
00511         "0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION);
00512     length = 84 + (strlen(company)+strlen(product)+strlen(version))*2; 
00513     klv_encode_ber_length(pb, length);
00514 
00515     
00516     mxf_write_local_tag(pb, 16, 0x3C0A);
00517     mxf_write_uuid(pb, Identification, 0);
00518     PRINT_KEY(s, "identification uid", pb->buf_ptr - 16);
00519 
00520     
00521     mxf_write_local_tag(pb, 16, 0x3C09);
00522     mxf_write_uuid(pb, Identification, 1);
00523 
00524     mxf_write_local_tag_utf16(pb, 0x3C01, company); 
00525     mxf_write_local_tag_utf16(pb, 0x3C02, product); 
00526     mxf_write_local_tag_utf16(pb, 0x3C04, version); 
00527 
00528     
00529     mxf_write_local_tag(pb, 16, 0x3C05);
00530     mxf_write_uuid(pb, Identification, 2);
00531 
00532     
00533     mxf_write_local_tag(pb, 8, 0x3C06);
00534     avio_wb64(pb, mxf->timestamp);
00535 }
00536 
00537 static void mxf_write_content_storage(AVFormatContext *s)
00538 {
00539     AVIOContext *pb = s->pb;
00540 
00541     mxf_write_metadata_key(pb, 0x011800);
00542     PRINT_KEY(s, "content storage key", pb->buf_ptr - 16);
00543     klv_encode_ber_length(pb, 92);
00544 
00545     
00546     mxf_write_local_tag(pb, 16, 0x3C0A);
00547     mxf_write_uuid(pb, ContentStorage, 0);
00548     PRINT_KEY(s, "content storage uid", pb->buf_ptr - 16);
00549 
00550     
00551     mxf_write_local_tag(pb, 16 * 2 + 8, 0x1901);
00552     mxf_write_refs_count(pb, 2);
00553     mxf_write_uuid(pb, MaterialPackage, 0);
00554     mxf_write_uuid(pb, SourcePackage, 0);
00555 
00556     
00557     mxf_write_local_tag(pb, 8 + 16, 0x1902);
00558     mxf_write_refs_count(pb, 1);
00559     mxf_write_uuid(pb, EssenceContainerData, 0);
00560 }
00561 
00562 static void mxf_write_track(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
00563 {
00564     MXFContext *mxf = s->priv_data;
00565     AVIOContext *pb = s->pb;
00566     MXFStreamContext *sc = st->priv_data;
00567 
00568     mxf_write_metadata_key(pb, 0x013b00);
00569     PRINT_KEY(s, "track key", pb->buf_ptr - 16);
00570     klv_encode_ber_length(pb, 80);
00571 
00572     
00573     mxf_write_local_tag(pb, 16, 0x3C0A);
00574     mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, st->index);
00575     PRINT_KEY(s, "track uid", pb->buf_ptr - 16);
00576 
00577     
00578     mxf_write_local_tag(pb, 4, 0x4801);
00579     avio_wb32(pb, st->index+2);
00580 
00581     
00582     mxf_write_local_tag(pb, 4, 0x4804);
00583     if (type == MaterialPackage)
00584         avio_wb32(pb, 0); 
00585     else
00586         avio_write(pb, sc->track_essence_element_key + 12, 4);
00587 
00588     mxf_write_local_tag(pb, 8, 0x4B01);
00589     avio_wb32(pb, mxf->time_base.den);
00590     avio_wb32(pb, mxf->time_base.num);
00591 
00592     
00593     mxf_write_local_tag(pb, 8, 0x4B02);
00594     avio_wb64(pb, 0);
00595 
00596     
00597     mxf_write_local_tag(pb, 16, 0x4803);
00598     mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
00599 }
00600 
00601 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 };
00602 
00603 static void mxf_write_common_fields(AVFormatContext *s, AVStream *st)
00604 {
00605     MXFContext *mxf = s->priv_data;
00606     AVIOContext *pb = s->pb;
00607 
00608     
00609     mxf_write_local_tag(pb, 16, 0x0201);
00610     if (st == mxf->timecode_track)
00611         avio_write(pb, smpte_12m_timecode_track_data_ul, 16);
00612     else {
00613         const MXFCodecUL *data_def_ul = mxf_get_data_definition_ul(st->codec->codec_type);
00614         avio_write(pb, data_def_ul->uid, 16);
00615     }
00616 
00617     
00618     mxf_write_local_tag(pb, 8, 0x0202);
00619     avio_wb64(pb, mxf->duration);
00620 }
00621 
00622 static void mxf_write_sequence(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
00623 {
00624     MXFContext *mxf = s->priv_data;
00625     AVIOContext *pb = s->pb;
00626     enum MXFMetadataSetType component;
00627 
00628     mxf_write_metadata_key(pb, 0x010f00);
00629     PRINT_KEY(s, "sequence key", pb->buf_ptr - 16);
00630     klv_encode_ber_length(pb, 80);
00631 
00632     mxf_write_local_tag(pb, 16, 0x3C0A);
00633     mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
00634 
00635     PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
00636     mxf_write_common_fields(s, st);
00637 
00638     
00639     mxf_write_local_tag(pb, 16 + 8, 0x1001);
00640     mxf_write_refs_count(pb, 1);
00641     if (st == mxf->timecode_track)
00642         component = TimecodeComponent;
00643     else
00644         component = SourceClip;
00645     if (type == SourcePackage)
00646         component += TypeBottom;
00647     mxf_write_uuid(pb, component, st->index);
00648 }
00649 
00650 static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
00651 {
00652     MXFContext *mxf = s->priv_data;
00653     AVIOContext *pb = s->pb;
00654 
00655     mxf_write_metadata_key(pb, 0x011400);
00656     klv_encode_ber_length(pb, 75);
00657 
00658     
00659     mxf_write_local_tag(pb, 16, 0x3C0A);
00660     mxf_write_uuid(pb, type == MaterialPackage ? TimecodeComponent :
00661                    TimecodeComponent + TypeBottom, st->index);
00662 
00663     mxf_write_common_fields(s, st);
00664 
00665     
00666     mxf_write_local_tag(pb, 8, 0x1501);
00667     avio_wb64(pb, mxf->timecode_start);
00668 
00669     
00670     mxf_write_local_tag(pb, 2, 0x1502);
00671     avio_wb16(pb, mxf->timecode_base);
00672 
00673     
00674     mxf_write_local_tag(pb, 1, 0x1503);
00675     avio_w8(pb, mxf->timecode_drop_frame);
00676 }
00677 
00678 static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
00679 {
00680     AVIOContext *pb = s->pb;
00681     int i;
00682 
00683     mxf_write_metadata_key(pb, 0x011100);
00684     PRINT_KEY(s, "sturctural component key", pb->buf_ptr - 16);
00685     klv_encode_ber_length(pb, 108);
00686 
00687     
00688     mxf_write_local_tag(pb, 16, 0x3C0A);
00689     mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, st->index);
00690 
00691     PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
00692     mxf_write_common_fields(s, st);
00693 
00694     
00695     mxf_write_local_tag(pb, 8, 0x1201);
00696     avio_wb64(pb, 0);
00697 
00698     
00699     mxf_write_local_tag(pb, 32, 0x1101);
00700     if (type == SourcePackage) {
00701         for (i = 0; i < 4; i++)
00702             avio_wb64(pb, 0);
00703     } else
00704         mxf_write_umid(s, 1);
00705 
00706     
00707     mxf_write_local_tag(pb, 4, 0x1102);
00708     if (type == SourcePackage)
00709         avio_wb32(pb, 0);
00710     else
00711         avio_wb32(pb, st->index+2);
00712 }
00713 
00714 static void mxf_write_multi_descriptor(AVFormatContext *s)
00715 {
00716     MXFContext *mxf = s->priv_data;
00717     AVIOContext *pb = s->pb;
00718     const uint8_t *ul;
00719     int i;
00720 
00721     mxf_write_metadata_key(pb, 0x014400);
00722     PRINT_KEY(s, "multiple descriptor key", pb->buf_ptr - 16);
00723     klv_encode_ber_length(pb, 64 + 16 * s->nb_streams);
00724 
00725     mxf_write_local_tag(pb, 16, 0x3C0A);
00726     mxf_write_uuid(pb, MultipleDescriptor, 0);
00727     PRINT_KEY(s, "multi_desc uid", pb->buf_ptr - 16);
00728 
00729     
00730     mxf_write_local_tag(pb, 8, 0x3001);
00731     avio_wb32(pb, mxf->time_base.den);
00732     avio_wb32(pb, mxf->time_base.num);
00733 
00734     
00735     mxf_write_local_tag(pb, 16, 0x3004);
00736     if (mxf->essence_container_count > 1)
00737         ul = multiple_desc_ul;
00738     else {
00739         MXFStreamContext *sc = s->streams[0]->priv_data;
00740         ul = mxf_essence_container_uls[sc->index].container_ul;
00741     }
00742     avio_write(pb, ul, 16);
00743 
00744     
00745     mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x3F01);
00746     mxf_write_refs_count(pb, s->nb_streams);
00747     for (i = 0; i < s->nb_streams; i++)
00748         mxf_write_uuid(pb, SubDescriptor, i);
00749 }
00750 
00751 static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
00752 {
00753     MXFContext *mxf = s->priv_data;
00754     MXFStreamContext *sc = st->priv_data;
00755     AVIOContext *pb = s->pb;
00756 
00757     avio_write(pb, key, 16);
00758     klv_encode_ber4_length(pb, size+20+8+12+20);
00759 
00760     mxf_write_local_tag(pb, 16, 0x3C0A);
00761     mxf_write_uuid(pb, SubDescriptor, st->index);
00762 
00763     mxf_write_local_tag(pb, 4, 0x3006);
00764     avio_wb32(pb, st->index+2);
00765 
00766     mxf_write_local_tag(pb, 8, 0x3001);
00767     avio_wb32(pb, mxf->time_base.den);
00768     avio_wb32(pb, mxf->time_base.num);
00769 
00770     mxf_write_local_tag(pb, 16, 0x3004);
00771     avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
00772 }
00773 
00774 static const UID mxf_mpegvideo_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 };
00775 static const UID mxf_wav_descriptor_key       = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 };
00776 static const UID mxf_aes3_descriptor_key      = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 };
00777 static const UID mxf_cdci_descriptor_key      = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x28,0x00 };
00778 static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x42,0x00 };
00779 
00780 static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
00781 {
00782     MXFStreamContext *sc = st->priv_data;
00783     AVIOContext *pb = s->pb;
00784     int stored_height = (st->codec->height+15)/16*16;
00785     int display_height;
00786     int f1, f2;
00787 
00788     mxf_write_generic_desc(s, st, key, size+8+8+8+8+8+8+5+16+sc->interlaced*4+12+20);
00789 
00790     mxf_write_local_tag(pb, 4, 0x3203);
00791     avio_wb32(pb, st->codec->width);
00792 
00793     mxf_write_local_tag(pb, 4, 0x3202);
00794     avio_wb32(pb, stored_height>>sc->interlaced);
00795 
00796     mxf_write_local_tag(pb, 4, 0x3209);
00797     avio_wb32(pb, st->codec->width);
00798 
00799     if (st->codec->height == 608) 
00800         display_height = 576;
00801     else if (st->codec->height == 512)  
00802         display_height = 486;
00803     else
00804         display_height = st->codec->height;
00805 
00806     mxf_write_local_tag(pb, 4, 0x3208);
00807     avio_wb32(pb, display_height>>sc->interlaced);
00808 
00809     
00810     mxf_write_local_tag(pb, 4, 0x3301);
00811     avio_wb32(pb, 8);
00812 
00813     
00814     mxf_write_local_tag(pb, 4, 0x3302);
00815     avio_wb32(pb, 2);
00816 
00817     
00818     mxf_write_local_tag(pb, 1, 0x320C);
00819     avio_w8(pb, sc->interlaced);
00820 
00821     
00822     switch (st->codec->height) {
00823     case  576: f1 = 23; f2 = 336; break;
00824     case  608: f1 =  7; f2 = 320; break;
00825     case  480: f1 = 20; f2 = 283; break;
00826     case  512: f1 =  7; f2 = 270; break;
00827     case  720: f1 = 26; f2 =   0; break; 
00828     case 1080: f1 = 21; f2 = 584; break;
00829     default:   f1 =  0; f2 =   0; break;
00830     }
00831 
00832     if (!sc->interlaced) {
00833         f2  = 0;
00834         f1 *= 2;
00835     }
00836 
00837     mxf_write_local_tag(pb, 12+sc->interlaced*4, 0x320D);
00838     avio_wb32(pb, sc->interlaced ? 2 : 1);
00839     avio_wb32(pb, 4);
00840     avio_wb32(pb, f1);
00841     if (sc->interlaced)
00842         avio_wb32(pb, f2);
00843 
00844     mxf_write_local_tag(pb, 8, 0x320E);
00845     avio_wb32(pb, sc->aspect_ratio.num);
00846     avio_wb32(pb, sc->aspect_ratio.den);
00847 
00848     mxf_write_local_tag(pb, 16, 0x3201);
00849     avio_write(pb, *sc->codec_ul, 16);
00850 }
00851 
00852 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st)
00853 {
00854     mxf_write_cdci_common(s, st, mxf_cdci_descriptor_key, 0);
00855 }
00856 
00857 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st)
00858 {
00859     AVIOContext *pb = s->pb;
00860     int profile_and_level = (st->codec->profile<<4) | st->codec->level;
00861 
00862     mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 8+5);
00863 
00864     
00865     mxf_write_local_tag(pb, 4, 0x8000);
00866     avio_wb32(pb, st->codec->bit_rate);
00867 
00868     
00869     mxf_write_local_tag(pb, 1, 0x8007);
00870     if (!st->codec->profile)
00871         profile_and_level |= 0x80; 
00872     avio_w8(pb, profile_and_level);
00873 }
00874 
00875 static void mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
00876 {
00877     AVIOContext *pb = s->pb;
00878 
00879     mxf_write_generic_desc(s, st, key, size+5+12+8+8);
00880 
00881     
00882     mxf_write_local_tag(pb, 1, 0x3D02);
00883     avio_w8(pb, 1);
00884 
00885     
00886     mxf_write_local_tag(pb, 8, 0x3D03);
00887     avio_wb32(pb, st->codec->sample_rate);
00888     avio_wb32(pb, 1);
00889 
00890     mxf_write_local_tag(pb, 4, 0x3D07);
00891     avio_wb32(pb, st->codec->channels);
00892 
00893     mxf_write_local_tag(pb, 4, 0x3D01);
00894     avio_wb32(pb, av_get_bits_per_sample(st->codec->codec_id));
00895 }
00896 
00897 static void mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size)
00898 {
00899     AVIOContext *pb = s->pb;
00900 
00901     mxf_write_generic_sound_common(s, st, key, size+6+8);
00902 
00903     mxf_write_local_tag(pb, 2, 0x3D0A);
00904     avio_wb16(pb, st->codec->block_align);
00905 
00906     
00907     mxf_write_local_tag(pb, 4, 0x3D09);
00908     avio_wb32(pb, st->codec->block_align*st->codec->sample_rate);
00909 }
00910 
00911 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st)
00912 {
00913     mxf_write_wav_common(s, st, mxf_wav_descriptor_key, 0);
00914 }
00915 
00916 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st)
00917 {
00918     mxf_write_wav_common(s, st, mxf_aes3_descriptor_key, 0);
00919 }
00920 
00921 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st)
00922 {
00923     mxf_write_generic_sound_common(s, st, mxf_generic_sound_descriptor_key, 0);
00924 }
00925 
00926 static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
00927 {
00928     MXFContext *mxf = s->priv_data;
00929     AVIOContext *pb = s->pb;
00930     int i, track_count = s->nb_streams+1;
00931 
00932     if (type == MaterialPackage) {
00933         mxf_write_metadata_key(pb, 0x013600);
00934         PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
00935         klv_encode_ber_length(pb, 92 + 16*track_count);
00936     } else {
00937         mxf_write_metadata_key(pb, 0x013700);
00938         PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
00939         klv_encode_ber_length(pb, 112 + 16*track_count); 
00940     }
00941 
00942     
00943     mxf_write_local_tag(pb, 16, 0x3C0A);
00944     mxf_write_uuid(pb, type, 0);
00945     av_log(s,AV_LOG_DEBUG, "package type:%d\n", type);
00946     PRINT_KEY(s, "package uid", pb->buf_ptr - 16);
00947 
00948     
00949     mxf_write_local_tag(pb, 32, 0x4401);
00950     mxf_write_umid(s, type == SourcePackage);
00951     PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
00952 
00953     
00954     mxf_write_local_tag(pb, 8, 0x4405);
00955     avio_wb64(pb, mxf->timestamp);
00956 
00957     
00958     mxf_write_local_tag(pb, 8, 0x4404);
00959     avio_wb64(pb, mxf->timestamp);
00960 
00961     
00962     mxf_write_local_tag(pb, track_count*16 + 8, 0x4403);
00963     mxf_write_refs_count(pb, track_count);
00964     mxf_write_uuid(pb, type == MaterialPackage ? Track :
00965                    Track + TypeBottom, -1); 
00966     for (i = 0; i < s->nb_streams; i++)
00967         mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i);
00968 
00969     
00970     if (type == SourcePackage) {
00971         mxf_write_local_tag(pb, 16, 0x4701);
00972         if (s->nb_streams > 1) {
00973             mxf_write_uuid(pb, MultipleDescriptor, 0);
00974             mxf_write_multi_descriptor(s);
00975         } else
00976             mxf_write_uuid(pb, SubDescriptor, 0);
00977     }
00978 
00979     
00980     mxf_write_track(s, mxf->timecode_track, type);
00981     mxf_write_sequence(s, mxf->timecode_track, type);
00982     mxf_write_timecode_component(s, mxf->timecode_track, type);
00983 
00984     for (i = 0; i < s->nb_streams; i++) {
00985         AVStream *st = s->streams[i];
00986         mxf_write_track(s, st, type);
00987         mxf_write_sequence(s, st, type);
00988         mxf_write_structural_component(s, st, type);
00989 
00990         if (type == SourcePackage) {
00991             MXFStreamContext *sc = st->priv_data;
00992             mxf_essence_container_uls[sc->index].write_desc(s, st);
00993         }
00994     }
00995 }
00996 
00997 static int mxf_write_essence_container_data(AVFormatContext *s)
00998 {
00999     AVIOContext *pb = s->pb;
01000 
01001     mxf_write_metadata_key(pb, 0x012300);
01002     klv_encode_ber_length(pb, 72);
01003 
01004     mxf_write_local_tag(pb, 16, 0x3C0A); 
01005     mxf_write_uuid(pb, EssenceContainerData, 0);
01006 
01007     mxf_write_local_tag(pb, 32, 0x2701); 
01008     mxf_write_umid(s, 1);
01009 
01010     mxf_write_local_tag(pb, 4, 0x3F07); 
01011     avio_wb32(pb, 1);
01012 
01013     mxf_write_local_tag(pb, 4, 0x3F06); 
01014     avio_wb32(pb, 2);
01015 
01016     return 0;
01017 }
01018 
01019 static int mxf_write_header_metadata_sets(AVFormatContext *s)
01020 {
01021     mxf_write_preface(s);
01022     mxf_write_identification(s);
01023     mxf_write_content_storage(s);
01024     mxf_write_package(s, MaterialPackage);
01025     mxf_write_package(s, SourcePackage);
01026     mxf_write_essence_container_data(s);
01027     return 0;
01028 }
01029 
01030 static unsigned klv_fill_size(uint64_t size)
01031 {
01032     unsigned pad = KAG_SIZE - (size & (KAG_SIZE-1));
01033     if (pad < 20) 
01034         return pad + KAG_SIZE;
01035     else
01036         return pad & (KAG_SIZE-1);
01037 }
01038 
01039 static void mxf_write_index_table_segment(AVFormatContext *s)
01040 {
01041     MXFContext *mxf = s->priv_data;
01042     AVIOContext *pb = s->pb;
01043     int i, j, temporal_reordering = 0;
01044     int key_index = mxf->last_key_index;
01045 
01046     av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count);
01047 
01048     if (!mxf->edit_units_count && !mxf->edit_unit_byte_count)
01049         return;
01050 
01051     avio_write(pb, index_table_segment_key, 16);
01052 
01053     if (mxf->edit_unit_byte_count) {
01054         klv_encode_ber_length(pb, 80);
01055     } else {
01056         klv_encode_ber_length(pb, 85 + 12+(s->nb_streams+1)*6 +
01057                               12+mxf->edit_units_count*(11+mxf->slice_count*4));
01058     }
01059 
01060     
01061     mxf_write_local_tag(pb, 16, 0x3C0A);
01062     mxf_write_uuid(pb, IndexTableSegment, 0);
01063 
01064     
01065     mxf_write_local_tag(pb, 8, 0x3F0B);
01066     avio_wb32(pb, mxf->time_base.den);
01067     avio_wb32(pb, mxf->time_base.num);
01068 
01069     
01070     mxf_write_local_tag(pb, 8, 0x3F0C);
01071     avio_wb64(pb, mxf->last_indexed_edit_unit);
01072 
01073     
01074     mxf_write_local_tag(pb, 8, 0x3F0D);
01075     if (mxf->edit_unit_byte_count)
01076         avio_wb64(pb, 0); 
01077     else
01078         avio_wb64(pb, mxf->edit_units_count);
01079 
01080     
01081     mxf_write_local_tag(pb, 4, 0x3F05);
01082     avio_wb32(pb, mxf->edit_unit_byte_count);
01083 
01084     
01085     mxf_write_local_tag(pb, 4, 0x3F06);
01086     avio_wb32(pb, 2);
01087 
01088     
01089     mxf_write_local_tag(pb, 4, 0x3F07);
01090     avio_wb32(pb, 1);
01091 
01092     if (!mxf->edit_unit_byte_count) {
01093         
01094         mxf_write_local_tag(pb, 1, 0x3F08);
01095         avio_w8(pb, mxf->slice_count);
01096 
01097         
01098         mxf_write_local_tag(pb, 8 + (s->nb_streams+1)*6, 0x3F09);
01099         avio_wb32(pb, s->nb_streams+1); 
01100         avio_wb32(pb, 6);               
01101         
01102         avio_w8(pb, 0);
01103         avio_w8(pb, 0); 
01104         avio_wb32(pb, 0); 
01105         for (i = 0; i < s->nb_streams; i++) {
01106             AVStream *st = s->streams[i];
01107             MXFStreamContext *sc = st->priv_data;
01108             avio_w8(pb, sc->temporal_reordering);
01109             if (sc->temporal_reordering)
01110                 temporal_reordering = 1;
01111             if (i == 0) { 
01112                 avio_w8(pb, 0); 
01113                 avio_wb32(pb, KAG_SIZE); 
01114             } else { 
01115                 unsigned audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size;
01116                 audio_frame_size += klv_fill_size(audio_frame_size);
01117                 avio_w8(pb, 1);
01118                 avio_wb32(pb, (i-1)*audio_frame_size); 
01119             }
01120         }
01121 
01122         mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+mxf->slice_count*4), 0x3F0A);
01123         avio_wb32(pb, mxf->edit_units_count);  
01124         avio_wb32(pb, 11+mxf->slice_count*4);  
01125 
01126         for (i = 0; i < mxf->edit_units_count; i++) {
01127             int temporal_offset = 0;
01128 
01129             if (!(mxf->index_entries[i].flags & 0x33)) { 
01130                 mxf->last_key_index = key_index;
01131                 key_index = i;
01132             }
01133 
01134             if (temporal_reordering) {
01135                 int pic_num_in_gop = i - key_index;
01136                 if (pic_num_in_gop != mxf->index_entries[i].temporal_ref) {
01137                     for (j = key_index; j < mxf->edit_units_count; j++) {
01138                         if (pic_num_in_gop == mxf->index_entries[j].temporal_ref)
01139                             break;
01140                     }
01141                     if (j == mxf->edit_units_count)
01142                         av_log(s, AV_LOG_WARNING, "missing frames\n");
01143                     temporal_offset = j - key_index - pic_num_in_gop;
01144                 }
01145             }
01146             avio_w8(pb, temporal_offset);
01147 
01148             if ((mxf->index_entries[i].flags & 0x30) == 0x30) { 
01149                 avio_w8(pb, mxf->last_key_index - i);
01150             } else {
01151                 avio_w8(pb, key_index - i); 
01152                 if ((mxf->index_entries[i].flags & 0x20) == 0x20) 
01153                     mxf->last_key_index = key_index;
01154             }
01155 
01156             if (!(mxf->index_entries[i].flags & 0x33) && 
01157                 mxf->index_entries[i].flags & 0x40 && !temporal_offset)
01158                 mxf->index_entries[i].flags |= 0x80; 
01159             avio_w8(pb, mxf->index_entries[i].flags);
01160             
01161             avio_wb64(pb, mxf->index_entries[i].offset);
01162             if (s->nb_streams > 1)
01163                 avio_wb32(pb, mxf->index_entries[i].slice_offset);
01164         }
01165 
01166         mxf->last_key_index = key_index - mxf->edit_units_count;
01167         mxf->last_indexed_edit_unit += mxf->edit_units_count;
01168         mxf->edit_units_count = 0;
01169     }
01170 }
01171 
01172 static void mxf_write_klv_fill(AVFormatContext *s)
01173 {
01174     unsigned pad = klv_fill_size(avio_tell(s->pb));
01175     if (pad) {
01176         avio_write(s->pb, klv_fill_key, 16);
01177         pad -= 16 + 4;
01178         klv_encode_ber4_length(s->pb, pad);
01179         for (; pad; pad--)
01180             avio_w8(s->pb, 0);
01181         assert(!(avio_tell(s->pb) & (KAG_SIZE-1)));
01182     }
01183 }
01184 
01185 static void mxf_write_partition(AVFormatContext *s, int bodysid,
01186                                 int indexsid,
01187                                 const uint8_t *key, int write_metadata)
01188 {
01189     MXFContext *mxf = s->priv_data;
01190     AVIOContext *pb = s->pb;
01191     int64_t header_byte_count_offset;
01192     unsigned index_byte_count = 0;
01193     uint64_t partition_offset = avio_tell(pb);
01194 
01195     if (!mxf->edit_unit_byte_count && mxf->edit_units_count)
01196         index_byte_count = 85 + 12+(s->nb_streams+1)*6 +
01197             12+mxf->edit_units_count*(11+mxf->slice_count*4);
01198     else if (mxf->edit_unit_byte_count && indexsid)
01199         index_byte_count = 80;
01200 
01201     if (index_byte_count) {
01202         
01203         index_byte_count += 16 + klv_ber_length(index_byte_count);
01204         index_byte_count += klv_fill_size(index_byte_count);
01205     }
01206 
01207     if (!memcmp(key, body_partition_key, 16)) {
01208         mxf->body_partition_offset =
01209             av_realloc(mxf->body_partition_offset,
01210                        (mxf->body_partitions_count+1)*
01211                        sizeof(*mxf->body_partition_offset));
01212         mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset;
01213     }
01214 
01215     
01216     avio_write(pb, key, 16);
01217     klv_encode_ber_length(pb, 88 + 16 * mxf->essence_container_count);
01218 
01219     
01220     avio_wb16(pb, 1); 
01221     avio_wb16(pb, 2); 
01222     avio_wb32(pb, KAG_SIZE); 
01223 
01224     avio_wb64(pb, partition_offset); 
01225 
01226     if (!memcmp(key, body_partition_key, 16) && mxf->body_partitions_count > 1)
01227         avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); 
01228     else if (!memcmp(key, footer_partition_key, 16) && mxf->body_partitions_count)
01229         avio_wb64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); 
01230     else
01231         avio_wb64(pb, 0);
01232 
01233     avio_wb64(pb, mxf->footer_partition_offset); 
01234 
01235     
01236     header_byte_count_offset = avio_tell(pb);
01237     avio_wb64(pb, 0); 
01238 
01239     
01240     avio_wb64(pb, index_byte_count); 
01241     avio_wb32(pb, index_byte_count ? indexsid : 0); 
01242 
01243     
01244     if (bodysid && mxf->edit_units_count && mxf->body_partitions_count) {
01245         avio_wb64(pb, mxf->body_offset);
01246     } else
01247         avio_wb64(pb, 0);
01248 
01249     avio_wb32(pb, bodysid); 
01250 
01251     
01252     avio_write(pb, op1a_ul, 16);
01253 
01254     
01255     mxf_write_essence_container_refs(s);
01256 
01257     if (write_metadata) {
01258         
01259         int64_t pos, start;
01260         unsigned header_byte_count;
01261 
01262         mxf_write_klv_fill(s);
01263         start = avio_tell(s->pb);
01264         mxf_write_primer_pack(s);
01265         mxf_write_header_metadata_sets(s);
01266         pos = avio_tell(s->pb);
01267         header_byte_count = pos - start + klv_fill_size(pos);
01268 
01269         
01270         avio_seek(pb, header_byte_count_offset, SEEK_SET);
01271         avio_wb64(pb, header_byte_count);
01272         avio_seek(pb, pos, SEEK_SET);
01273     }
01274 
01275     avio_flush(pb);
01276 }
01277 
01278 static const UID mxf_mpeg2_codec_uls[] = {
01279     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x10,0x00 }, 
01280     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, 
01281     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, 
01282     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, 
01283     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x02,0x00 }, 
01284     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, 
01285     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, 
01286     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, 
01287 };
01288 
01289 static const UID *mxf_get_mpeg2_codec_ul(AVCodecContext *avctx)
01290 {
01291     int long_gop = avctx->gop_size > 1 || avctx->has_b_frames;
01292 
01293     if (avctx->profile == 4) { 
01294         if (avctx->level == 8) 
01295             return &mxf_mpeg2_codec_uls[0+long_gop];
01296         else if (avctx->level == 4) 
01297             return &mxf_mpeg2_codec_uls[4+long_gop];
01298     } else if (avctx->profile == 0) { 
01299         if (avctx->level == 5) 
01300             return &mxf_mpeg2_codec_uls[2+long_gop];
01301         else if (avctx->level == 2) 
01302             return &mxf_mpeg2_codec_uls[6+long_gop];
01303     }
01304     return NULL;
01305 }
01306 
01307 static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st,
01308                                  AVPacket *pkt, MXFIndexEntry *e)
01309 {
01310     MXFStreamContext *sc = st->priv_data;
01311     MXFContext *mxf = s->priv_data;
01312     uint32_t c = -1;
01313     int i;
01314 
01315     for(i = 0; i < pkt->size - 4; i++) {
01316         c = (c<<8) + pkt->data[i];
01317         if (c == 0x1b5) {
01318             if ((pkt->data[i+1] & 0xf0) == 0x10) { 
01319                 st->codec->profile = pkt->data[i+1] & 0x07;
01320                 st->codec->level   = pkt->data[i+2] >> 4;
01321             } else if (i + 5 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x80) { 
01322                 sc->interlaced = !(pkt->data[i+5] & 0x80); 
01323                 break;
01324             }
01325         } else if (c == 0x1b8) { 
01326             if (pkt->data[i+4]>>6 & 0x01) { 
01327                 sc->closed_gop = 1;
01328                 if (e->flags & 0x40) 
01329                     e->flags |= 0x80; 
01330             }
01331             if (!mxf->header_written) {
01332                 unsigned hours   =  (pkt->data[i+1]>>2) & 0x1f;
01333                 unsigned minutes = ((pkt->data[i+1] & 0x03) << 4) | (pkt->data[i+2]>>4);
01334                 unsigned seconds = ((pkt->data[i+2] & 0x07) << 3) | (pkt->data[i+3]>>5);
01335                 unsigned frames  = ((pkt->data[i+3] & 0x1f) << 1) | (pkt->data[i+4]>>7);
01336                 mxf->timecode_drop_frame = !!(pkt->data[i+1] & 0x80);
01337                 mxf->timecode_start = (hours*3600 + minutes*60 + seconds) *
01338                     mxf->timecode_base + frames;
01339                 if (mxf->timecode_drop_frame) {
01340                     unsigned tminutes = 60 * hours + minutes;
01341                     mxf->timecode_start -= 2 * (tminutes - tminutes / 10);
01342                 }
01343                 av_log(s, AV_LOG_DEBUG, "frame %d %d:%d:%d%c%d\n", mxf->timecode_start,
01344                        hours, minutes, seconds, mxf->timecode_drop_frame ? ';':':', frames);
01345             }
01346         } else if (c == 0x1b3) { 
01347             e->flags |= 0x40;
01348             switch ((pkt->data[i+4]>>4) & 0xf) {
01349             case 2:  sc->aspect_ratio = (AVRational){  4,  3}; break;
01350             case 3:  sc->aspect_ratio = (AVRational){ 16,  9}; break;
01351             case 4:  sc->aspect_ratio = (AVRational){221,100}; break;
01352             default:
01353                 av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
01354                           st->codec->width, st->codec->height, 1024*1024);
01355             }
01356         } else if (c == 0x100) { 
01357             int pict_type = (pkt->data[i+2]>>3) & 0x07;
01358             e->temporal_ref = (pkt->data[i+1]<<2) | (pkt->data[i+2]>>6);
01359             if (pict_type == 2) { 
01360                 e->flags |= 0x22;
01361                 sc->closed_gop = 0; 
01362             } else if (pict_type == 3) { 
01363                 if (sc->closed_gop)
01364                     e->flags |= 0x13; 
01365                 else
01366                     e->flags |= 0x33;
01367                 sc->temporal_reordering = -1;
01368             } else if (!pict_type) {
01369                 av_log(s, AV_LOG_ERROR, "error parsing mpeg2 frame\n");
01370                 return 0;
01371             }
01372         }
01373     }
01374     if (s->oformat != &ff_mxf_d10_muxer)
01375         sc->codec_ul = mxf_get_mpeg2_codec_ul(st->codec);
01376     return !!sc->codec_ul;
01377 }
01378 
01379 static uint64_t mxf_parse_timestamp(time_t timestamp)
01380 {
01381     struct tm *time = gmtime(×tamp);
01382     if (!time)
01383         return 0;
01384     return (uint64_t)(time->tm_year+1900) << 48 |
01385            (uint64_t)(time->tm_mon+1)     << 40 |
01386            (uint64_t) time->tm_mday       << 32 |
01387                       time->tm_hour       << 24 |
01388                       time->tm_min        << 16 |
01389                       time->tm_sec        << 8;
01390 }
01391 
01392 static void mxf_gen_umid(AVFormatContext *s)
01393 {
01394     MXFContext *mxf = s->priv_data;
01395     uint32_t seed = av_get_random_seed();
01396     uint64_t umid = seed + 0x5294713400000000LL;
01397 
01398     AV_WB64(mxf->umid  , umid);
01399     AV_WB64(mxf->umid+8, umid>>8);
01400 
01401     mxf->instance_number = seed;
01402 }
01403 
01404 static int mxf_write_header(AVFormatContext *s)
01405 {
01406     MXFContext *mxf = s->priv_data;
01407     int i;
01408     uint8_t present[FF_ARRAY_ELEMS(mxf_essence_container_uls)] = {0};
01409     const int *samples_per_frame = NULL;
01410 
01411     if (!s->nb_streams)
01412         return -1;
01413 
01414     for (i = 0; i < s->nb_streams; i++) {
01415         AVStream *st = s->streams[i];
01416         MXFStreamContext *sc = av_mallocz(sizeof(*sc));
01417         if (!sc)
01418             return AVERROR(ENOMEM);
01419         st->priv_data = sc;
01420 
01421         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
01422             if (i != 0) {
01423                 av_log(s, AV_LOG_ERROR, "video stream must be first track\n");
01424                 return -1;
01425             }
01426             if (fabs(av_q2d(st->codec->time_base) - 1/25.0) < 0.0001) {
01427                 samples_per_frame = PAL_samples_per_frame;
01428                 mxf->time_base = (AVRational){ 1, 25 };
01429                 mxf->timecode_base = 25;
01430             } else if (fabs(av_q2d(st->codec->time_base) - 1001/30000.0) < 0.0001) {
01431                 samples_per_frame = NTSC_samples_per_frame;
01432                 mxf->time_base = (AVRational){ 1001, 30000 };
01433                 mxf->timecode_base = 30;
01434             } else {
01435                 av_log(s, AV_LOG_ERROR, "unsupported video frame rate\n");
01436                 return -1;
01437             }
01438             av_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
01439             if (s->oformat == &ff_mxf_d10_muxer) {
01440                 if (st->codec->bit_rate == 50000000)
01441                     if (mxf->time_base.den == 25) sc->index = 3;
01442                     else                          sc->index = 5;
01443                 else if (st->codec->bit_rate == 40000000)
01444                     if (mxf->time_base.den == 25) sc->index = 7;
01445                     else                          sc->index = 9;
01446                 else if (st->codec->bit_rate == 30000000)
01447                     if (mxf->time_base.den == 25) sc->index = 11;
01448                     else                          sc->index = 13;
01449                 else {
01450                     av_log(s, AV_LOG_ERROR, "error MXF D-10 only support 30/40/50 mbit/s\n");
01451                     return -1;
01452                 }
01453 
01454                 mxf->edit_unit_byte_count = KAG_SIZE; 
01455                 mxf->edit_unit_byte_count += 16 + 4 + (uint64_t)st->codec->bit_rate *
01456                     mxf->time_base.num / (8*mxf->time_base.den);
01457                 mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
01458                 mxf->edit_unit_byte_count += 16 + 4 + 4 + samples_per_frame[0]*8*4;
01459                 mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count);
01460             }
01461         } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
01462             if (st->codec->sample_rate != 48000) {
01463                 av_log(s, AV_LOG_ERROR, "only 48khz is implemented\n");
01464                 return -1;
01465             }
01466             av_set_pts_info(st, 64, 1, st->codec->sample_rate);
01467             if (s->oformat == &ff_mxf_d10_muxer) {
01468                 if (st->index != 1) {
01469                     av_log(s, AV_LOG_ERROR, "MXF D-10 only support one audio track\n");
01470                     return -1;
01471                 }
01472                 if (st->codec->codec_id != CODEC_ID_PCM_S16LE &&
01473                     st->codec->codec_id != CODEC_ID_PCM_S24LE) {
01474                     av_log(s, AV_LOG_ERROR, "MXF D-10 only support 16 or 24 bits le audio\n");
01475                 }
01476                 sc->index = ((MXFStreamContext*)s->streams[0]->priv_data)->index + 1;
01477             } else
01478             mxf->slice_count = 1;
01479         }
01480 
01481         if (!sc->index) {
01482             sc->index = mxf_get_essence_container_ul_index(st->codec->codec_id);
01483             if (sc->index == -1) {
01484                 av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, "
01485                        "codec not currently supported in container\n", i);
01486                 return -1;
01487             }
01488         }
01489 
01490         sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
01491 
01492         memcpy(sc->track_essence_element_key, mxf_essence_container_uls[sc->index].element_ul, 15);
01493         sc->track_essence_element_key[15] = present[sc->index];
01494         PRINT_KEY(s, "track essence element key", sc->track_essence_element_key);
01495 
01496         if (!present[sc->index])
01497             mxf->essence_container_count++;
01498         present[sc->index]++;
01499     }
01500 
01501     if (s->oformat == &ff_mxf_d10_muxer) {
01502         mxf->essence_container_count = 1;
01503     }
01504 
01505     if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT))
01506         mxf_gen_umid(s);
01507 
01508     for (i = 0; i < s->nb_streams; i++) {
01509         MXFStreamContext *sc = s->streams[i]->priv_data;
01510         
01511         sc->track_essence_element_key[13] = present[sc->index];
01512         sc->order = AV_RB32(sc->track_essence_element_key+12);
01513     }
01514 
01515     if (s->timestamp)
01516         mxf->timestamp = mxf_parse_timestamp(s->timestamp);
01517     mxf->duration = -1;
01518 
01519     mxf->timecode_track = av_mallocz(sizeof(*mxf->timecode_track));
01520     if (!mxf->timecode_track)
01521         return AVERROR(ENOMEM);
01522     mxf->timecode_track->priv_data = av_mallocz(sizeof(MXFStreamContext));
01523     if (!mxf->timecode_track->priv_data)
01524         return AVERROR(ENOMEM);
01525     mxf->timecode_track->index = -1;
01526 
01527     if (!samples_per_frame)
01528         samples_per_frame = PAL_samples_per_frame;
01529 
01530     if (ff_audio_interleave_init(s, samples_per_frame, mxf->time_base) < 0)
01531         return -1;
01532 
01533     return 0;
01534 }
01535 
01536 static const uint8_t system_metadata_pack_key[]        = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 };
01537 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 };
01538 
01539 static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps)
01540 {
01541     return (0                                    << 31) | 
01542            (drop                                 << 30) | 
01543            ( ((frame % fps) / 10)                << 28) | 
01544            ( ((frame % fps) % 10)                << 24) | 
01545            (0                                    << 23) | 
01546            ((((frame / fps) % 60) / 10)          << 20) | 
01547            ((((frame / fps) % 60) % 10)          << 16) | 
01548            (0                                    << 15) | 
01549            ((((frame / (fps * 60)) % 60) / 10)   << 12) | 
01550            ((((frame / (fps * 60)) % 60) % 10)   <<  8) | 
01551            (0                                    <<  7) | 
01552            (0                                    <<  6) | 
01553            ((((frame / (fps * 3600) % 24)) / 10) <<  4) | 
01554            (  (frame / (fps * 3600) % 24)) % 10;          
01555 }
01556 
01557 static void mxf_write_system_item(AVFormatContext *s)
01558 {
01559     MXFContext *mxf = s->priv_data;
01560     AVIOContext *pb = s->pb;
01561     unsigned frame;
01562     uint32_t time_code;
01563 
01564     frame = mxf->timecode_start + mxf->last_indexed_edit_unit + mxf->edit_units_count;
01565 
01566     
01567     avio_write(pb, system_metadata_pack_key, 16);
01568     klv_encode_ber4_length(pb, 57);
01569     avio_w8(pb, 0x5c); 
01570     avio_w8(pb, 0x04); 
01571     avio_w8(pb, 0x00); 
01572     avio_wb16(pb, 0x00); 
01573     avio_wb16(pb, frame); 
01574     if (mxf->essence_container_count > 1)
01575         avio_write(pb, multiple_desc_ul, 16);
01576     else {
01577         MXFStreamContext *sc = s->streams[0]->priv_data;
01578         avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
01579     }
01580     avio_w8(pb, 0);
01581     avio_wb64(pb, 0);
01582     avio_wb64(pb, 0); 
01583 
01584     avio_w8(pb, 0x81); 
01585     time_code = ff_framenum_to_12m_time_code(frame, mxf->timecode_drop_frame, mxf->timecode_base);
01586     avio_wb32(pb, time_code);
01587     avio_wb32(pb, 0); 
01588     avio_wb64(pb, 0);
01589 
01590     
01591     avio_write(pb, system_metadata_package_set_key, 16);
01592     klv_encode_ber4_length(pb, 35);
01593     avio_w8(pb, 0x83); 
01594     avio_wb16(pb, 0x20);
01595     mxf_write_umid(s, 1);
01596 }
01597 
01598 static void mxf_write_d10_video_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
01599 {
01600     MXFContext *mxf = s->priv_data;
01601     AVIOContext *pb = s->pb;
01602     int packet_size = (uint64_t)st->codec->bit_rate*mxf->time_base.num /
01603         (8*mxf->time_base.den); 
01604     int pad;
01605 
01606     packet_size += 16 + 4;
01607     packet_size += klv_fill_size(packet_size);
01608 
01609     klv_encode_ber4_length(pb, pkt->size);
01610     avio_write(pb, pkt->data, pkt->size);
01611 
01612     
01613     pad = packet_size - pkt->size - 16 - 4;
01614     if (pad > 20) {
01615         avio_write(s->pb, klv_fill_key, 16);
01616         pad -= 16 + 4;
01617         klv_encode_ber4_length(s->pb, pad);
01618         for (; pad; pad--)
01619             avio_w8(s->pb, 0);
01620         assert(!(avio_tell(s->pb) & (KAG_SIZE-1)));
01621     } else {
01622         av_log(s, AV_LOG_WARNING, "cannot fill d-10 video packet\n");
01623         for (; pad > 0; pad--)
01624             avio_w8(s->pb, 0);
01625     }
01626 }
01627 
01628 static void mxf_write_d10_audio_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt)
01629 {
01630     MXFContext *mxf = s->priv_data;
01631     AVIOContext *pb = s->pb;
01632     int frame_size = pkt->size / st->codec->block_align;
01633     uint8_t *samples = pkt->data;
01634     uint8_t *end = pkt->data + pkt->size;
01635     int i;
01636 
01637     klv_encode_ber4_length(pb, 4 + frame_size*4*8);
01638 
01639     avio_w8(pb, (frame_size == 1920 ? 0 : (mxf->edit_units_count-1) % 5 + 1));
01640     avio_wl16(pb, frame_size);
01641     avio_w8(pb, (1<<st->codec->channels)-1);
01642 
01643     while (samples < end) {
01644         for (i = 0; i < st->codec->channels; i++) {
01645             uint32_t sample;
01646             if (st->codec->codec_id == CODEC_ID_PCM_S24LE) {
01647                 sample = AV_RL24(samples)<< 4;
01648                 samples += 3;
01649             } else {
01650                 sample = AV_RL16(samples)<<12;
01651                 samples += 2;
01652             }
01653             avio_wl32(pb, sample | i);
01654         }
01655         for (; i < 8; i++)
01656             avio_wl32(pb, i);
01657     }
01658 }
01659 
01660 static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
01661 {
01662     MXFContext *mxf = s->priv_data;
01663     AVIOContext *pb = s->pb;
01664     AVStream *st = s->streams[pkt->stream_index];
01665     MXFStreamContext *sc = st->priv_data;
01666     MXFIndexEntry ie = {0};
01667 
01668     if (!mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) {
01669         mxf->index_entries = av_realloc(mxf->index_entries,
01670             (mxf->edit_units_count + EDIT_UNITS_PER_BODY)*sizeof(*mxf->index_entries));
01671         if (!mxf->index_entries) {
01672             av_log(s, AV_LOG_ERROR, "could not allocate index entries\n");
01673             return -1;
01674         }
01675     }
01676 
01677     if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) {
01678         if (!mxf_parse_mpeg2_frame(s, st, pkt, &ie)) {
01679             av_log(s, AV_LOG_ERROR, "could not get mpeg2 profile and level\n");
01680             return -1;
01681         }
01682     }
01683 
01684     if (!mxf->header_written) {
01685         if (mxf->edit_unit_byte_count) {
01686             mxf_write_partition(s, 1, 2, header_open_partition_key, 1);
01687             mxf_write_klv_fill(s);
01688             mxf_write_index_table_segment(s);
01689         } else {
01690             mxf_write_partition(s, 0, 0, header_open_partition_key, 1);
01691         }
01692         mxf->header_written = 1;
01693     }
01694 
01695     if (st->index == 0) {
01696         if (!mxf->edit_unit_byte_count &&
01697             (!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) &&
01698             !(ie.flags & 0x33)) { 
01699             mxf_write_klv_fill(s);
01700             mxf_write_partition(s, 1, 2, body_partition_key, 0);
01701 
01702             mxf_write_klv_fill(s);
01703             mxf_write_index_table_segment(s);
01704         }
01705 
01706         mxf_write_klv_fill(s);
01707         mxf_write_system_item(s);
01708 
01709         if (!mxf->edit_unit_byte_count) {
01710             mxf->index_entries[mxf->edit_units_count].offset = mxf->body_offset;
01711             mxf->index_entries[mxf->edit_units_count].flags = ie.flags;
01712             mxf->index_entries[mxf->edit_units_count].temporal_ref = ie.temporal_ref;
01713             mxf->body_offset += KAG_SIZE; 
01714         }
01715         mxf->edit_units_count++;
01716     } else if (!mxf->edit_unit_byte_count && st->index == 1) {
01717         mxf->index_entries[mxf->edit_units_count-1].slice_offset =
01718             mxf->body_offset - mxf->index_entries[mxf->edit_units_count-1].offset;
01719     }
01720 
01721     mxf_write_klv_fill(s);
01722     avio_write(pb, sc->track_essence_element_key, 16); 
01723     if (s->oformat == &ff_mxf_d10_muxer) {
01724         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
01725             mxf_write_d10_video_packet(s, st, pkt);
01726         else
01727             mxf_write_d10_audio_packet(s, st, pkt);
01728     } else {
01729         klv_encode_ber4_length(pb, pkt->size); 
01730         avio_write(pb, pkt->data, pkt->size);
01731         mxf->body_offset += 16+4+pkt->size + klv_fill_size(16+4+pkt->size);
01732     }
01733 
01734     avio_flush(pb);
01735 
01736     return 0;
01737 }
01738 
01739 static void mxf_write_random_index_pack(AVFormatContext *s)
01740 {
01741     MXFContext *mxf = s->priv_data;
01742     AVIOContext *pb = s->pb;
01743     uint64_t pos = avio_tell(pb);
01744     int i;
01745 
01746     avio_write(pb, random_index_pack_key, 16);
01747     klv_encode_ber_length(pb, 28 + 12*mxf->body_partitions_count);
01748 
01749     if (mxf->edit_unit_byte_count)
01750         avio_wb32(pb, 1); 
01751     else
01752         avio_wb32(pb, 0);
01753     avio_wb64(pb, 0); 
01754 
01755     for (i = 0; i < mxf->body_partitions_count; i++) {
01756         avio_wb32(pb, 1); 
01757         avio_wb64(pb, mxf->body_partition_offset[i]);
01758     }
01759 
01760     avio_wb32(pb, 0); 
01761     avio_wb64(pb, mxf->footer_partition_offset);
01762 
01763     avio_wb32(pb, avio_tell(pb) - pos + 4);
01764 }
01765 
01766 static int mxf_write_footer(AVFormatContext *s)
01767 {
01768     MXFContext *mxf = s->priv_data;
01769     AVIOContext *pb = s->pb;
01770 
01771     mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
01772 
01773     mxf_write_klv_fill(s);
01774     mxf->footer_partition_offset = avio_tell(pb);
01775     if (mxf->edit_unit_byte_count) { 
01776         mxf_write_partition(s, 0, 0, footer_partition_key, 0);
01777     } else {
01778         mxf_write_partition(s, 0, 2, footer_partition_key, 0);
01779 
01780         mxf_write_klv_fill(s);
01781         mxf_write_index_table_segment(s);
01782     }
01783 
01784     mxf_write_klv_fill(s);
01785     mxf_write_random_index_pack(s);
01786 
01787     if (s->pb->seekable) {
01788         avio_seek(pb, 0, SEEK_SET);
01789         if (mxf->edit_unit_byte_count) {
01790             mxf_write_partition(s, 1, 2, header_closed_partition_key, 1);
01791             mxf_write_klv_fill(s);
01792             mxf_write_index_table_segment(s);
01793         } else {
01794             mxf_write_partition(s, 0, 0, header_closed_partition_key, 1);
01795         }
01796     }
01797 
01798     avio_flush(pb);
01799 
01800     ff_audio_interleave_close(s);
01801 
01802     av_freep(&mxf->index_entries);
01803     av_freep(&mxf->body_partition_offset);
01804     av_freep(&mxf->timecode_track->priv_data);
01805     av_freep(&mxf->timecode_track);
01806 
01807     mxf_free(s);
01808 
01809     return 0;
01810 }
01811 
01812 static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
01813 {
01814     int i, stream_count = 0;
01815 
01816     for (i = 0; i < s->nb_streams; i++)
01817         stream_count += !!s->streams[i]->last_in_packet_buffer;
01818 
01819     if (stream_count && (s->nb_streams == stream_count || flush)) {
01820         AVPacketList *pktl = s->packet_buffer;
01821         if (s->nb_streams != stream_count) {
01822             AVPacketList *last = NULL;
01823             
01824             while (pktl) {
01825                 if (!stream_count || pktl->pkt.stream_index == 0)
01826                     break;
01827                 last = pktl;
01828                 pktl = pktl->next;
01829                 stream_count--;
01830             }
01831             
01832             while (pktl) {
01833                 AVPacketList *next = pktl->next;
01834 
01835                 if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl)
01836                     s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL;
01837                 av_free_packet(&pktl->pkt);
01838                 av_freep(&pktl);
01839                 pktl = next;
01840             }
01841             if (last)
01842                 last->next = NULL;
01843             else {
01844                 s->packet_buffer = NULL;
01845                 s->packet_buffer_end= NULL;
01846                 goto out;
01847             }
01848             pktl = s->packet_buffer;
01849         }
01850 
01851         *out = pktl->pkt;
01852         
01853         s->packet_buffer = pktl->next;
01854         if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl)
01855             s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL;
01856         if(!s->packet_buffer)
01857             s->packet_buffer_end= NULL;
01858         av_freep(&pktl);
01859         return 1;
01860     } else {
01861     out:
01862         av_init_packet(out);
01863         return 0;
01864     }
01865 }
01866 
01867 static int mxf_compare_timestamps(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
01868 {
01869     MXFStreamContext *sc  = s->streams[pkt ->stream_index]->priv_data;
01870     MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data;
01871 
01872     return next->dts > pkt->dts ||
01873         (next->dts == pkt->dts && sc->order < sc2->order);
01874 }
01875 
01876 static int mxf_interleave(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
01877 {
01878     return ff_audio_rechunk_interleave(s, out, pkt, flush,
01879                                mxf_interleave_get_packet, mxf_compare_timestamps);
01880 }
01881 
01882 AVOutputFormat ff_mxf_muxer = {
01883     "mxf",
01884     NULL_IF_CONFIG_SMALL("Material eXchange Format"),
01885     "application/mxf",
01886     "mxf",
01887     sizeof(MXFContext),
01888     CODEC_ID_PCM_S16LE,
01889     CODEC_ID_MPEG2VIDEO,
01890     mxf_write_header,
01891     mxf_write_packet,
01892     mxf_write_footer,
01893     AVFMT_NOTIMESTAMPS,
01894     NULL,
01895     mxf_interleave,
01896 };
01897 
01898 AVOutputFormat ff_mxf_d10_muxer = {
01899     "mxf_d10",
01900     NULL_IF_CONFIG_SMALL("Material eXchange Format, D-10 Mapping"),
01901     "application/mxf",
01902     NULL,
01903     sizeof(MXFContext),
01904     CODEC_ID_PCM_S16LE,
01905     CODEC_ID_MPEG2VIDEO,
01906     mxf_write_header,
01907     mxf_write_packet,
01908     mxf_write_footer,
01909     AVFMT_NOTIMESTAMPS,
01910     NULL,
01911     mxf_interleave,
01912 };