Mercurial > libavformat.hg
annotate mxfenc.c @ 4387:5c42816e12c6 libavformat
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This
allows these functions to peek back and retrieve values from the demuxer's
context (or RTSPState). The ASF/RTP payload parser will use this to be able
to parse SDP values (which occur even before the payload ID is given), store
them in the RTSPState and then retrieve them while parsing payload data. See
"[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet()
function pointer (was: transport context)" mailinglist thread.
author | rbultje |
---|---|
date | Fri, 06 Feb 2009 01:37:19 +0000 |
parents | e8e064a00ea5 |
children | 87a896580005 |
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 |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
38 #include "libavutil/fifo.h" |
3735 | 39 #include "mxf.h" |
40 | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
41 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
|
42 static const int PAL_samples_per_frame[] = { 1920, 0 }; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
43 |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
44 #define MXF_INDEX_CLUSTER_SIZE 4096 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
45 |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
46 typedef struct { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
47 AVFifoBuffer fifo; |
4323 | 48 unsigned fifo_size; ///< current fifo size allocated |
49 uint64_t dts; ///< current dts | |
50 int sample_size; ///< size of one sample all channels included | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
51 const int *samples_per_frame; ///< must be 0 terminated |
4323 | 52 const int *samples; ///< current samples per frame, pointer to samples_per_frame |
4374 | 53 AVRational time_base; ///< time base of output audio packets |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
54 } AudioInterleaveContext; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
55 |
3735 | 56 typedef struct { |
57 int local_tag; | |
58 UID uid; | |
59 } MXFLocalTagPair; | |
60 | |
3740 | 61 typedef struct { |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
62 uint8_t flags; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
63 uint64_t offset; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
64 unsigned slice_offset[17]; // one video, 16 audio |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
65 } MXFIndexEntry; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
66 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
67 typedef struct { |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
68 AudioInterleaveContext aic; |
3740 | 69 UID track_essence_element_key; |
4324 | 70 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
|
71 const UID *codec_ul; |
3834 | 72 int64_t duration; |
4323 | 73 int order; ///< interleaving order if dts are equal |
74 int interlaced; ///< wether picture is interlaced | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
75 int temporal_reordering; |
3740 | 76 } MXFStreamContext; |
77 | |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
78 typedef struct { |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
79 UID container_ul; |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
80 UID element_ul; |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
81 UID codec_ul; |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
82 void (*write_desc)(); |
3847 | 83 } MXFContainerEssenceEntry; |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
84 |
4345 | 85 static const struct { |
86 enum CodecID id; | |
87 int index; | |
88 } mxf_essence_mappings[] = { | |
89 { CODEC_ID_MPEG2VIDEO, 0 }, | |
4346 | 90 { CODEC_ID_PCM_S24LE, 1 }, |
4345 | 91 { CODEC_ID_PCM_S16LE, 1 }, |
92 { 0 } | |
93 }; | |
94 | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
95 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st); |
4320 | 96 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
|
97 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st); |
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 }, |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
112 { { 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
|
113 { 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
|
114 { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, |
4345 | 115 NULL }, |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
116 }; |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
117 |
3740 | 118 typedef struct MXFContext { |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
119 int64_t footer_partition_offset; |
3740 | 120 int essence_container_count; |
4001 | 121 uint8_t essence_containers_indices[FF_ARRAY_ELEMS(mxf_essence_container_uls)]; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
122 AVRational time_base; |
4313 | 123 int header_written; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
124 MXFIndexEntry *index_entries; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
125 unsigned edit_units_count; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
126 int edit_unit_start; ///< index of the stream starting edit unit |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
127 uint64_t timestamp; ///< timestamp, as year(16),month(8),day(8),hour(8),minutes(8),msec/4(8) |
3740 | 128 } MXFContext; |
3743 | 129 |
3735 | 130 static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd }; |
4012
2040c6c46c3c
fix umid base value, use revision 5 and generic material type
bcoudurier
parents:
4011
diff
changeset
|
131 static const uint8_t umid_base[] = { 0x06,0x0A,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x01,0x0D,0x00,0x13,0x00,0x00,0x00 }; |
3735 | 132 |
133 /** | |
134 * complete key for operation pattern, partitions, and primer pack | |
135 */ | |
4351 | 136 static const uint8_t op1a_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x01,0x01,0x00 }; |
137 static const uint8_t footer_partition_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x04,0x04,0x00 }; // ClosedComplete | |
138 static const uint8_t primer_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }; | |
139 static const uint8_t index_table_segment_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }; | |
140 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 | 141 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 |
142 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 | |
143 | |
3743 | 144 /** |
145 * partial key for header metadata | |
146 */ | |
147 static const uint8_t header_metadata_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01 }; | |
4351 | 148 static const uint8_t multiple_desc_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x0D,0x01,0x03,0x01,0x02,0x7F,0x01,0x00 }; |
3743 | 149 |
3749 | 150 /** |
151 * SMPTE RP210 http://www.smpte-ra.org/mdd/index.html | |
152 */ | |
153 static const MXFLocalTagPair mxf_local_tag_batch[] = { | |
154 // preface set | |
155 { 0x3C0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x02,0x00,0x00,0x00,0x00}}, /* Instance UID */ | |
156 { 0x3B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x04,0x00,0x00}}, /* Last Modified Date */ | |
157 { 0x3B05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x01,0x02,0x01,0x05,0x00,0x00,0x00}}, /* Version */ | |
158 { 0x3B06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x04,0x00,0x00}}, /* Identifications reference */ | |
159 { 0x3B03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x01,0x00,0x00}}, /* Content Storage reference */ | |
160 { 0x3B09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x03,0x00,0x00,0x00,0x00}}, /* Operational Pattern UL */ | |
161 { 0x3B0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x01,0x00,0x00}}, /* Essence Containers UL batch */ | |
162 { 0x3B0B, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x01,0x02,0x02,0x10,0x02,0x02,0x00,0x00}}, /* DM Schemes UL batch */ | |
163 // Identification | |
164 { 0x3C09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x01,0x00,0x00,0x00}}, /* This Generation UID */ | |
165 { 0x3C01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x02,0x01,0x00,0x00}}, /* Company Name */ | |
166 { 0x3C02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x03,0x01,0x00,0x00}}, /* Product Name */ | |
3792 | 167 { 0x3C04, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x05,0x01,0x00,0x00}}, /* Version String */ |
3749 | 168 { 0x3C05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x20,0x07,0x01,0x07,0x00,0x00,0x00}}, /* Product ID */ |
169 { 0x3C06, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x03,0x00,0x00}}, /* Modification Date */ | |
170 // Content Storage | |
171 { 0x1901, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x01,0x00,0x00}}, /* Package strong reference batch */ | |
4279 | 172 { 0x1902, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x05,0x02,0x00,0x00}}, /* Package strong reference batch */ |
3749 | 173 // Essence Container Data |
174 { 0x2701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x06,0x01,0x00,0x00,0x00}}, /* Linked Package UID */ | |
175 { 0x3F07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x01,0x03,0x04,0x04,0x00,0x00,0x00,0x00}}, /* BodySID */ | |
176 // Package | |
177 { 0x4401, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x10,0x00,0x00,0x00,0x00}}, /* Package UID */ | |
178 { 0x4405, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x01,0x03,0x00,0x00}}, /* Package Creation Date */ | |
179 { 0x4404, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x10,0x02,0x05,0x00,0x00}}, /* Package Modified Date */ | |
180 { 0x4403, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x05,0x00,0x00}}, /* Tracks Strong reference array */ | |
181 { 0x4701, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x03,0x00,0x00}}, /* Descriptor */ | |
182 // Track | |
183 { 0x4801, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00}}, /* Track ID */ | |
3827 | 184 { 0x4804, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x01,0x04,0x01,0x03,0x00,0x00,0x00,0x00}}, /* Track Number */ |
3749 | 185 { 0x4B01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x05,0x30,0x04,0x05,0x00,0x00,0x00,0x00}}, /* Edit Rate */ |
186 { 0x4B02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x01,0x03,0x01,0x03,0x00,0x00}}, /* Origin */ | |
187 { 0x4803, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x02,0x04,0x00,0x00}}, /* Sequence reference */ | |
188 // Sequence | |
189 { 0x0201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x07,0x01,0x00,0x00,0x00,0x00,0x00}}, /* Data Definition UL */ | |
190 { 0x0202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x07,0x02,0x02,0x01,0x01,0x03,0x00,0x00}}, /* Duration */ | |
191 { 0x1001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x06,0x09,0x00,0x00}}, /* Structural Components reference array */ | |
192 // Source Clip | |
4010 | 193 { 0x1201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x01,0x03,0x01,0x04,0x00,0x00}}, /* Start position */ |
3749 | 194 { 0x1101, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x01,0x00,0x00,0x00}}, /* SourcePackageID */ |
195 { 0x1102, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x03,0x02,0x00,0x00,0x00}}, /* SourceTrackID */ | |
3794 | 196 // File Descriptor |
197 { 0x3F01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x04,0x06,0x0B,0x00,0x00}}, /* Sub Descriptors reference array */ | |
3749 | 198 { 0x3006, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x06,0x01,0x01,0x03,0x05,0x00,0x00,0x00}}, /* Linked Track ID */ |
199 { 0x3001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x06,0x01,0x01,0x00,0x00,0x00,0x00}}, /* SampleRate */ | |
3794 | 200 { 0x3004, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x06,0x01,0x01,0x04,0x01,0x02,0x00,0x00}}, /* Essence Container */ |
201 // Generic Picture Essence Descriptor | |
4321 | 202 { 0x320C, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Frame Layout */ |
4322 | 203 { 0x320D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x03,0x02,0x05,0x00,0x00,0x00}}, /* Video Line Map */ |
3794 | 204 { 0x3203, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x02,0x00,0x00,0x00}}, /* Stored Width */ |
205 { 0x3202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x02,0x01,0x00,0x00,0x00}}, /* Stored Height */ | |
4335 | 206 { 0x3209, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0C,0x00,0x00,0x00}}, /* Display Width */ |
207 { 0x3208, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x05,0x01,0x0B,0x00,0x00,0x00}}, /* Display Height */ | |
3794 | 208 { 0x320E, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x00,0x00,0x00}}, /* Aspect Ratio */ |
209 { 0x3201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x04,0x01,0x06,0x01,0x00,0x00,0x00,0x00}}, /* Picture Essence Coding */ | |
210 // Generic Sound Essence Descriptor | |
4318 | 211 { 0x3D02, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x04,0x00,0x00,0x00}}, /* Locked/Unlocked */ |
3794 | 212 { 0x3D03, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x01,0x01,0x01,0x00,0x00}}, /* Audio sampling rate */ |
213 { 0x3D07, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x01,0x01,0x04,0x00,0x00,0x00}}, /* ChannelCount */ | |
214 { 0x3D01, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x04,0x02,0x03,0x03,0x04,0x00,0x00,0x00}}, /* Quantization bits */ | |
4011 | 215 { 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
|
216 // Index Table Segment |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
217 { 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
|
218 { 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
|
219 { 0x3F0D, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x07,0x02,0x02,0x01,0x01,0x02,0x00,0x00}}, /* Index Duration */ |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
220 { 0x3F05, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x04,0x06,0x02,0x01,0x00,0x00,0x00,0x00,0x00}}, /* Edit Unit Byte Count */ |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
221 { 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
|
222 { 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
|
223 { 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
|
224 { 0x3F0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x04,0x04,0x02,0x05,0x00,0x00,0x00}}, /* Index Entry Array */ |
4336 | 225 // MPEG video Descriptor |
226 { 0x8000, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x01,0x06,0x02,0x01,0x0B,0x00,0x00}}, /* BitRate */ | |
4339 | 227 // Wave Audio Essence Descriptor |
228 { 0x3D09, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x03,0x05,0x00,0x00,0x00}}, /* Average Bytes Per Second */ | |
229 { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */ | |
3749 | 230 }; |
231 | |
3844 | 232 static void mxf_write_uuid(ByteIOContext *pb, enum MXFMetadataSetType type, int value) |
3735 | 233 { |
234 put_buffer(pb, uuid_base, 12); | |
235 put_be16(pb, type); | |
236 put_be16(pb, value); | |
237 } | |
238 | |
3844 | 239 static void mxf_write_umid(ByteIOContext *pb, enum MXFMetadataSetType type, int value) |
3740 | 240 { |
241 put_buffer(pb, umid_base, 16); | |
242 mxf_write_uuid(pb, type, value); | |
243 } | |
3743 | 244 |
245 static void mxf_write_refs_count(ByteIOContext *pb, int ref_count) | |
246 { | |
247 put_be32(pb, ref_count); | |
248 put_be32(pb, 16); | |
249 } | |
250 | |
3735 | 251 static int klv_encode_ber_length(ByteIOContext *pb, uint64_t len) |
252 { | |
253 // Determine the best BER size | |
254 int size; | |
255 if (len < 128) { | |
256 //short form | |
257 put_byte(pb, len); | |
258 return 1; | |
259 } | |
260 | |
261 size = (av_log2(len) >> 3) + 1; | |
262 | |
263 // long form | |
264 put_byte(pb, 0x80 + size); | |
265 while(size) { | |
4351 | 266 size--; |
3735 | 267 put_byte(pb, len >> 8 * size & 0xff); |
268 } | |
269 return 0; | |
270 } | |
271 | |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
272 /* |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
273 * Get essence container ul index |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
274 */ |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
275 static int mxf_get_essence_container_ul_index(enum CodecID id) |
3721 | 276 { |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
277 int i; |
4345 | 278 for (i = 0; mxf_essence_mappings[i].id; i++) |
279 if (mxf_essence_mappings[i].id == id) | |
280 return mxf_essence_mappings[i].index; | |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
281 return -1; |
3721 | 282 } |
283 | |
3749 | 284 static void mxf_write_primer_pack(AVFormatContext *s) |
3735 | 285 { |
286 ByteIOContext *pb = s->pb; | |
287 int local_tag_number, i = 0; | |
288 | |
4001 | 289 local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch); |
3735 | 290 |
291 put_buffer(pb, primer_pack_key, 16); | |
292 klv_encode_ber_length(pb, local_tag_number * 18 + 8); | |
293 | |
294 put_be32(pb, local_tag_number); // local_tag num | |
295 put_be32(pb, 18); // item size, always 18 according to the specs | |
296 | |
297 for (i = 0; i < local_tag_number; i++) { | |
298 put_be16(pb, mxf_local_tag_batch[i].local_tag); | |
299 put_buffer(pb, mxf_local_tag_batch[i].uid, 16); | |
300 } | |
301 } | |
302 | |
3815 | 303 static void mxf_write_local_tag(ByteIOContext *pb, int size, int tag) |
3735 | 304 { |
305 put_be16(pb, tag); | |
3815 | 306 put_be16(pb, size); |
3735 | 307 } |
308 | |
3740 | 309 static void mxf_write_metadata_key(ByteIOContext *pb, unsigned int value) |
310 { | |
311 put_buffer(pb, header_metadata_key, 13); | |
312 put_be24(pb, value); | |
313 } | |
314 | |
3721 | 315 static void mxf_free(AVFormatContext *s) |
316 { | |
317 int i; | |
318 | |
319 for (i = 0; i < s->nb_streams; i++) { | |
3823 | 320 AVStream *st = s->streams[i]; |
3721 | 321 av_freep(&st->priv_data); |
322 } | |
323 } | |
324 | |
325 static const MXFDataDefinitionUL *mxf_get_data_definition_ul(enum CodecType type) | |
326 { | |
3735 | 327 const MXFDataDefinitionUL *uls = ff_mxf_data_definition_uls; |
3721 | 328 while (uls->type != CODEC_TYPE_DATA) { |
329 if (type == uls->type) | |
330 break; | |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
331 uls++; |
3721 | 332 } |
333 return uls; | |
334 } | |
335 | |
3821 | 336 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
|
337 { |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
338 MXFContext *c = s->priv_data; |
3780
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
339 ByteIOContext *pb = s->pb; |
3818
ae0d01b63679
compute essence containers in mxf_write_header, this simplifies the code
bcoudurier
parents:
3817
diff
changeset
|
340 int i; |
3780
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
341 |
3822 | 342 mxf_write_refs_count(pb, c->essence_container_count); |
343 av_log(s,AV_LOG_DEBUG, "essence container count:%d\n", c->essence_container_count); | |
344 for (i = 0; i < c->essence_container_count; i++) { | |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
345 put_buffer(pb, mxf_essence_container_uls[c->essence_containers_indices[i]].container_ul, 16); |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
346 PRINT_KEY(s, "essence container ul:\n", mxf_essence_container_uls[c->essence_containers_indices[i]].container_ul); |
3822 | 347 } |
3780
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
348 } |
261cd3e672e5
Remaining parts of GSoC MXF muxer by Zhentan Feng.
cehoyos
parents:
3778
diff
changeset
|
349 |
3749 | 350 static void mxf_write_preface(AVFormatContext *s) |
351 { | |
352 MXFContext *mxf = s->priv_data; | |
353 ByteIOContext *pb = s->pb; | |
354 | |
355 mxf_write_metadata_key(pb, 0x012f00); | |
356 PRINT_KEY(s, "preface key", pb->buf_ptr - 16); | |
357 klv_encode_ber_length(pb, 130 + 16 * mxf->essence_container_count); | |
358 | |
359 // write preface set uid | |
360 mxf_write_local_tag(pb, 16, 0x3C0A); | |
361 mxf_write_uuid(pb, Preface, 0); | |
362 PRINT_KEY(s, "preface uid", pb->buf_ptr - 16); | |
363 | |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
364 // last modified date |
3749 | 365 mxf_write_local_tag(pb, 8, 0x3B02); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
366 put_be64(pb, mxf->timestamp); |
3749 | 367 |
368 // write version | |
369 mxf_write_local_tag(pb, 2, 0x3B05); | |
370 put_be16(pb, 1); | |
371 | |
372 // write identification_refs | |
373 mxf_write_local_tag(pb, 16 + 8, 0x3B06); | |
374 mxf_write_refs_count(pb, 1); | |
375 mxf_write_uuid(pb, Identification, 0); | |
376 | |
377 // write content_storage_refs | |
378 mxf_write_local_tag(pb, 16, 0x3B03); | |
379 mxf_write_uuid(pb, ContentStorage, 0); | |
380 | |
381 mxf_write_local_tag(pb, 16, 0x3B09); | |
382 put_buffer(pb, op1a_ul, 16); | |
383 | |
384 // write essence_container_refs | |
385 mxf_write_local_tag(pb, 8 + 16 * mxf->essence_container_count, 0x3B0A); | |
3821 | 386 mxf_write_essence_container_refs(s); |
3749 | 387 |
388 // write dm_scheme_refs | |
389 mxf_write_local_tag(pb, 8, 0x3B0B); | |
390 put_be64(pb, 0); | |
391 } | |
392 | |
3804 | 393 /* |
3806
fa043e93fc66
introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents:
3805
diff
changeset
|
394 * Write a local tag containing an ascii string as utf-16 |
3804 | 395 */ |
3806
fa043e93fc66
introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents:
3805
diff
changeset
|
396 static void mxf_write_local_tag_utf16(ByteIOContext *pb, int tag, const char *value) |
3804 | 397 { |
3805
d8a6432c76f3
use strlen and do not write useless trailing 0 according to specs
bcoudurier
parents:
3804
diff
changeset
|
398 int i, size = strlen(value); |
3806
fa043e93fc66
introduce mxf_write_local_tag_utf16 and factorize
bcoudurier
parents:
3805
diff
changeset
|
399 mxf_write_local_tag(pb, size*2, tag); |
3804 | 400 for (i = 0; i < size; i++) |
401 put_be16(pb, value[i]); | |
402 } | |
403 | |
3749 | 404 static void mxf_write_identification(AVFormatContext *s) |
405 { | |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
406 MXFContext *mxf = s->priv_data; |
3749 | 407 ByteIOContext *pb = s->pb; |
3810 | 408 const char *company = "FFmpeg"; |
409 const char *product = "OP1a Muxer"; | |
3807 | 410 const char *version; |
3810 | 411 int length; |
3749 | 412 |
413 mxf_write_metadata_key(pb, 0x013000); | |
414 PRINT_KEY(s, "identification key", pb->buf_ptr - 16); | |
415 | |
3808 | 416 version = s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT ? |
3809 | 417 "0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION); |
3810 | 418 length = 84 + (strlen(company)+strlen(product)+strlen(version))*2; // utf-16 |
3749 | 419 klv_encode_ber_length(pb, length); |
420 | |
421 // write uid | |
422 mxf_write_local_tag(pb, 16, 0x3C0A); | |
423 mxf_write_uuid(pb, Identification, 0); | |
424 PRINT_KEY(s, "identification uid", pb->buf_ptr - 16); | |
3811 | 425 |
3749 | 426 // write generation uid |
427 mxf_write_local_tag(pb, 16, 0x3C09); | |
428 mxf_write_uuid(pb, Identification, 1); | |
429 | |
3810 | 430 mxf_write_local_tag_utf16(pb, 0x3C01, company); // Company Name |
431 mxf_write_local_tag_utf16(pb, 0x3C02, product); // Product Name | |
3807 | 432 mxf_write_local_tag_utf16(pb, 0x3C04, version); // Version String |
3749 | 433 |
434 // write product uid | |
435 mxf_write_local_tag(pb, 16, 0x3C05); | |
436 mxf_write_uuid(pb, Identification, 2); | |
437 | |
4384 | 438 // modification date |
3749 | 439 mxf_write_local_tag(pb, 8, 0x3C06); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
440 put_be64(pb, mxf->timestamp); |
3749 | 441 } |
442 | |
443 static void mxf_write_content_storage(AVFormatContext *s) | |
444 { | |
445 ByteIOContext *pb = s->pb; | |
446 | |
447 mxf_write_metadata_key(pb, 0x011800); | |
448 PRINT_KEY(s, "content storage key", pb->buf_ptr - 16); | |
4279 | 449 klv_encode_ber_length(pb, 92); |
3749 | 450 |
451 // write uid | |
452 mxf_write_local_tag(pb, 16, 0x3C0A); | |
453 mxf_write_uuid(pb, ContentStorage, 0); | |
454 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
|
455 |
3749 | 456 // write package reference |
457 mxf_write_local_tag(pb, 16 * 2 + 8, 0x1901); | |
458 mxf_write_refs_count(pb, 2); | |
459 mxf_write_uuid(pb, MaterialPackage, 0); | |
460 mxf_write_uuid(pb, SourcePackage, 0); | |
4279 | 461 |
462 // write essence container data | |
463 mxf_write_local_tag(pb, 8 + 16, 0x1902); | |
464 mxf_write_refs_count(pb, 1); | |
465 mxf_write_uuid(pb, EssenceContainerData, 0); | |
3749 | 466 } |
467 | |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
468 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
|
469 { |
4374 | 470 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
|
471 ByteIOContext *pb = s->pb; |
3823 | 472 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
|
473 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
474 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
|
475 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
|
476 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
|
477 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
478 // write track uid |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
479 mxf_write_local_tag(pb, 16, 0x3C0A); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
480 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
|
481 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
|
482 |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
483 // write track id |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
484 mxf_write_local_tag(pb, 4, 0x4801); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
485 put_be32(pb, st->index); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
486 |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
487 // write track number |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
488 mxf_write_local_tag(pb, 4, 0x4804); |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
489 if (type == MaterialPackage) |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
490 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
|
491 else |
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
492 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
|
493 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
494 mxf_write_local_tag(pb, 8, 0x4B01); |
4374 | 495 put_be32(pb, mxf->time_base.den); |
496 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
|
497 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
498 // write origin |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
499 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
|
500 put_be64(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
501 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
502 // write sequence refs |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
503 mxf_write_local_tag(pb, 16, 0x4803); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
504 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
|
505 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
506 |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
507 static void mxf_write_common_fields(ByteIOContext *pb, AVStream *st) |
3743 | 508 { |
3823 | 509 const MXFDataDefinitionUL *data_def_ul = mxf_get_data_definition_ul(st->codec->codec_type); |
3834 | 510 MXFStreamContext *sc = st->priv_data; |
511 | |
3743 | 512 // find data define uls |
513 mxf_write_local_tag(pb, 16, 0x0201); | |
514 put_buffer(pb, data_def_ul->uid, 16); | |
515 | |
516 // write duration | |
517 mxf_write_local_tag(pb, 8, 0x0202); | |
3834 | 518 put_be64(pb, sc->duration); |
3743 | 519 } |
520 | |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
521 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
|
522 { |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
523 ByteIOContext *pb = s->pb; |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
524 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
525 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
|
526 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
|
527 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
|
528 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
529 mxf_write_local_tag(pb, 16, 0x3C0A); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
530 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
|
531 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
532 PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
533 mxf_write_common_fields(pb, st); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
534 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
535 // write structural component |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
536 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
|
537 mxf_write_refs_count(pb, 1); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
538 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
|
539 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
540 |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
541 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
|
542 { |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
543 ByteIOContext *pb = s->pb; |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
544 int i; |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
545 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
546 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
|
547 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
|
548 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
|
549 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
550 // write uid |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
551 mxf_write_local_tag(pb, 16, 0x3C0A); |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
552 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
|
553 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
554 PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
555 mxf_write_common_fields(pb, st); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
556 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
557 // write start_position |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
558 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
|
559 put_be64(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
560 |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
561 // 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
|
562 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
|
563 if (type == SourcePackage) { |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
564 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
|
565 put_be64(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
566 } else |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
567 mxf_write_umid(pb, SourcePackage, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
568 |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
569 // write source track id |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
570 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
|
571 if (type == SourcePackage) |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
572 put_be32(pb, 0); |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
573 else |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
574 put_be32(pb, st->index); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
575 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
576 |
3749 | 577 static void mxf_write_multi_descriptor(AVFormatContext *s) |
578 { | |
4376 | 579 MXFContext *mxf = s->priv_data; |
3749 | 580 ByteIOContext *pb = s->pb; |
581 int i; | |
582 | |
583 mxf_write_metadata_key(pb, 0x014400); | |
584 PRINT_KEY(s, "multiple descriptor key", pb->buf_ptr - 16); | |
585 klv_encode_ber_length(pb, 64 + 16 * s->nb_streams); | |
586 | |
587 mxf_write_local_tag(pb, 16, 0x3C0A); | |
588 mxf_write_uuid(pb, MultipleDescriptor, 0); | |
589 PRINT_KEY(s, "multi_desc uid", pb->buf_ptr - 16); | |
590 | |
591 // write sample rate | |
592 mxf_write_local_tag(pb, 8, 0x3001); | |
4376 | 593 put_be32(pb, mxf->time_base.den); |
594 put_be32(pb, mxf->time_base.num); | |
3749 | 595 |
596 // write essence container ul | |
597 mxf_write_local_tag(pb, 16, 0x3004); | |
598 put_buffer(pb, multiple_desc_ul, 16); | |
599 | |
600 // write sub descriptor refs | |
601 mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x3F01); | |
602 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
|
603 for (i = 0; i < s->nb_streams; i++) |
3749 | 604 mxf_write_uuid(pb, SubDescriptor, i); |
605 } | |
606 | |
4376 | 607 static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size) |
3743 | 608 { |
4376 | 609 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
|
610 MXFStreamContext *sc = st->priv_data; |
4376 | 611 ByteIOContext *pb = s->pb; |
3743 | 612 |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
613 put_buffer(pb, key, 16); |
4315 | 614 klv_encode_ber_length(pb, size); |
3743 | 615 |
616 mxf_write_local_tag(pb, 16, 0x3C0A); | |
617 mxf_write_uuid(pb, SubDescriptor, st->index); | |
618 | |
619 mxf_write_local_tag(pb, 4, 0x3006); | |
620 put_be32(pb, st->index); | |
621 | |
3749 | 622 mxf_write_local_tag(pb, 8, 0x3001); |
4376 | 623 put_be32(pb, mxf->time_base.den); |
624 put_be32(pb, mxf->time_base.num); | |
3749 | 625 |
3743 | 626 mxf_write_local_tag(pb, 16, 0x3004); |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
627 put_buffer(pb, mxf_essence_container_uls[sc->index].container_ul, 16); |
3743 | 628 } |
629 | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
630 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
|
631 static const UID mxf_wav_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }; |
4320 | 632 static const UID mxf_aes3_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }; |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
633 |
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
634 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st) |
3743 | 635 { |
4316 | 636 MXFStreamContext *sc = st->priv_data; |
3743 | 637 ByteIOContext *pb = s->pb; |
4277 | 638 int stored_height = (st->codec->height+15)/16*16; |
4278 | 639 AVRational dar; |
4322 | 640 int f1, f2; |
3743 | 641 |
4376 | 642 mxf_write_generic_desc(s, st, mxf_mpegvideo_descriptor_key, 153+sc->interlaced*4); |
3743 | 643 |
644 mxf_write_local_tag(pb, 4, 0x3203); | |
645 put_be32(pb, st->codec->width); | |
646 | |
647 mxf_write_local_tag(pb, 4, 0x3202); | |
4316 | 648 put_be32(pb, stored_height>>sc->interlaced); |
3743 | 649 |
4335 | 650 mxf_write_local_tag(pb, 4, 0x3209); |
651 put_be32(pb, st->codec->width); | |
652 | |
653 mxf_write_local_tag(pb, 4, 0x3208); | |
654 put_be32(pb, st->codec->height>>sc->interlaced); | |
655 | |
4336 | 656 // bit rate |
657 mxf_write_local_tag(pb, 4, 0x8000); | |
658 put_be32(pb, st->codec->bit_rate); | |
659 | |
4321 | 660 // frame layout |
661 mxf_write_local_tag(pb, 1, 0x320C); | |
662 put_byte(pb, sc->interlaced); | |
663 | |
4322 | 664 // video line map |
665 switch (st->codec->height) { | |
666 case 576: f1 = 23; f2 = 336; break; | |
667 case 608: f1 = 7; f2 = 320; break; | |
668 case 480: f1 = 20; f2 = 283; break; | |
669 case 512: f1 = 7; f2 = 270; break; | |
670 case 720: f1 = 26; f2 = 0; break; // progressive | |
671 case 1080: f1 = 21; f2 = 584; break; | |
672 default: f1 = 0; f2 = 0; break; | |
673 } | |
674 | |
675 if (!sc->interlaced) { | |
676 f2 = 0; | |
677 f1 *= 2; | |
678 } | |
679 | |
4343 | 680 mxf_write_local_tag(pb, 12+sc->interlaced*4, 0x320D); |
4337 | 681 put_be32(pb, sc->interlaced ? 2 : 1); |
682 put_be32(pb, 4); | |
4322 | 683 put_be32(pb, f1); |
4337 | 684 if (sc->interlaced) |
685 put_be32(pb, f2); | |
4322 | 686 |
4278 | 687 av_reduce(&dar.num, &dar.den, |
688 st->codec->width*st->codec->sample_aspect_ratio.num, | |
689 st->codec->height*st->codec->sample_aspect_ratio.den, | |
690 1024*1024); | |
691 | |
3743 | 692 mxf_write_local_tag(pb, 8, 0x320E); |
4278 | 693 put_be32(pb, dar.num); |
694 put_be32(pb, dar.den); | |
4317
b978795a9e37
local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents:
4316
diff
changeset
|
695 |
b978795a9e37
local tag 3201 is picture essence coding, so do not write it for wav
bcoudurier
parents:
4316
diff
changeset
|
696 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
|
697 put_buffer(pb, *sc->codec_ul, 16); |
3743 | 698 } |
699 | |
4319 | 700 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size) |
3743 | 701 { |
702 ByteIOContext *pb = s->pb; | |
703 | |
4376 | 704 mxf_write_generic_desc(s, st, key, size); |
4318 | 705 |
4319 | 706 // audio locked |
4318 | 707 mxf_write_local_tag(pb, 1, 0x3D02); |
708 put_byte(pb, 1); | |
3743 | 709 |
710 // write audio sampling rate | |
711 mxf_write_local_tag(pb, 8, 0x3D03); | |
712 put_be32(pb, st->codec->sample_rate); | |
713 put_be32(pb, 1); | |
714 | |
715 mxf_write_local_tag(pb, 4, 0x3D07); | |
716 put_be32(pb, st->codec->channels); | |
717 | |
718 mxf_write_local_tag(pb, 4, 0x3D01); | |
4346 | 719 put_be32(pb, av_get_bits_per_sample(st->codec->codec_id)); |
3743 | 720 } |
721 | |
4340 | 722 static void mxf_write_wav_common_desc(AVFormatContext *s, AVStream *st, const UID key, unsigned size) |
4319 | 723 { |
4339 | 724 ByteIOContext *pb = s->pb; |
725 | |
4340 | 726 mxf_write_generic_sound_desc(s, st, key, size); |
4339 | 727 |
728 mxf_write_local_tag(pb, 2, 0x3D0A); | |
729 put_be16(pb, st->codec->block_align); | |
730 | |
731 // avg bytes per sec | |
732 mxf_write_local_tag(pb, 4, 0x3D09); | |
733 put_be32(pb, st->codec->block_align*st->codec->sample_rate); | |
4319 | 734 } |
735 | |
4340 | 736 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st) |
737 { | |
738 mxf_write_wav_common_desc(s, st, mxf_wav_descriptor_key, 107); | |
739 } | |
740 | |
4320 | 741 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st) |
742 { | |
4340 | 743 mxf_write_wav_common_desc(s, st, mxf_aes3_descriptor_key, 107); |
4320 | 744 } |
745 | |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
746 static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type) |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
747 { |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
748 MXFContext *mxf = s->priv_data; |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
749 ByteIOContext *pb = s->pb; |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
750 int i; |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
751 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
752 if (type == MaterialPackage) { |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
753 mxf_write_metadata_key(pb, 0x013600); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
754 PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
755 klv_encode_ber_length(pb, 92 + 16 * s->nb_streams); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
756 } else { |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
757 mxf_write_metadata_key(pb, 0x013700); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
758 PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
759 klv_encode_ber_length(pb, 112 + 16 * s->nb_streams); // 20 bytes length for descriptor reference |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
760 } |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
761 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
762 // write uid |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
763 mxf_write_local_tag(pb, 16, 0x3C0A); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
764 mxf_write_uuid(pb, type, 0); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
765 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
|
766 PRINT_KEY(s, "package uid", pb->buf_ptr - 16); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
767 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
768 // write package umid |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
769 mxf_write_local_tag(pb, 32, 0x4401); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
770 mxf_write_umid(pb, type, 0); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
771 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
|
772 |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
773 // package creation date |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
774 mxf_write_local_tag(pb, 8, 0x4405); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
775 put_be64(pb, mxf->timestamp); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
776 |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
777 // package modified date |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
778 mxf_write_local_tag(pb, 8, 0x4404); |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
779 put_be64(pb, mxf->timestamp); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
780 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
781 // write track refs |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
782 mxf_write_local_tag(pb, s->nb_streams * 16 + 8, 0x4403); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
783 mxf_write_refs_count(pb, s->nb_streams); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
784 for (i = 0; i < s->nb_streams; i++) |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
785 mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i); |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
786 |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
787 // write multiple descriptor reference |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
788 if (type == SourcePackage) { |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
789 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
|
790 if (s->nb_streams > 1) { |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
791 mxf_write_uuid(pb, MultipleDescriptor, 0); |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
792 mxf_write_multi_descriptor(s); |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
793 } else |
9b3ad7f292a4
do no write multi descriptor when only one track is present
bcoudurier
parents:
3850
diff
changeset
|
794 mxf_write_uuid(pb, SubDescriptor, 0); |
3848
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
795 } |
1b5106f2b3f4
move mxf_write_package to permit function merge
bcoudurier
parents:
3847
diff
changeset
|
796 |
3831 | 797 for (i = 0; i < s->nb_streams; i++) { |
3832
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
798 AVStream *st = s->streams[i]; |
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
799 mxf_write_track(s, st, type); |
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
800 mxf_write_sequence(s, st, type); |
f3a099c0fdf8
simplify, pass AVStream directly instead of index
bcoudurier
parents:
3831
diff
changeset
|
801 mxf_write_structural_component(s, st, type); |
3743 | 802 |
803 if (type == SourcePackage) { | |
3845
c266530d56b4
merge descriptor write table with essence container uls table and simplify
bcoudurier
parents:
3844
diff
changeset
|
804 MXFStreamContext *sc = st->priv_data; |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
805 mxf_essence_container_uls[sc->index].write_desc(s, st); |
3743 | 806 } |
807 } | |
808 } | |
809 | |
4279 | 810 static int mxf_write_essence_container_data(AVFormatContext *s) |
811 { | |
812 ByteIOContext *pb = s->pb; | |
813 | |
814 mxf_write_metadata_key(pb, 0x012300); | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
815 klv_encode_ber_length(pb, 72); |
4279 | 816 |
817 mxf_write_local_tag(pb, 16, 0x3C0A); // Instance UID | |
818 mxf_write_uuid(pb, EssenceContainerData, 0); | |
819 | |
820 mxf_write_local_tag(pb, 32, 0x2701); // Linked Package UID | |
821 mxf_write_umid(pb, SourcePackage, 0); | |
822 | |
823 mxf_write_local_tag(pb, 4, 0x3F07); // BodySID | |
824 put_be32(pb, 1); | |
825 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
826 mxf_write_local_tag(pb, 4, 0x3F06); // IndexSID |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
827 put_be32(pb, 2); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
828 |
4279 | 829 return 0; |
830 } | |
831 | |
3740 | 832 static int mxf_write_header_metadata_sets(AVFormatContext *s) |
833 { | |
3749 | 834 mxf_write_preface(s); |
835 mxf_write_identification(s); | |
836 mxf_write_content_storage(s); | |
3849 | 837 mxf_write_package(s, MaterialPackage); |
838 mxf_write_package(s, SourcePackage); | |
4279 | 839 mxf_write_essence_container_data(s); |
3740 | 840 return 0; |
841 } | |
842 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
843 static int mxf_write_index_table_segment(AVFormatContext *s) |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
844 { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
845 MXFContext *mxf = s->priv_data; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
846 ByteIOContext *pb = s->pb; |
4378 | 847 int i, j, k, ret; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
848 int temporal_reordering = 0; |
4378 | 849 int last_key_index = 0, key_index = 0; |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
850 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
851 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
|
852 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
853 put_buffer(pb, index_table_segment_key, 16); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
854 ret = klv_encode_ber_length(pb, 109 + s->nb_streams*6 + |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
855 mxf->edit_units_count*(11+(s->nb_streams-1)*4)); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
856 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
857 // instance id |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
858 mxf_write_local_tag(pb, 16, 0x3C0A); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
859 mxf_write_uuid(pb, IndexTableSegment, 0); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
860 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
861 // index edit rate |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
862 mxf_write_local_tag(pb, 8, 0x3F0B); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
863 put_be32(pb, mxf->time_base.num); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
864 put_be32(pb, mxf->time_base.den); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
865 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
866 // index start position |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
867 mxf_write_local_tag(pb, 8, 0x3F0C); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
868 put_be64(pb, 0); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
869 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
870 // index duration |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
871 mxf_write_local_tag(pb, 8, 0x3F0D); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
872 put_be64(pb, mxf->edit_units_count); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
873 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
874 // edit unit byte count |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
875 mxf_write_local_tag(pb, 4, 0x3F05); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
876 put_be32(pb, 0); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
877 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
878 // index sid |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
879 mxf_write_local_tag(pb, 4, 0x3F06); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
880 put_be32(pb, 2); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
881 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
882 // body sid |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
883 mxf_write_local_tag(pb, 4, 0x3F07); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
884 put_be32(pb, 1); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
885 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
886 // slice count - 1 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
887 mxf_write_local_tag(pb, 1, 0x3F08); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
888 put_byte(pb, s->nb_streams-1); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
889 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
890 // delta entry array |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
891 mxf_write_local_tag(pb, 8 + s->nb_streams*6, 0x3F09); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
892 put_be32(pb, s->nb_streams); // num of entries |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
893 put_be32(pb, 6); // size of one entry |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
894 for (i = 0; i < s->nb_streams; i++) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
895 AVStream *st = s->streams[i]; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
896 MXFStreamContext *sc = st->priv_data; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
897 put_byte(pb, sc->temporal_reordering); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
898 if (sc->temporal_reordering) |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
899 temporal_reordering = 1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
900 put_byte(pb, i); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
901 put_be32(pb, 0); // element delta |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
902 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
903 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
904 mxf_write_local_tag(pb, 8 + mxf->edit_units_count*(11+(s->nb_streams-1)*4), 0x3F0A); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
905 put_be32(pb, mxf->edit_units_count); // num of entries |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
906 put_be32(pb, 11+(s->nb_streams-1)*4); // size of one entry |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
907 for (i = 0; i < mxf->edit_units_count; i++) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
908 if (temporal_reordering) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
909 int temporal_offset = 0; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
910 for (j = i+1; j < mxf->edit_units_count; j++) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
911 temporal_offset++; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
912 if (mxf->index_entries[j].flags & 0x10) { // backward prediction |
4344
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
913 // next is not b, so is reordered |
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
914 if (!(mxf->index_entries[i+1].flags & 0x10)) { |
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
915 if ((mxf->index_entries[i].flags & 0x11) == 0) // i frame |
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
916 temporal_offset = 0; |
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
917 else |
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
918 temporal_offset = -temporal_offset; |
582124bb2c15
fix temporal offet of ipbb sequences, simplification welcome
bcoudurier
parents:
4343
diff
changeset
|
919 } |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
920 break; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
921 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
922 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
923 put_byte(pb, temporal_offset); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
924 } else |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
925 put_byte(pb, 0); |
4378 | 926 if (!(mxf->index_entries[i].flags & 0x33)) { // I frame |
927 last_key_index = key_index; | |
928 key_index = i; | |
929 } | |
930 if (mxf->index_entries[i].flags & 0x10 && // backward prediction | |
931 !(mxf->index_entries[key_index].flags & 0x80)) { // open gop | |
932 put_byte(pb, last_key_index - i); | |
933 } else { | |
934 put_byte(pb, key_index - i); // key frame offset | |
935 if ((mxf->index_entries[i].flags & 0x20) == 0x20) // only forward | |
936 last_key_index = key_index; | |
937 } | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
938 put_byte(pb, mxf->index_entries[i].flags); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
939 // stream offset |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
940 put_be64(pb, mxf->index_entries[i].offset - mxf->index_entries[0].offset); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
941 for (k = 0; k < s->nb_streams; k++) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
942 if (mxf->index_entries[i].slice_offset[k]) |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
943 put_be32(pb, mxf->index_entries[i].slice_offset[k]); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
944 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
945 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
946 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
947 return ret; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
948 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
949 |
4370 | 950 static void mxf_write_partition(AVFormatContext *s, int bodysid, |
951 int indexsid, unsigned index_byte_count, | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
952 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
|
953 { |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
954 MXFContext *mxf = s->priv_data; |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
955 ByteIOContext *pb = s->pb; |
3843 | 956 int64_t header_byte_count_offset; |
3812
1db39c874eb7
cosmetics, remove useless braces, move comments where appropriate, remove whitespaces
bcoudurier
parents:
3811
diff
changeset
|
957 |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
958 // write klv |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
959 put_buffer(pb, key, 16); |
3821 | 960 |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
961 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
|
962 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
963 // write partition value |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
964 put_be16(pb, 1); // majorVersion |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
965 put_be16(pb, 2); // minorVersion |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
966 put_be32(pb, 1); // kagSize |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
967 |
3841 | 968 put_be64(pb, url_ftell(pb) - 25); // thisPartition |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
969 put_be64(pb, 0); // previousPartition |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
970 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
971 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
|
972 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
973 // set offset |
3843 | 974 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
|
975 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
|
976 |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
977 // indexTable |
4370 | 978 put_be64(pb, index_byte_count); // indexByteCount |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
979 put_be32(pb, indexsid); // indexSID |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
980 put_be64(pb, 0); // bodyOffset |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
981 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
982 put_be32(pb, bodysid); // bodySID |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
983 put_buffer(pb, op1a_ul, 16); // operational pattern |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
984 |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
985 // essence container |
3821 | 986 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
|
987 |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
988 if (write_metadata) { |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
989 // mark the start of the headermetadata and calculate metadata size |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
990 int64_t pos, start = url_ftell(s->pb); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
991 mxf_write_primer_pack(s); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
992 mxf_write_header_metadata_sets(s); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
993 pos = url_ftell(s->pb); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
994 // update header_byte_count |
3843 | 995 url_fseek(pb, header_byte_count_offset, SEEK_SET); |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
996 put_be64(pb, pos - start); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
997 url_fseek(pb, pos, SEEK_SET); |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
998 } |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
999 |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1000 put_flush_packet(pb); |
3760
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1001 } |
fde28855a81e
Import more ok'ed chunks of the mxf muxer from the soc tree
vitor
parents:
3759
diff
changeset
|
1002 |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1003 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
|
1004 { 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
|
1005 { 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
|
1006 { 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
|
1007 { 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
|
1008 { 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
|
1009 { 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
|
1010 { 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
|
1011 { 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
|
1012 }; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1013 |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1014 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
|
1015 { |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1016 if (avctx->profile == 4) { // Main |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1017 if (avctx->level == 8) // Main |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1018 return avctx->gop_size ? |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1019 &mxf_mpeg2_codec_uls[1] : |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1020 &mxf_mpeg2_codec_uls[0]; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1021 else if (avctx->level == 4) // High |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1022 return avctx->gop_size ? |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1023 &mxf_mpeg2_codec_uls[5] : |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1024 &mxf_mpeg2_codec_uls[4]; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1025 } 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
|
1026 if (avctx->level == 5) // Main |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1027 return avctx->gop_size ? |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1028 &mxf_mpeg2_codec_uls[3] : |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1029 &mxf_mpeg2_codec_uls[2]; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1030 else if (avctx->level == 2) // High |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1031 return avctx->gop_size ? |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1032 &mxf_mpeg2_codec_uls[7] : |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1033 &mxf_mpeg2_codec_uls[6]; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1034 } |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1035 return NULL; |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1036 } |
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1037 |
4313 | 1038 static int mxf_parse_mpeg2_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt) |
1039 { | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1040 MXFContext *mxf = s->priv_data; |
4313 | 1041 MXFStreamContext *sc = st->priv_data; |
1042 uint32_t c = -1; | |
1043 int i; | |
1044 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1045 mxf->index_entries[mxf->edit_units_count].flags = 0; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1046 |
4313 | 1047 for(i = 0; i < pkt->size - 4; i++) { |
1048 c = (c<<8) + pkt->data[i]; | |
1049 if (c == 0x1B5) { | |
1050 if (i + 2 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x10) { // seq ext | |
1051 st->codec->profile = pkt->data[i+1] & 0x07; | |
1052 st->codec->level = pkt->data[i+2] >> 4; | |
4314 | 1053 } else if (i + 5 < pkt->size && (pkt->data[i+1] & 0xf0) == 0x80) { // pict coding ext |
1054 sc->interlaced = !(pkt->data[i+5] & 0x80); // progressive frame | |
4313 | 1055 break; |
1056 } | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1057 } else if (c == 0x1b8) { // gop |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1058 if (i + 4 < pkt->size && pkt->data[i+4]>>6 & 0x01) // closed |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1059 mxf->index_entries[mxf->edit_units_count].flags |= 0x80; // random access |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1060 } else if (c == 0x1b3) { // seq |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1061 mxf->index_entries[mxf->edit_units_count].flags |= 0x40; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1062 } else if (c == 0x100) { // pic |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1063 int pict_type = (pkt->data[i+2]>>3) & 0x07; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1064 if (pict_type == 2) { // P frame |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1065 mxf->index_entries[mxf->edit_units_count].flags |= 0x22; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1066 st->codec->gop_size = 1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1067 } else if (pict_type == 3) { // B frame |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1068 mxf->index_entries[mxf->edit_units_count].flags |= 0x33; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1069 sc->temporal_reordering = -1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1070 } else if (!pict_type) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1071 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
|
1072 return 0; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1073 } |
4313 | 1074 } |
1075 } | |
1076 sc->codec_ul = mxf_get_mpeg2_codec_ul(st->codec); | |
1077 return !!sc->codec_ul; | |
1078 } | |
1079 | |
4374 | 1080 static int ff_audio_interleave_init(AVFormatContext *s, |
1081 const int *samples_per_frame, | |
1082 AVRational time_base) | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1083 { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1084 int i; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1085 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1086 if (!samples_per_frame) |
4327
60bad0ded22a
do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents:
4326
diff
changeset
|
1087 return -1; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1088 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1089 for (i = 0; i < s->nb_streams; i++) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1090 AVStream *st = s->streams[i]; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1091 AudioInterleaveContext *aic = st->priv_data; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1092 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1093 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1094 aic->sample_size = (st->codec->channels * |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1095 av_get_bits_per_sample(st->codec->codec_id)) / 8; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1096 if (!aic->sample_size) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1097 av_log(s, AV_LOG_ERROR, "could not compute sample size\n"); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1098 return -1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1099 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1100 aic->samples_per_frame = samples_per_frame; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1101 aic->samples = aic->samples_per_frame; |
4374 | 1102 aic->time_base = time_base; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1103 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1104 av_fifo_init(&aic->fifo, 100 * *aic->samples); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1105 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1106 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1107 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1108 return 0; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1109 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1110 |
4330 | 1111 static void ff_audio_interleave_close(AVFormatContext *s) |
1112 { | |
1113 int i; | |
1114 for (i = 0; i < s->nb_streams; i++) { | |
1115 AVStream *st = s->streams[i]; | |
1116 AudioInterleaveContext *aic = st->priv_data; | |
1117 | |
1118 if (st->codec->codec_type == CODEC_TYPE_AUDIO) | |
1119 av_fifo_free(&aic->fifo); | |
1120 } | |
1121 } | |
1122 | |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1123 static uint64_t mxf_parse_timestamp(time_t timestamp) |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1124 { |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1125 struct tm *time = localtime(×tamp); |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1126 return (uint64_t)(time->tm_year+1900) << 48 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1127 (uint64_t)(time->tm_mon+1) << 40 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1128 (uint64_t) time->tm_mday << 32 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1129 time->tm_hour << 24 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1130 time->tm_min << 16 | |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1131 time->tm_sec << 8; |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1132 } |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1133 |
3836 | 1134 static int mxf_write_header(AVFormatContext *s) |
3749 | 1135 { |
1136 MXFContext *mxf = s->priv_data; | |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1137 int i; |
4001 | 1138 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
|
1139 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
|
1140 |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1141 if (s->nb_streams > 17) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1142 av_log(s, AV_LOG_ERROR, "error, mxf muxer supports 17 tracks maximum\n"); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1143 return -1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1144 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1145 |
3816
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1146 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
|
1147 AVStream *st = s->streams[i]; |
3824 | 1148 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
|
1149 if (!sc) |
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1150 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
|
1151 st->priv_data = sc; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1152 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1153 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
4363 | 1154 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
|
1155 samples_per_frame = PAL_samples_per_frame; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1156 mxf->time_base = (AVRational){ 1, 25 }; |
4363 | 1157 } 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
|
1158 samples_per_frame = NTSC_samples_per_frame; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1159 mxf->time_base = (AVRational){ 1001, 30000 }; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1160 } else { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1161 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
|
1162 return -1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1163 } |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1164 mxf->edit_unit_start = st->index; |
4374 | 1165 av_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den); |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1166 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1167 if (st->codec->sample_rate != 48000) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1168 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
|
1169 return -1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1170 } |
4374 | 1171 av_set_pts_info(st, 64, 1, st->codec->sample_rate); |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1172 } |
3834 | 1173 sc->duration = -1; |
1174 | |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1175 sc->index = mxf_get_essence_container_ul_index(st->codec->codec_id); |
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1176 if (sc->index == -1) { |
3817
22831cc65a35
get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents:
3816
diff
changeset
|
1177 av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, " |
22831cc65a35
get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents:
3816
diff
changeset
|
1178 "codec not currently supported in container\n", i); |
22831cc65a35
get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents:
3816
diff
changeset
|
1179 return -1; |
22831cc65a35
get essence container ul in header and set it per track, check for unsupported codec
bcoudurier
parents:
3816
diff
changeset
|
1180 } |
3833
8b3fdbc81f3e
correctly write codec ul, mpeg-2 needs profile and level to be set
bcoudurier
parents:
3832
diff
changeset
|
1181 |
4313 | 1182 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
|
1183 |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1184 if (!present[sc->index]) { |
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1185 mxf->essence_containers_indices[mxf->essence_container_count++] = sc->index; |
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1186 present[sc->index] = 1; |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
1187 } else |
3846
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1188 present[sc->index]++; |
0ee95f0b4c00
store index in table in MXFStreamContext, simplify
bcoudurier
parents:
3845
diff
changeset
|
1189 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
|
1190 sc->track_essence_element_key[15] = present[sc->index]; |
3826
da2d0c162cde
introduce MXFContainerEssencePair to associate essence element key and
bcoudurier
parents:
3825
diff
changeset
|
1191 PRINT_KEY(s, "track essence element key", sc->track_essence_element_key); |
3816
50bdbde13ecf
move per track code in mxf_write_header to be able to check for unsupported configuration
bcoudurier
parents:
3815
diff
changeset
|
1192 } |
3749 | 1193 |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1194 for (i = 0; i < s->nb_streams; i++) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1195 MXFStreamContext *sc = s->streams[i]->priv_data; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1196 // update element count |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1197 sc->track_essence_element_key[13] = present[sc->index]; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1198 sc->order = AV_RB32(sc->track_essence_element_key+12); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1199 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1200 |
4385
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1201 mxf->timestamp = mxf_parse_timestamp(s->timestamp); |
e8e064a00ea5
format timestamp correctly according to specs and set it
bcoudurier
parents:
4384
diff
changeset
|
1202 |
4327
60bad0ded22a
do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents:
4326
diff
changeset
|
1203 if (!samples_per_frame) |
60bad0ded22a
do not use PAL_samples_per_frame in init, to make init independant
bcoudurier
parents:
4326
diff
changeset
|
1204 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
|
1205 |
4374 | 1206 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
|
1207 return -1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1208 |
3749 | 1209 return 0; |
1210 } | |
1211 | |
3836 | 1212 static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt) |
3778 | 1213 { |
4313 | 1214 MXFContext *mxf = s->priv_data; |
3778 | 1215 ByteIOContext *pb = s->pb; |
1216 AVStream *st = s->streams[pkt->stream_index]; | |
1217 MXFStreamContext *sc = st->priv_data; | |
1218 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1219 if (!(mxf->edit_units_count % MXF_INDEX_CLUSTER_SIZE)) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1220 mxf->index_entries = av_realloc(mxf->index_entries, |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1221 (mxf->edit_units_count + MXF_INDEX_CLUSTER_SIZE)* |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1222 sizeof(*mxf->index_entries)); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1223 if (!mxf->index_entries) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1224 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
|
1225 return -1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1226 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1227 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1228 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1229 if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1230 if (!mxf_parse_mpeg2_frame(s, st, pkt)) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1231 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
|
1232 return -1; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1233 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1234 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1235 |
4313 | 1236 if (!mxf->header_written) { |
4370 | 1237 mxf_write_partition(s, 1, 0, 0, header_open_partition_key, 1); |
4313 | 1238 mxf->header_written = 1; |
1239 } | |
1240 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1241 if (st->index == mxf->edit_unit_start) { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1242 mxf->index_entries[mxf->edit_units_count].offset = url_ftell(pb); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1243 mxf->index_entries[mxf->edit_units_count].slice_offset[st->index] = 0; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1244 mxf->edit_units_count++; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1245 } else { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1246 mxf->index_entries[mxf->edit_units_count-1].slice_offset[st->index] = |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1247 url_ftell(pb) - mxf->index_entries[mxf->edit_units_count-1].offset; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1248 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1249 |
3778 | 1250 put_buffer(pb, sc->track_essence_element_key, 16); // write key |
1251 klv_encode_ber_length(pb, pkt->size); // write length | |
1252 put_buffer(pb, pkt->data, pkt->size); // write value | |
1253 | |
3835 | 1254 sc->duration = FFMAX(pkt->pts + pkt->duration, sc->duration); |
1255 | |
3778 | 1256 put_flush_packet(pb); |
1257 return 0; | |
1258 } | |
1259 | |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1260 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
|
1261 { |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1262 MXFContext *mxf = s->priv_data; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1263 ByteIOContext *pb = s->pb; |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1264 uint64_t pos = url_ftell(pb); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1265 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1266 put_buffer(pb, random_index_pack_key, 16); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1267 klv_encode_ber_length(pb, 28); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1268 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1269 put_be32(pb, 1); // BodySID of header partition |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1270 put_be64(pb, 0); // offset of header partition |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1271 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1272 put_be32(pb, 0); // BodySID of footer partition |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1273 put_be64(pb, mxf->footer_partition_offset); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1274 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1275 put_be32(pb, url_ftell(pb) - pos + 4); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1276 } |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1277 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1278 static int mxf_write_footer(AVFormatContext *s) |
3740 | 1279 { |
1280 MXFContext *mxf = s->priv_data; | |
1281 ByteIOContext *pb = s->pb; | |
4370 | 1282 unsigned index_byte_count = |
1283 109 + s->nb_streams*6 + | |
1284 mxf->edit_units_count*(11+(s->nb_streams-1)*4); | |
1285 | |
1286 // add encoded ber length | |
1287 index_byte_count += 16 + | |
1288 (index_byte_count < 128 ? 1 : (av_log2(index_byte_count) >> 3) + 2); | |
3740 | 1289 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1290 mxf->footer_partition_offset = url_ftell(pb); |
4370 | 1291 mxf_write_partition(s, 0, 2, index_byte_count, footer_partition_key, 0); |
4341
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1292 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1293 mxf_write_index_table_segment(s); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1294 |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1295 mxf_write_random_index_pack(s); |
501d1dd19021
write index table and rip, muxer works pretty well now
bcoudurier
parents:
4340
diff
changeset
|
1296 |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1297 if (!url_is_streamed(s->pb)) { |
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1298 url_fseek(pb, 0, SEEK_SET); |
4370 | 1299 mxf_write_partition(s, 1, 0, 0, header_closed_partition_key, 1); |
3842
c4e0e02a4832
simplify and correctly rewrite metadata in header partition, mark it closed complete
bcoudurier
parents:
3841
diff
changeset
|
1300 } |
4330 | 1301 |
1302 ff_audio_interleave_close(s); | |
1303 | |
3749 | 1304 mxf_free(s); |
3740 | 1305 return 0; |
1306 } | |
3749 | 1307 |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1308 static int mxf_interleave_new_audio_packet(AVFormatContext *s, AVPacket *pkt, |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1309 int stream_index, int flush) |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1310 { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1311 AVStream *st = s->streams[stream_index]; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1312 AudioInterleaveContext *aic = st->priv_data; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1313 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1314 int size = FFMIN(av_fifo_size(&aic->fifo), *aic->samples * aic->sample_size); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1315 if (!size || (!flush && size == av_fifo_size(&aic->fifo))) |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1316 return 0; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1317 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1318 av_new_packet(pkt, size); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1319 av_fifo_read(&aic->fifo, pkt->data, size); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1320 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1321 pkt->dts = pkt->pts = aic->dts; |
4374 | 1322 pkt->duration = av_rescale_q(*aic->samples, st->time_base, aic->time_base); |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1323 pkt->stream_index = stream_index; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1324 aic->dts += pkt->duration; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1325 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1326 aic->samples++; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1327 if (!*aic->samples) |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1328 aic->samples = aic->samples_per_frame; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1329 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1330 return size; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1331 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1332 |
4328
fb0fde31327a
change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents:
4327
diff
changeset
|
1333 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
|
1334 { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1335 AVPacketList *pktl; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1336 int stream_count = 0; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1337 int streams[MAX_STREAMS]; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1338 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1339 memset(streams, 0, sizeof(streams)); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1340 pktl = s->packet_buffer; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1341 while (pktl) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1342 //av_log(s, AV_LOG_DEBUG, "show st:%d dts:%lld\n", pktl->pkt.stream_index, pktl->pkt.dts); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1343 if (!streams[pktl->pkt.stream_index]) |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1344 stream_count++; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1345 streams[pktl->pkt.stream_index]++; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1346 pktl = pktl->next; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1347 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1348 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1349 if (stream_count && (s->nb_streams == stream_count || flush)) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1350 pktl = s->packet_buffer; |
4342 | 1351 if (s->nb_streams != stream_count) { |
1352 MXFContext *mxf = s->priv_data; | |
1353 AVPacketList *first = NULL; | |
1354 // find first packet in edit unit | |
1355 while (pktl) { | |
1356 AVStream *st = s->streams[pktl->pkt.stream_index]; | |
1357 if (st->index == mxf->edit_unit_start) | |
1358 break; | |
1359 else if (!first) | |
1360 first = pktl; | |
1361 pktl = pktl->next; | |
1362 } | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1363 // purge packet queue |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1364 while (pktl) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1365 AVPacketList *next = pktl->next; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1366 av_free_packet(&pktl->pkt); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1367 av_freep(&pktl); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1368 pktl = next; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1369 } |
4342 | 1370 if (!first) |
1371 goto out; | |
1372 pktl = first; | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1373 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1374 |
4342 | 1375 *out = pktl->pkt; |
1376 //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts); | |
1377 s->packet_buffer = pktl->next; | |
1378 av_freep(&pktl); | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1379 return 1; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1380 } else { |
4342 | 1381 out: |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1382 av_init_packet(out); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1383 return 0; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1384 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1385 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1386 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1387 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
|
1388 { |
4374 | 1389 MXFStreamContext *sc = s->streams[pkt ->stream_index]->priv_data; |
1390 MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data; | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1391 |
4374 | 1392 return next->dts > pkt->dts || |
1393 (next->dts == pkt->dts && sc->order < sc2->order); | |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1394 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1395 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1396 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
|
1397 { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1398 int i; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1399 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1400 if (pkt) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1401 AVStream *st = s->streams[pkt->stream_index]; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1402 AudioInterleaveContext *aic = st->priv_data; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1403 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1404 av_fifo_generic_write(&aic->fifo, pkt->data, pkt->size, NULL); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1405 } else { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1406 // rewrite pts and dts to be decoded time line position |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1407 pkt->pts = pkt->dts = aic->dts; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1408 aic->dts += pkt->duration; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1409 ff_interleave_add_packet(s, pkt, mxf_compare_timestamps); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1410 } |
4328
fb0fde31327a
change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents:
4327
diff
changeset
|
1411 pkt = NULL; |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1412 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1413 |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1414 for (i = 0; i < s->nb_streams; i++) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1415 AVStream *st = s->streams[i]; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1416 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1417 AVPacket new_pkt; |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1418 while (mxf_interleave_new_audio_packet(s, &new_pkt, i, flush)) |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1419 ff_interleave_add_packet(s, &new_pkt, mxf_compare_timestamps); |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1420 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1421 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1422 |
4328
fb0fde31327a
change prototype of mxf_interleave_get_packet to make it compatible
bcoudurier
parents:
4327
diff
changeset
|
1423 return mxf_interleave_get_packet(s, out, pkt, flush); |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1424 } |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1425 |
3721 | 1426 AVOutputFormat mxf_muxer = { |
1427 "mxf", | |
1428 NULL_IF_CONFIG_SMALL("Material eXchange Format"), | |
1429 NULL, | |
1430 "mxf", | |
1431 sizeof(MXFContext), | |
1432 CODEC_ID_PCM_S16LE, | |
1433 CODEC_ID_MPEG2VIDEO, | |
3836 | 1434 mxf_write_header, |
1435 mxf_write_packet, | |
1436 mxf_write_footer, | |
4350 | 1437 AVFMT_NOTIMESTAMPS, |
4312
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1438 NULL, |
385b2fdccbbb
correctly pack and interleave pcm samples in mxf
bcoudurier
parents:
4279
diff
changeset
|
1439 mxf_interleave, |
3721 | 1440 }; |