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