Mercurial > libavformat.hg
annotate mxf.c @ 1224:b6eb59aa44ca libavformat
add codec detection based on essence container ul
author | bcoudurier |
---|---|
date | Thu, 03 Aug 2006 09:14:56 +0000 |
parents | 5f1bf54448e7 |
children | 339cb300decd |
rev | line source |
---|---|
1186 | 1 /* |
2 * MXF demuxer. | |
3 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>. | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
18 */ | |
19 | |
20 /* | |
21 * References | |
22 * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value | |
23 * SMPTE 377M MXF File Format Specifications | |
24 * SMPTE 378M Operational Pattern 1a | |
25 * SMPTE 379M MXF Generic Container | |
26 * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container | |
27 * SMPTE 382M Mapping AES3 and Broadcast Wave Audio into the MXF Generic Container | |
28 * SMPTE 383M Mapping DV-DIF Data to the MXF Generic Container | |
29 * | |
30 * Principle | |
31 * Search for Track numbers which will identify essence element KLV packets. | |
32 * Search for SourcePackage which define tracks which contains Track numbers. | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
33 * Material Package contains tracks with reference to SourcePackage tracks. |
1186 | 34 * Search for Descriptors (Picture, Sound) which contains codec info and parameters. |
35 * Assign Descriptors to correct Tracks. | |
36 * | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
37 * Metadata reading functions read Local Tags, get InstanceUID(0x3C0A) then add MetaDataSet to MXFContext. |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
38 * Metadata parsing resolves Strong References to objects. |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
39 * |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
40 * Simple demuxer, only OP1A supported and some files might not work at all. |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
41 * Only tracks with associated descriptors will be decoded. "Highly Desirable" SMPTE 377M D.1 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
42 * Only descriptors with EssenceSoundCompression or PictureEssenceCoding will be taken into account. "D/req" SMPTE 377M |
1186 | 43 */ |
44 | |
45 //#define DEBUG | |
46 | |
47 #include "avformat.h" | |
48 | |
1197 | 49 typedef uint8_t UID[16]; |
1189 | 50 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
51 enum MXFMetadataSetType { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
52 MaterialPackage, |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
53 SourcePackage, |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
54 SourceClip, |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
55 TimecodeComponent, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
56 Sequence, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
57 MultipleDescriptor, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
58 Descriptor, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
59 Track, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
60 EssenceContainerData, |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
61 }; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
62 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
63 typedef struct MXFStructuralComponent { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
64 UID uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
65 enum MXFMetadataSetType type; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
66 UID source_package_uid; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
67 UID data_definition_ul; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
68 int64_t duration; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
69 int64_t start_position; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
70 int source_track_id; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
71 } MXFStructuralComponent; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
72 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
73 typedef struct MXFSequence { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
74 UID uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
75 enum MXFMetadataSetType type; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
76 UID data_definition_ul; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
77 UID *structural_components_refs; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
78 int structural_components_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
79 int64_t duration; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
80 } MXFSequence; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
81 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
82 typedef struct MXFTrack { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
83 UID uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
84 enum MXFMetadataSetType type; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
85 MXFSequence *sequence; /* mandatory, and only one */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
86 UID sequence_ref; |
1186 | 87 int track_id; |
1197 | 88 uint8_t track_number[4]; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
89 AVRational edit_rate; |
1186 | 90 } MXFTrack; |
91 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
92 typedef struct MXFDescriptor { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
93 UID uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
94 enum MXFMetadataSetType type; |
1192 | 95 UID essence_container_ul; |
96 UID essence_codec_ul; | |
1186 | 97 AVRational sample_rate; |
98 AVRational aspect_ratio; | |
99 int width; | |
100 int height; | |
101 int channels; | |
102 int bits_per_sample; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
103 UID *sub_descriptors_refs; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
104 int sub_descriptors_count; |
1186 | 105 int linked_track_id; |
106 } MXFDescriptor; | |
107 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
108 typedef struct MXFPackage { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
109 UID uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
110 enum MXFMetadataSetType type; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
111 UID package_uid; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
112 UID *tracks_refs; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
113 int tracks_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
114 MXFDescriptor *descriptor; /* only one */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
115 UID descriptor_ref; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
116 } MXFPackage; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
117 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
118 typedef struct MXFEssenceContainerData { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
119 UID uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
120 enum MXFMetadataSetType type; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
121 UID linked_package_uid; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
122 } MXFEssenceContainerData; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
123 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
124 typedef struct { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
125 UID uid; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
126 enum MXFMetadataSetType type; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
127 } MXFMetadataSet; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
128 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
129 typedef struct MXFContext { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
130 UID *packages_refs; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
131 int packages_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
132 UID *essence_container_data_sets_refs; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
133 int essence_container_data_sets_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
134 UID *essence_containers_uls; /* Universal Labels SMPTE RP224 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
135 int essence_containers_uls_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
136 UID operational_pattern_ul; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
137 UID content_storage_uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
138 MXFMetadataSet **metadata_sets; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
139 int metadata_sets_count; |
1186 | 140 AVFormatContext *fc; |
141 } MXFContext; | |
142 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
143 typedef struct KLVPacket { |
1189 | 144 UID key; |
1186 | 145 offset_t offset; |
146 uint64_t length; | |
147 } KLVPacket; | |
148 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
149 typedef struct MXFCodecUL { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
150 UID uid; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
151 enum CodecID id; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
152 } MXFCodecUL; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
153 |
1210 | 154 typedef struct MXFMetadataReadTableEntry { |
155 const UID key; | |
156 int (*read)(MXFContext *mxf, KLVPacket *klv); | |
157 } MXFMetadataReadTableEntry; | |
1189 | 158 |
159 /* partial keys to match */ | |
1195 | 160 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 }; |
1197 | 161 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 }; |
1186 | 162 |
163 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y))) | |
164 | |
1199 | 165 #define PRINT_KEY(x) dprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", \ |
1208 | 166 (x)[0], (x)[1], (x)[2], (x)[3], (x)[4], (x)[5], (x)[6], (x)[7], (x)[8], (x)[9], (x)[10], (x)[11], (x)[12], (x)[13], (x)[14], (x)[15]) |
1186 | 167 |
168 static int64_t klv_decode_ber_length(ByteIOContext *pb) | |
169 { | |
170 int64_t size = 0; | |
171 uint8_t length = get_byte(pb); | |
172 int type = length >> 7; | |
173 | |
174 if (type) { /* long form */ | |
175 int bytes_num = length & 0x7f; | |
176 /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */ | |
177 if (bytes_num > 8) | |
178 return -1; | |
179 while (bytes_num--) | |
180 size = size << 8 | get_byte(pb); | |
181 } else { | |
182 size = length & 0x7f; | |
183 } | |
184 return size; | |
185 } | |
186 | |
187 static int klv_read_packet(KLVPacket *klv, ByteIOContext *pb) | |
188 { | |
189 klv->offset = url_ftell(pb); | |
190 get_buffer(pb, klv->key, 16); | |
191 klv->length = klv_decode_ber_length(pb); | |
1194 | 192 return klv->length == -1 ? -1 : 0; |
1186 | 193 } |
194 | |
195 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv) | |
196 { | |
197 int i; | |
198 | |
199 for (i = 0; i < s->nb_streams; i++) { | |
1197 | 200 MXFTrack *track = s->streams[i]->priv_data; |
201 /* SMPTE 379M 7.3 */ | |
202 if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number))) | |
1186 | 203 return i; |
204 } | |
205 return -1; | |
206 } | |
207 | |
208 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) | |
209 { | |
210 KLVPacket klv; | |
211 | |
212 while (!url_feof(&s->pb)) { | |
1191 | 213 if (klv_read_packet(&klv, &s->pb) < 0) { |
214 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n"); | |
1186 | 215 return -1; |
1191 | 216 } |
1198 | 217 #ifdef DEBUG |
218 PRINT_KEY(klv.key); | |
219 #endif | |
1186 | 220 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
221 av_get_packet(&s->pb, pkt, klv.length); | |
222 pkt->stream_index = mxf_get_stream_index(s, &klv); | |
1194 | 223 return pkt->stream_index == -1 ? -1 : 0; |
1186 | 224 } else |
225 url_fskip(&s->pb, klv.length); | |
226 } | |
227 return AVERROR_IO; | |
228 } | |
229 | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
230 static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set) |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
231 { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
232 mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
233 mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
234 mxf->metadata_sets_count++; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
235 return 0; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
236 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
237 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
238 static int mxf_read_metadata_preface(MXFContext *mxf, KLVPacket *klv) |
1186 | 239 { |
240 ByteIOContext *pb = &mxf->fc->pb; | |
241 int bytes_read = 0; | |
242 | |
243 while (bytes_read < klv->length) { | |
244 int tag = get_be16(pb); | |
245 int size = get_be16(pb); /* SMPTE 336M Table 8 KLV specified length, 0x53 */ | |
246 | |
247 switch (tag) { | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
248 case 0x3B03: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
249 get_buffer(pb, mxf->content_storage_uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
250 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
251 case 0x3B09: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
252 get_buffer(pb, mxf->operational_pattern_ul, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
253 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
254 case 0x3B0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
255 mxf->essence_containers_uls_count = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
256 if (mxf->essence_containers_uls_count >= UINT_MAX / sizeof(UID)) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
257 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
258 mxf->essence_containers_uls = av_malloc(mxf->essence_containers_uls_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
259 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
260 get_buffer(pb, mxf->essence_containers_uls, mxf->essence_containers_uls_count * sizeof(UID)); |
1186 | 261 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
262 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
263 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
264 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
265 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
266 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
267 return 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
268 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
269 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
270 static int mxf_read_metadata_content_storage(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
271 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
272 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
273 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
274 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
275 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
276 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
277 int size = get_be16(pb); /* SMPTE 336M Table 8 KLV specified length, 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
278 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
279 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
280 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
281 case 0x1901: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
282 mxf->packages_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
283 if (mxf->packages_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
284 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
285 mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
286 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
287 get_buffer(pb, mxf->packages_refs, mxf->packages_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
288 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
289 case 0x1902: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
290 mxf->essence_container_data_sets_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
291 if (mxf->essence_container_data_sets_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
292 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
293 mxf->essence_container_data_sets_refs = av_malloc(mxf->essence_container_data_sets_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
294 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
295 get_buffer(pb, mxf->essence_container_data_sets_refs, mxf->essence_container_data_sets_count * sizeof(UID)); |
1186 | 296 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
297 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
298 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
299 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
300 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
301 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
302 return 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
303 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
304 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
305 static int mxf_read_metadata_source_clip(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
306 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
307 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
308 MXFStructuralComponent *source_clip = av_mallocz(sizeof(*source_clip)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
309 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
310 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
311 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
312 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
313 int size = get_be16(pb); /* SMPTE 336M Table 8 KLV specified length, 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
314 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
315 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
316 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
317 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
318 get_buffer(pb, source_clip->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
319 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
320 case 0x0202: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
321 source_clip->duration = get_be64(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
322 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
323 case 0x1201: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
324 source_clip->start_position = get_be64(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
325 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
326 case 0x1101: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
327 /* UMID, only get last 16 bytes */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
328 url_fskip(pb, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
329 get_buffer(pb, source_clip->source_package_uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
330 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
331 case 0x1102: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
332 source_clip->source_track_id = get_be32(pb); |
1186 | 333 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
334 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
335 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
336 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
337 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
338 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
339 source_clip->type = SourceClip; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
340 return mxf_add_metadata_set(mxf, source_clip); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
341 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
342 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
343 static int mxf_read_metadata_material_package(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
344 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
345 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
346 MXFPackage *package = av_mallocz(sizeof(*package)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
347 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
348 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
349 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
350 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
351 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
352 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
353 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
354 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
355 get_buffer(pb, package->uid, 16); |
1186 | 356 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
357 case 0x4403: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
358 package->tracks_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
359 if (package->tracks_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
360 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
361 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
362 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
363 get_buffer(pb, package->tracks_refs, package->tracks_count * sizeof(UID)); |
1186 | 364 break; |
365 default: | |
366 url_fskip(pb, size); | |
367 } | |
368 bytes_read += size + 4; | |
369 } | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
370 package->type = MaterialPackage; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
371 return mxf_add_metadata_set(mxf, package); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
372 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
373 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
374 static int mxf_read_metadata_track(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
375 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
376 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
377 MXFTrack *track = av_mallocz(sizeof(*track)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
378 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
379 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
380 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
381 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
382 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
383 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
384 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
385 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
386 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
387 get_buffer(pb, track->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
388 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
389 case 0x4801: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
390 track->track_id = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
391 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
392 case 0x4804: |
1197 | 393 get_buffer(pb, track->track_number, 4); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
394 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
395 case 0x4B01: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
396 track->edit_rate.den = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
397 track->edit_rate.num = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
398 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
399 case 0x4803: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
400 get_buffer(pb, track->sequence_ref, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
401 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
402 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
403 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
404 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
405 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
406 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
407 track->type = Track; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
408 return mxf_add_metadata_set(mxf, track); |
1186 | 409 } |
410 | |
411 static int mxf_read_metadata_sequence(MXFContext *mxf, KLVPacket *klv) | |
412 { | |
413 ByteIOContext *pb = &mxf->fc->pb; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
414 MXFSequence *sequence = av_mallocz(sizeof(*sequence)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
415 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
416 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
417 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
418 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
419 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
420 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
421 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
422 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
423 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
424 get_buffer(pb, sequence->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
425 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
426 case 0x0202: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
427 sequence->duration = get_be64(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
428 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
429 case 0x0201: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
430 get_buffer(pb, sequence->data_definition_ul, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
431 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
432 case 0x1001: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
433 sequence->structural_components_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
434 if (sequence->structural_components_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
435 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
436 sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
437 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
438 get_buffer(pb, sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
439 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
440 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
441 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
442 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
443 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
444 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
445 sequence->type = Sequence; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
446 return mxf_add_metadata_set(mxf, sequence); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
447 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
448 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
449 static int mxf_read_metadata_source_package(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
450 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
451 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
452 MXFPackage *package = av_mallocz(sizeof(*package)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
453 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
454 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
455 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
456 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
457 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
458 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
459 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
460 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
461 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
462 get_buffer(pb, package->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
463 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
464 case 0x4403: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
465 package->tracks_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
466 if (package->tracks_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
467 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
468 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
469 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
470 get_buffer(pb, package->tracks_refs, package->tracks_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
471 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
472 case 0x4401: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
473 /* UMID, only get last 16 bytes */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
474 url_fskip(pb, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
475 get_buffer(pb, package->package_uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
476 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
477 case 0x4701: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
478 get_buffer(pb, package->descriptor_ref, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
479 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
480 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
481 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
482 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
483 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
484 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
485 package->type = SourcePackage; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
486 return mxf_add_metadata_set(mxf, package); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
487 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
488 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
489 static int mxf_read_metadata_multiple_descriptor(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
490 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
491 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
492 MXFDescriptor *descriptor = av_mallocz(sizeof(*descriptor)); |
1186 | 493 int bytes_read = 0; |
494 | |
495 while (bytes_read < klv->length) { | |
496 int tag = get_be16(pb); | |
497 int size = get_be16(pb); /* KLV specified by 0x53 */ | |
498 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
499 dprintf("tag 0x%04X, size %d\n", tag, size); |
1186 | 500 switch (tag) { |
501 case 0x3C0A: | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
502 get_buffer(pb, descriptor->uid, 16); |
1186 | 503 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
504 case 0x3F01: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
505 descriptor->sub_descriptors_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
506 if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
507 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
508 descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
509 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
510 get_buffer(pb, descriptor->sub_descriptors_refs, descriptor->sub_descriptors_count * sizeof(UID)); |
1186 | 511 break; |
512 default: | |
513 url_fskip(pb, size); | |
514 } | |
515 bytes_read += size + 4; | |
516 } | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
517 descriptor->type = MultipleDescriptor; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
518 return mxf_add_metadata_set(mxf, descriptor); |
1186 | 519 } |
520 | |
1202 | 521 static void mxf_read_metadata_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor) |
522 { | |
523 int code; | |
524 | |
525 do { | |
526 code = get_byte(pb); | |
527 dprintf("pixel layout: code 0x%x\n", code); | |
528 switch (code) { | |
529 case 0x52: /* R */ | |
530 descriptor->bits_per_sample += get_byte(pb); | |
531 break; | |
532 case 0x47: /* G */ | |
533 descriptor->bits_per_sample += get_byte(pb); | |
534 break; | |
535 case 0x42: /* B */ | |
536 descriptor->bits_per_sample += get_byte(pb); | |
537 break; | |
538 default: | |
539 get_byte(pb); | |
540 } | |
541 } while (code != 0); /* SMPTE 377M E.2.46 */ | |
542 } | |
543 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
544 static int mxf_read_metadata_generic_descriptor(MXFContext *mxf, KLVPacket *klv) |
1186 | 545 { |
546 ByteIOContext *pb = &mxf->fc->pb; | |
1192 | 547 MXFDescriptor *descriptor = av_mallocz(sizeof(*descriptor)); |
1186 | 548 int bytes_read = 0; |
549 | |
550 while (bytes_read < klv->length) { | |
551 int tag = get_be16(pb); | |
552 int size = get_be16(pb); /* KLV specified by 0x53 */ | |
553 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
554 dprintf("tag 0x%04X, size %d\n", tag, size); |
1186 | 555 switch (tag) { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
556 case 0x3C0A: |
1192 | 557 get_buffer(pb, descriptor->uid, 16); |
1186 | 558 break; |
559 case 0x3004: | |
1192 | 560 get_buffer(pb, descriptor->essence_container_ul, 16); |
1186 | 561 break; |
562 case 0x3006: | |
1192 | 563 descriptor->linked_track_id = get_be32(pb); |
1186 | 564 break; |
565 case 0x3201: /* PictureEssenceCoding */ | |
1192 | 566 get_buffer(pb, descriptor->essence_codec_ul, 16); |
1186 | 567 break; |
568 case 0x3203: | |
1192 | 569 descriptor->width = get_be32(pb); |
1186 | 570 break; |
571 case 0x3202: | |
1192 | 572 descriptor->height = get_be32(pb); |
1186 | 573 break; |
574 case 0x320E: | |
1192 | 575 descriptor->aspect_ratio.num = get_be32(pb); |
576 descriptor->aspect_ratio.den = get_be32(pb); | |
1186 | 577 break; |
578 case 0x3D03: | |
1192 | 579 descriptor->sample_rate.num = get_be32(pb); |
580 descriptor->sample_rate.den = get_be32(pb); | |
1186 | 581 break; |
582 case 0x3D06: /* SoundEssenceCompression */ | |
1192 | 583 get_buffer(pb, descriptor->essence_codec_ul, 16); |
1186 | 584 break; |
585 case 0x3D07: | |
1192 | 586 descriptor->channels = get_be32(pb); |
1186 | 587 break; |
588 case 0x3D01: | |
1192 | 589 descriptor->bits_per_sample = get_be32(pb); |
1186 | 590 break; |
1202 | 591 case 0x3401: |
592 mxf_read_metadata_pixel_layout(pb, descriptor); | |
593 break; | |
1186 | 594 default: |
595 url_fskip(pb, size); | |
596 } | |
597 bytes_read += size + 4; | |
598 } | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
599 descriptor->type = Descriptor; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
600 return mxf_add_metadata_set(mxf, descriptor); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
601 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
602 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
603 /* SMPTE RP224 http://www.smpte-ra.org/mdd/index.html */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
604 static const UID picture_essence_track_ul = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x01,0x00,0x00,0x00 }; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
605 static const UID sound_essence_track_ul = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x00,0x00,0x00 }; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
606 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
607 static const MXFCodecUL mxf_codec_uls[] = { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
608 /* PictureEssenceCoding */ |
1205 | 609 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, CODEC_ID_MPEG2VIDEO }, /* 422P@ML I-Frame */ |
610 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, CODEC_ID_MPEG2VIDEO }, /* 422P@HL Long GoP */ | |
611 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, CODEC_ID_MPEG2VIDEO }, /* MP@ML Long GoP */ | |
612 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, CODEC_ID_MPEG2VIDEO }, /* 422P@ML Long GoP */ | |
613 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, CODEC_ID_MPEG2VIDEO }, /* MP@HL Long GoP */ | |
1217 | 614 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x03 }, CODEC_ID_MPEG4 }, /* XDCAM proxy_pal030926.mxf */ |
615 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x04 }, CODEC_ID_MPEG4 }, /* XDCAM Proxy C0023S01.mxf */ | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
616 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, CODEC_ID_MPEG2VIDEO }, /* D-10 30Mbps PAL */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
617 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, CODEC_ID_MPEG2VIDEO }, /* D-10 50Mbps PAL */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
618 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 }, CODEC_ID_DVVIDEO }, /* DVCPRO50 PAL */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
619 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 }, CODEC_ID_DVVIDEO }, /* DVCPRO25 PAL */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
620 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 }, CODEC_ID_DVVIDEO }, /* DV25 IEC PAL */ |
1200 | 621 //{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_JPEG2K }, /* JPEG2000 Codestream */ |
1202 | 622 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x01,0x7F,0x00,0x00,0x00 }, CODEC_ID_RAWVIDEO }, /* Uncompressed */ |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
623 /* SoundEssenceCompression */ |
1217 | 624 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, CODEC_ID_PCM_S16LE }, /* Uncompressed */ |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
625 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x7F,0x00,0x00,0x00 }, CODEC_ID_PCM_S16LE }, |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
626 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x02,0x02,0x01,0x7E,0x00,0x00,0x00 }, CODEC_ID_PCM_S16BE }, /* From Omneon MXF file */ |
1200 | 627 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_PCM_ALAW }, |
1217 | 628 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x04,0x04,0x02,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_PCM_ALAW }, /* XDCAM Proxy C0023S01.mxf */ |
1200 | 629 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x01,0x00 }, CODEC_ID_AC3 }, |
630 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x05,0x00 }, CODEC_ID_MP2 }, /* MP2 or MP3 */ | |
631 //{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x1C,0x00 }, CODEC_ID_DOLBY_E }, /* Dolby-E */ | |
1218 | 632 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE }, |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
633 }; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
634 |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
635 static const MXFCodecUL mxf_picture_essence_container_uls[] = { |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
636 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, CODEC_ID_MPEG2VIDEO }, /* MPEG-ES Frame wrapped */ |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
637 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE }, |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
638 }; |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
639 |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
640 static const MXFCodecUL mxf_sound_essence_container_uls[] = { |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
641 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, CODEC_ID_PCM_S16LE }, /* BWF Frame wrapped */ |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
642 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 }, CODEC_ID_PCM_S16LE }, /* AES Frame wrapped */ |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
643 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, CODEC_ID_MP2 }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */ |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
644 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x01 }, CODEC_ID_MP2 }, /* MPEG-ES Frame wrapped, 0xc0 MPA stream id */ |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
645 //{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, CODEC_ID_PCM_AES3 }, /* D-10 Mapping 30Mbps PAL Extended Template */ |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
646 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE }, |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
647 }; |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
648 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
649 static enum CodecID mxf_get_codec_id(const MXFCodecUL *uls, UID *uid) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
650 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
651 while (uls->id != CODEC_ID_NONE) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
652 if(!memcmp(uls->uid, *uid, 16)) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
653 return uls->id; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
654 uls++; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
655 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
656 return CODEC_ID_NONE; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
657 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
658 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
659 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref) |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
660 { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
661 int i; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
662 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
663 if (!strong_ref) |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
664 return NULL; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
665 for (i = 0; i < mxf->metadata_sets_count; i++) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
666 if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16)) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
667 return mxf->metadata_sets[i]; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
668 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
669 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
670 return NULL; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
671 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
672 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
673 static int mxf_parse_structural_metadata(MXFContext *mxf) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
674 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
675 MXFPackage *material_package = NULL; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
676 MXFPackage *source_package = NULL; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
677 MXFPackage *temp_package = NULL; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
678 int i, j, k; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
679 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
680 dprintf("metadata sets count %d\n", mxf->metadata_sets_count); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
681 /* TODO: handle multiple material packages (OP3x) */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
682 for (i = 0; i < mxf->packages_count; i++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
683 if (!(temp_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
684 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve package strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
685 return -1; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
686 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
687 if (temp_package->type == MaterialPackage) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
688 material_package = temp_package; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
689 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
690 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
691 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
692 if (!material_package) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
693 av_log(mxf->fc, AV_LOG_ERROR, "no material package found\n"); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
694 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
695 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
696 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
697 for (i = 0; i < material_package->tracks_count; i++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
698 MXFTrack *material_track = NULL; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
699 MXFTrack *source_track = NULL; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
700 MXFTrack *temp_track = NULL; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
701 MXFDescriptor *descriptor = NULL; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
702 MXFStructuralComponent *component = NULL; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
703 AVStream *st; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
704 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
705 if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
706 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
707 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
708 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
709 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
710 if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
711 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
712 return -1; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
713 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
714 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
715 /* TODO: handle multiple source clips */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
716 for (j = 0; j < material_track->sequence->structural_components_count; j++) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
717 /* TODO: handle timecode component */ |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
718 component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j]); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
719 if (!component || component->type != SourceClip) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
720 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
721 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
722 for (k = 0; k < mxf->packages_count; k++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
723 if (!(temp_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[k]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
724 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
725 return -1; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
726 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
727 if (!memcmp(temp_package->package_uid, component->source_package_uid, 16)) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
728 source_package = temp_package; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
729 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
730 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
731 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
732 if (!source_package) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
733 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source package found\n", material_track->track_id); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
734 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
735 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
736 for (k = 0; k < source_package->tracks_count; k++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
737 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
738 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
739 return -1; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
740 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
741 if (temp_track->track_id == component->source_track_id) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
742 source_track = temp_track; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
743 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
744 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
745 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
746 if (!source_track) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
747 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
748 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
749 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
750 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
751 if (!source_track) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
752 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
753 |
1197 | 754 st = av_new_stream(mxf->fc, source_track->track_id); |
755 st->priv_data = source_track; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
756 st->duration = component->duration; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
757 if (st->duration == -1) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
758 st->duration = AV_NOPTS_VALUE; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
759 st->start_time = component->start_position; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
760 av_set_pts_info(st, 64, material_track->edit_rate.num, material_track->edit_rate.den); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
761 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
762 if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
763 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
764 return -1; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
765 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
766 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
767 #ifdef DEBUG |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
768 PRINT_KEY(source_track->sequence->data_definition_ul); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
769 #endif |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
770 if (!memcmp(source_track->sequence->data_definition_ul, picture_essence_track_ul, 16)) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
771 st->codec->codec_type = CODEC_TYPE_VIDEO; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
772 else if (!memcmp(source_track->sequence->data_definition_ul, sound_essence_track_ul, 16)) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
773 st->codec->codec_type = CODEC_TYPE_AUDIO; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
774 else |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
775 st->codec->codec_type = CODEC_TYPE_DATA; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
776 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
777 source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
778 if (source_package->descriptor) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
779 if (source_package->descriptor->type == MultipleDescriptor) { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
780 for (j = 0; j < source_package->descriptor->sub_descriptors_count; j++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
781 MXFDescriptor *sub_descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor->sub_descriptors_refs[j]); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
782 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
783 if (!sub_descriptor) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
784 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
785 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
786 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
787 if (sub_descriptor->linked_track_id == source_track->track_id) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
788 descriptor = sub_descriptor; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
789 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
790 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
791 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
792 } else |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
793 descriptor = source_package->descriptor; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
794 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
795 if (!descriptor) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
796 av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
797 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
798 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
799 #ifdef DEBUG |
1192 | 800 PRINT_KEY(descriptor->essence_codec_ul); |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
801 PRINT_KEY(descriptor->essence_container_ul); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
802 #endif |
1192 | 803 st->codec->codec_id = mxf_get_codec_id(mxf_codec_uls, &descriptor->essence_codec_ul); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
804 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
805 if (st->codec->codec_id == CODEC_ID_NONE) |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
806 st->codec->codec_id = mxf_get_codec_id(mxf_picture_essence_container_uls, &descriptor->essence_container_ul); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
807 st->codec->width = descriptor->width; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
808 st->codec->height = descriptor->height; |
1202 | 809 st->codec->bits_per_sample = descriptor->bits_per_sample; /* Uncompressed */ |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
810 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
811 if (st->codec->codec_id == CODEC_ID_NONE) |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
812 st->codec->codec_id = mxf_get_codec_id(mxf_sound_essence_container_uls, &descriptor->essence_container_ul); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
813 st->codec->channels = descriptor->channels; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
814 st->codec->bits_per_sample = descriptor->bits_per_sample; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
815 st->codec->sample_rate = descriptor->sample_rate.num / descriptor->sample_rate.den; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
816 /* TODO: implement CODEC_ID_RAWAUDIO */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
817 if (st->codec->codec_id == CODEC_ID_PCM_S16LE) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
818 if (descriptor->bits_per_sample == 24) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
819 st->codec->codec_id = CODEC_ID_PCM_S24LE; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
820 else if (descriptor->bits_per_sample == 32) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
821 st->codec->codec_id = CODEC_ID_PCM_S32LE; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
822 } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
823 if (descriptor->bits_per_sample == 24) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
824 st->codec->codec_id = CODEC_ID_PCM_S24BE; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
825 else if (descriptor->bits_per_sample == 32) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
826 st->codec->codec_id = CODEC_ID_PCM_S32BE; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
827 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
828 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
829 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
830 return 0; |
1186 | 831 } |
832 | |
1210 | 833 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { |
834 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2F,0x00 }, mxf_read_metadata_preface }, | |
835 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_metadata_content_storage }, | |
836 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_metadata_source_package }, | |
837 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_metadata_material_package }, | |
838 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_metadata_sequence }, | |
839 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_metadata_source_clip }, | |
840 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_metadata_multiple_descriptor }, | |
841 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 }, mxf_read_metadata_generic_descriptor }, /* Generic Sound */ | |
842 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_metadata_generic_descriptor }, /* CDCI */ | |
843 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_metadata_generic_descriptor }, /* RGBA */ | |
844 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_metadata_generic_descriptor }, /* MPEG 2 Video */ | |
845 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_metadata_generic_descriptor }, /* Wave */ | |
846 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_metadata_generic_descriptor }, /* AES3 */ | |
847 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_metadata_track }, /* Static Track */ | |
848 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_metadata_track }, /* Generic Track */ | |
849 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL }, | |
850 }; | |
851 | |
1186 | 852 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
853 { | |
854 MXFContext *mxf = s->priv_data; | |
855 KLVPacket klv; | |
856 | |
857 mxf->fc = s; | |
858 while (!url_feof(&s->pb)) { | |
1210 | 859 const MXFMetadataReadTableEntry *function; |
860 | |
1191 | 861 if (klv_read_packet(&klv, &s->pb) < 0) { |
862 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n"); | |
1186 | 863 return -1; |
1191 | 864 } |
1198 | 865 #ifdef DEBUG |
866 PRINT_KEY(klv.key); | |
867 #endif | |
1210 | 868 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
1186 | 869 /* FIXME avoid seek */ |
870 url_fseek(&s->pb, klv.offset, SEEK_SET); | |
871 break; | |
1210 | 872 } |
873 | |
874 for (function = mxf_metadata_read_table; function->read; function++) { | |
875 if (IS_KLV_KEY(klv.key, function->key)) { | |
876 if (function->read(mxf, &klv) < 0) { | |
877 av_log(s, AV_LOG_ERROR, "error reading header metadata\n"); | |
878 return -1; | |
879 } | |
880 break; | |
881 } | |
882 } | |
883 if (!function->read) | |
1186 | 884 url_fskip(&s->pb, klv.length); |
885 } | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
886 return mxf_parse_structural_metadata(mxf); |
1186 | 887 } |
888 | |
889 static int mxf_read_close(AVFormatContext *s) | |
890 { | |
891 MXFContext *mxf = s->priv_data; | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
892 int i; |
1186 | 893 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
894 av_freep(&mxf->packages_refs); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
895 av_freep(&mxf->essence_container_data_sets_refs); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
896 av_freep(&mxf->essence_containers_uls); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
897 for (i = 0; i < mxf->metadata_sets_count; i++) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
898 switch (mxf->metadata_sets[i]->type) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
899 case MultipleDescriptor: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
900 av_freep(&((MXFDescriptor *)mxf->metadata_sets[i])->sub_descriptors_refs); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
901 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
902 case Sequence: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
903 av_freep(&((MXFSequence *)mxf->metadata_sets[i])->structural_components_refs); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
904 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
905 case SourcePackage: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
906 case MaterialPackage: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
907 av_freep(&((MXFPackage *)mxf->metadata_sets[i])->tracks_refs); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
908 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
909 default: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
910 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
911 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
912 av_freep(&mxf->metadata_sets[i]); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
913 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
914 av_freep(&mxf->metadata_sets); |
1186 | 915 return 0; |
916 } | |
917 | |
918 static int mxf_probe(AVProbeData *p) { | |
1211 | 919 uint8_t *bufp = p->buf; |
920 uint8_t *end = p->buf + p->buf_size; | |
921 | |
1186 | 922 if (p->buf_size < sizeof(mxf_header_partition_pack_key)) |
923 return 0; | |
924 | |
1211 | 925 /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */ |
926 end -= sizeof(mxf_header_partition_pack_key); | |
927 for (; bufp < end; bufp++) { | |
928 if (IS_KLV_KEY(bufp, mxf_header_partition_pack_key)) | |
929 return AVPROBE_SCORE_MAX; | |
930 } | |
931 return 0; | |
1186 | 932 } |
933 | |
934 | |
935 AVInputFormat mxf_demuxer = { | |
936 "mxf", | |
937 "MXF format", | |
938 sizeof(MXFContext), | |
939 mxf_probe, | |
940 mxf_read_header, | |
941 mxf_read_packet, | |
942 mxf_read_close, | |
943 NULL, | |
944 }; |