Mercurial > libavformat.hg
annotate mxfdec.c @ 3736:441e758e1a5e libavformat
Make AU demuxer handle S24BE, S32BE and F64BE PCM audio.
author | pross |
---|---|
date | Tue, 19 Aug 2008 10:49:38 +0000 |
parents | 3b3b45af4a92 |
children | 2f06c3611681 |
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; |
1198 | 302 #ifdef DEBUG |
1907 | 303 PRINT_KEY(s, "read packet", klv.key); |
1198 | 304 #endif |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
305 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
|
306 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
|
307 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
|
308 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
|
309 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
|
310 } |
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
|
311 return 0; |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
312 } |
1186 | 313 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
|
314 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
|
315 if (index < 0) { |
3533 | 316 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
|
317 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
|
318 } |
3117 | 319 if (s->streams[index]->discard == AVDISCARD_ALL) |
320 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
|
321 /* 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
|
322 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
|
323 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
|
324 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
|
325 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
|
326 } |
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 } else |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
328 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
|
329 pkt->stream_index = index; |
2121 | 330 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
|
331 return 0; |
1186 | 332 } else |
3117 | 333 skip: |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
334 url_fskip(s->pb, klv.length); |
1186 | 335 } |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2125
diff
changeset
|
336 return AVERROR(EIO); |
1186 | 337 } |
338 | |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
339 static int mxf_read_primer_pack(MXFContext *mxf) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
340 { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
341 ByteIOContext *pb = mxf->fc->pb; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
342 int item_num = get_be32(pb); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
343 int item_len = get_be32(pb); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
344 |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
345 if (item_len != 18) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
346 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
|
347 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
348 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
349 if (item_num > UINT_MAX / item_len) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
350 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
351 mxf->local_tags_count = item_num; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
352 mxf->local_tags = av_malloc(item_num*item_len); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
353 if (!mxf->local_tags) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
354 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
355 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
|
356 return 0; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
357 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
358 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
359 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
|
360 { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
361 mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); |
2944 | 362 if (!mxf->metadata_sets) |
363 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
|
364 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
|
365 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
|
366 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
|
367 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
368 |
2948 | 369 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
|
370 { |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
371 if (size != 16) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
372 return -1; |
2946 | 373 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
|
374 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
|
375 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
|
376 } |
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
|
377 |
2948 | 378 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
|
379 { |
1650 | 380 switch (tag) { |
381 case 0x1901: | |
382 mxf->packages_count = get_be32(pb); | |
383 if (mxf->packages_count >= UINT_MAX / sizeof(UID)) | |
384 return -1; | |
385 mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID)); | |
2944 | 386 if (!mxf->packages_refs) |
387 return -1; | |
1650 | 388 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
389 get_buffer(pb, (uint8_t *)mxf->packages_refs, mxf->packages_count * sizeof(UID)); | |
390 break; | |
391 } | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
392 return 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
393 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
394 |
2948 | 395 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
|
396 { |
1650 | 397 switch(tag) { |
398 case 0x0202: | |
399 source_clip->duration = get_be64(pb); | |
400 break; | |
401 case 0x1201: | |
402 source_clip->start_position = get_be64(pb); | |
403 break; | |
404 case 0x1101: | |
405 /* UMID, only get last 16 bytes */ | |
406 url_fskip(pb, 16); | |
407 get_buffer(pb, source_clip->source_package_uid, 16); | |
408 break; | |
409 case 0x1102: | |
410 source_clip->source_track_id = get_be32(pb); | |
411 break; | |
412 } | |
413 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
|
414 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
415 |
2948 | 416 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
|
417 { |
1650 | 418 switch(tag) { |
419 case 0x4403: | |
420 package->tracks_count = get_be32(pb); | |
421 if (package->tracks_count >= UINT_MAX / sizeof(UID)) | |
422 return -1; | |
423 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); | |
2944 | 424 if (!package->tracks_refs) |
425 return -1; | |
1650 | 426 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
427 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); | |
428 break; | |
429 } | |
430 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
|
431 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
432 |
2948 | 433 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
|
434 { |
1650 | 435 switch(tag) { |
436 case 0x4801: | |
437 track->track_id = get_be32(pb); | |
438 break; | |
439 case 0x4804: | |
440 get_buffer(pb, track->track_number, 4); | |
441 break; | |
442 case 0x4B01: | |
443 track->edit_rate.den = get_be32(pb); | |
444 track->edit_rate.num = get_be32(pb); | |
445 break; | |
446 case 0x4803: | |
447 get_buffer(pb, track->sequence_ref, 16); | |
448 break; | |
449 } | |
450 return 0; | |
1186 | 451 } |
452 | |
2948 | 453 static int mxf_read_sequence(MXFSequence *sequence, ByteIOContext *pb, int tag) |
1186 | 454 { |
1650 | 455 switch(tag) { |
456 case 0x0202: | |
457 sequence->duration = get_be64(pb); | |
458 break; | |
459 case 0x0201: | |
460 get_buffer(pb, sequence->data_definition_ul, 16); | |
461 break; | |
462 case 0x1001: | |
463 sequence->structural_components_count = get_be32(pb); | |
464 if (sequence->structural_components_count >= UINT_MAX / sizeof(UID)) | |
465 return -1; | |
466 sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID)); | |
2944 | 467 if (!sequence->structural_components_refs) |
468 return -1; | |
1650 | 469 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
470 get_buffer(pb, (uint8_t *)sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID)); | |
471 break; | |
472 } | |
473 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
|
474 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
475 |
2948 | 476 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
|
477 { |
1650 | 478 switch(tag) { |
479 case 0x4403: | |
480 package->tracks_count = get_be32(pb); | |
481 if (package->tracks_count >= UINT_MAX / sizeof(UID)) | |
482 return -1; | |
483 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); | |
2944 | 484 if (!package->tracks_refs) |
485 return -1; | |
1650 | 486 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
487 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); | |
488 break; | |
489 case 0x4401: | |
490 /* UMID, only get last 16 bytes */ | |
491 url_fskip(pb, 16); | |
492 get_buffer(pb, package->package_uid, 16); | |
493 break; | |
494 case 0x4701: | |
495 get_buffer(pb, package->descriptor_ref, 16); | |
496 break; | |
497 } | |
498 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
|
499 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
500 |
2948 | 501 static void mxf_read_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor) |
1202 | 502 { |
503 int code; | |
504 | |
505 do { | |
506 code = get_byte(pb); | |
1907 | 507 dprintf(NULL, "pixel layout: code 0x%x\n", code); |
1202 | 508 switch (code) { |
509 case 0x52: /* R */ | |
510 descriptor->bits_per_sample += get_byte(pb); | |
511 break; | |
512 case 0x47: /* G */ | |
513 descriptor->bits_per_sample += get_byte(pb); | |
514 break; | |
515 case 0x42: /* B */ | |
516 descriptor->bits_per_sample += get_byte(pb); | |
517 break; | |
518 default: | |
519 get_byte(pb); | |
520 } | |
521 } while (code != 0); /* SMPTE 377M E.2.46 */ | |
522 } | |
523 | |
2952 | 524 static int mxf_read_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size, UID uid) |
1186 | 525 { |
1650 | 526 switch(tag) { |
1652
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
527 case 0x3F01: |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
528 descriptor->sub_descriptors_count = get_be32(pb); |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
529 if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID)) |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
530 return -1; |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
531 descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID)); |
2944 | 532 if (!descriptor->sub_descriptors_refs) |
533 return -1; | |
1652
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
534 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
|
535 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
|
536 break; |
1650 | 537 case 0x3004: |
538 get_buffer(pb, descriptor->essence_container_ul, 16); | |
539 break; | |
540 case 0x3006: | |
541 descriptor->linked_track_id = get_be32(pb); | |
542 break; | |
543 case 0x3201: /* PictureEssenceCoding */ | |
544 get_buffer(pb, descriptor->essence_codec_ul, 16); | |
545 break; | |
546 case 0x3203: | |
547 descriptor->width = get_be32(pb); | |
548 break; | |
549 case 0x3202: | |
550 descriptor->height = get_be32(pb); | |
551 break; | |
552 case 0x320E: | |
553 descriptor->aspect_ratio.num = get_be32(pb); | |
554 descriptor->aspect_ratio.den = get_be32(pb); | |
555 break; | |
556 case 0x3D03: | |
557 descriptor->sample_rate.num = get_be32(pb); | |
558 descriptor->sample_rate.den = get_be32(pb); | |
559 break; | |
560 case 0x3D06: /* SoundEssenceCompression */ | |
561 get_buffer(pb, descriptor->essence_codec_ul, 16); | |
562 break; | |
563 case 0x3D07: | |
564 descriptor->channels = get_be32(pb); | |
565 break; | |
566 case 0x3D01: | |
567 descriptor->bits_per_sample = get_be32(pb); | |
568 break; | |
569 case 0x3401: | |
2948 | 570 mxf_read_pixel_layout(pb, descriptor); |
1650 | 571 break; |
2952 | 572 default: |
573 /* Private uid used by SONY C0023S01.mxf */ | |
574 if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) { | |
2953 | 575 descriptor->extradata = av_malloc(size); |
576 if (!descriptor->extradata) | |
577 return -1; | |
578 descriptor->extradata_size = size; | |
579 get_buffer(pb, descriptor->extradata, size); | |
2952 | 580 } |
1650 | 581 break; |
582 } | |
583 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
|
584 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
585 |
2115 | 586 /* |
587 * Match an uid independently of the version byte and up to len common bytes | |
588 * Returns: boolean | |
589 */ | |
590 static int mxf_match_uid(const UID key, const UID uid, int len) | |
591 { | |
592 int i; | |
593 for (i = 0; i < len; i++) { | |
594 if (i != 7 && key[i] != uid[i]) | |
595 return 0; | |
596 } | |
597 return 1; | |
598 } | |
599 | |
1225 | 600 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
|
601 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
602 while (uls->id != CODEC_ID_NONE) { |
2942 | 603 if(mxf_match_uid(uls->uid, *uid, uls->matching_len)) |
1225 | 604 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
605 uls++; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
606 } |
1225 | 607 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
|
608 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
609 |
1341
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
610 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
|
611 { |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
612 while (uls->type != CODEC_TYPE_DATA) { |
2115 | 613 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
|
614 break; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
615 uls++; |
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 return uls->type; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
618 } |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
619 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
620 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
|
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 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
|
623 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
624 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
|
625 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
|
626 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
|
627 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
|
628 (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
|
629 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
|
630 } |
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 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
|
633 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
634 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
635 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
|
636 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
637 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
|
638 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
|
639 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
|
640 |
1907 | 641 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
|
642 /* 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
|
643 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
|
644 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
|
645 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
|
646 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
647 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
|
648 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
|
649 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
650 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
651 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
652 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
|
653 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
|
654 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
|
655 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
|
656 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
|
657 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
|
658 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
|
659 UID *essence_container_ul = NULL; |
1225 | 660 const MXFCodecUL *codec_ul = NULL; |
661 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
|
662 AVStream *st; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
663 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
664 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
|
665 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
|
666 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
667 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
668 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
669 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
|
670 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
|
671 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
|
672 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
673 |
1190
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 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
|
675 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
|
676 /* TODO: handle timecode component */ |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
677 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
|
678 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
|
679 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
680 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
681 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
|
682 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
|
683 if (!temp_package) |
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
684 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
|
685 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
|
686 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
|
687 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
688 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
689 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
690 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
|
691 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
|
692 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
693 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
694 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
|
695 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
|
696 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
|
697 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
|
698 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
699 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
|
700 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
|
701 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
702 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
703 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
704 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
|
705 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
|
706 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
707 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
708 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
709 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
|
710 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
711 |
1197 | 712 st = av_new_stream(mxf->fc, source_track->track_id); |
2912 | 713 if (!st) { |
714 av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n"); | |
715 return -1; | |
716 } | |
1197 | 717 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
|
718 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
|
719 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
|
720 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
|
721 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
|
722 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
|
723 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
724 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
|
725 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
|
726 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
|
727 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
728 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
729 #ifdef DEBUG |
1907 | 730 PRINT_KEY(mxf->fc, "data definition ul", 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
|
731 #endif |
3734 | 732 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
|
733 |
1634
eeb3521e4d09
AnyType is needed, descriptor_ref can reference Descriptor or MultipleDescriptor
bcoudurier
parents:
1633
diff
changeset
|
734 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
|
735 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
|
736 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
|
737 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
|
738 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
|
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) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
741 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
|
742 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
743 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
744 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
|
745 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
|
746 break; |
1190
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 } |
1634
eeb3521e4d09
AnyType is needed, descriptor_ref can reference Descriptor or MultipleDescriptor
bcoudurier
parents:
1633
diff
changeset
|
749 } 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
|
750 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
|
751 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
752 if (!descriptor) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
753 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
|
754 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
755 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
756 #ifdef DEBUG |
1907 | 757 PRINT_KEY(mxf->fc, "essence codec ul", descriptor->essence_codec_ul); |
758 PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul); | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
759 #endif |
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
|
760 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
|
761 /* 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
|
762 * 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
|
763 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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 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
|
769 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
|
770 } |
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
|
771 } |
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
|
772 } |
1225 | 773 /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */ |
3734 | 774 codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul); |
1226 | 775 st->codec->codec_id = codec_ul->id; |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
776 if (descriptor->extradata) { |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
777 st->codec->extradata = descriptor->extradata; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
778 st->codec->extradata_size = descriptor->extradata_size; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
779 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
780 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
3734 | 781 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
|
782 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 783 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
|
784 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
|
785 st->codec->height = descriptor->height; |
1202 | 786 st->codec->bits_per_sample = descriptor->bits_per_sample; /* Uncompressed */ |
2023 | 787 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
|
788 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
3734 | 789 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
|
790 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 791 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
|
792 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
|
793 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
|
794 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
|
795 /* 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
|
796 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
|
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_S24LE; |
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_S32LE; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
801 } 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
|
802 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
|
803 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
|
804 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
|
805 st->codec->codec_id = CODEC_ID_PCM_S32BE; |
1348 | 806 } else if (st->codec->codec_id == CODEC_ID_MP2) { |
2023 | 807 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
|
808 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
809 } |
2949
c433c2607194
simplify and detect better non frame wrapped mappings
bcoudurier
parents:
2948
diff
changeset
|
810 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
|
811 av_log(mxf->fc, AV_LOG_WARNING, "only frame wrapped mappings are correctly supported\n"); |
2023 | 812 st->need_parsing = AVSTREAM_PARSE_FULL; |
1226 | 813 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
814 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
815 return 0; |
1186 | 816 } |
817 | |
1210 | 818 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
819 { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }, mxf_read_primer_pack }, |
2948 | 820 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType }, |
821 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_source_package, sizeof(MXFPackage), SourcePackage }, | |
822 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_material_package, sizeof(MXFPackage), MaterialPackage }, | |
823 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence }, | |
824 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_source_clip, sizeof(MXFStructuralComponent), SourceClip }, | |
825 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor }, | |
826 { { 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 */ | |
827 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* CDCI */ | |
828 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* RGBA */ | |
829 { { 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 */ | |
830 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Wave */ | |
831 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* AES3 */ | |
832 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */ | |
833 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */ | |
834 { { 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
|
835 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType }, |
1210 | 836 }; |
837 | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
838 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
|
839 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
840 ByteIOContext *pb = mxf->fc->pb; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
841 MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf; |
2947 | 842 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
|
843 |
2944 | 844 if (!ctx) |
845 return -1; | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
846 while (url_ftell(pb) + 4 < klv_end) { |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
847 int tag = get_be16(pb); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
848 int size = get_be16(pb); /* KLV specified by 0x53 */ |
2947 | 849 uint64_t next = url_ftell(pb) + size; |
2954 | 850 UID uid = {0}; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
851 |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
852 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
|
853 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
|
854 continue; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
855 } |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
856 if (tag > 0x7FFF) { /* dynamic tag */ |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
857 int i; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
858 for (i = 0; i < mxf->local_tags_count; i++) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
859 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
|
860 if (local_tag == tag) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
861 memcpy(uid, mxf->local_tags+i*18+2, 16); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
862 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
|
863 #ifdef DEBUG |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
864 PRINT_KEY(mxf->fc, "uid", uid); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
865 #endif |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
866 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
867 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
868 } |
2947 | 869 if (ctx_size && tag == 0x3C0A) |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
870 get_buffer(pb, ctx->uid, 16); |
2951 | 871 else if (read_child(ctx, pb, tag, size, uid) < 0) |
872 return -1; | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
873 |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
874 url_fseek(pb, next, SEEK_SET); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
875 } |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
876 if (ctx_size) ctx->type = type; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
877 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
|
878 } |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
879 |
1186 | 880 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
881 { | |
882 MXFContext *mxf = s->priv_data; | |
883 KLVPacket klv; | |
884 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
885 if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) { |
1395 | 886 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); |
887 return -1; | |
888 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
889 url_fseek(s->pb, -14, SEEK_CUR); |
1186 | 890 mxf->fc = s; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
891 while (!url_feof(s->pb)) { |
1655 | 892 const MXFMetadataReadTableEntry *metadata; |
1210 | 893 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
894 if (klv_read_packet(&klv, s->pb) < 0) |
1186 | 895 return -1; |
1198 | 896 #ifdef DEBUG |
1907 | 897 PRINT_KEY(s, "read header", klv.key); |
1198 | 898 #endif |
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
|
899 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
|
900 IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
1186 | 901 /* FIXME avoid seek */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
902 url_fseek(s->pb, klv.offset, SEEK_SET); |
1186 | 903 break; |
1210 | 904 } |
905 | |
1655 | 906 for (metadata = mxf_metadata_read_table; metadata->read; metadata++) { |
907 if (IS_KLV_KEY(klv.key, metadata->key)) { | |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
908 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
|
909 if (read(mxf, &klv, metadata->read, metadata->ctx_size, metadata->type) < 0) { |
1210 | 910 av_log(s, AV_LOG_ERROR, "error reading header metadata\n"); |
911 return -1; | |
912 } | |
913 break; | |
914 } | |
915 } | |
1655 | 916 if (!metadata->read) |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
917 url_fskip(s->pb, klv.length); |
1186 | 918 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
919 return mxf_parse_structural_metadata(mxf); |
1186 | 920 } |
921 | |
922 static int mxf_read_close(AVFormatContext *s) | |
923 { | |
924 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
|
925 int i; |
1186 | 926 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
927 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
|
928 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
|
929 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
|
930 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
|
931 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
|
932 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
933 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
|
934 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
|
935 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
936 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
|
937 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
|
938 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
|
939 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
|
940 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
|
941 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
|
942 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
|
943 default: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
944 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
945 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
946 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
|
947 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
948 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
|
949 av_freep(&mxf->aesc); |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
950 av_freep(&mxf->local_tags); |
1186 | 951 return 0; |
952 } | |
953 | |
954 static int mxf_probe(AVProbeData *p) { | |
1211 | 955 uint8_t *bufp = p->buf; |
956 uint8_t *end = p->buf + p->buf_size; | |
957 | |
1186 | 958 if (p->buf_size < sizeof(mxf_header_partition_pack_key)) |
959 return 0; | |
960 | |
1211 | 961 /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */ |
962 end -= sizeof(mxf_header_partition_pack_key); | |
963 for (; bufp < end; bufp++) { | |
1231
e713080a7880
revert r5909, dont use non constant static variable, breaks multithreaded apps
bcoudurier
parents:
1230
diff
changeset
|
964 if (IS_KLV_KEY(bufp, mxf_header_partition_pack_key)) |
1211 | 965 return AVPROBE_SCORE_MAX; |
966 } | |
967 return 0; | |
1186 | 968 } |
969 | |
2036 | 970 /* rudimentary byte seek */ |
1343 | 971 /* XXX: use MXF Index */ |
972 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags) | |
973 { | |
974 AVStream *st = s->streams[stream_index]; | |
975 int64_t seconds; | |
976 | |
1363 | 977 if (!s->bit_rate) |
1343 | 978 return -1; |
1363 | 979 if (sample_time < 0) |
980 sample_time = 0; | |
1343 | 981 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
|
982 url_fseek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET); |
1395 | 983 av_update_cur_dts(s, st, sample_time); |
984 return 0; | |
1343 | 985 } |
1186 | 986 |
987 AVInputFormat mxf_demuxer = { | |
988 "mxf", | |
3585 | 989 NULL_IF_CONFIG_SMALL("Material eXchange Format"), |
1186 | 990 sizeof(MXFContext), |
991 mxf_probe, | |
992 mxf_read_header, | |
993 mxf_read_packet, | |
994 mxf_read_close, | |
1343 | 995 mxf_read_seek, |
1186 | 996 }; |