Mercurial > libavformat.hg
annotate mxfdec.c @ 3792:a6d4e93e171b libavformat
fix version string ul
author | bcoudurier |
---|---|
date | Fri, 29 Aug 2008 16:56:36 +0000 |
parents | b7bd38b16272 |
children | dcc57b916324 |
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 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1354
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1354
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1354
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1186 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1354
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1186 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1354
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1186 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1354
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
1186 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 */ | |
21 | |
22 /* | |
23 * References | |
24 * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value | |
25 * SMPTE 377M MXF File Format Specifications | |
26 * SMPTE 378M Operational Pattern 1a | |
27 * SMPTE 379M MXF Generic Container | |
28 * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container | |
29 * SMPTE 382M Mapping AES3 and Broadcast Wave Audio into the MXF Generic Container | |
30 * SMPTE 383M Mapping DV-DIF Data to the MXF Generic Container | |
31 * | |
32 * Principle | |
33 * Search for Track numbers which will identify essence element KLV packets. | |
34 * 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
|
35 * Material Package contains tracks with reference to SourcePackage tracks. |
1186 | 36 * Search for Descriptors (Picture, Sound) which contains codec info and parameters. |
37 * Assign Descriptors to correct Tracks. | |
38 * | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
39 * 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
|
40 * 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
|
41 * |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
42 * 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
|
43 * Only tracks with associated descriptors will be decoded. "Highly Desirable" SMPTE 377M D.1 |
1186 | 44 */ |
45 | |
1228 | 46 //#define DEBUG |
1186 | 47 |
3286 | 48 #include "libavutil/aes.h" |
3734 | 49 #include "mxf.h" |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
50 |
2125 | 51 typedef struct { |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
52 UID uid; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
53 enum MXFMetadataSetType type; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
54 UID source_container_ul; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
55 } MXFCryptoContext; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
56 |
2125 | 57 typedef struct { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 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
|
65 } MXFStructuralComponent; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
66 |
2125 | 67 typedef struct { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
68 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
|
69 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
|
70 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
|
71 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
|
72 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
|
73 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
|
74 } MXFSequence; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
75 |
2125 | 76 typedef struct { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 UID sequence_ref; |
1186 | 81 int track_id; |
1197 | 82 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
|
83 AVRational edit_rate; |
1186 | 84 } MXFTrack; |
85 | |
2125 | 86 typedef struct { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
87 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
|
88 enum MXFMetadataSetType type; |
1192 | 89 UID essence_container_ul; |
90 UID essence_codec_ul; | |
1186 | 91 AVRational sample_rate; |
92 AVRational aspect_ratio; | |
93 int width; | |
94 int height; | |
95 int channels; | |
96 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
|
97 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
|
98 int sub_descriptors_count; |
1186 | 99 int linked_track_id; |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
100 uint8_t *extradata; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
101 int extradata_size; |
1186 | 102 } MXFDescriptor; |
103 | |
2125 | 104 typedef struct { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
105 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
|
106 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
|
107 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
|
108 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
|
109 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
|
110 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
|
111 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
|
112 } MXFPackage; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
113 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
114 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
|
115 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
|
116 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
|
117 } MXFMetadataSet; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
118 |
2125 | 119 typedef struct { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
120 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
|
121 int packages_count; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
122 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
|
123 int metadata_sets_count; |
1186 | 124 AVFormatContext *fc; |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
125 struct AVAES *aesc; |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
126 uint8_t *local_tags; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
127 int local_tags_count; |
1186 | 128 } MXFContext; |
129 | |
1225 | 130 enum MXFWrappingScheme { |
131 Frame, | |
132 Clip, | |
133 }; | |
134 | |
2125 | 135 typedef struct { |
1210 | 136 const UID key; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
137 int (*read)(); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
138 int ctx_size; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
139 enum MXFMetadataSetType type; |
1210 | 140 } MXFMetadataReadTableEntry; |
1189 | 141 |
142 /* partial keys to match */ | |
1195 | 143 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 }; |
1197 | 144 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 }; |
2116
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
145 static const uint8_t mxf_klv_key[] = { 0x06,0x0e,0x2b,0x34 }; |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
146 /* complete keys to match */ |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
147 static const uint8_t mxf_crypto_source_container_ul[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x02,0x02,0x00,0x00,0x00 }; |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
148 static const uint8_t mxf_encrypted_triplet_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 }; |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
149 static const uint8_t mxf_encrypted_essence_container[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0b,0x01,0x00 }; |
2952 | 150 static const uint8_t mxf_sony_mpeg4_extradata[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0e,0x06,0x06,0x02,0x02,0x01,0x00,0x00 }; |
1186 | 151 |
152 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y))) | |
153 | |
154 static int64_t klv_decode_ber_length(ByteIOContext *pb) | |
155 { | |
1644 | 156 uint64_t size = get_byte(pb); |
157 if (size & 0x80) { /* long form */ | |
158 int bytes_num = size & 0x7f; | |
1186 | 159 /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */ |
160 if (bytes_num > 8) | |
161 return -1; | |
1644 | 162 size = 0; |
1186 | 163 while (bytes_num--) |
164 size = size << 8 | get_byte(pb); | |
165 } | |
166 return size; | |
167 } | |
168 | |
2116
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
169 static int mxf_read_sync(ByteIOContext *pb, const uint8_t *key, unsigned size) |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
170 { |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
171 int i, b; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
172 for (i = 0; i < size && !url_feof(pb); i++) { |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
173 b = get_byte(pb); |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
174 if (b == key[0]) |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
175 i = 0; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
176 else if (b != key[i]) |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
177 i = -1; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
178 } |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
179 return i == size; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
180 } |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
181 |
1186 | 182 static int klv_read_packet(KLVPacket *klv, ByteIOContext *pb) |
183 { | |
2116
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
184 if (!mxf_read_sync(pb, mxf_klv_key, 4)) |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
185 return -1; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
186 klv->offset = url_ftell(pb) - 4; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
187 memcpy(klv->key, mxf_klv_key, 4); |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
188 get_buffer(pb, klv->key + 4, 12); |
1186 | 189 klv->length = klv_decode_ber_length(pb); |
1194 | 190 return klv->length == -1 ? -1 : 0; |
1186 | 191 } |
192 | |
193 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv) | |
194 { | |
195 int i; | |
196 | |
197 for (i = 0; i < s->nb_streams; i++) { | |
1197 | 198 MXFTrack *track = s->streams[i]->priv_data; |
1650 | 199 /* SMPTE 379M 7.3 */ |
1197 | 200 if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number))) |
1186 | 201 return i; |
202 } | |
1347
ff613c1c0795
return 0 as stream index if only one stream, this is completely non standard, fix Cars_TL4IO6_239_DEXX_MPEG_TDC_072006.wav.mxf
bcoudurier
parents:
1343
diff
changeset
|
203 /* return 0 if only one stream, for OP Atom files with 0 as track number */ |
ff613c1c0795
return 0 as stream index if only one stream, this is completely non standard, fix Cars_TL4IO6_239_DEXX_MPEG_TDC_072006.wav.mxf
bcoudurier
parents:
1343
diff
changeset
|
204 return s->nb_streams == 1 ? 0 : -1; |
1186 | 205 } |
206 | |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
207 /* XXX: use AVBitStreamFilter */ |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
208 static int mxf_get_d10_aes3_packet(ByteIOContext *pb, AVStream *st, AVPacket *pkt, int64_t length) |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
209 { |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
210 uint8_t buffer[61444]; |
2995 | 211 const uint8_t *buf_ptr, *end_ptr; |
212 uint8_t *data_ptr; | |
2563 | 213 int i; |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
214 |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
215 if (length > 61444) /* worst case PAL 1920 samples 8 channels */ |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
216 return -1; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
217 get_buffer(pb, buffer, length); |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
218 av_new_packet(pkt, length); |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
219 data_ptr = pkt->data; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
220 end_ptr = buffer + length; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
221 buf_ptr = buffer + 4; /* skip SMPTE 331M header */ |
2563 | 222 for (; buf_ptr < end_ptr; ) { |
223 for (i = 0; i < st->codec->channels; i++) { | |
224 uint32_t sample = bytestream_get_le32(&buf_ptr); | |
225 if (st->codec->bits_per_sample == 24) | |
226 bytestream_put_le24(&data_ptr, (sample >> 4) & 0xffffff); | |
227 else | |
228 bytestream_put_le16(&data_ptr, (sample >> 12) & 0xffff); | |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
229 } |
2563 | 230 buf_ptr += 32 - st->codec->channels*4; // always 8 channels stored SMPTE 331M |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
231 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
232 pkt->size = data_ptr - pkt->data; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
233 return 0; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
234 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
235 |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
236 static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv) |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
237 { |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
238 static const uint8_t checkv[16] = {0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b}; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
239 MXFContext *mxf = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
240 ByteIOContext *pb = s->pb; |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
241 offset_t end = url_ftell(pb) + klv->length; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
242 uint64_t size; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
243 uint64_t orig_size; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
244 uint64_t plaintext_size; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
245 uint8_t ivec[16]; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
246 uint8_t tmpbuf[16]; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
247 int index; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
248 |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
249 if (!mxf->aesc && s->key && s->keylen == 16) { |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
250 mxf->aesc = av_malloc(av_aes_size); |
2944 | 251 if (!mxf->aesc) |
252 return -1; | |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
253 av_aes_init(mxf->aesc, s->key, 128, 1); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
254 } |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
255 // crypto context |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
256 url_fskip(pb, klv_decode_ber_length(pb)); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
257 // plaintext offset |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
258 klv_decode_ber_length(pb); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
259 plaintext_size = get_be64(pb); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
260 // source klv key |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
261 klv_decode_ber_length(pb); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
262 get_buffer(pb, klv->key, 16); |
2123 | 263 if (!IS_KLV_KEY(klv, mxf_essence_element_key)) |
264 return -1; | |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
265 index = mxf_get_stream_index(s, klv); |
2123 | 266 if (index < 0) |
267 return -1; | |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
268 // source size |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
269 klv_decode_ber_length(pb); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
270 orig_size = get_be64(pb); |
2123 | 271 if (orig_size < plaintext_size) |
272 return -1; | |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
273 // enc. code |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
274 size = klv_decode_ber_length(pb); |
2123 | 275 if (size < 32 || size - 32 < orig_size) |
276 return -1; | |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
277 get_buffer(pb, ivec, 16); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
278 get_buffer(pb, tmpbuf, 16); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
279 if (mxf->aesc) |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
280 av_aes_crypt(mxf->aesc, tmpbuf, tmpbuf, 1, ivec, 1); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
281 if (memcmp(tmpbuf, checkv, 16)) |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
282 av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n"); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
283 size -= 32; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
284 av_get_packet(pb, pkt, size); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
285 size -= plaintext_size; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
286 if (mxf->aesc) |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
287 av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size], |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
288 &pkt->data[plaintext_size], size >> 4, ivec, 1); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
289 pkt->size = orig_size; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
290 pkt->stream_index = index; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
291 url_fskip(pb, end - url_ftell(pb)); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
292 return 0; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
293 } |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
294 |
1186 | 295 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) |
296 { | |
297 KLVPacket klv; | |
298 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
299 while (!url_feof(s->pb)) { |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
300 if (klv_read_packet(&klv, s->pb) < 0) |
1186 | 301 return -1; |
1907 | 302 PRINT_KEY(s, "read packet", klv.key); |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
303 if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) { |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
304 int res = mxf_decrypt_triplet(s, pkt, &klv); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
305 if (res < 0) { |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
306 av_log(s, AV_LOG_ERROR, "invalid encoded triplet\n"); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
307 return -1; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
308 } |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
309 return 0; |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
310 } |
1186 | 311 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
312 int index = mxf_get_stream_index(s, &klv); |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
313 if (index < 0) { |
3533 | 314 av_log(s, AV_LOG_ERROR, "error getting stream index %x\n", AV_RB32(klv.key+12)); |
3146
2da3651f804d
just skip klv packet, when no corresponding stream is found
bcoudurier
parents:
3117
diff
changeset
|
315 goto skip; |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
316 } |
3117 | 317 if (s->streams[index]->discard == AVDISCARD_ALL) |
318 goto skip; | |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
319 /* check for 8 channels AES3 element */ |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
320 if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
321 if (mxf_get_d10_aes3_packet(s->pb, s->streams[index], pkt, klv.length) < 0) { |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
322 av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n"); |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
323 return -1; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
324 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
325 } else |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
326 av_get_packet(s->pb, pkt, klv.length); |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
327 pkt->stream_index = index; |
2121 | 328 pkt->pos = klv.offset; |
1354
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
329 return 0; |
1186 | 330 } else |
3117 | 331 skip: |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
332 url_fskip(s->pb, klv.length); |
1186 | 333 } |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2125
diff
changeset
|
334 return AVERROR(EIO); |
1186 | 335 } |
336 | |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
337 static int mxf_read_primer_pack(MXFContext *mxf) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
338 { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
339 ByteIOContext *pb = mxf->fc->pb; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
340 int item_num = get_be32(pb); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
341 int item_len = get_be32(pb); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
342 |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
343 if (item_len != 18) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
344 av_log(mxf->fc, AV_LOG_ERROR, "unsupported primer pack item length\n"); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
345 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
346 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
347 if (item_num > UINT_MAX / item_len) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
348 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
349 mxf->local_tags_count = item_num; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
350 mxf->local_tags = av_malloc(item_num*item_len); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
351 if (!mxf->local_tags) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
352 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
353 get_buffer(pb, mxf->local_tags, item_num*item_len); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
354 return 0; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
355 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
356 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
357 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
|
358 { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
359 mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); |
2944 | 360 if (!mxf->metadata_sets) |
361 return -1; | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
362 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
|
363 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
|
364 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
|
365 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
366 |
2948 | 367 static int mxf_read_cryptographic_context(MXFCryptoContext *cryptocontext, ByteIOContext *pb, int tag, int size, UID uid) |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
368 { |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
369 if (size != 16) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
370 return -1; |
2946 | 371 if (IS_KLV_KEY(uid, mxf_crypto_source_container_ul)) |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
372 get_buffer(pb, cryptocontext->source_container_ul, 16); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
373 return 0; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
374 } |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
375 |
2948 | 376 static int mxf_read_content_storage(MXFContext *mxf, ByteIOContext *pb, int tag) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
377 { |
1650 | 378 switch (tag) { |
379 case 0x1901: | |
380 mxf->packages_count = get_be32(pb); | |
381 if (mxf->packages_count >= UINT_MAX / sizeof(UID)) | |
382 return -1; | |
383 mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID)); | |
2944 | 384 if (!mxf->packages_refs) |
385 return -1; | |
1650 | 386 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
387 get_buffer(pb, (uint8_t *)mxf->packages_refs, mxf->packages_count * sizeof(UID)); | |
388 break; | |
389 } | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
390 return 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
391 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
392 |
2948 | 393 static int mxf_read_source_clip(MXFStructuralComponent *source_clip, ByteIOContext *pb, int tag) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
394 { |
1650 | 395 switch(tag) { |
396 case 0x0202: | |
397 source_clip->duration = get_be64(pb); | |
398 break; | |
399 case 0x1201: | |
400 source_clip->start_position = get_be64(pb); | |
401 break; | |
402 case 0x1101: | |
403 /* UMID, only get last 16 bytes */ | |
404 url_fskip(pb, 16); | |
405 get_buffer(pb, source_clip->source_package_uid, 16); | |
406 break; | |
407 case 0x1102: | |
408 source_clip->source_track_id = get_be32(pb); | |
409 break; | |
410 } | |
411 return 0; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
412 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
413 |
2948 | 414 static int mxf_read_material_package(MXFPackage *package, ByteIOContext *pb, int tag) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
415 { |
1650 | 416 switch(tag) { |
417 case 0x4403: | |
418 package->tracks_count = get_be32(pb); | |
419 if (package->tracks_count >= UINT_MAX / sizeof(UID)) | |
420 return -1; | |
421 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); | |
2944 | 422 if (!package->tracks_refs) |
423 return -1; | |
1650 | 424 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
425 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); | |
426 break; | |
427 } | |
428 return 0; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
429 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
430 |
2948 | 431 static int mxf_read_track(MXFTrack *track, ByteIOContext *pb, int tag) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
432 { |
1650 | 433 switch(tag) { |
434 case 0x4801: | |
435 track->track_id = get_be32(pb); | |
436 break; | |
437 case 0x4804: | |
438 get_buffer(pb, track->track_number, 4); | |
439 break; | |
440 case 0x4B01: | |
441 track->edit_rate.den = get_be32(pb); | |
442 track->edit_rate.num = get_be32(pb); | |
443 break; | |
444 case 0x4803: | |
445 get_buffer(pb, track->sequence_ref, 16); | |
446 break; | |
447 } | |
448 return 0; | |
1186 | 449 } |
450 | |
2948 | 451 static int mxf_read_sequence(MXFSequence *sequence, ByteIOContext *pb, int tag) |
1186 | 452 { |
1650 | 453 switch(tag) { |
454 case 0x0202: | |
455 sequence->duration = get_be64(pb); | |
456 break; | |
457 case 0x0201: | |
458 get_buffer(pb, sequence->data_definition_ul, 16); | |
459 break; | |
460 case 0x1001: | |
461 sequence->structural_components_count = get_be32(pb); | |
462 if (sequence->structural_components_count >= UINT_MAX / sizeof(UID)) | |
463 return -1; | |
464 sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID)); | |
2944 | 465 if (!sequence->structural_components_refs) |
466 return -1; | |
1650 | 467 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
468 get_buffer(pb, (uint8_t *)sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID)); | |
469 break; | |
470 } | |
471 return 0; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
472 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
473 |
2948 | 474 static int mxf_read_source_package(MXFPackage *package, ByteIOContext *pb, int tag) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
475 { |
1650 | 476 switch(tag) { |
477 case 0x4403: | |
478 package->tracks_count = get_be32(pb); | |
479 if (package->tracks_count >= UINT_MAX / sizeof(UID)) | |
480 return -1; | |
481 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); | |
2944 | 482 if (!package->tracks_refs) |
483 return -1; | |
1650 | 484 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
485 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); | |
486 break; | |
487 case 0x4401: | |
488 /* UMID, only get last 16 bytes */ | |
489 url_fskip(pb, 16); | |
490 get_buffer(pb, package->package_uid, 16); | |
491 break; | |
492 case 0x4701: | |
493 get_buffer(pb, package->descriptor_ref, 16); | |
494 break; | |
495 } | |
496 return 0; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
497 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
498 |
2948 | 499 static void mxf_read_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor) |
1202 | 500 { |
501 int code; | |
502 | |
503 do { | |
504 code = get_byte(pb); | |
1907 | 505 dprintf(NULL, "pixel layout: code 0x%x\n", code); |
1202 | 506 switch (code) { |
507 case 0x52: /* R */ | |
508 descriptor->bits_per_sample += get_byte(pb); | |
509 break; | |
510 case 0x47: /* G */ | |
511 descriptor->bits_per_sample += get_byte(pb); | |
512 break; | |
513 case 0x42: /* B */ | |
514 descriptor->bits_per_sample += get_byte(pb); | |
515 break; | |
516 default: | |
517 get_byte(pb); | |
518 } | |
519 } while (code != 0); /* SMPTE 377M E.2.46 */ | |
520 } | |
521 | |
2952 | 522 static int mxf_read_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size, UID uid) |
1186 | 523 { |
1650 | 524 switch(tag) { |
1652
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
525 case 0x3F01: |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
526 descriptor->sub_descriptors_count = get_be32(pb); |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
527 if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID)) |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
528 return -1; |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
529 descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID)); |
2944 | 530 if (!descriptor->sub_descriptors_refs) |
531 return -1; | |
1652
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
532 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
533 get_buffer(pb, (uint8_t *)descriptor->sub_descriptors_refs, descriptor->sub_descriptors_count * sizeof(UID)); |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
534 break; |
1650 | 535 case 0x3004: |
536 get_buffer(pb, descriptor->essence_container_ul, 16); | |
537 break; | |
538 case 0x3006: | |
539 descriptor->linked_track_id = get_be32(pb); | |
540 break; | |
541 case 0x3201: /* PictureEssenceCoding */ | |
542 get_buffer(pb, descriptor->essence_codec_ul, 16); | |
543 break; | |
544 case 0x3203: | |
545 descriptor->width = get_be32(pb); | |
546 break; | |
547 case 0x3202: | |
548 descriptor->height = get_be32(pb); | |
549 break; | |
550 case 0x320E: | |
551 descriptor->aspect_ratio.num = get_be32(pb); | |
552 descriptor->aspect_ratio.den = get_be32(pb); | |
553 break; | |
554 case 0x3D03: | |
555 descriptor->sample_rate.num = get_be32(pb); | |
556 descriptor->sample_rate.den = get_be32(pb); | |
557 break; | |
558 case 0x3D06: /* SoundEssenceCompression */ | |
559 get_buffer(pb, descriptor->essence_codec_ul, 16); | |
560 break; | |
561 case 0x3D07: | |
562 descriptor->channels = get_be32(pb); | |
563 break; | |
564 case 0x3D01: | |
565 descriptor->bits_per_sample = get_be32(pb); | |
566 break; | |
567 case 0x3401: | |
2948 | 568 mxf_read_pixel_layout(pb, descriptor); |
1650 | 569 break; |
2952 | 570 default: |
571 /* Private uid used by SONY C0023S01.mxf */ | |
572 if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) { | |
2953 | 573 descriptor->extradata = av_malloc(size); |
574 if (!descriptor->extradata) | |
575 return -1; | |
576 descriptor->extradata_size = size; | |
577 get_buffer(pb, descriptor->extradata, size); | |
2952 | 578 } |
1650 | 579 break; |
580 } | |
581 return 0; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
582 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
583 |
2115 | 584 /* |
585 * Match an uid independently of the version byte and up to len common bytes | |
586 * Returns: boolean | |
587 */ | |
588 static int mxf_match_uid(const UID key, const UID uid, int len) | |
589 { | |
590 int i; | |
591 for (i = 0; i < len; i++) { | |
592 if (i != 7 && key[i] != uid[i]) | |
593 return 0; | |
594 } | |
595 return 1; | |
596 } | |
597 | |
1225 | 598 static const MXFCodecUL *mxf_get_codec_ul(const MXFCodecUL *uls, UID *uid) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
599 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
600 while (uls->id != CODEC_ID_NONE) { |
2942 | 601 if(mxf_match_uid(uls->uid, *uid, uls->matching_len)) |
1225 | 602 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
603 uls++; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
604 } |
1225 | 605 return uls; |
1190
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 |
1341
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
608 static enum CodecType mxf_get_codec_type(const MXFDataDefinitionUL *uls, UID *uid) |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
609 { |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
610 while (uls->type != CODEC_TYPE_DATA) { |
2115 | 611 if(mxf_match_uid(uls->uid, *uid, 16)) |
1341
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
612 break; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
613 uls++; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
614 } |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
615 return uls->type; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
616 } |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
617 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
618 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type) |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
619 { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
620 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
|
621 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
622 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
|
623 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
|
624 for (i = 0; i < mxf->metadata_sets_count; i++) { |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
625 if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) && |
1634
eeb3521e4d09
AnyType is needed, descriptor_ref can reference Descriptor or MultipleDescriptor
bcoudurier
parents:
1633
diff
changeset
|
626 (type == AnyType || mxf->metadata_sets[i]->type == type)) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
627 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
|
628 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
629 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
630 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
|
631 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
632 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
633 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
|
634 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
635 MXFPackage *material_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
|
636 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
|
637 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
|
638 |
1907 | 639 dprintf(mxf->fc, "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
|
640 /* 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
|
641 for (i = 0; i < mxf->packages_count; i++) { |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
642 material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage); |
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
643 if (material_package) break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
644 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
645 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
|
646 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
|
647 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
648 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
649 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
650 for (i = 0; i < material_package->tracks_count; i++) { |
1543
394a8590d5a0
move source_package declaration in the loop and reset it each iteration
bcoudurier
parents:
1521
diff
changeset
|
651 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
|
652 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
|
653 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
|
654 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
|
655 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
|
656 MXFStructuralComponent *component = NULL; |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
657 UID *essence_container_ul = NULL; |
1225 | 658 const MXFCodecUL *codec_ul = NULL; |
659 const MXFCodecUL *container_ul = NULL; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
660 AVStream *st; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
661 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
662 if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
663 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
|
664 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
665 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
666 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
667 if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
668 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
|
669 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
|
670 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
671 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
672 /* 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
|
673 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
|
674 /* TODO: handle timecode component */ |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
675 component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], SourceClip); |
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
676 if (!component) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
677 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
678 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
679 for (k = 0; k < mxf->packages_count; k++) { |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
680 temp_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[k], SourcePackage); |
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
681 if (!temp_package) |
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
682 continue; |
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 (!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
|
684 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
|
685 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
686 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
687 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
688 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
|
689 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
|
690 break; |
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 for (k = 0; k < source_package->tracks_count; k++) { |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
693 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k], Track))) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
694 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
|
695 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
|
696 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
697 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
|
698 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
|
699 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
700 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
701 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
702 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
|
703 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
|
704 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
705 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
706 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
707 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
|
708 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
709 |
1197 | 710 st = av_new_stream(mxf->fc, source_track->track_id); |
2912 | 711 if (!st) { |
712 av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n"); | |
713 return -1; | |
714 } | |
1197 | 715 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
|
716 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
|
717 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
|
718 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
|
719 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
|
720 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
|
721 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
722 if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) { |
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 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
|
724 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
|
725 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
726 |
1907 | 727 PRINT_KEY(mxf->fc, "data definition ul", source_track->sequence->data_definition_ul); |
3734 | 728 st->codec->codec_type = mxf_get_codec_type(ff_mxf_data_definition_uls, &source_track->sequence->data_definition_ul); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
729 |
1634
eeb3521e4d09
AnyType is needed, descriptor_ref can reference Descriptor or MultipleDescriptor
bcoudurier
parents:
1633
diff
changeset
|
730 source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
731 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
|
732 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
|
733 for (j = 0; j < source_package->descriptor->sub_descriptors_count; j++) { |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
734 MXFDescriptor *sub_descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor->sub_descriptors_refs[j], 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
|
735 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
736 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
|
737 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
|
738 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
739 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
740 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
|
741 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
|
742 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
743 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
744 } |
1634
eeb3521e4d09
AnyType is needed, descriptor_ref can reference Descriptor or MultipleDescriptor
bcoudurier
parents:
1633
diff
changeset
|
745 } else if (source_package->descriptor->type == Descriptor) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
746 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
|
747 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
748 if (!descriptor) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
749 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
|
750 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
751 } |
1907 | 752 PRINT_KEY(mxf->fc, "essence codec ul", descriptor->essence_codec_ul); |
753 PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul); | |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
754 essence_container_ul = &descriptor->essence_container_ul; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
755 /* HACK: replacing the original key with mxf_encrypted_essence_container |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
756 * is not allowed according to s429-6, try to find correct information anyway */ |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
757 if (IS_KLV_KEY(essence_container_ul, mxf_encrypted_essence_container)) { |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
758 av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n"); |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
759 for (k = 0; k < mxf->metadata_sets_count; k++) { |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
760 MXFMetadataSet *metadata = mxf->metadata_sets[k]; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
761 if (metadata->type == CryptoContext) { |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
762 essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
763 break; |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
764 } |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
765 } |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
766 } |
1225 | 767 /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */ |
3734 | 768 codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul); |
1226 | 769 st->codec->codec_id = codec_ul->id; |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
770 if (descriptor->extradata) { |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
771 st->codec->extradata = descriptor->extradata; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
772 st->codec->extradata_size = descriptor->extradata_size; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
773 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
774 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
3734 | 775 container_ul = mxf_get_codec_ul(ff_mxf_essence_container_uls, essence_container_ul); |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
776 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 777 st->codec->codec_id = container_ul->id; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
778 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
|
779 st->codec->height = descriptor->height; |
1202 | 780 st->codec->bits_per_sample = descriptor->bits_per_sample; /* Uncompressed */ |
3781 | 781 st->sample_aspect_ratio = descriptor->aspect_ratio; |
2023 | 782 st->need_parsing = AVSTREAM_PARSE_HEADERS; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
783 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
3734 | 784 container_ul = mxf_get_codec_ul(ff_mxf_essence_container_uls, essence_container_ul); |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
785 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 786 st->codec->codec_id = container_ul->id; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
787 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
|
788 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
|
789 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
|
790 /* 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
|
791 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
|
792 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
|
793 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
|
794 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
|
795 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
|
796 } 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
|
797 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
|
798 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
|
799 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
|
800 st->codec->codec_id = CODEC_ID_PCM_S32BE; |
1348 | 801 } else if (st->codec->codec_id == CODEC_ID_MP2) { |
2023 | 802 st->need_parsing = AVSTREAM_PARSE_FULL; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
803 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
804 } |
2949
c433c2607194
simplify and detect better non frame wrapped mappings
bcoudurier
parents:
2948
diff
changeset
|
805 if (st->codec->codec_type != CODEC_TYPE_DATA && (*essence_container_ul)[15] > 0x01) { |
c433c2607194
simplify and detect better non frame wrapped mappings
bcoudurier
parents:
2948
diff
changeset
|
806 av_log(mxf->fc, AV_LOG_WARNING, "only frame wrapped mappings are correctly supported\n"); |
2023 | 807 st->need_parsing = AVSTREAM_PARSE_FULL; |
1226 | 808 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
809 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
810 return 0; |
1186 | 811 } |
812 | |
1210 | 813 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
814 { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }, mxf_read_primer_pack }, |
2948 | 815 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType }, |
816 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_source_package, sizeof(MXFPackage), SourcePackage }, | |
817 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_material_package, sizeof(MXFPackage), MaterialPackage }, | |
818 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence }, | |
819 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_source_clip, sizeof(MXFStructuralComponent), SourceClip }, | |
820 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor }, | |
821 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Generic Sound */ | |
822 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* CDCI */ | |
823 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* RGBA */ | |
824 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* MPEG 2 Video */ | |
825 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Wave */ | |
826 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* AES3 */ | |
827 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */ | |
828 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */ | |
829 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext }, | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
830 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType }, |
1210 | 831 }; |
832 | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
833 static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, int (*read_child)(), int ctx_size, enum MXFMetadataSetType type) |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
834 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
835 ByteIOContext *pb = mxf->fc->pb; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
836 MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf; |
2947 | 837 uint64_t klv_end = url_ftell(pb) + klv->length; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
838 |
2944 | 839 if (!ctx) |
840 return -1; | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
841 while (url_ftell(pb) + 4 < klv_end) { |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
842 int tag = get_be16(pb); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
843 int size = get_be16(pb); /* KLV specified by 0x53 */ |
2947 | 844 uint64_t next = url_ftell(pb) + size; |
2954 | 845 UID uid = {0}; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
846 |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
847 if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */ |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
848 av_log(mxf->fc, AV_LOG_ERROR, "local tag 0x%04X with 0 size\n", tag); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
849 continue; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
850 } |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
851 if (tag > 0x7FFF) { /* dynamic tag */ |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
852 int i; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
853 for (i = 0; i < mxf->local_tags_count; i++) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
854 int local_tag = AV_RB16(mxf->local_tags+i*18); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
855 if (local_tag == tag) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
856 memcpy(uid, mxf->local_tags+i*18+2, 16); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
857 dprintf(mxf->fc, "local tag 0x%04X\n", local_tag); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
858 PRINT_KEY(mxf->fc, "uid", uid); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
859 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
860 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
861 } |
2947 | 862 if (ctx_size && tag == 0x3C0A) |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
863 get_buffer(pb, ctx->uid, 16); |
2951 | 864 else if (read_child(ctx, pb, tag, size, uid) < 0) |
865 return -1; | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
866 |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
867 url_fseek(pb, next, SEEK_SET); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
868 } |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
869 if (ctx_size) ctx->type = type; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
870 return ctx_size ? mxf_add_metadata_set(mxf, ctx) : 0; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
871 } |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
872 |
1186 | 873 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
874 { | |
875 MXFContext *mxf = s->priv_data; | |
876 KLVPacket klv; | |
877 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
878 if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) { |
1395 | 879 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); |
880 return -1; | |
881 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
882 url_fseek(s->pb, -14, SEEK_CUR); |
1186 | 883 mxf->fc = s; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
884 while (!url_feof(s->pb)) { |
1655 | 885 const MXFMetadataReadTableEntry *metadata; |
1210 | 886 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
887 if (klv_read_packet(&klv, s->pb) < 0) |
1186 | 888 return -1; |
1907 | 889 PRINT_KEY(s, "read header", klv.key); |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
890 if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) || |
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
891 IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
1186 | 892 /* FIXME avoid seek */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
893 url_fseek(s->pb, klv.offset, SEEK_SET); |
1186 | 894 break; |
1210 | 895 } |
896 | |
1655 | 897 for (metadata = mxf_metadata_read_table; metadata->read; metadata++) { |
898 if (IS_KLV_KEY(klv.key, metadata->key)) { | |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
899 int (*read)() = klv.key[5] == 0x53 ? mxf_read_local_tags : metadata->read; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
900 if (read(mxf, &klv, metadata->read, metadata->ctx_size, metadata->type) < 0) { |
1210 | 901 av_log(s, AV_LOG_ERROR, "error reading header metadata\n"); |
902 return -1; | |
903 } | |
904 break; | |
905 } | |
906 } | |
1655 | 907 if (!metadata->read) |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
908 url_fskip(s->pb, klv.length); |
1186 | 909 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
910 return mxf_parse_structural_metadata(mxf); |
1186 | 911 } |
912 | |
913 static int mxf_read_close(AVFormatContext *s) | |
914 { | |
915 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
|
916 int i; |
1186 | 917 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
918 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
|
919 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
|
920 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
|
921 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
|
922 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
|
923 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
924 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
|
925 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
|
926 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
927 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
|
928 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
|
929 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
|
930 break; |
3528
290a8617ed9d
unset Track sets, relying in AVStream->priv_data and will be freed in av_close_input_file
bcoudurier
parents:
3424
diff
changeset
|
931 case Track: |
290a8617ed9d
unset Track sets, relying in AVStream->priv_data and will be freed in av_close_input_file
bcoudurier
parents:
3424
diff
changeset
|
932 mxf->metadata_sets[i] = NULL; /* will be freed later */ |
290a8617ed9d
unset Track sets, relying in AVStream->priv_data and will be freed in av_close_input_file
bcoudurier
parents:
3424
diff
changeset
|
933 break; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
934 default: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
935 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
936 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
937 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
|
938 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
939 av_freep(&mxf->metadata_sets); |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
940 av_freep(&mxf->aesc); |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
941 av_freep(&mxf->local_tags); |
1186 | 942 return 0; |
943 } | |
944 | |
945 static int mxf_probe(AVProbeData *p) { | |
1211 | 946 uint8_t *bufp = p->buf; |
947 uint8_t *end = p->buf + p->buf_size; | |
948 | |
1186 | 949 if (p->buf_size < sizeof(mxf_header_partition_pack_key)) |
950 return 0; | |
951 | |
1211 | 952 /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */ |
953 end -= sizeof(mxf_header_partition_pack_key); | |
954 for (; bufp < end; bufp++) { | |
1231
e713080a7880
revert r5909, dont use non constant static variable, breaks multithreaded apps
bcoudurier
parents:
1230
diff
changeset
|
955 if (IS_KLV_KEY(bufp, mxf_header_partition_pack_key)) |
1211 | 956 return AVPROBE_SCORE_MAX; |
957 } | |
958 return 0; | |
1186 | 959 } |
960 | |
2036 | 961 /* rudimentary byte seek */ |
1343 | 962 /* XXX: use MXF Index */ |
963 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags) | |
964 { | |
965 AVStream *st = s->streams[stream_index]; | |
966 int64_t seconds; | |
967 | |
1363 | 968 if (!s->bit_rate) |
1343 | 969 return -1; |
1363 | 970 if (sample_time < 0) |
971 sample_time = 0; | |
1343 | 972 seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
973 url_fseek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET); |
1395 | 974 av_update_cur_dts(s, st, sample_time); |
975 return 0; | |
1343 | 976 } |
1186 | 977 |
978 AVInputFormat mxf_demuxer = { | |
979 "mxf", | |
3585 | 980 NULL_IF_CONFIG_SMALL("Material eXchange Format"), |
1186 | 981 sizeof(MXFContext), |
982 mxf_probe, | |
983 mxf_read_header, | |
984 mxf_read_packet, | |
985 mxf_read_close, | |
1343 | 986 mxf_read_seek, |
1186 | 987 }; |