Mercurial > libavformat.hg
annotate mxfdec.c @ 4770:7875964b4a58 libavformat
Remove index writing in RM muxer, since it is broken (multiple streams per
single index chunk) and is always empty anyway. See "[PATCH] rmenc.c: remove
index writing" thread.
author | rbultje |
---|---|
date | Sat, 21 Mar 2009 20:34:24 +0000 |
parents | a079bfd0192b |
children | 9bc9feb36557 |
rev | line source |
---|---|
1186 | 1 /* |
2 * MXF demuxer. | |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4175
diff
changeset
|
3 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com> |
1186 | 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" |
4403 | 49 #include "libavcodec/bytestream.h" |
50 #include "avformat.h" | |
3734 | 51 #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
|
52 |
2125 | 53 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
|
54 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
|
55 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
|
56 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
|
57 } 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
|
58 |
2125 | 59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 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
|
65 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
|
66 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
|
67 } MXFStructuralComponent; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
68 |
2125 | 69 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
|
70 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
|
71 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
|
72 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
|
73 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
|
74 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
|
75 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
|
76 } MXFSequence; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
77 |
2125 | 78 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
|
79 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
|
80 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
|
81 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
|
82 UID sequence_ref; |
1186 | 83 int track_id; |
1197 | 84 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
|
85 AVRational edit_rate; |
1186 | 86 } MXFTrack; |
87 | |
2125 | 88 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
|
89 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
|
90 enum MXFMetadataSetType type; |
1192 | 91 UID essence_container_ul; |
92 UID essence_codec_ul; | |
1186 | 93 AVRational sample_rate; |
94 AVRational aspect_ratio; | |
95 int width; | |
96 int height; | |
97 int channels; | |
98 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
|
99 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
|
100 int sub_descriptors_count; |
1186 | 101 int linked_track_id; |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
102 uint8_t *extradata; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
103 int extradata_size; |
1186 | 104 } MXFDescriptor; |
105 | |
2125 | 106 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
|
107 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
|
108 enum MXFMetadataSetType type; |
4174
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
109 } MXFIndexTableSegment; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
110 |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
111 typedef struct { |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
112 UID uid; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 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
|
119 } MXFPackage; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
120 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
121 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
|
122 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
|
123 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
|
124 } MXFMetadataSet; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
125 |
2125 | 126 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
|
127 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
|
128 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
|
129 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
|
130 int metadata_sets_count; |
1186 | 131 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
|
132 struct AVAES *aesc; |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
133 uint8_t *local_tags; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
134 int local_tags_count; |
1186 | 135 } MXFContext; |
136 | |
1225 | 137 enum MXFWrappingScheme { |
138 Frame, | |
139 Clip, | |
140 }; | |
141 | |
2125 | 142 typedef struct { |
1210 | 143 const UID key; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
144 int (*read)(); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
145 int ctx_size; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
146 enum MXFMetadataSetType type; |
1210 | 147 } MXFMetadataReadTableEntry; |
1189 | 148 |
149 /* partial keys to match */ | |
1195 | 150 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 }; |
1197 | 151 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
|
152 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
|
153 /* complete keys to match */ |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
154 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
|
155 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
|
156 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 | 157 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 | 158 |
159 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y))) | |
160 | |
161 static int64_t klv_decode_ber_length(ByteIOContext *pb) | |
162 { | |
1644 | 163 uint64_t size = get_byte(pb); |
164 if (size & 0x80) { /* long form */ | |
165 int bytes_num = size & 0x7f; | |
1186 | 166 /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */ |
167 if (bytes_num > 8) | |
168 return -1; | |
1644 | 169 size = 0; |
1186 | 170 while (bytes_num--) |
171 size = size << 8 | get_byte(pb); | |
172 } | |
173 return size; | |
174 } | |
175 | |
2116
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
176 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
|
177 { |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
178 int i, b; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
179 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
|
180 b = get_byte(pb); |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
181 if (b == key[0]) |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
182 i = 0; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
183 else if (b != key[i]) |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
184 i = -1; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
185 } |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
186 return i == size; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
187 } |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
188 |
1186 | 189 static int klv_read_packet(KLVPacket *klv, ByteIOContext *pb) |
190 { | |
2116
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
191 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
|
192 return -1; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
193 klv->offset = url_ftell(pb) - 4; |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
194 memcpy(klv->key, mxf_klv_key, 4); |
a56cef4f6091
sync to mxf klv key before trying to read klv packet
bcoudurier
parents:
2115
diff
changeset
|
195 get_buffer(pb, klv->key + 4, 12); |
1186 | 196 klv->length = klv_decode_ber_length(pb); |
1194 | 197 return klv->length == -1 ? -1 : 0; |
1186 | 198 } |
199 | |
200 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv) | |
201 { | |
202 int i; | |
203 | |
204 for (i = 0; i < s->nb_streams; i++) { | |
1197 | 205 MXFTrack *track = s->streams[i]->priv_data; |
1650 | 206 /* SMPTE 379M 7.3 */ |
1197 | 207 if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number))) |
1186 | 208 return i; |
209 } | |
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
|
210 /* 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
|
211 return s->nb_streams == 1 ? 0 : -1; |
1186 | 212 } |
213 | |
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 /* 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
|
215 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
|
216 { |
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 uint8_t buffer[61444]; |
2995 | 218 const uint8_t *buf_ptr, *end_ptr; |
219 uint8_t *data_ptr; | |
2563 | 220 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
|
221 |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
222 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
|
223 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
|
224 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
|
225 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
|
226 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
|
227 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
|
228 buf_ptr = buffer + 4; /* skip SMPTE 331M header */ |
2563 | 229 for (; buf_ptr < end_ptr; ) { |
230 for (i = 0; i < st->codec->channels; i++) { | |
231 uint32_t sample = bytestream_get_le32(&buf_ptr); | |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3829
diff
changeset
|
232 if (st->codec->bits_per_coded_sample == 24) |
2563 | 233 bytestream_put_le24(&data_ptr, (sample >> 4) & 0xffffff); |
234 else | |
235 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
|
236 } |
2563 | 237 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
|
238 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
239 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
|
240 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
|
241 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
242 |
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
|
243 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
|
244 { |
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 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
|
246 MXFContext *mxf = s->priv_data; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
247 ByteIOContext *pb = s->pb; |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3927
diff
changeset
|
248 int64_t end = url_ftell(pb) + klv->length; |
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
|
249 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
|
250 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
|
251 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
|
252 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
|
253 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
|
254 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
|
255 |
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 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
|
257 mxf->aesc = av_malloc(av_aes_size); |
2944 | 258 if (!mxf->aesc) |
259 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
|
260 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
|
261 } |
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 // 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
|
263 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
|
264 // 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
|
265 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
|
266 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
|
267 // 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
|
268 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
|
269 get_buffer(pb, klv->key, 16); |
2123 | 270 if (!IS_KLV_KEY(klv, mxf_essence_element_key)) |
271 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
|
272 index = mxf_get_stream_index(s, klv); |
2123 | 273 if (index < 0) |
274 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
|
275 // 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
|
276 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
|
277 orig_size = get_be64(pb); |
2123 | 278 if (orig_size < plaintext_size) |
279 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
|
280 // 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
|
281 size = klv_decode_ber_length(pb); |
2123 | 282 if (size < 32 || size - 32 < orig_size) |
283 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
|
284 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
|
285 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
|
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, 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
|
288 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
|
289 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
|
290 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 &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
|
296 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
|
297 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
|
298 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
|
299 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
|
300 } |
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
|
301 |
1186 | 302 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) |
303 { | |
304 KLVPacket klv; | |
305 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
306 while (!url_feof(s->pb)) { |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
307 if (klv_read_packet(&klv, s->pb) < 0) |
1186 | 308 return -1; |
1907 | 309 PRINT_KEY(s, "read packet", klv.key); |
4174
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
310 dprintf(s, "size %lld offset %#llx\n", klv.length, klv.offset); |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
311 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
|
312 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
|
313 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
|
314 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
|
315 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
|
316 } |
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
|
317 return 0; |
1646
52215d40cb3f
Make seeking work in files that contain encrypted tracks.
reimar
parents:
1644
diff
changeset
|
318 } |
1186 | 319 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
|
320 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
|
321 if (index < 0) { |
3911
308606d12c24
print stream index in decimal not in hex, easier for debugging
bcoudurier
parents:
3908
diff
changeset
|
322 av_log(s, AV_LOG_ERROR, "error getting stream index %d\n", AV_RB32(klv.key+12)); |
3146
2da3651f804d
just skip klv packet, when no corresponding stream is found
bcoudurier
parents:
3117
diff
changeset
|
323 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
|
324 } |
3117 | 325 if (s->streams[index]->discard == AVDISCARD_ALL) |
326 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
|
327 /* 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
|
328 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
|
329 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
|
330 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
|
331 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
|
332 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
333 } else |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
334 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
|
335 pkt->stream_index = index; |
2121 | 336 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
|
337 return 0; |
1186 | 338 } else |
3117 | 339 skip: |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
340 url_fskip(s->pb, klv.length); |
1186 | 341 } |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2125
diff
changeset
|
342 return AVERROR(EIO); |
1186 | 343 } |
344 | |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
345 static int mxf_read_primer_pack(MXFContext *mxf) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
346 { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
347 ByteIOContext *pb = mxf->fc->pb; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
348 int item_num = get_be32(pb); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
349 int item_len = get_be32(pb); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
350 |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
351 if (item_len != 18) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
352 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
|
353 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
354 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
355 if (item_num > UINT_MAX / item_len) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
356 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
357 mxf->local_tags_count = item_num; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
358 mxf->local_tags = av_malloc(item_num*item_len); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
359 if (!mxf->local_tags) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
360 return -1; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
361 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
|
362 return 0; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
363 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
364 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
365 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
|
366 { |
4761 | 367 if (mxf->metadata_sets_count+1 >= UINT_MAX / sizeof(*mxf->metadata_sets)) |
368 return AVERROR(ENOMEM); | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
369 mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); |
2944 | 370 if (!mxf->metadata_sets) |
371 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
|
372 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
|
373 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
|
374 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
|
375 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
376 |
2948 | 377 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
|
378 { |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
379 if (size != 16) |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
380 return -1; |
2946 | 381 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
|
382 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
|
383 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
|
384 } |
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
|
385 |
2948 | 386 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
|
387 { |
1650 | 388 switch (tag) { |
389 case 0x1901: | |
390 mxf->packages_count = get_be32(pb); | |
391 if (mxf->packages_count >= UINT_MAX / sizeof(UID)) | |
392 return -1; | |
393 mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID)); | |
2944 | 394 if (!mxf->packages_refs) |
395 return -1; | |
1650 | 396 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
397 get_buffer(pb, (uint8_t *)mxf->packages_refs, mxf->packages_count * sizeof(UID)); | |
398 break; | |
399 } | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
400 return 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
401 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
402 |
2948 | 403 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
|
404 { |
1650 | 405 switch(tag) { |
406 case 0x0202: | |
407 source_clip->duration = get_be64(pb); | |
408 break; | |
409 case 0x1201: | |
410 source_clip->start_position = get_be64(pb); | |
411 break; | |
412 case 0x1101: | |
413 /* UMID, only get last 16 bytes */ | |
414 url_fskip(pb, 16); | |
415 get_buffer(pb, source_clip->source_package_uid, 16); | |
416 break; | |
417 case 0x1102: | |
418 source_clip->source_track_id = get_be32(pb); | |
419 break; | |
420 } | |
421 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
|
422 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
423 |
2948 | 424 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
|
425 { |
1650 | 426 switch(tag) { |
427 case 0x4403: | |
428 package->tracks_count = get_be32(pb); | |
429 if (package->tracks_count >= UINT_MAX / sizeof(UID)) | |
430 return -1; | |
431 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); | |
2944 | 432 if (!package->tracks_refs) |
433 return -1; | |
1650 | 434 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
435 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); | |
436 break; | |
437 } | |
438 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
|
439 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
440 |
2948 | 441 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
|
442 { |
1650 | 443 switch(tag) { |
444 case 0x4801: | |
445 track->track_id = get_be32(pb); | |
446 break; | |
447 case 0x4804: | |
448 get_buffer(pb, track->track_number, 4); | |
449 break; | |
450 case 0x4B01: | |
451 track->edit_rate.den = get_be32(pb); | |
452 track->edit_rate.num = get_be32(pb); | |
453 break; | |
454 case 0x4803: | |
455 get_buffer(pb, track->sequence_ref, 16); | |
456 break; | |
457 } | |
458 return 0; | |
1186 | 459 } |
460 | |
2948 | 461 static int mxf_read_sequence(MXFSequence *sequence, ByteIOContext *pb, int tag) |
1186 | 462 { |
1650 | 463 switch(tag) { |
464 case 0x0202: | |
465 sequence->duration = get_be64(pb); | |
466 break; | |
467 case 0x0201: | |
468 get_buffer(pb, sequence->data_definition_ul, 16); | |
469 break; | |
470 case 0x1001: | |
471 sequence->structural_components_count = get_be32(pb); | |
472 if (sequence->structural_components_count >= UINT_MAX / sizeof(UID)) | |
473 return -1; | |
474 sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID)); | |
2944 | 475 if (!sequence->structural_components_refs) |
476 return -1; | |
1650 | 477 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
478 get_buffer(pb, (uint8_t *)sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID)); | |
479 break; | |
480 } | |
481 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
|
482 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
483 |
2948 | 484 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
|
485 { |
1650 | 486 switch(tag) { |
487 case 0x4403: | |
488 package->tracks_count = get_be32(pb); | |
489 if (package->tracks_count >= UINT_MAX / sizeof(UID)) | |
490 return -1; | |
491 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); | |
2944 | 492 if (!package->tracks_refs) |
493 return -1; | |
1650 | 494 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
495 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); | |
496 break; | |
497 case 0x4401: | |
498 /* UMID, only get last 16 bytes */ | |
499 url_fskip(pb, 16); | |
500 get_buffer(pb, package->package_uid, 16); | |
501 break; | |
502 case 0x4701: | |
503 get_buffer(pb, package->descriptor_ref, 16); | |
504 break; | |
505 } | |
506 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
|
507 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
508 |
4174
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
509 static int mxf_read_index_table_segment(MXFIndexTableSegment *segment, ByteIOContext *pb, int tag) |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
510 { |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
511 switch(tag) { |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
512 case 0x3F05: dprintf(NULL, "EditUnitByteCount %d\n", get_be32(pb)); break; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
513 case 0x3F06: dprintf(NULL, "IndexSID %d\n", get_be32(pb)); break; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
514 case 0x3F07: dprintf(NULL, "BodySID %d\n", get_be32(pb)); break; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
515 case 0x3F0B: dprintf(NULL, "IndexEditRate %d/%d\n", get_be32(pb), get_be32(pb)); break; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
516 case 0x3F0C: dprintf(NULL, "IndexStartPosition %lld\n", get_be64(pb)); break; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
517 case 0x3F0D: dprintf(NULL, "IndexDuration %lld\n", get_be64(pb)); break; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
518 } |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
519 return 0; |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
520 } |
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
521 |
2948 | 522 static void mxf_read_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor) |
1202 | 523 { |
524 int code; | |
525 | |
526 do { | |
527 code = get_byte(pb); | |
4175
6b141a4f9567
use lower case x and alternate format for hex in printf
bcoudurier
parents:
4174
diff
changeset
|
528 dprintf(NULL, "pixel layout: code %#x\n", code); |
1202 | 529 switch (code) { |
530 case 0x52: /* R */ | |
531 descriptor->bits_per_sample += get_byte(pb); | |
532 break; | |
533 case 0x47: /* G */ | |
534 descriptor->bits_per_sample += get_byte(pb); | |
535 break; | |
536 case 0x42: /* B */ | |
537 descriptor->bits_per_sample += get_byte(pb); | |
538 break; | |
539 default: | |
540 get_byte(pb); | |
541 } | |
542 } while (code != 0); /* SMPTE 377M E.2.46 */ | |
543 } | |
544 | |
2952 | 545 static int mxf_read_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size, UID uid) |
1186 | 546 { |
1650 | 547 switch(tag) { |
1652
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
548 case 0x3F01: |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
549 descriptor->sub_descriptors_count = get_be32(pb); |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
550 if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID)) |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
551 return -1; |
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
552 descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID)); |
2944 | 553 if (!descriptor->sub_descriptors_refs) |
554 return -1; | |
1652
d8807a8435ab
merge multiple descriptor parsing with generic one
bcoudurier
parents:
1651
diff
changeset
|
555 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
|
556 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
|
557 break; |
1650 | 558 case 0x3004: |
559 get_buffer(pb, descriptor->essence_container_ul, 16); | |
560 break; | |
561 case 0x3006: | |
562 descriptor->linked_track_id = get_be32(pb); | |
563 break; | |
564 case 0x3201: /* PictureEssenceCoding */ | |
565 get_buffer(pb, descriptor->essence_codec_ul, 16); | |
566 break; | |
567 case 0x3203: | |
568 descriptor->width = get_be32(pb); | |
569 break; | |
570 case 0x3202: | |
571 descriptor->height = get_be32(pb); | |
572 break; | |
573 case 0x320E: | |
574 descriptor->aspect_ratio.num = get_be32(pb); | |
575 descriptor->aspect_ratio.den = get_be32(pb); | |
576 break; | |
577 case 0x3D03: | |
578 descriptor->sample_rate.num = get_be32(pb); | |
579 descriptor->sample_rate.den = get_be32(pb); | |
580 break; | |
581 case 0x3D06: /* SoundEssenceCompression */ | |
582 get_buffer(pb, descriptor->essence_codec_ul, 16); | |
583 break; | |
584 case 0x3D07: | |
585 descriptor->channels = get_be32(pb); | |
586 break; | |
587 case 0x3D01: | |
588 descriptor->bits_per_sample = get_be32(pb); | |
589 break; | |
590 case 0x3401: | |
2948 | 591 mxf_read_pixel_layout(pb, descriptor); |
1650 | 592 break; |
2952 | 593 default: |
594 /* Private uid used by SONY C0023S01.mxf */ | |
595 if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) { | |
2953 | 596 descriptor->extradata = av_malloc(size); |
597 if (!descriptor->extradata) | |
598 return -1; | |
599 descriptor->extradata_size = size; | |
600 get_buffer(pb, descriptor->extradata, size); | |
2952 | 601 } |
1650 | 602 break; |
603 } | |
604 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
|
605 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
606 |
2115 | 607 /* |
608 * Match an uid independently of the version byte and up to len common bytes | |
609 * Returns: boolean | |
610 */ | |
611 static int mxf_match_uid(const UID key, const UID uid, int len) | |
612 { | |
613 int i; | |
614 for (i = 0; i < len; i++) { | |
615 if (i != 7 && key[i] != uid[i]) | |
616 return 0; | |
617 } | |
618 return 1; | |
619 } | |
620 | |
1225 | 621 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
|
622 { |
4404 | 623 while (uls->uid[0]) { |
2942 | 624 if(mxf_match_uid(uls->uid, *uid, uls->matching_len)) |
1225 | 625 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
626 uls++; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
627 } |
1225 | 628 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
|
629 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
630 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
631 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
|
632 { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
633 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
|
634 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
635 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
|
636 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
|
637 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
|
638 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
|
639 (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
|
640 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
|
641 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
642 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
643 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
|
644 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
645 |
3829
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
646 static const MXFCodecUL mxf_essence_container_uls[] = { |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
647 // video essence container uls |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
648 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, 14, CODEC_ID_MPEG2VIDEO }, /* MPEG-ES Frame wrapped */ |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
649 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, 14, CODEC_ID_DVVIDEO }, /* DV 625 25mbps */ |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
650 // sound essence container uls |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
651 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, 14, CODEC_ID_PCM_S16LE }, /* BWF Frame wrapped */ |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
652 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, 14, CODEC_ID_MP2 }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */ |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
653 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, 14, CODEC_ID_PCM_S16LE }, /* D-10 Mapping 50Mbps PAL Extended Template */ |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
654 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, 0, CODEC_ID_NONE }, |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
655 }; |
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
656 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
657 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
|
658 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
659 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
|
660 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
|
661 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
|
662 |
1907 | 663 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
|
664 /* 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
|
665 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
|
666 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
|
667 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
|
668 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
669 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
|
670 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
|
671 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
672 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
673 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
674 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
|
675 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
|
676 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
|
677 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
|
678 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
|
679 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
|
680 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
|
681 UID *essence_container_ul = NULL; |
1225 | 682 const MXFCodecUL *codec_ul = NULL; |
683 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
|
684 AVStream *st; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
685 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
686 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
|
687 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
|
688 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
689 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
690 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
691 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
|
692 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
|
693 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
|
694 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
695 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
696 /* 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
|
697 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
|
698 /* TODO: handle timecode component */ |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
699 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
|
700 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
|
701 continue; |
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 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
|
704 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
|
705 if (!temp_package) |
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
706 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
|
707 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
|
708 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
|
709 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
710 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
711 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
712 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
|
713 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
|
714 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
715 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
716 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
|
717 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
|
718 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
|
719 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
|
720 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
721 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
|
722 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
|
723 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
724 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
725 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
726 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
|
727 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
|
728 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
729 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
730 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
731 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
|
732 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
733 |
1197 | 734 st = av_new_stream(mxf->fc, source_track->track_id); |
2912 | 735 if (!st) { |
736 av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n"); | |
737 return -1; | |
738 } | |
1197 | 739 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
|
740 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
|
741 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
|
742 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
|
743 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
|
744 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
|
745 |
1632
6a6035a48dde
Extend mxf_resolve_strong_ref by a type parameter, to avoid modify something
reimar
parents:
1631
diff
changeset
|
746 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
|
747 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
|
748 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
|
749 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
750 |
1907 | 751 PRINT_KEY(mxf->fc, "data definition ul", source_track->sequence->data_definition_ul); |
4404 | 752 codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &source_track->sequence->data_definition_ul); |
753 st->codec->codec_type = codec_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
|
754 |
1634
eeb3521e4d09
AnyType is needed, descriptor_ref can reference Descriptor or MultipleDescriptor
bcoudurier
parents:
1633
diff
changeset
|
755 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
|
756 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
|
757 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
|
758 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
|
759 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
|
760 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
761 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
|
762 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
|
763 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
764 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
765 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
|
766 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
|
767 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
768 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
769 } |
1634
eeb3521e4d09
AnyType is needed, descriptor_ref can reference Descriptor or MultipleDescriptor
bcoudurier
parents:
1633
diff
changeset
|
770 } 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
|
771 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
|
772 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
773 if (!descriptor) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
774 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
|
775 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
776 } |
1907 | 777 PRINT_KEY(mxf->fc, "essence codec ul", descriptor->essence_codec_ul); |
778 PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul); | |
1779
de2cf54eb68f
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
bcoudurier
parents:
1655
diff
changeset
|
779 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
|
780 /* 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
|
781 * 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
|
782 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
|
783 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
|
784 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
|
785 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
|
786 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
|
787 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
|
788 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
|
789 } |
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
|
790 } |
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
|
791 } |
1225 | 792 /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */ |
3734 | 793 codec_ul = mxf_get_codec_ul(ff_mxf_codec_uls, &descriptor->essence_codec_ul); |
1226 | 794 st->codec->codec_id = codec_ul->id; |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
795 if (descriptor->extradata) { |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
796 st->codec->extradata = descriptor->extradata; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
797 st->codec->extradata_size = descriptor->extradata_size; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
798 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
799 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
3829
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
800 container_ul = mxf_get_codec_ul(mxf_essence_container_uls, essence_container_ul); |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
801 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 802 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
|
803 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
|
804 st->codec->height = descriptor->height; |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3829
diff
changeset
|
805 st->codec->bits_per_coded_sample = descriptor->bits_per_sample; /* Uncompressed */ |
2023 | 806 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
|
807 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
3829
dcc57b916324
put back mxf_essence_container_uls in demuxer as static const
bcoudurier
parents:
3781
diff
changeset
|
808 container_ul = mxf_get_codec_ul(mxf_essence_container_uls, essence_container_ul); |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
809 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 810 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
|
811 st->codec->channels = descriptor->channels; |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3829
diff
changeset
|
812 st->codec->bits_per_coded_sample = descriptor->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
|
813 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
|
814 /* 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
|
815 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
|
816 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
|
817 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
|
818 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
|
819 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
|
820 } 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
|
821 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
|
822 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
|
823 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
|
824 st->codec->codec_id = CODEC_ID_PCM_S32BE; |
1348 | 825 } else if (st->codec->codec_id == CODEC_ID_MP2) { |
2023 | 826 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
|
827 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
828 } |
2949
c433c2607194
simplify and detect better non frame wrapped mappings
bcoudurier
parents:
2948
diff
changeset
|
829 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
|
830 av_log(mxf->fc, AV_LOG_WARNING, "only frame wrapped mappings are correctly supported\n"); |
2023 | 831 st->need_parsing = AVSTREAM_PARSE_FULL; |
1226 | 832 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
833 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
834 return 0; |
1186 | 835 } |
836 | |
1210 | 837 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
838 { { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x05,0x01,0x00 }, mxf_read_primer_pack }, |
2948 | 839 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_content_storage, 0, AnyType }, |
840 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_source_package, sizeof(MXFPackage), SourcePackage }, | |
841 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_material_package, sizeof(MXFPackage), MaterialPackage }, | |
842 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_sequence, sizeof(MXFSequence), Sequence }, | |
843 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_source_clip, sizeof(MXFStructuralComponent), SourceClip }, | |
844 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor }, | |
845 { { 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 */ | |
846 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* CDCI */ | |
847 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* RGBA */ | |
848 { { 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 */ | |
849 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* Wave */ | |
850 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_generic_descriptor, sizeof(MXFDescriptor), Descriptor }, /* AES3 */ | |
851 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */ | |
852 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */ | |
853 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext }, | |
4174
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
854 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment }, |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
855 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType }, |
1210 | 856 }; |
857 | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
858 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
|
859 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
860 ByteIOContext *pb = mxf->fc->pb; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
861 MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf; |
2947 | 862 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
|
863 |
2944 | 864 if (!ctx) |
865 return -1; | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
866 while (url_ftell(pb) + 4 < klv_end) { |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
867 int tag = get_be16(pb); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
868 int size = get_be16(pb); /* KLV specified by 0x53 */ |
2947 | 869 uint64_t next = url_ftell(pb) + size; |
2954 | 870 UID uid = {0}; |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
871 |
4175
6b141a4f9567
use lower case x and alternate format for hex in printf
bcoudurier
parents:
4174
diff
changeset
|
872 dprintf(mxf->fc, "local tag %#04x size %d\n", tag, size); |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
873 if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */ |
4175
6b141a4f9567
use lower case x and alternate format for hex in printf
bcoudurier
parents:
4174
diff
changeset
|
874 av_log(mxf->fc, AV_LOG_ERROR, "local tag %#04x with 0 size\n", tag); |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
875 continue; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
876 } |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
877 if (tag > 0x7FFF) { /* dynamic tag */ |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
878 int i; |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
879 for (i = 0; i < mxf->local_tags_count; i++) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
880 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
|
881 if (local_tag == tag) { |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
882 memcpy(uid, mxf->local_tags+i*18+2, 16); |
4175
6b141a4f9567
use lower case x and alternate format for hex in printf
bcoudurier
parents:
4174
diff
changeset
|
883 dprintf(mxf->fc, "local tag %#04x\n", local_tag); |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
884 PRINT_KEY(mxf->fc, "uid", uid); |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
885 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
886 } |
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
887 } |
2947 | 888 if (ctx_size && tag == 0x3C0A) |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
889 get_buffer(pb, ctx->uid, 16); |
2951 | 890 else if (read_child(ctx, pb, tag, size, uid) < 0) |
891 return -1; | |
1649
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
892 |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
893 url_fseek(pb, next, SEEK_SET); |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
894 } |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
895 if (ctx_size) ctx->type = type; |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
896 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
|
897 } |
46d5a151ca4f
follow michael suggestion and simplify code at object level
bcoudurier
parents:
1646
diff
changeset
|
898 |
1186 | 899 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
900 { | |
901 MXFContext *mxf = s->priv_data; | |
902 KLVPacket klv; | |
903 | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
904 if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) { |
1395 | 905 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); |
906 return -1; | |
907 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
908 url_fseek(s->pb, -14, SEEK_CUR); |
1186 | 909 mxf->fc = s; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
910 while (!url_feof(s->pb)) { |
1655 | 911 const MXFMetadataReadTableEntry *metadata; |
1210 | 912 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
913 if (klv_read_packet(&klv, s->pb) < 0) |
1186 | 914 return -1; |
1907 | 915 PRINT_KEY(s, "read header", klv.key); |
4174
8572dd01c69d
print more debug information if enabled, including index
bcoudurier
parents:
3973
diff
changeset
|
916 dprintf(s, "size %lld offset %#llx\n", klv.length, klv.offset); |
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
|
917 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
|
918 IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
1186 | 919 /* FIXME avoid seek */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
920 url_fseek(s->pb, klv.offset, SEEK_SET); |
1186 | 921 break; |
1210 | 922 } |
923 | |
1655 | 924 for (metadata = mxf_metadata_read_table; metadata->read; metadata++) { |
925 if (IS_KLV_KEY(klv.key, metadata->key)) { | |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
926 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
|
927 if (read(mxf, &klv, metadata->read, metadata->ctx_size, metadata->type) < 0) { |
1210 | 928 av_log(s, AV_LOG_ERROR, "error reading header metadata\n"); |
929 return -1; | |
930 } | |
931 break; | |
932 } | |
933 } | |
1655 | 934 if (!metadata->read) |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2564
diff
changeset
|
935 url_fskip(s->pb, klv.length); |
1186 | 936 } |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
937 return mxf_parse_structural_metadata(mxf); |
1186 | 938 } |
939 | |
940 static int mxf_read_close(AVFormatContext *s) | |
941 { | |
942 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
|
943 int i; |
1186 | 944 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
945 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
|
946 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
|
947 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
|
948 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
|
949 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
|
950 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
951 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
|
952 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
|
953 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
954 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
|
955 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
|
956 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
|
957 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
|
958 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
|
959 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
|
960 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
|
961 default: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
962 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
963 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
964 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
|
965 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
966 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
|
967 av_freep(&mxf->aesc); |
2945
670945e9899d
support dynamically allocated local tags, used by encrypted files
bcoudurier
parents:
2944
diff
changeset
|
968 av_freep(&mxf->local_tags); |
1186 | 969 return 0; |
970 } | |
971 | |
972 static int mxf_probe(AVProbeData *p) { | |
1211 | 973 uint8_t *bufp = p->buf; |
974 uint8_t *end = p->buf + p->buf_size; | |
975 | |
1186 | 976 if (p->buf_size < sizeof(mxf_header_partition_pack_key)) |
977 return 0; | |
978 | |
1211 | 979 /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */ |
980 end -= sizeof(mxf_header_partition_pack_key); | |
981 for (; bufp < end; bufp++) { | |
1231
e713080a7880
revert r5909, dont use non constant static variable, breaks multithreaded apps
bcoudurier
parents:
1230
diff
changeset
|
982 if (IS_KLV_KEY(bufp, mxf_header_partition_pack_key)) |
1211 | 983 return AVPROBE_SCORE_MAX; |
984 } | |
985 return 0; | |
1186 | 986 } |
987 | |
2036 | 988 /* rudimentary byte seek */ |
1343 | 989 /* XXX: use MXF Index */ |
990 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags) | |
991 { | |
992 AVStream *st = s->streams[stream_index]; | |
993 int64_t seconds; | |
994 | |
1363 | 995 if (!s->bit_rate) |
1343 | 996 return -1; |
1363 | 997 if (sample_time < 0) |
998 sample_time = 0; | |
1343 | 999 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
|
1000 url_fseek(s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET); |
1395 | 1001 av_update_cur_dts(s, st, sample_time); |
1002 return 0; | |
1343 | 1003 } |
1186 | 1004 |
1005 AVInputFormat mxf_demuxer = { | |
1006 "mxf", | |
3585 | 1007 NULL_IF_CONFIG_SMALL("Material eXchange Format"), |
1186 | 1008 sizeof(MXFContext), |
1009 mxf_probe, | |
1010 mxf_read_header, | |
1011 mxf_read_packet, | |
1012 mxf_read_close, | |
1343 | 1013 mxf_read_seek, |
1186 | 1014 }; |