Mercurial > libavformat.hg
annotate mxfenc.c @ 6275:287072e5227b libavformat
Add MD5 protocol
This is a write-only protocol which computes the md5sum of data written,
and on close writes this to the designated output or stdout if none
is specified. It can be used to test muxers without writing an actual
file.
author | mru |
---|---|
date | Sun, 18 Jul 2010 20:19:08 +0000 |
parents | 23e04fb7656e |
children | 43fe2984f310 |
rev | line source |
---|---|
3721 | 1 /* |
2 * MXF muxer | |
3 * Copyright (c) 2008 GUCAS, Zhentan Feng <spyfeng at gmail dot com> | |
4325 | 4 * Copyright (c) 2008 Baptiste Coudurier <baptiste dot coudurier at gmail dot com> |
3721 | 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 * References | |
25 * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value | |
26 * SMPTE 377M MXF File Format Specifications | |
27 * SMPTE 379M MXF Generic Container | |
28 * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container | |
29 * SMPTE RP210: SMPTE Metadata Dictionary | |
30 * SMPTE RP224: Registry of SMPTE Universal Labels | |
31 */ | |
32 | |
33 //#define DEBUG | |
34 | |
4363 | 35 #include <math.h> |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
36 #include <time.h> |
4363 | 37 |
4696 | 38 #include "libavutil/random_seed.h" |
4403 | 39 #include "libavcodec/bytestream.h" |
4400
65adb9e5214f
extract audio interleaving code from mxf muxer, will be used by gxf and dv
bcoudurier
parents:
4397
diff
changeset
|
40 #include "audiointerleave.h" |
4403 | 41 #include "avformat.h" |
3735 | 42 #include "mxf.h" |
43 | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
44 static const int NTSC_samples_per_frame[] = { 1602, 1601, 1602, 1601, 1602, 0 }; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
45 static const int PAL_samples_per_frame[] = { 1920, 0 }; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
46 |
4473 | 47 AVOutputFormat mxf_d10_muxer; |
48 | |
4440 | 49 #define EDIT_UNITS_PER_BODY 250 |
4393 | 50 #define KAG_SIZE 512 |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
51 |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
52 typedef struct { |
3735 | 53 int local_tag; |
54 UID uid; | |
55 } MXFLocalTagPair; | |
56 | |
3740 | 57 typedef struct { |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
58 uint8_t flags; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
59 uint64_t offset; |
4407 | 60 unsigned slice_offset; ///< offset of audio slice |
6214 | 61 uint16_t temporal_ref; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
62 } MXFIndexEntry; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
63 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
64 typedef struct { |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
65 AudioInterleaveContext aic; |
3740 | 66 UID track_essence_element_key; |
5081 | 67 int index; ///< index in mxf_essence_container_uls table |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
68 const UID *codec_ul; |
5081 | 69 int order; ///< interleaving order if dts are equal |
70 int interlaced; ///< wether picture is interlaced | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
71 int temporal_reordering; |
4505 | 72 AVRational aspect_ratio; ///< display aspect ratio |
5080 | 73 int closed_gop; ///< gop is closed, used in mpeg-2 frame parsing |
3740 | 74 } MXFStreamContext; |
75 | |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
76 typedef struct { |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
77 UID container_ul; |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
78 UID element_ul; |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
79 UID codec_ul; |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
80 void (*write_desc)(); |
3847 | 81 } MXFContainerEssenceEntry; |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
82 |
4345 | 83 static const struct { |
84 enum CodecID id; | |
85 int index; | |
86 } mxf_essence_mappings[] = { | |
87 { CODEC_ID_MPEG2VIDEO, 0 }, | |
4346 | 88 { CODEC_ID_PCM_S24LE, 1 }, |
4345 | 89 { CODEC_ID_PCM_S16LE, 1 }, |
5359 | 90 { CODEC_ID_NONE } |
4345 | 91 }; |
92 | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
93 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st); |
4320 | 94 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st); |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
95 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st); |
4473 | 96 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st); |
97 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st); | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
98 |
3847 | 99 static const MXFContainerEssenceEntry mxf_essence_container_uls[] = { |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
100 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
101 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 }, |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
102 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 }, |
4345 | 103 mxf_write_mpegvideo_desc }, |
4320 | 104 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 }, |
105 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x03,0x00 }, | |
106 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, | |
4345 | 107 mxf_write_aes3_desc }, |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
108 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
109 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x01,0x00 }, |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
110 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, |
4345 | 111 mxf_write_wav_desc }, |
4473 | 112 // D-10 625/50 PAL 50mb/s |
113 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, | |
114 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 }, | |
115 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, | |
116 mxf_write_cdci_desc }, | |
117 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, | |
118 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 }, | |
119 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, | |
120 mxf_write_generic_sound_desc }, | |
121 // D-10 525/60 NTSC 50mb/s | |
122 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 }, | |
123 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 }, | |
124 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 }, | |
125 mxf_write_cdci_desc }, | |
126 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 }, | |
127 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 }, | |
128 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, | |
129 mxf_write_generic_sound_desc }, | |
130 // D-10 625/50 PAL 40mb/s | |
131 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 }, | |
132 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 }, | |
133 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 }, | |
134 mxf_write_cdci_desc }, | |
135 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 }, | |
136 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 }, | |
137 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, | |
138 mxf_write_generic_sound_desc }, | |
139 // D-10 525/60 NTSC 40mb/s | |
140 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, | |
141 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 }, | |
142 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 }, | |
143 mxf_write_cdci_desc }, | |
144 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, | |
145 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 }, | |
146 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, | |
147 mxf_write_generic_sound_desc }, | |
148 // D-10 625/50 PAL 30mb/s | |
149 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, | |
150 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 }, | |
151 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, | |
152 mxf_write_cdci_desc }, | |
153 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, | |
154 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 }, | |
155 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, | |
156 mxf_write_generic_sound_desc }, | |
157 // D-10 525/60 NTSC 30mb/s | |
158 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 }, | |
159 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 }, | |
160 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 }, | |
161 mxf_write_cdci_desc }, | |
162 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 }, | |
163 { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 }, | |
164 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, | |
165 mxf_write_generic_sound_desc }, | |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
166 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
167 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
168 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, |
4345 | 169 NULL }, |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
170 }; |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
171 |
3740 | 172 typedef struct MXFContext { |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
173 int64_t footer_partition_offset; |
3740 | 174 int essence_container_count; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
175 AVRational time_base; |
4313 | 176 int header_written; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
177 MXFIndexEntry *index_entries; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
178 unsigned edit_units_count; |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
179 uint64_t timestamp; ///< timestamp, as year(16),month(8),day(8),hour(8),minutes(8),msec/4(8) |
4407 | 180 uint8_t slice_count; ///< index slice count minus 1 (1 if no audio, 0 otherwise) |
4440 | 181 int last_indexed_edit_unit; |
182 uint64_t *body_partition_offset; | |
183 unsigned body_partitions_count; | |
184 int last_key_index; ///< index of last key frame | |
4448 | 185 uint64_t duration; |
186 AVStream *timecode_track; | |
187 int timecode_base; ///< rounded time code base (25 or 30) | |
4449 | 188 int timecode_start; ///< frame number computed from mpeg-2 gop header timecode |
4448 | 189 int timecode_drop_frame; ///< time code use drop frame method frop mpeg-2 essence gop header |
4473 | 190 int edit_unit_byte_count; ///< fixed edit unit byte count |
4481
27fd3af46000
compute body offset and index entry offset correctly
bcoudurier
parents:
4478
diff
changeset
|
191 uint64_t body_offset; |
4696 | 192 uint32_t instance_number; |
193 uint8_t umid[16]; ///< unique material identifier | |
3740 | 194 } MXFContext; |
3743 | 195 |
3735 | 196 static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd }; |
4696 | 197 static const uint8_t umid_ul[] = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13 }; |
3735 | 198 |
199 /** | |
200 * complete key for operation pattern, partitions, and primer pack | |
201 */ | |
4536
b94bedbb59d7
always use multi track since timecode track is present
bcoudurier
parents:
4535
diff
changeset
|
202 static const uint8_t op1a_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x01,0x09,0x00 }; |
4351 | 203 static const uint8_t footer_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }; // ClosedComplete |
204 static const uint8_t primer_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }; | |
205 static const uint8_t index_table_segment_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }; | |
206 static const uint8_t random_index_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x11,0x01,0x00 }; | |
3839 | 207 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 |
208 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 | |
4393 | 209 static const uint8_t klv_fill_key[] = { 0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x03,0x01,0x02,0x10,0x01,0x00,0x00,0x00 }; |
4440 | 210 static const uint8_t body_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x03,0x04,0x00 }; // ClosedComplete |
3839 | 211 |
3743 | 212 /** |
213 * partial key for header metadata | |
214 */ | |
215 static const uint8_t header_metadata_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01 }; | |
4351 | 216 static const uint8_t multiple_desc_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x0D,0x01,0x03,0x01,0x02,0x7F,0x01,0x00 }; |
3743 | 217 |
3749 | 218 /** |
219 * SMPTE RP210 http://www.smpte-ra.org/mdd/index.html | |
220 */ | |
221 static const MXFLocalTagPair mxf_local_tag_batch[] = { | |
222 // preface set | |
223 { 0x3C0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x02,0x00,0x00,0x00,0x00}}, /* Instance UID */ | |
224 { 0x3B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x04,0x00,0x00}}, /* Last Modified Date */ | |
225 { 0x3B05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x01,0x05,0x00,0x00,0x00}}, /* Version */ | |
226 { 0x3B06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x04,0x00,0x00}}, /* Identifications reference */ | |
227 { 0x3B03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x01,0x00,0x00}}, /* Content Storage reference */ | |
228 { 0x3B09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x03,0x00,0x00,0x00,0x00}}, /* Operational Pattern UL */ | |
229 { 0x3B0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x01,0x00,0x00}}, /* Essence Containers UL batch */ | |
230 { 0x3B0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x02,0x00,0x00}}, /* DM Schemes UL batch */ | |
231 // Identification | |
232 { 0x3C09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x01,0x00,0x00,0x00}}, /* This Generation UID */ | |
233 { 0x3C01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x02,0x01,0x00,0x00}}, /* Company Name */ | |
234 { 0x3C02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x03,0x01,0x00,0x00}}, /* Product Name */ | |
3792 | 235 { 0x3C04, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x05,0x01,0x00,0x00}}, /* Version String */ |
3749 | 236 { 0x3C05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x07,0x00,0x00,0x00}}, /* Product ID */ |
237 { 0x3C06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x03,0x00,0x00}}, /* Modification Date */ | |
238 // Content Storage | |
239 { 0x1901, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x01,0x00,0x00}}, /* Package strong reference batch */ | |
4279 | 240 { 0x1902, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x02,0x00,0x00}}, /* Package strong reference batch */ |
3749 | 241 // Essence Container Data |
242 { 0x2701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x06,0x01,0x00,0x00,0x00}}, /* Linked Package UID */ | |
243 { 0x3F07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x04,0x00,0x00,0x00,0x00}}, /* BodySID */ | |
244 // Package | |
245 { 0x4401, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x10,0x00,0x00,0x00,0x00}}, /* Package UID */ | |
246 { 0x4405, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x01,0x03,0x00,0x00}}, /* Package Creation Date */ | |
247 { 0x4404, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x05,0x00,0x00}}, /* Package Modified Date */ | |
248 { 0x4403, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x05,0x00,0x00}}, /* Tracks Strong reference array */ | |
249 { 0x4701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x03,0x00,0x00}}, /* Descriptor */ | |
250 // Track | |
251 { 0x4801, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00}}, /* Track ID */ | |
3827 | 252 { 0x4804, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x04,0x01,0x03,0x00,0x00,0x00,0x00}}, /* Track Number */ |
3749 | 253 { 0x4B01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x30,0x04,0x05,0x00,0x00,0x00,0x00}}, /* Edit Rate */ |
254 { 0x4B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x03,0x00,0x00}}, /* Origin */ | |
255 { 0x4803, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x04,0x00,0x00}}, /* Sequence reference */ | |
256 // Sequence | |
257 { 0x0201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x07,0x01,0x00,0x00,0x00,0x00,0x00}}, /* Data Definition UL */ | |
258 { 0x0202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x02,0x01,0x01,0x03,0x00,0x00}}, /* Duration */ | |
259 { 0x1001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x09,0x00,0x00}}, /* Structural Components reference array */ | |
260 // Source Clip | |
4431 | 261 { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x04,0x00,0x00}}, /* Start position */ |
3749 | 262 { 0x1101, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x01,0x00,0x00,0x00}}, /* SourcePackageID */ |
263 { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, /* SourceTrackID */ | |
4448 | 264 // Timecode Component |
265 { 0x1501, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x05,0x00,0x00}}, /* Start Time Code */ | |
266 { 0x1502, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x04,0x01,0x01,0x02,0x06,0x00,0x00}}, /* Rounded Time Code Base */ | |
267 { 0x1503, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x04,0x01,0x01,0x05,0x00,0x00,0x00}}, /* Drop Frame */ | |
3794 | 268 // File Descriptor |
269 { 0x3F01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x04,0x06,0x0B,0x00,0x00}}, /* Sub Descriptors reference array */ | |
3749 | 270 { 0x3006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x06,0x01,0x01,0x03,0x05,0x00,0x00,0x00}}, /* Linked Track ID */ |
271 { 0x3001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x00,0x00,0x00,0x00}}, /* SampleRate */ | |
3794 | 272 { 0x3004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x01,0x02,0x00,0x00}}, /* Essence Container */ |
273 // Generic Picture Essence Descriptor | |
4321 | 274 { 0x320C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Frame Layout */ |
4431 | 275 { 0x320D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x03,0x02,0x05,0x00,0x00,0x00}}, /* Video Line Map */ |
3794 | 276 { 0x3203, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x02,0x00,0x00,0x00}}, /* Stored Width */ |
277 { 0x3202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x01,0x00,0x00,0x00}}, /* Stored Height */ | |
4335 | 278 { 0x3209, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0C,0x00,0x00,0x00}}, /* Display Width */ |
279 { 0x3208, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0B,0x00,0x00,0x00}}, /* Display Height */ | |
3794 | 280 { 0x320E, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x00,0x00,0x00}}, /* Aspect Ratio */ |
281 { 0x3201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, /* Picture Essence Coding */ | |
4434
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
282 // CDCI Picture Essence Descriptor |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
283 { 0x3301, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x05,0x03,0x0A,0x00,0x00,0x00}}, /* Component Depth */ |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
284 { 0x3302, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x05,0x00,0x00,0x00}}, /* Horizontal Subsampling */ |
3794 | 285 // Generic Sound Essence Descriptor |
4431 | 286 { 0x3D02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Locked/Unlocked */ |
3794 | 287 { 0x3D03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x01,0x01,0x00,0x00}}, /* Audio sampling rate */ |
288 { 0x3D07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x01,0x01,0x04,0x00,0x00,0x00}}, /* ChannelCount */ | |
289 { 0x3D01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x03,0x04,0x00,0x00,0x00}}, /* Quantization bits */ | |
4011 | 290 { 0x3D06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x02,0x04,0x02,0x00,0x00,0x00,0x00}}, /* Sound Essence Compression */ |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
291 // Index Table Segment |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
292 { 0x3F0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x05,0x30,0x04,0x06,0x00,0x00,0x00,0x00}}, /* Index Edit Rate */ |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
293 { 0x3F0C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x0A,0x00,0x00}}, /* Index Start Position */ |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
294 { 0x3F0D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x02,0x01,0x01,0x02,0x00,0x00}}, /* Index Duration */ |
4431 | 295 { 0x3F05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x06,0x02,0x01,0x00,0x00,0x00,0x00}}, /* Edit Unit Byte Count */ |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
296 { 0x3F06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x05,0x00,0x00,0x00,0x00}}, /* IndexSID */ |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
297 { 0x3F08, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x04,0x04,0x01,0x01,0x00,0x00,0x00}}, /* Slice Count */ |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
298 { 0x3F09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x01,0x06,0x00,0x00,0x00}}, /* Delta Entry Array */ |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
299 { 0x3F0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x02,0x05,0x00,0x00,0x00}}, /* Index Entry Array */ |
4336 | 300 // MPEG video Descriptor |
301 { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, /* BitRate */ | |
5090
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
302 { 0x8007, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0A,0x00,0x00}}, /* ProfileAndLevel */ |
4339 | 303 // Wave Audio Essence Descriptor |
304 { 0x3D09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x03,0x05,0x00,0x00,0x00}}, /* Average Bytes Per Second */ | |
305 { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */ | |
3749 | 306 }; |
307 | |
3844 | 308 static void mxf_write_uuid(ByteIOContext *pb, enum MXFMetadataSetType type, int value) |
3735 | 309 { |
310 put_buffer(pb, uuid_base, 12); | |
311 put_be16(pb, type); | |
312 put_be16(pb, value); | |
313 } | |
314 | |
4696 | 315 static void mxf_write_umid(AVFormatContext *s, int type) |
3740 | 316 { |
4696 | 317 MXFContext *mxf = s->priv_data; |
318 put_buffer(s->pb, umid_ul, 13); | |
319 put_be24(s->pb, mxf->instance_number); | |
320 put_buffer(s->pb, mxf->umid, 15); | |
4697
ca6a35b5c915
again 10l, typo, put_byte instead of put_buffer
bcoudurier
parents:
4696
diff
changeset
|
321 put_byte(s->pb, type); |
3740 | 322 } |
3743 | 323 |
324 static void mxf_write_refs_count(ByteIOContext *pb, int ref_count) | |
325 { | |
326 put_be32(pb, ref_count); | |
327 put_be32(pb, 16); | |
328 } | |
329 | |
4393 | 330 static int klv_ber_length(uint64_t len) |
331 { | |
332 if (len < 128) | |
333 return 1; | |
334 else | |
335 return (av_log2(len) >> 3) + 2; | |
336 } | |
337 | |
3735 | 338 static int klv_encode_ber_length(ByteIOContext *pb, uint64_t len) |
339 { | |
340 // Determine the best BER size | |
341 int size; | |
342 if (len < 128) { | |
343 //short form | |
344 put_byte(pb, len); | |
345 return 1; | |
346 } | |
347 | |
348 size = (av_log2(len) >> 3) + 1; | |
349 | |
350 // long form | |
351 put_byte(pb, 0x80 + size); | |
352 while(size) { | |
4351 | 353 size--; |
3735 | 354 put_byte(pb, len >> 8 * size & 0xff); |
355 } | |
356 return 0; | |
357 } | |
358 | |
4469
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
359 static void klv_encode_ber4_length(ByteIOContext *pb, int len) |
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
360 { |
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
361 put_byte(pb, 0x80 + 3); |
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
362 put_be24(pb, len); |
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
363 } |
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
364 |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
365 /* |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
366 * Get essence container ul index |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
367 */ |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
368 static int mxf_get_essence_container_ul_index(enum CodecID id) |
3721 | 369 { |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
370 int i; |
4345 | 371 for (i = 0; mxf_essence_mappings[i].id; i++) |
372 if (mxf_essence_mappings[i].id == id) | |
373 return mxf_essence_mappings[i].index; | |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
374 return -1; |
3721 | 375 } |
376 | |
3749 | 377 static void mxf_write_primer_pack(AVFormatContext *s) |
3735 | 378 { |
379 ByteIOContext *pb = s->pb; | |
380 int local_tag_number, i = 0; | |
381 | |
4001 | 382 local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch); |
3735 | 383 |
384 put_buffer(pb, primer_pack_key, 16); | |
385 klv_encode_ber_length(pb, local_tag_number * 18 + 8); | |
386 | |
387 put_be32(pb, local_tag_number); // local_tag num | |
388 put_be32(pb, 18); // item size, always 18 according to the specs | |
389 | |
390 for (i = 0; i < local_tag_number; i++) { | |
391 put_be16(pb, mxf_local_tag_batch[i].local_tag); | |
392 put_buffer(pb, mxf_local_tag_batch[i].uid, 16); | |
393 } | |
394 } | |
395 | |
3815 | 396 static void mxf_write_local_tag(ByteIOContext *pb, int size, int tag) |
3735 | 397 { |
398 put_be16(pb, tag); | |
3815 | 399 put_be16(pb, size); |
3735 | 400 } |
401 | |
3740 | 402 static void mxf_write_metadata_key(ByteIOContext *pb, unsigned int value) |
403 { | |
404 put_buffer(pb, header_metadata_key, 13); | |
405 put_be24(pb, value); | |
406 } | |
407 | |
3721 | 408 static void mxf_free(AVFormatContext *s) |
409 { | |
410 int i; | |
411 | |
412 for (i = 0; i < s->nb_streams; i++) { | |
3823 | 413 AVStream *st = s->streams[i]; |
3721 | 414 av_freep(&st->priv_data); |
415 } | |
416 } | |
417 | |
4404 | 418 static const MXFCodecUL *mxf_get_data_definition_ul(int type) |
3721 | 419 { |
4404 | 420 const MXFCodecUL *uls = ff_mxf_data_definition_uls; |
421 while (uls->uid[0]) { | |
422 if (type == uls->id) | |
3721 | 423 break; |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
424 uls++; |
3721 | 425 } |
426 return uls; | |
427 } | |
428 | |
3821 | 429 static void mxf_write_essence_container_refs(AVFormatContext *s) |
3780
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
430 { |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
431 MXFContext *c = s->priv_data; |
3780
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
432 ByteIOContext *pb = s->pb; |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
433 int i; |
3780
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
434 |
3822 | 435 mxf_write_refs_count(pb, c->essence_container_count); |
436 av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count); | |
437 for (i = 0; i < c->essence_container_count; i++) { | |
4475 | 438 MXFStreamContext *sc = s->streams[i]->priv_data; |
439 put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16); | |
3822 | 440 } |
3780
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
441 } |
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
442 |
3749 | 443 static void mxf_write_preface(AVFormatContext *s) |
444 { | |
445 MXFContext *mxf = s->priv_data; | |
446 ByteIOContext *pb = s->pb; | |
447 | |
448 mxf_write_metadata_key(pb, 0x012f00); | |
449 PRINT_KEY(s, "preface key", pb->buf_ptr - 16); | |
450 klv_encode_ber_length(pb, 130 + 16 * mxf->essence_container_count); | |
451 | |
452 // write preface set uid | |
453 mxf_write_local_tag(pb, 16, 0x3C0A); | |
454 mxf_write_uuid(pb, Preface, 0); | |
455 PRINT_KEY(s, "preface uid", pb->buf_ptr - 16); | |
456 | |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
457 // last modified date |
3749 | 458 mxf_write_local_tag(pb, 8, 0x3B02); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
459 put_be64(pb, mxf->timestamp); |
3749 | 460 |
461 // write version | |
462 mxf_write_local_tag(pb, 2, 0x3B05); | |
4535 | 463 put_be16(pb, 258); // v1.2 |
3749 | 464 |
465 // write identification_refs | |
466 mxf_write_local_tag(pb, 16 + 8, 0x3B06); | |
467 mxf_write_refs_count(pb, 1); | |
468 mxf_write_uuid(pb, Identification, 0); | |
469 | |
470 // write content_storage_refs | |
471 mxf_write_local_tag(pb, 16, 0x3B03); | |
472 mxf_write_uuid(pb, ContentStorage, 0); | |
473 | |
4430 | 474 // operational pattern |
3749 | 475 mxf_write_local_tag(pb, 16, 0x3B09); |
4536
b94bedbb59d7
always use multi track since timecode track is present
bcoudurier
parents:
4535
diff
changeset
|
476 put_buffer(pb, op1a_ul, 16); |
3749 | 477 |
478 // write essence_container_refs | |
479 mxf_write_local_tag(pb, 8 + 16 * mxf->essence_container_count, 0x3B0A); | |
3821 | 480 mxf_write_essence_container_refs(s); |
3749 | 481 |
482 // write dm_scheme_refs | |
483 mxf_write_local_tag(pb, 8, 0x3B0B); | |
484 put_be64(pb, 0); | |
485 } | |
486 | |
3804 | 487 /* |
3806
fa043e93fc66
introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents:
3805
diff
changeset
|
488 * Write a local tag containing an ascii string as utf-16 |
3804 | 489 */ |
3806
fa043e93fc66
introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents:
3805
diff
changeset
|
490 static void mxf_write_local_tag_utf16(ByteIOContext *pb, int tag, const char *value) |
3804 | 491 { |
3805
d8a6432c76f3
use strlen and do not write useless trailing 0 according to specs
bcoudurier
parents:
3804
diff
changeset
|
492 int i, size = strlen(value); |
3806
fa043e93fc66
introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents:
3805
diff
changeset
|
493 mxf_write_local_tag(pb, size*2, tag); |
3804 | 494 for (i = 0; i < size; i++) |
495 put_be16(pb, value[i]); | |
496 } | |
497 | |
3749 | 498 static void mxf_write_identification(AVFormatContext *s) |
499 { | |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
500 MXFContext *mxf = s->priv_data; |
3749 | 501 ByteIOContext *pb = s->pb; |
3810 | 502 const char *company = "FFmpeg"; |
503 const char *product = "OP1a Muxer"; | |
3807 | 504 const char *version; |
3810 | 505 int length; |
3749 | 506 |
507 mxf_write_metadata_key(pb, 0x013000); | |
508 PRINT_KEY(s, "identification key", pb->buf_ptr - 16); | |
509 | |
3808 | 510 version = s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT ? |
3809 | 511 "0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION); |
3810 | 512 length = 84 + (strlen(company)+strlen(product)+strlen(version))*2; // utf-16 |
3749 | 513 klv_encode_ber_length(pb, length); |
514 | |
515 // write uid | |
516 mxf_write_local_tag(pb, 16, 0x3C0A); | |
517 mxf_write_uuid(pb, Identification, 0); | |
518 PRINT_KEY(s, "identification uid", pb->buf_ptr - 16); | |
3811 | 519 |
3749 | 520 // write generation uid |
521 mxf_write_local_tag(pb, 16, 0x3C09); | |
522 mxf_write_uuid(pb, Identification, 1); | |
523 | |
3810 | 524 mxf_write_local_tag_utf16(pb, 0x3C01, company); // Company Name |
525 mxf_write_local_tag_utf16(pb, 0x3C02, product); // Product Name | |
3807 | 526 mxf_write_local_tag_utf16(pb, 0x3C04, version); // Version String |
3749 | 527 |
528 // write product uid | |
529 mxf_write_local_tag(pb, 16, 0x3C05); | |
530 mxf_write_uuid(pb, Identification, 2); | |
531 | |
4384 | 532 // modification date |
3749 | 533 mxf_write_local_tag(pb, 8, 0x3C06); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
534 put_be64(pb, mxf->timestamp); |
3749 | 535 } |
536 | |
537 static void mxf_write_content_storage(AVFormatContext *s) | |
538 { | |
539 ByteIOContext *pb = s->pb; | |
540 | |
541 mxf_write_metadata_key(pb, 0x011800); | |
542 PRINT_KEY(s, "content storage key", pb->buf_ptr - 16); | |
4279 | 543 klv_encode_ber_length(pb, 92); |
3749 | 544 |
545 // write uid | |
546 mxf_write_local_tag(pb, 16, 0x3C0A); | |
547 mxf_write_uuid(pb, ContentStorage, 0); | |
548 PRINT_KEY(s, "content storage uid", pb->buf_ptr - 16); | |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
549 |
3749 | 550 // write package reference |
551 mxf_write_local_tag(pb, 16 * 2 + 8, 0x1901); | |
552 mxf_write_refs_count(pb, 2); | |
553 mxf_write_uuid(pb, MaterialPackage, 0); | |
554 mxf_write_uuid(pb, SourcePackage, 0); | |
4279 | 555 |
556 // write essence container data | |
557 mxf_write_local_tag(pb, 8 + 16, 0x1902); | |
558 mxf_write_refs_count(pb, 1); | |
559 mxf_write_uuid(pb, EssenceContainerData, 0); | |
3749 | 560 } |
561 | |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
562 static void mxf_write_track(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type) |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
563 { |
4374 | 564 MXFContext *mxf = s->priv_data; |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
565 ByteIOContext *pb = s->pb; |
3823 | 566 MXFStreamContext *sc = st->priv_data; |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
567 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
568 mxf_write_metadata_key(pb, 0x013b00); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
569 PRINT_KEY(s, "track key", pb->buf_ptr - 16); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
570 klv_encode_ber_length(pb, 80); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
571 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
572 // write track uid |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
573 mxf_write_local_tag(pb, 16, 0x3C0A); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
574 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, st->index); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
575 PRINT_KEY(s, "track uid", pb->buf_ptr - 16); |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
576 |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
577 // write track id |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
578 mxf_write_local_tag(pb, 4, 0x4801); |
4565 | 579 put_be32(pb, st->index+2); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
580 |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
581 // write track number |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
582 mxf_write_local_tag(pb, 4, 0x4804); |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
583 if (type == MaterialPackage) |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
584 put_be32(pb, 0); // track number of material package is 0 |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
585 else |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
586 put_buffer(pb, sc->track_essence_element_key + 12, 4); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
587 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
588 mxf_write_local_tag(pb, 8, 0x4B01); |
4374 | 589 put_be32(pb, mxf->time_base.den); |
590 put_be32(pb, mxf->time_base.num); | |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
591 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
592 // write origin |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
593 mxf_write_local_tag(pb, 8, 0x4B02); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
594 put_be64(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
595 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
596 // write sequence refs |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
597 mxf_write_local_tag(pb, 16, 0x4803); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
598 mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
599 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
600 |
4448 | 601 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 }; |
602 | |
603 static void mxf_write_common_fields(AVFormatContext *s, AVStream *st) | |
3743 | 604 { |
4448 | 605 MXFContext *mxf = s->priv_data; |
606 ByteIOContext *pb = s->pb; | |
3834 | 607 |
3743 | 608 // find data define uls |
609 mxf_write_local_tag(pb, 16, 0x0201); | |
4448 | 610 if (st == mxf->timecode_track) |
611 put_buffer(pb, smpte_12m_timecode_track_data_ul, 16); | |
612 else { | |
613 const MXFCodecUL *data_def_ul = mxf_get_data_definition_ul(st->codec->codec_type); | |
614 put_buffer(pb, data_def_ul->uid, 16); | |
615 } | |
3743 | 616 |
617 // write duration | |
618 mxf_write_local_tag(pb, 8, 0x0202); | |
4448 | 619 put_be64(pb, mxf->duration); |
3743 | 620 } |
621 | |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
622 static void mxf_write_sequence(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type) |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
623 { |
4448 | 624 MXFContext *mxf = s->priv_data; |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
625 ByteIOContext *pb = s->pb; |
4448 | 626 enum MXFMetadataSetType component; |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
627 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
628 mxf_write_metadata_key(pb, 0x010f00); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
629 PRINT_KEY(s, "sequence key", pb->buf_ptr - 16); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
630 klv_encode_ber_length(pb, 80); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
631 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
632 mxf_write_local_tag(pb, 16, 0x3C0A); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
633 mxf_write_uuid(pb, type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
634 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
635 PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16); |
4448 | 636 mxf_write_common_fields(s, st); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
637 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
638 // write structural component |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
639 mxf_write_local_tag(pb, 16 + 8, 0x1001); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
640 mxf_write_refs_count(pb, 1); |
4448 | 641 if (st == mxf->timecode_track) |
642 component = TimecodeComponent; | |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
643 else |
4448 | 644 component = SourceClip; |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
645 if (type == SourcePackage) |
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
646 component += TypeBottom; |
4448 | 647 mxf_write_uuid(pb, component, st->index); |
648 } | |
649 | |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
650 static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type) |
4448 | 651 { |
652 MXFContext *mxf = s->priv_data; | |
653 ByteIOContext *pb = s->pb; | |
654 | |
655 mxf_write_metadata_key(pb, 0x011400); | |
656 klv_encode_ber_length(pb, 75); | |
657 | |
658 // UID | |
659 mxf_write_local_tag(pb, 16, 0x3C0A); | |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
660 mxf_write_uuid(pb, type == MaterialPackage ? TimecodeComponent : |
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
661 TimecodeComponent + TypeBottom, st->index); |
4448 | 662 |
663 mxf_write_common_fields(s, st); | |
664 | |
665 // Start Time Code | |
666 mxf_write_local_tag(pb, 8, 0x1501); | |
667 put_be64(pb, mxf->timecode_start); | |
668 | |
669 // Rounded Time Code Base | |
670 mxf_write_local_tag(pb, 2, 0x1502); | |
671 put_be16(pb, mxf->timecode_base); | |
672 | |
673 // Drop Frame | |
674 mxf_write_local_tag(pb, 1, 0x1503); | |
675 put_byte(pb, mxf->timecode_drop_frame); | |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
676 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
677 |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
678 static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type) |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
679 { |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
680 ByteIOContext *pb = s->pb; |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
681 int i; |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
682 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
683 mxf_write_metadata_key(pb, 0x011100); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
684 PRINT_KEY(s, "sturctural component key", pb->buf_ptr - 16); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
685 klv_encode_ber_length(pb, 108); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
686 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
687 // write uid |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
688 mxf_write_local_tag(pb, 16, 0x3C0A); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
689 mxf_write_uuid(pb, type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, st->index); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
690 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
691 PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16); |
4448 | 692 mxf_write_common_fields(s, st); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
693 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
694 // write start_position |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
695 mxf_write_local_tag(pb, 8, 0x1201); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
696 put_be64(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
697 |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
698 // write source package uid, end of the reference |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
699 mxf_write_local_tag(pb, 32, 0x1101); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
700 if (type == SourcePackage) { |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
701 for (i = 0; i < 4; i++) |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
702 put_be64(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
703 } else |
4696 | 704 mxf_write_umid(s, 1); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
705 |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
706 // write source track id |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
707 mxf_write_local_tag(pb, 4, 0x1102); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
708 if (type == SourcePackage) |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
709 put_be32(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
710 else |
4565 | 711 put_be32(pb, st->index+2); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
712 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
713 |
3749 | 714 static void mxf_write_multi_descriptor(AVFormatContext *s) |
715 { | |
4376 | 716 MXFContext *mxf = s->priv_data; |
3749 | 717 ByteIOContext *pb = s->pb; |
4473 | 718 const uint8_t *ul; |
3749 | 719 int i; |
720 | |
721 mxf_write_metadata_key(pb, 0x014400); | |
722 PRINT_KEY(s, "multiple descriptor key", pb->buf_ptr - 16); | |
723 klv_encode_ber_length(pb, 64 + 16 * s->nb_streams); | |
724 | |
725 mxf_write_local_tag(pb, 16, 0x3C0A); | |
726 mxf_write_uuid(pb, MultipleDescriptor, 0); | |
727 PRINT_KEY(s, "multi_desc uid", pb->buf_ptr - 16); | |
728 | |
729 // write sample rate | |
730 mxf_write_local_tag(pb, 8, 0x3001); | |
4376 | 731 put_be32(pb, mxf->time_base.den); |
732 put_be32(pb, mxf->time_base.num); | |
3749 | 733 |
734 // write essence container ul | |
735 mxf_write_local_tag(pb, 16, 0x3004); | |
4473 | 736 if (mxf->essence_container_count > 1) |
737 ul = multiple_desc_ul; | |
4475 | 738 else { |
739 MXFStreamContext *sc = s->streams[0]->priv_data; | |
740 ul = mxf_essence_container_uls[sc->index].container_ul; | |
741 } | |
4473 | 742 put_buffer(pb, ul, 16); |
3749 | 743 |
744 // write sub descriptor refs | |
745 mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x3F01); | |
746 mxf_write_refs_count(pb, s->nb_streams); | |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
747 for (i = 0; i < s->nb_streams; i++) |
3749 | 748 mxf_write_uuid(pb, SubDescriptor, i); |
749 } | |
750 | |
4376 | 751 static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size) |
3743 | 752 { |
4376 | 753 MXFContext *mxf = s->priv_data; |
3817
22831cc65a35
get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents:
3816
diff
changeset
|
754 MXFStreamContext *sc = st->priv_data; |
4376 | 755 ByteIOContext *pb = s->pb; |
3743 | 756 |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
757 put_buffer(pb, key, 16); |
5091
d1609b5528e6
use ber4 length for descriptors preferred by specs
bcoudurier
parents:
5090
diff
changeset
|
758 klv_encode_ber4_length(pb, size+20+8+12+20); |
3743 | 759 |
760 mxf_write_local_tag(pb, 16, 0x3C0A); | |
761 mxf_write_uuid(pb, SubDescriptor, st->index); | |
762 | |
763 mxf_write_local_tag(pb, 4, 0x3006); | |
4565 | 764 put_be32(pb, st->index+2); |
3743 | 765 |
3749 | 766 mxf_write_local_tag(pb, 8, 0x3001); |
4376 | 767 put_be32(pb, mxf->time_base.den); |
768 put_be32(pb, mxf->time_base.num); | |
3749 | 769 |
3743 | 770 mxf_write_local_tag(pb, 16, 0x3004); |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
771 put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16); |
3743 | 772 } |
773 | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
774 static const UID mxf_mpegvideo_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }; |
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
775 static const UID mxf_wav_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }; |
4320 | 776 static const UID mxf_aes3_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }; |
4473 | 777 static const UID mxf_cdci_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }; |
778 static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x42,0x00 }; | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
779 |
4471
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
780 static void mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size) |
3743 | 781 { |
4316 | 782 MXFStreamContext *sc = st->priv_data; |
3743 | 783 ByteIOContext *pb = s->pb; |
4277 | 784 int stored_height = (st->codec->height+15)/16*16; |
4472 | 785 int display_height; |
4322 | 786 int f1, f2; |
3743 | 787 |
4527 | 788 mxf_write_generic_desc(s, st, key, size+8+8+8+8+8+8+5+16+sc->interlaced*4+12+20); |
3743 | 789 |
790 mxf_write_local_tag(pb, 4, 0x3203); | |
791 put_be32(pb, st->codec->width); | |
792 | |
793 mxf_write_local_tag(pb, 4, 0x3202); | |
4316 | 794 put_be32(pb, stored_height>>sc->interlaced); |
3743 | 795 |
4335 | 796 mxf_write_local_tag(pb, 4, 0x3209); |
797 put_be32(pb, st->codec->width); | |
798 | |
4472 | 799 if (st->codec->height == 608) // PAL + VBI |
800 display_height = 576; | |
801 else if (st->codec->height == 512) // NTSC + VBI | |
802 display_height = 486; | |
803 else | |
804 display_height = st->codec->height; | |
805 | |
4335 | 806 mxf_write_local_tag(pb, 4, 0x3208); |
4472 | 807 put_be32(pb, display_height>>sc->interlaced); |
4335 | 808 |
4434
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
809 // component depth |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
810 mxf_write_local_tag(pb, 4, 0x3301); |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
811 put_be32(pb, 8); |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
812 |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
813 // horizontal subsampling |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
814 mxf_write_local_tag(pb, 4, 0x3302); |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
815 put_be32(pb, 2); |
a75d42745d16
write component depth and horizontal subsampling best effort local tags
bcoudurier
parents:
4433
diff
changeset
|
816 |
4321 | 817 // frame layout |
818 mxf_write_local_tag(pb, 1, 0x320C); | |
819 put_byte(pb, sc->interlaced); | |
820 | |
4322 | 821 // video line map |
822 switch (st->codec->height) { | |
823 case 576: f1 = 23; f2 = 336; break; | |
824 case 608: f1 = 7; f2 = 320; break; | |
825 case 480: f1 = 20; f2 = 283; break; | |
826 case 512: f1 = 7; f2 = 270; break; | |
827 case 720: f1 = 26; f2 = 0; break; // progressive | |
828 case 1080: f1 = 21; f2 = 584; break; | |
829 default: f1 = 0; f2 = 0; break; | |
830 } | |
831 | |
832 if (!sc->interlaced) { | |
833 f2 = 0; | |
834 f1 *= 2; | |
835 } | |
836 | |
4343 | 837 mxf_write_local_tag(pb, 12+sc->interlaced*4, 0x320D); |
4337 | 838 put_be32(pb, sc->interlaced ? 2 : 1); |
839 put_be32(pb, 4); | |
4322 | 840 put_be32(pb, f1); |
4337 | 841 if (sc->interlaced) |
842 put_be32(pb, f2); | |
4322 | 843 |
3743 | 844 mxf_write_local_tag(pb, 8, 0x320E); |
4505 | 845 put_be32(pb, sc->aspect_ratio.num); |
846 put_be32(pb, sc->aspect_ratio.den); | |
4317
b978795a9e37
local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents:
4316
diff
changeset
|
847 |
b978795a9e37
local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents:
4316
diff
changeset
|
848 mxf_write_local_tag(pb, 16, 0x3201); |
b978795a9e37
local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents:
4316
diff
changeset
|
849 put_buffer(pb, *sc->codec_ul, 16); |
3743 | 850 } |
851 | |
4473 | 852 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st) |
853 { | |
4527 | 854 mxf_write_cdci_common(s, st, mxf_cdci_descriptor_key, 0); |
4473 | 855 } |
856 | |
4471
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
857 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st) |
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
858 { |
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
859 ByteIOContext *pb = s->pb; |
5090
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
860 int profile_and_level = (st->codec->profile<<4) | st->codec->level; |
4471
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
861 |
5090
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
862 mxf_write_cdci_common(s, st, mxf_mpegvideo_descriptor_key, 8+5); |
4471
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
863 |
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
864 // bit rate |
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
865 mxf_write_local_tag(pb, 4, 0x8000); |
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
866 put_be32(pb, st->codec->bit_rate); |
5090
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
867 |
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
868 // profile and level |
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
869 mxf_write_local_tag(pb, 1, 0x8007); |
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
870 if (!st->codec->profile) |
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
871 profile_and_level |= 0x80; // escape bit |
f2671cc3467c
write profile and level local tag in mpeg descriptor
bcoudurier
parents:
5081
diff
changeset
|
872 put_byte(pb, profile_and_level); |
4471
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
873 } |
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
874 |
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
875 static void mxf_write_generic_sound_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size) |
3743 | 876 { |
877 ByteIOContext *pb = s->pb; | |
878 | |
4527 | 879 mxf_write_generic_desc(s, st, key, size+5+12+8+8); |
4318 | 880 |
4319 | 881 // audio locked |
4318 | 882 mxf_write_local_tag(pb, 1, 0x3D02); |
883 put_byte(pb, 1); | |
3743 | 884 |
885 // write audio sampling rate | |
886 mxf_write_local_tag(pb, 8, 0x3D03); | |
887 put_be32(pb, st->codec->sample_rate); | |
888 put_be32(pb, 1); | |
889 | |
890 mxf_write_local_tag(pb, 4, 0x3D07); | |
891 put_be32(pb, st->codec->channels); | |
892 | |
893 mxf_write_local_tag(pb, 4, 0x3D01); | |
4346 | 894 put_be32(pb, av_get_bits_per_sample(st->codec->codec_id)); |
3743 | 895 } |
896 | |
4471
bac4bfb54ff7
split mpegvideo descriptor into cdci descriptor and wav common in sound common
bcoudurier
parents:
4470
diff
changeset
|
897 static void mxf_write_wav_common(AVFormatContext *s, AVStream *st, const UID key, unsigned size) |
4319 | 898 { |
4339 | 899 ByteIOContext *pb = s->pb; |
900 | |
4527 | 901 mxf_write_generic_sound_common(s, st, key, size+6+8); |
4339 | 902 |
903 mxf_write_local_tag(pb, 2, 0x3D0A); | |
904 put_be16(pb, st->codec->block_align); | |
905 | |
906 // avg bytes per sec | |
907 mxf_write_local_tag(pb, 4, 0x3D09); | |
908 put_be32(pb, st->codec->block_align*st->codec->sample_rate); | |
4319 | 909 } |
910 | |
4340 | 911 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st) |
912 { | |
4527 | 913 mxf_write_wav_common(s, st, mxf_wav_descriptor_key, 0); |
4340 | 914 } |
915 | |
4320 | 916 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st) |
917 { | |
4527 | 918 mxf_write_wav_common(s, st, mxf_aes3_descriptor_key, 0); |
4320 | 919 } |
920 | |
4473 | 921 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st) |
922 { | |
4527 | 923 mxf_write_generic_sound_common(s, st, mxf_generic_sound_descriptor_key, 0); |
4473 | 924 } |
925 | |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
926 static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type) |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
927 { |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
928 MXFContext *mxf = s->priv_data; |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
929 ByteIOContext *pb = s->pb; |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
930 int i, track_count = s->nb_streams+1; |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
931 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
932 if (type == MaterialPackage) { |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
933 mxf_write_metadata_key(pb, 0x013600); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
934 PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16); |
4448 | 935 klv_encode_ber_length(pb, 92 + 16*track_count); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
936 } else { |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
937 mxf_write_metadata_key(pb, 0x013700); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
938 PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16); |
4448 | 939 klv_encode_ber_length(pb, 112 + 16*track_count); // 20 bytes length for descriptor reference |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
940 } |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
941 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
942 // write uid |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
943 mxf_write_local_tag(pb, 16, 0x3C0A); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
944 mxf_write_uuid(pb, type, 0); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
945 av_log(s,AV_LOG_DEBUG, "package type:%d\n", type); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
946 PRINT_KEY(s, "package uid", pb->buf_ptr - 16); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
947 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
948 // write package umid |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
949 mxf_write_local_tag(pb, 32, 0x4401); |
4696 | 950 mxf_write_umid(s, type == SourcePackage); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
951 PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
952 |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
953 // package creation date |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
954 mxf_write_local_tag(pb, 8, 0x4405); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
955 put_be64(pb, mxf->timestamp); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
956 |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
957 // package modified date |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
958 mxf_write_local_tag(pb, 8, 0x4404); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
959 put_be64(pb, mxf->timestamp); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
960 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
961 // write track refs |
4448 | 962 mxf_write_local_tag(pb, track_count*16 + 8, 0x4403); |
963 mxf_write_refs_count(pb, track_count); | |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
964 mxf_write_uuid(pb, type == MaterialPackage ? Track : |
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
965 Track + TypeBottom, -1); // timecode track |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
966 for (i = 0; i < s->nb_streams; i++) |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
967 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
968 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
969 // write multiple descriptor reference |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
970 if (type == SourcePackage) { |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
971 mxf_write_local_tag(pb, 16, 0x4701); |
3851
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
972 if (s->nb_streams > 1) { |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
973 mxf_write_uuid(pb, MultipleDescriptor, 0); |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
974 mxf_write_multi_descriptor(s); |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
975 } else |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
976 mxf_write_uuid(pb, SubDescriptor, 0); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
977 } |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
978 |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
979 // write timecode track |
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
980 mxf_write_track(s, mxf->timecode_track, type); |
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
981 mxf_write_sequence(s, mxf->timecode_track, type); |
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
982 mxf_write_timecode_component(s, mxf->timecode_track, type); |
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
983 |
3831 | 984 for (i = 0; i < s->nb_streams; i++) { |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
985 AVStream *st = s->streams[i]; |
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
986 mxf_write_track(s, st, type); |
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
987 mxf_write_sequence(s, st, type); |
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
988 mxf_write_structural_component(s, st, type); |
3743 | 989 |
990 if (type == SourcePackage) { | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
991 MXFStreamContext *sc = st->priv_data; |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
992 mxf_essence_container_uls[sc->index].write_desc(s, st); |
3743 | 993 } |
994 } | |
995 } | |
996 | |
4279 | 997 static int mxf_write_essence_container_data(AVFormatContext *s) |
998 { | |
999 ByteIOContext *pb = s->pb; | |
1000 | |
1001 mxf_write_metadata_key(pb, 0x012300); | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1002 klv_encode_ber_length(pb, 72); |
4279 | 1003 |
1004 mxf_write_local_tag(pb, 16, 0x3C0A); // Instance UID | |
1005 mxf_write_uuid(pb, EssenceContainerData, 0); | |
1006 | |
1007 mxf_write_local_tag(pb, 32, 0x2701); // Linked Package UID | |
4696 | 1008 mxf_write_umid(s, 1); |
4279 | 1009 |
1010 mxf_write_local_tag(pb, 4, 0x3F07); // BodySID | |
1011 put_be32(pb, 1); | |
1012 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1013 mxf_write_local_tag(pb, 4, 0x3F06); // IndexSID |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1014 put_be32(pb, 2); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1015 |
4279 | 1016 return 0; |
1017 } | |
1018 | |
3740 | 1019 static int mxf_write_header_metadata_sets(AVFormatContext *s) |
1020 { | |
3749 | 1021 mxf_write_preface(s); |
1022 mxf_write_identification(s); | |
1023 mxf_write_content_storage(s); | |
3849 | 1024 mxf_write_package(s, MaterialPackage); |
1025 mxf_write_package(s, SourcePackage); | |
4279 | 1026 mxf_write_essence_container_data(s); |
3740 | 1027 return 0; |
1028 } | |
1029 | |
4397
6d1626886974
only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents:
4396
diff
changeset
|
1030 static unsigned klv_fill_size(uint64_t size) |
4393 | 1031 { |
4397
6d1626886974
only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents:
4396
diff
changeset
|
1032 unsigned pad = KAG_SIZE - (size & (KAG_SIZE-1)); |
4469
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
1033 if (pad < 20) // smallest fill item possible |
4393 | 1034 return pad + KAG_SIZE; |
1035 else | |
1036 return pad & (KAG_SIZE-1); | |
1037 } | |
1038 | |
4408 | 1039 static void mxf_write_index_table_segment(AVFormatContext *s) |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1040 { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1041 MXFContext *mxf = s->priv_data; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1042 ByteIOContext *pb = s->pb; |
6214 | 1043 int i, j, temporal_reordering = 0; |
4446
efe78f986bec
fix last keyframe index accross body partitions
bcoudurier
parents:
4445
diff
changeset
|
1044 int key_index = mxf->last_key_index; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1045 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1046 av_log(s, AV_LOG_DEBUG, "edit units count %d\n", mxf->edit_units_count); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1047 |
4473 | 1048 if (!mxf->edit_units_count && !mxf->edit_unit_byte_count) |
4440 | 1049 return; |
1050 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1051 put_buffer(pb, index_table_segment_key, 16); |
4473 | 1052 |
1053 if (mxf->edit_unit_byte_count) { | |
4531 | 1054 klv_encode_ber_length(pb, 80); |
4473 | 1055 } else { |
1056 klv_encode_ber_length(pb, 85 + 12+(s->nb_streams+1)*6 + | |
1057 12+mxf->edit_units_count*(11+mxf->slice_count*4)); | |
1058 } | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1059 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1060 // instance id |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1061 mxf_write_local_tag(pb, 16, 0x3C0A); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1062 mxf_write_uuid(pb, IndexTableSegment, 0); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1063 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1064 // index edit rate |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1065 mxf_write_local_tag(pb, 8, 0x3F0B); |
4574 | 1066 put_be32(pb, mxf->time_base.den); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1067 put_be32(pb, mxf->time_base.num); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1068 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1069 // index start position |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1070 mxf_write_local_tag(pb, 8, 0x3F0C); |
4440 | 1071 put_be64(pb, mxf->last_indexed_edit_unit); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1072 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1073 // index duration |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1074 mxf_write_local_tag(pb, 8, 0x3F0D); |
5092
ad1e45ad8e5e
set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents:
5091
diff
changeset
|
1075 if (mxf->edit_unit_byte_count) |
ad1e45ad8e5e
set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents:
5091
diff
changeset
|
1076 put_be64(pb, 0); // index table covers whole container |
ad1e45ad8e5e
set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents:
5091
diff
changeset
|
1077 else |
ad1e45ad8e5e
set index duration to 0 for cbr, specifying whole container coverage
bcoudurier
parents:
5091
diff
changeset
|
1078 put_be64(pb, mxf->edit_units_count); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1079 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1080 // edit unit byte count |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1081 mxf_write_local_tag(pb, 4, 0x3F05); |
4473 | 1082 put_be32(pb, mxf->edit_unit_byte_count); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1083 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1084 // index sid |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1085 mxf_write_local_tag(pb, 4, 0x3F06); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1086 put_be32(pb, 2); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1087 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1088 // body sid |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1089 mxf_write_local_tag(pb, 4, 0x3F07); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1090 put_be32(pb, 1); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1091 |
4531 | 1092 if (!mxf->edit_unit_byte_count) { |
1093 // real slice count - 1 | |
1094 mxf_write_local_tag(pb, 1, 0x3F08); | |
1095 put_byte(pb, mxf->slice_count); | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1096 |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1097 // delta entry array |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1098 mxf_write_local_tag(pb, 8 + (s->nb_streams+1)*6, 0x3F09); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1099 put_be32(pb, s->nb_streams+1); // num of entries |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1100 put_be32(pb, 6); // size of one entry |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1101 // write system item delta entry |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1102 put_byte(pb, 0); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1103 put_byte(pb, 0); // slice entry |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1104 put_be32(pb, 0); // element delta |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1105 for (i = 0; i < s->nb_streams; i++) { |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1106 AVStream *st = s->streams[i]; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1107 MXFStreamContext *sc = st->priv_data; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1108 put_byte(pb, sc->temporal_reordering); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1109 if (sc->temporal_reordering) |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1110 temporal_reordering = 1; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1111 if (i == 0) { // video track |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1112 put_byte(pb, 0); // slice number |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1113 put_be32(pb, KAG_SIZE); // system item size including klv fill |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1114 } else { // audio track |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1115 unsigned audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1116 audio_frame_size += klv_fill_size(audio_frame_size); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1117 put_byte(pb, 1); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1118 put_be32(pb, (i-1)*audio_frame_size); // element delta |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1119 } |
4397
6d1626886974
only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents:
4396
diff
changeset
|
1120 } |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1121 |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1122 mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+mxf->slice_count*4), 0x3F0A); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1123 put_be32(pb, mxf->edit_units_count); // num of entries |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1124 put_be32(pb, 11+mxf->slice_count*4); // size of one entry |
6214 | 1125 |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1126 for (i = 0; i < mxf->edit_units_count; i++) { |
5080 | 1127 int temporal_offset = 0; |
6214 | 1128 |
1129 if (!(mxf->index_entries[i].flags & 0x33)) { // I frame | |
1130 mxf->last_key_index = key_index; | |
1131 key_index = i; | |
1132 } | |
1133 | |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1134 if (temporal_reordering) { |
6214 | 1135 int pic_num_in_gop = i - key_index; |
1136 if (pic_num_in_gop != mxf->index_entries[i].temporal_ref) { | |
1137 for (j = key_index; j < mxf->edit_units_count; j++) { | |
1138 if (pic_num_in_gop == mxf->index_entries[j].temporal_ref) | |
1139 break; | |
4344
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
1140 } |
6214 | 1141 if (j == mxf->edit_units_count) |
1142 av_log(s, AV_LOG_WARNING, "missing frames\n"); | |
1143 temporal_offset = j - key_index - pic_num_in_gop; | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1144 } |
5080 | 1145 } |
1146 put_byte(pb, temporal_offset); | |
1147 | |
1148 if ((mxf->index_entries[i].flags & 0x30) == 0x30) { // back and forward prediction | |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1149 put_byte(pb, mxf->last_key_index - i); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1150 } else { |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1151 put_byte(pb, key_index - i); // key frame offset |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1152 if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1153 mxf->last_key_index = key_index; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1154 } |
6214 | 1155 |
1156 if (!(mxf->index_entries[i].flags & 0x33) && // I frame | |
1157 mxf->index_entries[i].flags & 0x40 && !temporal_offset) | |
1158 mxf->index_entries[i].flags |= 0x80; // random access | |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1159 put_byte(pb, mxf->index_entries[i].flags); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1160 // stream offset |
4481
27fd3af46000
compute body offset and index entry offset correctly
bcoudurier
parents:
4478
diff
changeset
|
1161 put_be64(pb, mxf->index_entries[i].offset); |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1162 if (s->nb_streams > 1) |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1163 put_be32(pb, mxf->index_entries[i].slice_offset); |
4378 | 1164 } |
4440 | 1165 |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1166 mxf->last_key_index = key_index - mxf->edit_units_count; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1167 mxf->last_indexed_edit_unit += mxf->edit_units_count; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1168 mxf->edit_units_count = 0; |
4473 | 1169 } |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1170 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1171 |
4432
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1172 static void mxf_write_klv_fill(AVFormatContext *s) |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1173 { |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1174 unsigned pad = klv_fill_size(url_ftell(s->pb)); |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1175 if (pad) { |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1176 put_buffer(s->pb, klv_fill_key, 16); |
4469
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
1177 pad -= 16 + 4; |
49cf858ac430
encode klv fill item length in fixed ber 4 bytes
bcoudurier
parents:
4461
diff
changeset
|
1178 klv_encode_ber4_length(s->pb, pad); |
4432
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1179 for (; pad; pad--) |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1180 put_byte(s->pb, 0); |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1181 assert(!(url_ftell(s->pb) & (KAG_SIZE-1))); |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1182 } |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1183 } |
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1184 |
4370 | 1185 static void mxf_write_partition(AVFormatContext *s, int bodysid, |
4439
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1186 int indexsid, |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1187 const uint8_t *key, int write_metadata) |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1188 { |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1189 MXFContext *mxf = s->priv_data; |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1190 ByteIOContext *pb = s->pb; |
3843 | 1191 int64_t header_byte_count_offset; |
4439
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1192 unsigned index_byte_count = 0; |
4442
85f1c6887bef
fix partition offset when only one stream present
bcoudurier
parents:
4441
diff
changeset
|
1193 uint64_t partition_offset = url_ftell(pb); |
4439
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1194 |
4473 | 1195 if (!mxf->edit_unit_byte_count && mxf->edit_units_count) |
1196 index_byte_count = 85 + 12+(s->nb_streams+1)*6 + | |
1197 12+mxf->edit_units_count*(11+mxf->slice_count*4); | |
1198 else if (mxf->edit_unit_byte_count && indexsid) | |
4537 | 1199 index_byte_count = 80; |
4473 | 1200 |
1201 if (index_byte_count) { | |
4439
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1202 // add encoded ber length |
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1203 index_byte_count += 16 + klv_ber_length(index_byte_count); |
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1204 index_byte_count += klv_fill_size(index_byte_count); |
4440 | 1205 } |
1206 | |
1207 if (!memcmp(key, body_partition_key, 16)) { | |
1208 mxf->body_partition_offset = | |
1209 av_realloc(mxf->body_partition_offset, | |
1210 (mxf->body_partitions_count+1)* | |
1211 sizeof(*mxf->body_partition_offset)); | |
4442
85f1c6887bef
fix partition offset when only one stream present
bcoudurier
parents:
4441
diff
changeset
|
1212 mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset; |
4439
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1213 } |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
1214 |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1215 // write klv |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1216 put_buffer(pb, key, 16); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1217 klv_encode_ber_length(pb, 88 + 16 * mxf->essence_container_count); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1218 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1219 // write partition value |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1220 put_be16(pb, 1); // majorVersion |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1221 put_be16(pb, 2); // minorVersion |
4393 | 1222 put_be32(pb, KAG_SIZE); // KAGSize |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1223 |
4442
85f1c6887bef
fix partition offset when only one stream present
bcoudurier
parents:
4441
diff
changeset
|
1224 put_be64(pb, partition_offset); // ThisPartition |
4440 | 1225 |
1226 if (!memcmp(key, body_partition_key, 16) && mxf->body_partitions_count > 1) | |
1227 put_be64(pb, mxf->body_partition_offset[mxf->body_partitions_count-2]); // PreviousPartition | |
4460 | 1228 else if (!memcmp(key, footer_partition_key, 16) && mxf->body_partitions_count) |
4440 | 1229 put_be64(pb, mxf->body_partition_offset[mxf->body_partitions_count-1]); // PreviousPartition |
1230 else | |
1231 put_be64(pb, 0); | |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1232 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1233 put_be64(pb, mxf->footer_partition_offset); // footerPartition |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1234 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1235 // set offset |
3843 | 1236 header_byte_count_offset = url_ftell(pb); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1237 put_be64(pb, 0); // headerByteCount, update later |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1238 |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1239 // indexTable |
4370 | 1240 put_be64(pb, index_byte_count); // indexByteCount |
4439
4bc3b8687ec2
compute index byte count in mxf_write_partition
bcoudurier
parents:
4438
diff
changeset
|
1241 put_be32(pb, index_byte_count ? indexsid : 0); // indexSID |
4440 | 1242 |
1243 // BodyOffset | |
4473 | 1244 if (bodysid && mxf->edit_units_count && mxf->body_partitions_count) { |
4481
27fd3af46000
compute body offset and index entry offset correctly
bcoudurier
parents:
4478
diff
changeset
|
1245 put_be64(pb, mxf->body_offset); |
4445 | 1246 } else |
1247 put_be64(pb, 0); | |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1248 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1249 put_be32(pb, bodysid); // bodySID |
4430 | 1250 |
1251 // operational pattern | |
4536
b94bedbb59d7
always use multi track since timecode track is present
bcoudurier
parents:
4535
diff
changeset
|
1252 put_buffer(pb, op1a_ul, 16); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1253 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1254 // essence container |
3821 | 1255 mxf_write_essence_container_refs(s); |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1256 |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1257 if (write_metadata) { |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1258 // mark the start of the headermetadata and calculate metadata size |
4433 | 1259 int64_t pos, start; |
4393 | 1260 unsigned header_byte_count; |
1261 | |
4432
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1262 mxf_write_klv_fill(s); |
4433 | 1263 start = url_ftell(s->pb); |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1264 mxf_write_primer_pack(s); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1265 mxf_write_header_metadata_sets(s); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1266 pos = url_ftell(s->pb); |
4397
6d1626886974
only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents:
4396
diff
changeset
|
1267 header_byte_count = pos - start + klv_fill_size(pos); |
4393 | 1268 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1269 // update header_byte_count |
3843 | 1270 url_fseek(pb, header_byte_count_offset, SEEK_SET); |
4393 | 1271 put_be64(pb, header_byte_count); |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1272 url_fseek(pb, pos, SEEK_SET); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1273 } |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1274 |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1275 put_flush_packet(pb); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1276 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1277 |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1278 static const UID mxf_mpeg2_codec_uls[] = { |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1279 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x10,0x00 }, // MP-ML I-Frame |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1280 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, // MP-ML Long GOP |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1281 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, // 422P-ML I-Frame |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1282 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, // 422P-ML Long GOP |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1283 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x02,0x00 }, // MP-HL I-Frame |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1284 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, // MP-HL Long GOP |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1285 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, // 422P-HL I-Frame |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1286 { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, // 422P-HL Long GOP |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1287 }; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1288 |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1289 static const UID *mxf_get_mpeg2_codec_ul(AVCodecContext *avctx) |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1290 { |
5093
d4cce49ac1f1
fix and simplify long gop mpeg codec ul computation
bcoudurier
parents:
5092
diff
changeset
|
1291 int long_gop = avctx->gop_size > 1 || avctx->has_b_frames; |
d4cce49ac1f1
fix and simplify long gop mpeg codec ul computation
bcoudurier
parents:
5092
diff
changeset
|
1292 |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1293 if (avctx->profile == 4) { // Main |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1294 if (avctx->level == 8) // Main |
5093
d4cce49ac1f1
fix and simplify long gop mpeg codec ul computation
bcoudurier
parents:
5092
diff
changeset
|
1295 return &mxf_mpeg2_codec_uls[0+long_gop]; |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1296 else if (avctx->level == 4) // High |
5093
d4cce49ac1f1
fix and simplify long gop mpeg codec ul computation
bcoudurier
parents:
5092
diff
changeset
|
1297 return &mxf_mpeg2_codec_uls[4+long_gop]; |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1298 } else if (avctx->profile == 0) { // 422 |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1299 if (avctx->level == 5) // Main |
5093
d4cce49ac1f1
fix and simplify long gop mpeg codec ul computation
bcoudurier
parents:
5092
diff
changeset
|
1300 return &mxf_mpeg2_codec_uls[2+long_gop]; |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1301 else if (avctx->level == 2) // High |
5093
d4cce49ac1f1
fix and simplify long gop mpeg codec ul computation
bcoudurier
parents:
5092
diff
changeset
|
1302 return &mxf_mpeg2_codec_uls[6+long_gop]; |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1303 } |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1304 return NULL; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1305 } |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1306 |
6214 | 1307 static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st, |
1308 AVPacket *pkt, MXFIndexEntry *e) | |
4313 | 1309 { |
1310 MXFStreamContext *sc = st->priv_data; | |
4449 | 1311 MXFContext *mxf = s->priv_data; |
4313 | 1312 uint32_t c = -1; |
1313 int i; | |
1314 | |
1315 for(i = 0; i < pkt->size - 4; i++) { | |
1316 c = (c<<8) + pkt->data[i]; | |
5081 | 1317 if (c == 0x1b5) { |
4938 | 1318 if ((pkt->data[i+1] & 0xf0) == 0x10) { // seq ext |
4313 | 1319 st->codec->profile = pkt->data[i+1] & 0x07; |
1320 st->codec->level = pkt->data[i+2] >> 4; | |
4314 | 1321 } else if (i + 5 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x80) { // pict coding ext |
1322 sc->interlaced = !(pkt->data[i+5] & 0x80); // progressive frame | |
4313 | 1323 break; |
1324 } | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1325 } else if (c == 0x1b8) { // gop |
5080 | 1326 if (pkt->data[i+4]>>6 & 0x01) { // closed |
1327 sc->closed_gop = 1; | |
6214 | 1328 if (e->flags & 0x40) // sequence header present |
1329 e->flags |= 0x80; // random access | |
5080 | 1330 } |
4939 | 1331 if (!mxf->header_written) { |
1332 unsigned hours = (pkt->data[i+1]>>2) & 0x1f; | |
1333 unsigned minutes = ((pkt->data[i+1] & 0x03) << 4) | (pkt->data[i+2]>>4); | |
1334 unsigned seconds = ((pkt->data[i+2] & 0x07) << 3) | (pkt->data[i+3]>>5); | |
1335 unsigned frames = ((pkt->data[i+3] & 0x1f) << 1) | (pkt->data[i+4]>>7); | |
1336 mxf->timecode_drop_frame = !!(pkt->data[i+1] & 0x80); | |
1337 mxf->timecode_start = (hours*3600 + minutes*60 + seconds) * | |
1338 mxf->timecode_base + frames; | |
1339 if (mxf->timecode_drop_frame) { | |
1340 unsigned tminutes = 60 * hours + minutes; | |
1341 mxf->timecode_start -= 2 * (tminutes - tminutes / 10); | |
4449 | 1342 } |
4939 | 1343 av_log(s, AV_LOG_DEBUG, "frame %d %d:%d:%d%c%d\n", mxf->timecode_start, |
1344 hours, minutes, seconds, mxf->timecode_drop_frame ? ';':':', frames); | |
1345 } | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1346 } else if (c == 0x1b3) { // seq |
6214 | 1347 e->flags |= 0x40; |
4939 | 1348 switch ((pkt->data[i+4]>>4) & 0xf) { |
1349 case 2: sc->aspect_ratio = (AVRational){ 4, 3}; break; | |
1350 case 3: sc->aspect_ratio = (AVRational){ 16, 9}; break; | |
1351 case 4: sc->aspect_ratio = (AVRational){221,100}; break; | |
1352 default: | |
1353 av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den, | |
1354 st->codec->width, st->codec->height, 1024*1024); | |
1355 } | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1356 } else if (c == 0x100) { // pic |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1357 int pict_type = (pkt->data[i+2]>>3) & 0x07; |
6214 | 1358 e->temporal_ref = (pkt->data[i+1]<<2) | (pkt->data[i+2]>>6); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1359 if (pict_type == 2) { // P frame |
6214 | 1360 e->flags |= 0x22; |
5080 | 1361 sc->closed_gop = 0; // reset closed gop, don't matter anymore |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1362 } else if (pict_type == 3) { // B frame |
5080 | 1363 if (sc->closed_gop) |
6214 | 1364 e->flags |= 0x13; // only backward prediction |
5080 | 1365 else |
6214 | 1366 e->flags |= 0x33; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1367 sc->temporal_reordering = -1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1368 } else if (!pict_type) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1369 av_log(s, AV_LOG_ERROR, "error parsing mpeg2 frame\n"); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1370 return 0; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1371 } |
4313 | 1372 } |
1373 } | |
4473 | 1374 if (s->oformat != &mxf_d10_muxer) |
1375 sc->codec_ul = mxf_get_mpeg2_codec_ul(st->codec); | |
4313 | 1376 return !!sc->codec_ul; |
1377 } | |
1378 | |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1379 static uint64_t mxf_parse_timestamp(time_t timestamp) |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1380 { |
4716
7c99a46b3f3d
use utc time for timestamp and do not set it if not specified
bcoudurier
parents:
4713
diff
changeset
|
1381 struct tm *time = gmtime(×tamp); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1382 return (uint64_t)(time->tm_year+1900) << 48 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1383 (uint64_t)(time->tm_mon+1) << 40 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1384 (uint64_t) time->tm_mday << 32 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1385 time->tm_hour << 24 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1386 time->tm_min << 16 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1387 time->tm_sec << 8; |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1388 } |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1389 |
4696 | 1390 static void mxf_gen_umid(AVFormatContext *s) |
1391 { | |
1392 MXFContext *mxf = s->priv_data; | |
6036
201152a121b5
Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents:
5910
diff
changeset
|
1393 uint32_t seed = av_get_random_seed(); |
4696 | 1394 uint64_t umid = seed + 0x5294713400000000LL; |
1395 | |
1396 AV_WB64(mxf->umid , umid); | |
1397 AV_WB64(mxf->umid+8, umid>>8); | |
1398 | |
1399 mxf->instance_number = seed; | |
1400 } | |
1401 | |
3836 | 1402 static int mxf_write_header(AVFormatContext *s) |
3749 | 1403 { |
1404 MXFContext *mxf = s->priv_data; | |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1405 int i; |
4001 | 1406 uint8_t present[FF_ARRAY_ELEMS(mxf_essence_container_uls)] = {0}; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1407 const int *samples_per_frame = NULL; |
3816
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1408 |
4696 | 1409 if (!s->nb_streams) |
1410 return -1; | |
1411 | |
3816
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1412 for (i = 0; i < s->nb_streams; i++) { |
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1413 AVStream *st = s->streams[i]; |
3824 | 1414 MXFStreamContext *sc = av_mallocz(sizeof(*sc)); |
3816
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1415 if (!sc) |
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1416 return AVERROR(ENOMEM); |
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1417 st->priv_data = sc; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1418 |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5602
diff
changeset
|
1419 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { |
4396 | 1420 if (i != 0) { |
1421 av_log(s, AV_LOG_ERROR, "video stream must be first track\n"); | |
1422 return -1; | |
1423 } | |
4363 | 1424 if (fabs(av_q2d(st->codec->time_base) - 1/25.0) < 0.0001) { |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1425 samples_per_frame = PAL_samples_per_frame; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1426 mxf->time_base = (AVRational){ 1, 25 }; |
4448 | 1427 mxf->timecode_base = 25; |
4363 | 1428 } else if (fabs(av_q2d(st->codec->time_base) - 1001/30000.0) < 0.0001) { |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1429 samples_per_frame = NTSC_samples_per_frame; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1430 mxf->time_base = (AVRational){ 1001, 30000 }; |
4448 | 1431 mxf->timecode_base = 30; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1432 } else { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1433 av_log(s, AV_LOG_ERROR, "unsupported video frame rate\n"); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1434 return -1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1435 } |
4374 | 1436 av_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den); |
4473 | 1437 if (s->oformat == &mxf_d10_muxer) { |
1438 if (st->codec->bit_rate == 50000000) | |
1439 if (mxf->time_base.den == 25) sc->index = 3; | |
1440 else sc->index = 5; | |
1441 else if (st->codec->bit_rate == 40000000) | |
1442 if (mxf->time_base.den == 25) sc->index = 7; | |
1443 else sc->index = 9; | |
1444 else if (st->codec->bit_rate == 30000000) | |
1445 if (mxf->time_base.den == 25) sc->index = 11; | |
1446 else sc->index = 13; | |
1447 else { | |
1448 av_log(s, AV_LOG_ERROR, "error MXF D-10 only support 30/40/50 mbit/s\n"); | |
1449 return -1; | |
1450 } | |
1451 | |
1452 mxf->edit_unit_byte_count = KAG_SIZE; // system element | |
1453 mxf->edit_unit_byte_count += 16 + 4 + (uint64_t)st->codec->bit_rate * | |
1454 mxf->time_base.num / (8*mxf->time_base.den); | |
1455 mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count); | |
1456 mxf->edit_unit_byte_count += 16 + 4 + 4 + samples_per_frame[0]*8*4; | |
1457 mxf->edit_unit_byte_count += klv_fill_size(mxf->edit_unit_byte_count); | |
1458 } | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5602
diff
changeset
|
1459 } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1460 if (st->codec->sample_rate != 48000) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1461 av_log(s, AV_LOG_ERROR, "only 48khz is implemented\n"); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1462 return -1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1463 } |
4374 | 1464 av_set_pts_info(st, 64, 1, st->codec->sample_rate); |
4473 | 1465 if (s->oformat == &mxf_d10_muxer) { |
1466 if (st->index != 1) { | |
1467 av_log(s, AV_LOG_ERROR, "MXF D-10 only support one audio track\n"); | |
1468 return -1; | |
1469 } | |
1470 if (st->codec->codec_id != CODEC_ID_PCM_S16LE && | |
1471 st->codec->codec_id != CODEC_ID_PCM_S24LE) { | |
1472 av_log(s, AV_LOG_ERROR, "MXF D-10 only support 16 or 24 bits le audio\n"); | |
1473 } | |
1474 sc->index = ((MXFStreamContext*)s->streams[0]->priv_data)->index + 1; | |
1475 } else | |
4397
6d1626886974
only use 2 slices for index, one video(vbr) and one audio(cbr)
bcoudurier
parents:
4396
diff
changeset
|
1476 mxf->slice_count = 1; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1477 } |
3834 | 1478 |
4473 | 1479 if (!sc->index) { |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1480 sc->index = mxf_get_essence_container_ul_index(st->codec->codec_id); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1481 if (sc->index == -1) { |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1482 av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, " |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1483 "codec not currently supported in container\n", i); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1484 return -1; |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1485 } |
4473 | 1486 } |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1487 |
4313 | 1488 sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul; |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1489 |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1490 memcpy(sc->track_essence_element_key, mxf_essence_container_uls[sc->index].element_ul, 15); |
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1491 sc->track_essence_element_key[15] = present[sc->index]; |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
1492 PRINT_KEY(s, "track essence element key", sc->track_essence_element_key); |
4533 | 1493 |
1494 if (!present[sc->index]) | |
1495 mxf->essence_container_count++; | |
1496 present[sc->index]++; | |
3816
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1497 } |
3749 | 1498 |
4473 | 1499 if (s->oformat == &mxf_d10_muxer) { |
1500 mxf->essence_container_count = 1; | |
1501 } | |
1502 | |
4716
7c99a46b3f3d
use utc time for timestamp and do not set it if not specified
bcoudurier
parents:
4713
diff
changeset
|
1503 if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) |
4696 | 1504 mxf_gen_umid(s); |
1505 | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1506 for (i = 0; i < s->nb_streams; i++) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1507 MXFStreamContext *sc = s->streams[i]->priv_data; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1508 // update element count |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1509 sc->track_essence_element_key[13] = present[sc->index]; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1510 sc->order = AV_RB32(sc->track_essence_element_key+12); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1511 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1512 |
4716
7c99a46b3f3d
use utc time for timestamp and do not set it if not specified
bcoudurier
parents:
4713
diff
changeset
|
1513 if (s->timestamp) |
7c99a46b3f3d
use utc time for timestamp and do not set it if not specified
bcoudurier
parents:
4713
diff
changeset
|
1514 mxf->timestamp = mxf_parse_timestamp(s->timestamp); |
4448 | 1515 mxf->duration = -1; |
1516 | |
1517 mxf->timecode_track = av_mallocz(sizeof(*mxf->timecode_track)); | |
1518 if (!mxf->timecode_track) | |
1519 return AVERROR(ENOMEM); | |
1520 mxf->timecode_track->priv_data = av_mallocz(sizeof(MXFStreamContext)); | |
1521 if (!mxf->timecode_track->priv_data) | |
1522 return AVERROR(ENOMEM); | |
4529
ade95792aa16
use index 0 for timecode track and write it in source package also
bcoudurier
parents:
4528
diff
changeset
|
1523 mxf->timecode_track->index = -1; |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1524 |
4327
60bad0ded22a
do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents:
4326
diff
changeset
|
1525 if (!samples_per_frame) |
60bad0ded22a
do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents:
4326
diff
changeset
|
1526 samples_per_frame = PAL_samples_per_frame; |
60bad0ded22a
do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents:
4326
diff
changeset
|
1527 |
4374 | 1528 if (ff_audio_interleave_init(s, samples_per_frame, mxf->time_base) < 0) |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1529 return -1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1530 |
3749 | 1531 return 0; |
1532 } | |
1533 | |
4395 | 1534 static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 }; |
1535 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 }; | |
1536 | |
1537 static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps) | |
1538 { | |
1539 return (0 << 31) | // color frame flag | |
1540 (0 << 30) | // drop frame flag | |
1541 ( ((frame % fps) / 10) << 28) | // tens of frames | |
1542 ( ((frame % fps) % 10) << 24) | // units of frames | |
1543 (0 << 23) | // field phase (NTSC), b0 (PAL) | |
1544 ((((frame / fps) % 60) / 10) << 20) | // tens of seconds | |
1545 ((((frame / fps) % 60) % 10) << 16) | // units of seconds | |
1546 (0 << 15) | // b0 (NTSC), b2 (PAL) | |
1547 ((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes | |
1548 ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes | |
1549 (0 << 7) | // b1 | |
1550 (0 << 6) | // b2 (NSC), field phase (PAL) | |
1551 ((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours | |
1552 ( (frame / (fps * 3600) % 24)) % 10; // units of hours | |
1553 } | |
1554 | |
1555 static void mxf_write_system_item(AVFormatContext *s) | |
1556 { | |
1557 MXFContext *mxf = s->priv_data; | |
1558 ByteIOContext *pb = s->pb; | |
4448 | 1559 unsigned frame; |
4395 | 1560 uint32_t time_code; |
1561 | |
4449 | 1562 frame = mxf->timecode_start + mxf->last_indexed_edit_unit + mxf->edit_units_count; |
4395 | 1563 |
1564 // write system metadata pack | |
1565 put_buffer(pb, system_metadata_pack_key, 16); | |
4470
1c6dd9d7a634
write essence elements klv packets with ber4 length, more interoperable
bcoudurier
parents:
4469
diff
changeset
|
1566 klv_encode_ber4_length(pb, 57); |
4395 | 1567 put_byte(pb, 0x5c); // UL, user date/time stamp, picture and sound item present |
1568 put_byte(pb, 0x04); // content package rate | |
1569 put_byte(pb, 0x00); // content package type | |
1570 put_be16(pb, 0x00); // channel handle | |
1571 put_be16(pb, frame); // continuity count | |
1572 if (mxf->essence_container_count > 1) | |
1573 put_buffer(pb, multiple_desc_ul, 16); | |
4475 | 1574 else { |
1575 MXFStreamContext *sc = s->streams[0]->priv_data; | |
1576 put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16); | |
1577 } | |
4395 | 1578 put_byte(pb, 0); |
1579 put_be64(pb, 0); | |
1580 put_be64(pb, 0); // creation date/time stamp | |
1581 | |
1582 put_byte(pb, 0x81); // SMPTE 12M time code | |
4448 | 1583 time_code = ff_framenum_to_12m_time_code(frame, mxf->timecode_drop_frame, mxf->timecode_base); |
4395 | 1584 put_be32(pb, time_code); |
1585 put_be32(pb, 0); // binary group data | |
1586 put_be64(pb, 0); | |
1587 | |
1588 // write system metadata package set | |
1589 put_buffer(pb, system_metadata_package_set_key, 16); | |
4470
1c6dd9d7a634
write essence elements klv packets with ber4 length, more interoperable
bcoudurier
parents:
4469
diff
changeset
|
1590 klv_encode_ber4_length(pb, 35); |
4395 | 1591 put_byte(pb, 0x83); // UMID |
1592 put_be16(pb, 0x20); | |
4696 | 1593 mxf_write_umid(s, 1); |
4395 | 1594 } |
1595 | |
4473 | 1596 static void mxf_write_d10_video_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt) |
1597 { | |
1598 MXFContext *mxf = s->priv_data; | |
1599 ByteIOContext *pb = s->pb; | |
1600 int packet_size = (uint64_t)st->codec->bit_rate*mxf->time_base.num / | |
1601 (8*mxf->time_base.den); // frame size | |
1602 int pad; | |
1603 | |
1604 packet_size += 16 + 4; | |
1605 packet_size += klv_fill_size(packet_size); | |
1606 | |
1607 klv_encode_ber4_length(pb, pkt->size); | |
1608 put_buffer(pb, pkt->data, pkt->size); | |
1609 | |
1610 // ensure CBR muxing by padding to correct video frame size | |
1611 pad = packet_size - pkt->size - 16 - 4; | |
1612 if (pad > 20) { | |
1613 put_buffer(s->pb, klv_fill_key, 16); | |
1614 pad -= 16 + 4; | |
1615 klv_encode_ber4_length(s->pb, pad); | |
1616 for (; pad; pad--) | |
1617 put_byte(s->pb, 0); | |
1618 assert(!(url_ftell(s->pb) & (KAG_SIZE-1))); | |
1619 } else { | |
1620 av_log(s, AV_LOG_WARNING, "cannot fill d-10 video packet\n"); | |
1621 for (; pad > 0; pad--) | |
1622 put_byte(s->pb, 0); | |
1623 } | |
1624 } | |
1625 | |
1626 static void mxf_write_d10_audio_packet(AVFormatContext *s, AVStream *st, AVPacket *pkt) | |
1627 { | |
1628 MXFContext *mxf = s->priv_data; | |
1629 ByteIOContext *pb = s->pb; | |
4573 | 1630 int frame_size = pkt->size / st->codec->block_align; |
4473 | 1631 uint8_t *samples = pkt->data; |
1632 uint8_t *end = pkt->data + pkt->size; | |
1633 int i; | |
1634 | |
1635 klv_encode_ber4_length(pb, 4 + frame_size*4*8); | |
1636 | |
1637 put_byte(pb, (frame_size == 1920 ? 0 : (mxf->edit_units_count-1) % 5 + 1)); | |
1638 put_le16(pb, frame_size); | |
1639 put_byte(pb, (1<<st->codec->channels)-1); | |
1640 | |
1641 while (samples < end) { | |
1642 for (i = 0; i < st->codec->channels; i++) { | |
1643 uint32_t sample; | |
1644 if (st->codec->codec_id == CODEC_ID_PCM_S24LE) { | |
4571
d870b1e4b731
do not set frame start bit since marked as not used and factorize
bcoudurier
parents:
4565
diff
changeset
|
1645 sample = AV_RL24(samples)<< 4; |
4473 | 1646 samples += 3; |
1647 } else { | |
4571
d870b1e4b731
do not set frame start bit since marked as not used and factorize
bcoudurier
parents:
4565
diff
changeset
|
1648 sample = AV_RL16(samples)<<12; |
4473 | 1649 samples += 2; |
1650 } | |
4571
d870b1e4b731
do not set frame start bit since marked as not used and factorize
bcoudurier
parents:
4565
diff
changeset
|
1651 put_le32(pb, sample | i); |
4473 | 1652 } |
1653 for (; i < 8; i++) | |
4572 | 1654 put_le32(pb, i); |
4473 | 1655 } |
1656 } | |
1657 | |
3836 | 1658 static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt) |
3778 | 1659 { |
4313 | 1660 MXFContext *mxf = s->priv_data; |
3778 | 1661 ByteIOContext *pb = s->pb; |
1662 AVStream *st = s->streams[pkt->stream_index]; | |
1663 MXFStreamContext *sc = st->priv_data; | |
6214 | 1664 MXFIndexEntry ie = {0}; |
3778 | 1665 |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1666 if (!mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) { |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1667 mxf->index_entries = av_realloc(mxf->index_entries, |
4440 | 1668 (mxf->edit_units_count + EDIT_UNITS_PER_BODY)*sizeof(*mxf->index_entries)); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1669 if (!mxf->index_entries) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1670 av_log(s, AV_LOG_ERROR, "could not allocate index entries\n"); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1671 return -1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1672 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1673 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1674 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1675 if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) { |
6214 | 1676 if (!mxf_parse_mpeg2_frame(s, st, pkt, &ie)) { |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1677 av_log(s, AV_LOG_ERROR, "could not get mpeg2 profile and level\n"); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1678 return -1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1679 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1680 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1681 |
4313 | 1682 if (!mxf->header_written) { |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1683 if (mxf->edit_unit_byte_count) { |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1684 mxf_write_partition(s, 1, 2, header_open_partition_key, 1); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1685 mxf_write_klv_fill(s); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1686 mxf_write_index_table_segment(s); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1687 } else { |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1688 mxf_write_partition(s, 0, 0, header_open_partition_key, 1); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1689 } |
4313 | 1690 mxf->header_written = 1; |
1691 } | |
1692 | |
4396 | 1693 if (st->index == 0) { |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1694 if (!mxf->edit_unit_byte_count && |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1695 (!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) && |
6214 | 1696 !(ie.flags & 0x33)) { // I frame, Gop start |
4440 | 1697 mxf_write_klv_fill(s); |
1698 mxf_write_partition(s, 1, 2, body_partition_key, 0); | |
1699 | |
1700 mxf_write_klv_fill(s); | |
1701 mxf_write_index_table_segment(s); | |
1702 } | |
1703 | |
4436 | 1704 mxf_write_klv_fill(s); |
4395 | 1705 mxf_write_system_item(s); |
1706 | |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1707 if (!mxf->edit_unit_byte_count) { |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1708 mxf->index_entries[mxf->edit_units_count].offset = mxf->body_offset; |
6214 | 1709 mxf->index_entries[mxf->edit_units_count].flags = ie.flags; |
1710 mxf->index_entries[mxf->edit_units_count].temporal_ref = ie.temporal_ref; | |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1711 mxf->body_offset += KAG_SIZE; // size of system element |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1712 } |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1713 mxf->edit_units_count++; |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1714 } else if (!mxf->edit_unit_byte_count && st->index == 1) { |
4481
27fd3af46000
compute body offset and index entry offset correctly
bcoudurier
parents:
4478
diff
changeset
|
1715 mxf->index_entries[mxf->edit_units_count-1].slice_offset = |
27fd3af46000
compute body offset and index entry offset correctly
bcoudurier
parents:
4478
diff
changeset
|
1716 mxf->body_offset - mxf->index_entries[mxf->edit_units_count-1].offset; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1717 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1718 |
4435
4f96c60c9561
cosmetics, associate mxf_write_klv_fill to aligned elements
bcoudurier
parents:
4434
diff
changeset
|
1719 mxf_write_klv_fill(s); |
3778 | 1720 put_buffer(pb, sc->track_essence_element_key, 16); // write key |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1721 if (s->oformat == &mxf_d10_muxer) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5602
diff
changeset
|
1722 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1723 mxf_write_d10_video_packet(s, st, pkt); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1724 else |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1725 mxf_write_d10_audio_packet(s, st, pkt); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1726 } else { |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1727 klv_encode_ber4_length(pb, pkt->size); // write length |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1728 put_buffer(pb, pkt->data, pkt->size); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1729 mxf->body_offset += 16+4+pkt->size + klv_fill_size(16+4+pkt->size); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1730 } |
3778 | 1731 |
1732 put_flush_packet(pb); | |
4481
27fd3af46000
compute body offset and index entry offset correctly
bcoudurier
parents:
4478
diff
changeset
|
1733 |
3778 | 1734 return 0; |
1735 } | |
1736 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1737 static void mxf_write_random_index_pack(AVFormatContext *s) |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1738 { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1739 MXFContext *mxf = s->priv_data; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1740 ByteIOContext *pb = s->pb; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1741 uint64_t pos = url_ftell(pb); |
4440 | 1742 int i; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1743 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1744 put_buffer(pb, random_index_pack_key, 16); |
4440 | 1745 klv_encode_ber_length(pb, 28 + 12*mxf->body_partitions_count); |
1746 | |
4528 | 1747 if (mxf->edit_unit_byte_count) |
1748 put_be32(pb, 1); // BodySID of header partition | |
1749 else | |
4532 | 1750 put_be32(pb, 0); |
4440 | 1751 put_be64(pb, 0); // offset of header partition |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1752 |
4440 | 1753 for (i = 0; i < mxf->body_partitions_count; i++) { |
1754 put_be32(pb, 1); // BodySID | |
1755 put_be64(pb, mxf->body_partition_offset[i]); | |
1756 } | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1757 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1758 put_be32(pb, 0); // BodySID of footer partition |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1759 put_be64(pb, mxf->footer_partition_offset); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1760 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1761 put_be32(pb, url_ftell(pb) - pos + 4); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1762 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1763 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1764 static int mxf_write_footer(AVFormatContext *s) |
3740 | 1765 { |
1766 MXFContext *mxf = s->priv_data; | |
1767 ByteIOContext *pb = s->pb; | |
4393 | 1768 |
4448 | 1769 mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count; |
1770 | |
4393 | 1771 mxf_write_klv_fill(s); |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1772 mxf->footer_partition_offset = url_ftell(pb); |
4473 | 1773 if (mxf->edit_unit_byte_count) { // no need to repeat index |
1774 mxf_write_partition(s, 0, 0, footer_partition_key, 0); | |
1775 } else { | |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1776 mxf_write_partition(s, 0, 2, footer_partition_key, 0); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1777 |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1778 mxf_write_klv_fill(s); |
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1779 mxf_write_index_table_segment(s); |
4473 | 1780 } |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1781 |
4432
f8ba6cf226e7
move up mxf_write_klv_fill and align index, rip and primer pack
bcoudurier
parents:
4431
diff
changeset
|
1782 mxf_write_klv_fill(s); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1783 mxf_write_random_index_pack(s); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1784 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1785 if (!url_is_streamed(s->pb)) { |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1786 url_fseek(pb, 0, SEEK_SET); |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1787 if (mxf->edit_unit_byte_count) { |
4473 | 1788 mxf_write_partition(s, 1, 2, header_closed_partition_key, 1); |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1789 mxf_write_klv_fill(s); |
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1790 mxf_write_index_table_segment(s); |
4473 | 1791 } else { |
1792 mxf_write_partition(s, 0, 0, header_closed_partition_key, 1); | |
1793 } | |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1794 } |
4330 | 1795 |
4530 | 1796 put_flush_packet(pb); |
1797 | |
4330 | 1798 ff_audio_interleave_close(s); |
1799 | |
4402 | 1800 av_freep(&mxf->index_entries); |
4440 | 1801 av_freep(&mxf->body_partition_offset); |
4448 | 1802 av_freep(&mxf->timecode_track->priv_data); |
1803 av_freep(&mxf->timecode_track); | |
4402 | 1804 |
3749 | 1805 mxf_free(s); |
4474
cfd03b6fab13
cosmetics, reindent, add/remove some empty lines, redundant comment
bcoudurier
parents:
4473
diff
changeset
|
1806 |
3740 | 1807 return 0; |
1808 } | |
3749 | 1809 |
4328
fb0fde31327a
change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents:
4327
diff
changeset
|
1810 static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush) |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1811 { |
5602 | 1812 int i, stream_count = 0; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1813 |
5602 | 1814 for (i = 0; i < s->nb_streams; i++) |
1815 stream_count += !!s->streams[i]->last_in_packet_buffer; | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1816 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1817 if (stream_count && (s->nb_streams == stream_count || flush)) { |
5602 | 1818 AVPacketList *pktl = s->packet_buffer; |
4342 | 1819 if (s->nb_streams != stream_count) { |
4461 | 1820 AVPacketList *last = NULL; |
4500 | 1821 // find last packet in edit unit |
4342 | 1822 while (pktl) { |
4500 | 1823 if (!stream_count || pktl->pkt.stream_index == 0) |
4342 | 1824 break; |
4461 | 1825 last = pktl; |
4342 | 1826 pktl = pktl->next; |
4500 | 1827 stream_count--; |
4342 | 1828 } |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1829 // purge packet queue |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1830 while (pktl) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1831 AVPacketList *next = pktl->next; |
5210
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1832 |
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1833 if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl) |
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1834 s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1835 av_free_packet(&pktl->pkt); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1836 av_freep(&pktl); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1837 pktl = next; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1838 } |
4500 | 1839 if (last) |
1840 last->next = NULL; | |
1841 else { | |
1842 s->packet_buffer = NULL; | |
5210
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1843 s->packet_buffer_end= NULL; |
4342 | 1844 goto out; |
4500 | 1845 } |
1846 pktl = s->packet_buffer; | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1847 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1848 |
4342 | 1849 *out = pktl->pkt; |
1850 //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts); | |
1851 s->packet_buffer = pktl->next; | |
5210
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1852 if(s->streams[pktl->pkt.stream_index]->last_in_packet_buffer == pktl) |
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1853 s->streams[pktl->pkt.stream_index]->last_in_packet_buffer= NULL; |
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1854 if(!s->packet_buffer) |
36d130853c9b
Improve amortized worst case speed of the muxers packet interleaving code
michael
parents:
5093
diff
changeset
|
1855 s->packet_buffer_end= NULL; |
4342 | 1856 av_freep(&pktl); |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1857 return 1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1858 } else { |
4342 | 1859 out: |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1860 av_init_packet(out); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1861 return 0; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1862 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1863 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1864 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1865 static int mxf_compare_timestamps(AVFormatContext *s, AVPacket *next, AVPacket *pkt) |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1866 { |
4374 | 1867 MXFStreamContext *sc = s->streams[pkt ->stream_index]->priv_data; |
1868 MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data; | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1869 |
4374 | 1870 return next->dts > pkt->dts || |
1871 (next->dts == pkt->dts && sc->order < sc2->order); | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1872 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1873 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1874 static int mxf_interleave(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush) |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1875 { |
4426
7854590fb1fd
rename ff_audio_interleave to ff_audio_rechunk_interleave
bcoudurier
parents:
4408
diff
changeset
|
1876 return ff_audio_rechunk_interleave(s, out, pkt, flush, |
4400
65adb9e5214f
extract audio interleaving code from mxf muxer, will be used by gxf and dv
bcoudurier
parents:
4397
diff
changeset
|
1877 mxf_interleave_get_packet, mxf_compare_timestamps); |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1878 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1879 |
3721 | 1880 AVOutputFormat mxf_muxer = { |
1881 "mxf", | |
1882 NULL_IF_CONFIG_SMALL("Material eXchange Format"), | |
4476 | 1883 "application/mxf", |
3721 | 1884 "mxf", |
1885 sizeof(MXFContext), | |
1886 CODEC_ID_PCM_S16LE, | |
1887 CODEC_ID_MPEG2VIDEO, | |
3836 | 1888 mxf_write_header, |
1889 mxf_write_packet, | |
1890 mxf_write_footer, | |
4350 | 1891 AVFMT_NOTIMESTAMPS, |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1892 NULL, |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1893 mxf_interleave, |
3721 | 1894 }; |
4473 | 1895 |
1896 AVOutputFormat mxf_d10_muxer = { | |
1897 "mxf_d10", | |
1898 NULL_IF_CONFIG_SMALL("Material eXchange Format, D-10 Mapping"), | |
1899 "application/mxf", | |
1900 NULL, | |
1901 sizeof(MXFContext), | |
1902 CODEC_ID_PCM_S16LE, | |
1903 CODEC_ID_MPEG2VIDEO, | |
1904 mxf_write_header, | |
4504
c0803ee07a93
merge mxf_write_d10_packet into mxf_write_packet
bcoudurier
parents:
4500
diff
changeset
|
1905 mxf_write_packet, |
4473 | 1906 mxf_write_footer, |
1907 AVFMT_NOTIMESTAMPS, | |
1908 NULL, | |
1909 mxf_interleave, | |
1910 }; |