Mercurial > libavformat.hg
annotate mxf.c @ 1418:9720274e2621 libavformat
remove mov_read_leaf and remove useless reading function table, mov_read_default will skip atom with no parsing function anyway
author | bcoudurier |
---|---|
date | Wed, 25 Oct 2006 22:50:49 +0000 |
parents | 069c0c5a1baf |
children | 927cc72c6cac |
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" | |
49 | |
1197 | 50 typedef uint8_t UID[16]; |
1189 | 51 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
52 enum MXFMetadataSetType { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
53 MaterialPackage, |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
54 SourcePackage, |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
55 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
|
56 TimecodeComponent, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
57 Sequence, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
58 MultipleDescriptor, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
59 Descriptor, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
60 Track, |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
61 EssenceContainerData, |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
62 }; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
63 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
64 typedef struct MXFStructuralComponent { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
65 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
|
66 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
|
67 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
|
68 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
|
69 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
|
70 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
|
71 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
|
72 } MXFStructuralComponent; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
73 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
74 typedef struct MXFSequence { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
75 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
|
76 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
|
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 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
|
79 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
|
80 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
|
81 } MXFSequence; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
82 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
83 typedef struct MXFTrack { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
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 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
|
87 UID sequence_ref; |
1186 | 88 int track_id; |
1197 | 89 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
|
90 AVRational edit_rate; |
1186 | 91 } MXFTrack; |
92 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
93 typedef struct MXFDescriptor { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
94 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
|
95 enum MXFMetadataSetType type; |
1192 | 96 UID essence_container_ul; |
97 UID essence_codec_ul; | |
1186 | 98 AVRational sample_rate; |
99 AVRational aspect_ratio; | |
100 int width; | |
101 int height; | |
102 int channels; | |
103 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
|
104 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
|
105 int sub_descriptors_count; |
1186 | 106 int linked_track_id; |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
107 uint8_t *extradata; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
108 int extradata_size; |
1186 | 109 } MXFDescriptor; |
110 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
111 typedef struct MXFPackage { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
112 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
|
113 enum MXFMetadataSetType type; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
114 UID package_uid; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
115 UID *tracks_refs; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
116 int tracks_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
117 MXFDescriptor *descriptor; /* only one */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
118 UID descriptor_ref; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
119 } MXFPackage; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
120 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
121 typedef struct MXFEssenceContainerData { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
122 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
|
123 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
|
124 UID linked_package_uid; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
125 } MXFEssenceContainerData; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
126 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
127 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
|
128 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
|
129 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
|
130 } MXFMetadataSet; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
131 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
132 typedef struct MXFContext { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
133 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
|
134 int packages_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
135 UID *essence_container_data_sets_refs; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
136 int essence_container_data_sets_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
137 UID *essence_containers_uls; /* Universal Labels SMPTE RP224 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
138 int essence_containers_uls_count; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
139 UID operational_pattern_ul; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
140 UID content_storage_uid; |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
141 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
|
142 int metadata_sets_count; |
1186 | 143 AVFormatContext *fc; |
144 } MXFContext; | |
145 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
146 typedef struct KLVPacket { |
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 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
157 typedef struct MXFCodecUL { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
158 UID uid; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
159 enum CodecID id; |
1225 | 160 enum MXFWrappingScheme wrapping; |
1190
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 |
1341
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
163 typedef struct MXFDataDefinitionUL { |
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 |
1210 | 168 typedef struct MXFMetadataReadTableEntry { |
169 const UID key; | |
170 int (*read)(MXFContext *mxf, KLVPacket *klv); | |
171 } MXFMetadataReadTableEntry; | |
1189 | 172 |
173 /* partial keys to match */ | |
1195 | 174 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 }; |
1197 | 175 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 }; |
1186 | 176 |
177 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y))) | |
178 | |
1340 | 179 #define PRINT_KEY(s, x) dprintf("%s %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", s, \ |
1208 | 180 (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 | 181 |
182 static int64_t klv_decode_ber_length(ByteIOContext *pb) | |
183 { | |
184 int64_t size = 0; | |
185 uint8_t length = get_byte(pb); | |
186 int type = length >> 7; | |
187 | |
188 if (type) { /* long form */ | |
189 int bytes_num = length & 0x7f; | |
190 /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */ | |
191 if (bytes_num > 8) | |
192 return -1; | |
193 while (bytes_num--) | |
194 size = size << 8 | get_byte(pb); | |
195 } else { | |
196 size = length & 0x7f; | |
197 } | |
198 return size; | |
199 } | |
200 | |
201 static int klv_read_packet(KLVPacket *klv, ByteIOContext *pb) | |
202 { | |
203 klv->offset = url_ftell(pb); | |
204 get_buffer(pb, klv->key, 16); | |
205 klv->length = klv_decode_ber_length(pb); | |
1194 | 206 return klv->length == -1 ? -1 : 0; |
1186 | 207 } |
208 | |
209 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv) | |
210 { | |
211 int i; | |
212 | |
213 for (i = 0; i < s->nb_streams; i++) { | |
1197 | 214 MXFTrack *track = s->streams[i]->priv_data; |
215 /* SMPTE 379M 7.3 */ | |
216 if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number))) | |
1186 | 217 return i; |
218 } | |
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
|
219 /* 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
|
220 return s->nb_streams == 1 ? 0 : -1; |
1186 | 221 } |
222 | |
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
|
223 /* 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
|
224 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
|
225 { |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
226 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
|
227 uint8_t *buf_ptr, *end_ptr, *data_ptr; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
228 |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
229 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
|
230 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
|
231 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
|
232 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
|
233 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
|
234 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
|
235 buf_ptr = buffer + 4; /* skip SMPTE 331M header */ |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
236 for (; buf_ptr < end_ptr; buf_ptr += 4) { |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
237 if (st->codec->bits_per_sample == 24) { |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
238 data_ptr[0] = (buf_ptr[2] >> 4) | ((buf_ptr[3] & 0x0f) << 4); |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
239 data_ptr[1] = (buf_ptr[1] >> 4) | ((buf_ptr[2] & 0x0f) << 4); |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
240 data_ptr[2] = (buf_ptr[0] >> 4) | ((buf_ptr[1] & 0x0f) << 4); |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
241 data_ptr += 3; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
242 } else { |
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 data_ptr[0] = (buf_ptr[2] >> 4) | ((buf_ptr[3] & 0x0f) << 4); |
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 data_ptr[1] = (buf_ptr[1] >> 4) | ((buf_ptr[2] & 0x0f) << 4); |
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 data_ptr += 2; |
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 } |
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 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
248 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
|
249 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
|
250 } |
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 |
1186 | 252 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) |
253 { | |
254 KLVPacket klv; | |
255 | |
256 while (!url_feof(&s->pb)) { | |
1191 | 257 if (klv_read_packet(&klv, &s->pb) < 0) { |
258 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n"); | |
1186 | 259 return -1; |
1191 | 260 } |
1198 | 261 #ifdef DEBUG |
1340 | 262 PRINT_KEY("read packet", klv.key); |
1198 | 263 #endif |
1186 | 264 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
|
265 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
|
266 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
|
267 av_log(s, AV_LOG_ERROR, "error getting stream index\n"); |
1396
069c0c5a1baf
skip packet if no stream index is found, fix proxy_pal030926.mxf
bcoudurier
parents:
1395
diff
changeset
|
268 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
|
269 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
|
270 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
271 /* 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
|
272 if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) { |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
273 if (mxf_get_d10_aes3_packet(&s->pb, s->streams[index], pkt, klv.length) < 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
|
274 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
|
275 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
|
276 } |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
277 } else |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
278 av_get_packet(&s->pb, pkt, klv.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
|
279 pkt->stream_index = index; |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
280 return 0; |
1186 | 281 } else |
282 url_fskip(&s->pb, klv.length); | |
283 } | |
284 return AVERROR_IO; | |
285 } | |
286 | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
287 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
|
288 { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
289 mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets)); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
294 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
295 static int mxf_read_metadata_preface(MXFContext *mxf, KLVPacket *klv) |
1186 | 296 { |
297 ByteIOContext *pb = &mxf->fc->pb; | |
298 int bytes_read = 0; | |
299 | |
300 while (bytes_read < klv->length) { | |
301 int tag = get_be16(pb); | |
302 int size = get_be16(pb); /* SMPTE 336M Table 8 KLV specified length, 0x53 */ | |
303 | |
304 switch (tag) { | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
305 case 0x3B03: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
306 get_buffer(pb, mxf->content_storage_uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
307 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
308 case 0x3B09: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
309 get_buffer(pb, mxf->operational_pattern_ul, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
310 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
311 case 0x3B0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
312 mxf->essence_containers_uls_count = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
313 if (mxf->essence_containers_uls_count >= UINT_MAX / sizeof(UID)) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
314 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
315 mxf->essence_containers_uls = av_malloc(mxf->essence_containers_uls_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
316 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
1339 | 317 get_buffer(pb, (uint8_t *)mxf->essence_containers_uls, mxf->essence_containers_uls_count * sizeof(UID)); |
1186 | 318 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
319 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
320 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
321 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
322 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
323 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
324 return 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
325 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
326 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
327 static int mxf_read_metadata_content_storage(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
328 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
329 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
330 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
331 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
332 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
333 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
334 int size = get_be16(pb); /* SMPTE 336M Table 8 KLV specified length, 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
335 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
336 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
337 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
338 case 0x1901: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
339 mxf->packages_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
340 if (mxf->packages_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
341 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
342 mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
343 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
1339 | 344 get_buffer(pb, (uint8_t *)mxf->packages_refs, mxf->packages_count * sizeof(UID)); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
345 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
346 case 0x1902: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
347 mxf->essence_container_data_sets_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
348 if (mxf->essence_container_data_sets_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
349 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
350 mxf->essence_container_data_sets_refs = av_malloc(mxf->essence_container_data_sets_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
351 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
1339 | 352 get_buffer(pb, (uint8_t *)mxf->essence_container_data_sets_refs, mxf->essence_container_data_sets_count * sizeof(UID)); |
1186 | 353 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
354 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
355 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
356 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
357 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
358 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
359 return 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
360 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
361 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
362 static int mxf_read_metadata_source_clip(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
363 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
364 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
365 MXFStructuralComponent *source_clip = av_mallocz(sizeof(*source_clip)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
366 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
367 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
368 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
369 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
370 int size = get_be16(pb); /* SMPTE 336M Table 8 KLV specified length, 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
371 |
1310
6904eb006d7b
workaround for files, mainly d-cinema, with 0 sized tags especially UMID in source clip, 377M B.10,13 clearly mentions that this is non standard though
bcoudurier
parents:
1275
diff
changeset
|
372 bytes_read += size + 4; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
373 dprintf("tag 0x%04X, size %d\n", tag, size); |
1310
6904eb006d7b
workaround for files, mainly d-cinema, with 0 sized tags especially UMID in source clip, 377M B.10,13 clearly mentions that this is non standard though
bcoudurier
parents:
1275
diff
changeset
|
374 if (!size) /* ignore empty tag, needed for some files with empty UMID tag */ |
6904eb006d7b
workaround for files, mainly d-cinema, with 0 sized tags especially UMID in source clip, 377M B.10,13 clearly mentions that this is non standard though
bcoudurier
parents:
1275
diff
changeset
|
375 continue; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
376 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
377 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
378 get_buffer(pb, source_clip->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
379 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
380 case 0x0202: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
381 source_clip->duration = get_be64(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
382 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
383 case 0x1201: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
384 source_clip->start_position = get_be64(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
385 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
386 case 0x1101: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
387 /* UMID, only get last 16 bytes */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
388 url_fskip(pb, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
389 get_buffer(pb, source_clip->source_package_uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
390 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
391 case 0x1102: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
392 source_clip->source_track_id = get_be32(pb); |
1186 | 393 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
394 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
395 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
396 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
397 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
398 source_clip->type = SourceClip; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
399 return mxf_add_metadata_set(mxf, source_clip); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
400 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
401 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
402 static int mxf_read_metadata_material_package(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
403 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
404 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
405 MXFPackage *package = av_mallocz(sizeof(*package)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
406 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
407 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
408 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
409 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
410 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
411 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
412 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
413 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
414 get_buffer(pb, package->uid, 16); |
1186 | 415 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
416 case 0x4403: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
417 package->tracks_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
418 if (package->tracks_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
419 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
420 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
421 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
1339 | 422 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); |
1186 | 423 break; |
424 default: | |
425 url_fskip(pb, size); | |
426 } | |
427 bytes_read += size + 4; | |
428 } | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
429 package->type = MaterialPackage; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
430 return mxf_add_metadata_set(mxf, package); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
431 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
432 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
433 static int mxf_read_metadata_track(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
434 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
435 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
436 MXFTrack *track = av_mallocz(sizeof(*track)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
437 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
438 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
439 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
440 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
441 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
442 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
443 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
444 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
445 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
446 get_buffer(pb, track->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
447 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
448 case 0x4801: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
449 track->track_id = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
450 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
451 case 0x4804: |
1197 | 452 get_buffer(pb, track->track_number, 4); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
453 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
454 case 0x4B01: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
455 track->edit_rate.den = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
456 track->edit_rate.num = get_be32(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
457 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
458 case 0x4803: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
459 get_buffer(pb, track->sequence_ref, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
460 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
461 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
462 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
463 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
464 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
465 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
466 track->type = Track; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
467 return mxf_add_metadata_set(mxf, track); |
1186 | 468 } |
469 | |
470 static int mxf_read_metadata_sequence(MXFContext *mxf, KLVPacket *klv) | |
471 { | |
472 ByteIOContext *pb = &mxf->fc->pb; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
473 MXFSequence *sequence = av_mallocz(sizeof(*sequence)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
474 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
475 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
476 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
477 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
478 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
479 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
480 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
481 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
482 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
483 get_buffer(pb, sequence->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
484 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
485 case 0x0202: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
486 sequence->duration = get_be64(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
487 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
488 case 0x0201: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
489 get_buffer(pb, sequence->data_definition_ul, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
490 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
491 case 0x1001: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
492 sequence->structural_components_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
493 if (sequence->structural_components_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
494 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
495 sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
496 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
1339 | 497 get_buffer(pb, (uint8_t *)sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID)); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
498 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
499 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
500 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
501 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
502 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
503 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
504 sequence->type = Sequence; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
505 return mxf_add_metadata_set(mxf, sequence); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
506 } |
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 static int mxf_read_metadata_source_package(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
509 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
510 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
511 MXFPackage *package = av_mallocz(sizeof(*package)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
512 int bytes_read = 0; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
513 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
514 while (bytes_read < klv->length) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
515 int tag = get_be16(pb); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
516 int size = get_be16(pb); /* KLV specified by 0x53 */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
517 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
518 dprintf("tag 0x%04X, size %d\n", tag, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
519 switch (tag) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
520 case 0x3C0A: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
521 get_buffer(pb, package->uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
522 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
523 case 0x4403: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
524 package->tracks_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
525 if (package->tracks_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
526 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
527 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
528 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
1339 | 529 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID)); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
530 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
531 case 0x4401: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
532 /* UMID, only get last 16 bytes */ |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
533 url_fskip(pb, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
534 get_buffer(pb, package->package_uid, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
535 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
536 case 0x4701: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
537 get_buffer(pb, package->descriptor_ref, 16); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
538 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
539 default: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
540 url_fskip(pb, size); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
541 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
542 bytes_read += size + 4; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
543 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
544 package->type = SourcePackage; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
545 return mxf_add_metadata_set(mxf, package); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
546 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
547 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
548 static int mxf_read_metadata_multiple_descriptor(MXFContext *mxf, KLVPacket *klv) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
549 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
550 ByteIOContext *pb = &mxf->fc->pb; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
551 MXFDescriptor *descriptor = av_mallocz(sizeof(*descriptor)); |
1186 | 552 int bytes_read = 0; |
553 | |
554 while (bytes_read < klv->length) { | |
555 int tag = get_be16(pb); | |
556 int size = get_be16(pb); /* KLV specified by 0x53 */ | |
557 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
558 dprintf("tag 0x%04X, size %d\n", tag, size); |
1186 | 559 switch (tag) { |
560 case 0x3C0A: | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
561 get_buffer(pb, descriptor->uid, 16); |
1186 | 562 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
563 case 0x3F01: |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
564 descriptor->sub_descriptors_count = get_be32(pb); |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
565 if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID)) |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
566 return -1; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
567 descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID)); |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
568 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */ |
1339 | 569 get_buffer(pb, (uint8_t *)descriptor->sub_descriptors_refs, descriptor->sub_descriptors_count * sizeof(UID)); |
1186 | 570 break; |
571 default: | |
572 url_fskip(pb, size); | |
573 } | |
574 bytes_read += size + 4; | |
575 } | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
576 descriptor->type = MultipleDescriptor; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
577 return mxf_add_metadata_set(mxf, descriptor); |
1186 | 578 } |
579 | |
1202 | 580 static void mxf_read_metadata_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor) |
581 { | |
582 int code; | |
583 | |
584 do { | |
585 code = get_byte(pb); | |
586 dprintf("pixel layout: code 0x%x\n", code); | |
587 switch (code) { | |
588 case 0x52: /* R */ | |
589 descriptor->bits_per_sample += get_byte(pb); | |
590 break; | |
591 case 0x47: /* G */ | |
592 descriptor->bits_per_sample += get_byte(pb); | |
593 break; | |
594 case 0x42: /* B */ | |
595 descriptor->bits_per_sample += get_byte(pb); | |
596 break; | |
597 default: | |
598 get_byte(pb); | |
599 } | |
600 } while (code != 0); /* SMPTE 377M E.2.46 */ | |
601 } | |
602 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
603 static int mxf_read_metadata_generic_descriptor(MXFContext *mxf, KLVPacket *klv) |
1186 | 604 { |
605 ByteIOContext *pb = &mxf->fc->pb; | |
1192 | 606 MXFDescriptor *descriptor = av_mallocz(sizeof(*descriptor)); |
1186 | 607 int bytes_read = 0; |
608 | |
609 while (bytes_read < klv->length) { | |
610 int tag = get_be16(pb); | |
611 int size = get_be16(pb); /* KLV specified by 0x53 */ | |
612 | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
613 dprintf("tag 0x%04X, size %d\n", tag, size); |
1186 | 614 switch (tag) { |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
615 case 0x3C0A: |
1192 | 616 get_buffer(pb, descriptor->uid, 16); |
1186 | 617 break; |
618 case 0x3004: | |
1192 | 619 get_buffer(pb, descriptor->essence_container_ul, 16); |
1186 | 620 break; |
621 case 0x3006: | |
1192 | 622 descriptor->linked_track_id = get_be32(pb); |
1186 | 623 break; |
624 case 0x3201: /* PictureEssenceCoding */ | |
1192 | 625 get_buffer(pb, descriptor->essence_codec_ul, 16); |
1186 | 626 break; |
627 case 0x3203: | |
1192 | 628 descriptor->width = get_be32(pb); |
1186 | 629 break; |
630 case 0x3202: | |
1192 | 631 descriptor->height = get_be32(pb); |
1186 | 632 break; |
633 case 0x320E: | |
1192 | 634 descriptor->aspect_ratio.num = get_be32(pb); |
635 descriptor->aspect_ratio.den = get_be32(pb); | |
1186 | 636 break; |
637 case 0x3D03: | |
1192 | 638 descriptor->sample_rate.num = get_be32(pb); |
639 descriptor->sample_rate.den = get_be32(pb); | |
1186 | 640 break; |
641 case 0x3D06: /* SoundEssenceCompression */ | |
1192 | 642 get_buffer(pb, descriptor->essence_codec_ul, 16); |
1186 | 643 break; |
644 case 0x3D07: | |
1192 | 645 descriptor->channels = get_be32(pb); |
1186 | 646 break; |
647 case 0x3D01: | |
1192 | 648 descriptor->bits_per_sample = get_be32(pb); |
1186 | 649 break; |
1202 | 650 case 0x3401: |
651 mxf_read_metadata_pixel_layout(pb, descriptor); | |
652 break; | |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
653 case 0x8201: /* Private tag used by SONY C0023S01.mxf */ |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
654 descriptor->extradata = av_malloc(size); |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
655 descriptor->extradata_size = size; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
656 get_buffer(pb, descriptor->extradata, size); |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
657 break; |
1186 | 658 default: |
659 url_fskip(pb, size); | |
660 } | |
661 bytes_read += size + 4; | |
662 } | |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
663 descriptor->type = Descriptor; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
664 return mxf_add_metadata_set(mxf, descriptor); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
665 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
666 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
667 /* 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
|
668 static const MXFDataDefinitionUL mxf_data_definition_uls[] = { |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
669 { { 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
|
670 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x00,0x00,0x00 }, CODEC_TYPE_AUDIO }, |
1342 | 671 { { 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
|
672 { { 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
|
673 }; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
674 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
675 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
|
676 /* PictureEssenceCoding */ |
1225 | 677 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@ML I-Frame */ |
678 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@HL Long GoP */ | |
679 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* MP@ML Long GoP */ | |
680 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@ML Long GoP */ | |
681 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* MP@HL Long GoP */ | |
682 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x03 }, CODEC_ID_MPEG4, Frame }, /* XDCAM proxy_pal030926.mxf */ | |
683 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x04 }, CODEC_ID_MPEG4, Frame }, /* XDCAM Proxy C0023S01.mxf */ | |
684 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 30Mbps PAL */ | |
685 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 50Mbps PAL */ | |
686 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 }, CODEC_ID_DVVIDEO, Frame }, /* DVCPRO50 PAL */ | |
687 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 }, CODEC_ID_DVVIDEO, Frame }, /* DVCPRO25 PAL */ | |
688 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 }, CODEC_ID_DVVIDEO, Frame }, /* DV25 IEC PAL */ | |
1275 | 689 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_JPEG2000, Frame }, /* JPEG2000 Codestream */ |
1225 | 690 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x01,0x7F,0x00,0x00,0x00 }, CODEC_ID_RAWVIDEO, Frame }, /* Uncompressed */ |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
691 /* SoundEssenceCompression */ |
1225 | 692 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, CODEC_ID_PCM_S16LE, Frame }, /* Uncompressed */ |
693 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x7F,0x00,0x00,0x00 }, CODEC_ID_PCM_S16LE, Frame }, | |
694 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x02,0x02,0x01,0x7E,0x00,0x00,0x00 }, CODEC_ID_PCM_S16BE, Frame }, /* From Omneon MXF file */ | |
695 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_PCM_ALAW, Frame }, | |
696 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x04,0x04,0x02,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_PCM_ALAW, Frame }, /* XDCAM Proxy C0023S01.mxf */ | |
697 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x01,0x00 }, CODEC_ID_AC3, Frame }, | |
698 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x05,0x00 }, CODEC_ID_MP2, Frame }, /* MP2 or MP3 */ | |
699 //{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x1C,0x00 }, CODEC_ID_DOLBY_E, Frame }, /* Dolby-E */ | |
700 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE, Frame }, | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
701 }; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
702 |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
703 static const MXFCodecUL mxf_picture_essence_container_uls[] = { |
1225 | 704 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, CODEC_ID_MPEG2VIDEO, Frame }, /* MPEG-ES Frame wrapped */ |
705 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xe0,0x02 }, CODEC_ID_MPEG2VIDEO, Clip }, /* MPEG-ES Clip wrapped, 0xe0 MPV stream id */ | |
706 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x04,0x61,0x07 }, CODEC_ID_MPEG2VIDEO, Clip }, /* MPEG-ES Custom wrapped, 0x61 ??? stream id */ | |
707 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE, Frame }, | |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
708 }; |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
709 |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
710 static const MXFCodecUL mxf_sound_essence_container_uls[] = { |
1225 | 711 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, CODEC_ID_PCM_S16LE, Frame }, /* BWF Frame wrapped */ |
712 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 }, CODEC_ID_PCM_S16LE, Frame }, /* AES Frame wrapped */ | |
713 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, CODEC_ID_MP2, Frame }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */ | |
714 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x01 }, CODEC_ID_MP2, Frame }, /* MPEG-ES Frame wrapped, 0xc0 MPA stream id */ | |
715 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x02 }, CODEC_ID_MP2, Clip }, /* MPEG-ES Clip wrapped, 0xc0 MPA stream id */ | |
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
|
716 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, CODEC_ID_PCM_S16BE, Frame }, /* D-10 Mapping 30Mbps PAL Extended Template */ |
34273a935dcf
support D-10, XDCAM, fix ebu_small_d10_50_audio_resampling_problem.mxf, xdcam-pal-d10-imx50.mxf
bcoudurier
parents:
1348
diff
changeset
|
717 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, CODEC_ID_PCM_S16BE, Frame }, /* D-10 Mapping 50Mbps PAL Extended Template */ |
1225 | 718 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE, Frame }, |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
719 }; |
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
720 |
1225 | 721 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
|
722 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
723 while (uls->id != CODEC_ID_NONE) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
724 if(!memcmp(uls->uid, *uid, 16)) |
1225 | 725 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
726 uls++; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
727 } |
1225 | 728 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
|
729 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
730 |
1341
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
731 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
|
732 { |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
733 while (uls->type != CODEC_TYPE_DATA) { |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
734 if(!memcmp(uls->uid, *uid, 16)) |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
735 break; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
736 uls++; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
737 } |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
738 return uls->type; |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
739 } |
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
740 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
741 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref) |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
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 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
|
744 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
745 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
|
746 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
|
747 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
|
748 if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16)) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
749 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
|
750 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
751 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
752 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
|
753 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
754 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
755 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
|
756 { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
757 MXFPackage *material_package = NULL; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
758 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
|
759 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
|
760 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
|
761 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
762 dprintf("metadata sets count %d\n", mxf->metadata_sets_count); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
763 /* 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
|
764 for (i = 0; i < mxf->packages_count; i++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
765 if (!(temp_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
766 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve package strong ref\n"); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
767 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
|
768 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
769 if (temp_package->type == MaterialPackage) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
770 material_package = temp_package; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
771 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
772 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
773 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
774 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
|
775 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
|
776 return -1; |
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 for (i = 0; i < material_package->tracks_count; i++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
780 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
|
781 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
|
782 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
|
783 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
|
784 MXFStructuralComponent *component = NULL; |
1225 | 785 const MXFCodecUL *codec_ul = NULL; |
786 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
|
787 AVStream *st; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
788 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
789 if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
790 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
|
791 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
792 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
793 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
794 if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
795 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
|
796 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
|
797 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
798 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
799 /* 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
|
800 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
|
801 /* TODO: handle timecode component */ |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
802 component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j]); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
803 if (!component || component->type != SourceClip) |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
804 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
805 |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
806 for (k = 0; k < mxf->packages_count; k++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
807 if (!(temp_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[k]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
808 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
|
809 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
|
810 } |
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 (!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
|
812 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
|
813 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
814 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
815 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
816 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
|
817 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
|
818 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
819 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
820 for (k = 0; k < source_package->tracks_count; k++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
821 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k]))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
822 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
|
823 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
|
824 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
825 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
|
826 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
|
827 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
828 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
829 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
830 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
|
831 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
|
832 break; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
833 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
834 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
835 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
|
836 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
837 |
1197 | 838 st = av_new_stream(mxf->fc, source_track->track_id); |
839 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
|
840 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
|
841 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
|
842 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
|
843 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
|
844 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
|
845 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
846 if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref))) { |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
847 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
|
848 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
|
849 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
850 |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
851 #ifdef DEBUG |
1340 | 852 PRINT_KEY("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
|
853 #endif |
1341
884baacb7f7e
use a data definition uls table to fetch codec type
bcoudurier
parents:
1340
diff
changeset
|
854 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
|
855 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
856 source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref); |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
857 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
|
858 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
|
859 for (j = 0; j < source_package->descriptor->sub_descriptors_count; j++) { |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
860 MXFDescriptor *sub_descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor->sub_descriptors_refs[j]); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
861 |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
862 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
|
863 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
|
864 continue; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
865 } |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
866 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
|
867 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
|
868 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
869 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
870 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
871 } else |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
872 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
|
873 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
874 if (!descriptor) { |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
875 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
|
876 continue; |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
877 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
878 #ifdef DEBUG |
1340 | 879 PRINT_KEY("essence codec ul", descriptor->essence_codec_ul); |
880 PRINT_KEY("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
|
881 #endif |
1225 | 882 /* TODO: drop PictureEssenceCoding and SoundEssenceCompression, only check EssenceContainer */ |
883 codec_ul = mxf_get_codec_ul(mxf_codec_uls, &descriptor->essence_codec_ul); | |
1226 | 884 st->codec->codec_id = codec_ul->id; |
1230
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
885 if (descriptor->extradata) { |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
886 st->codec->extradata = descriptor->extradata; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
887 st->codec->extradata_size = descriptor->extradata_size; |
fbd5d23dcefc
parse SONY hidden MPEG-4 extradata, fix C0023S01.mxf
bcoudurier
parents:
1229
diff
changeset
|
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 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
1225 | 890 container_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, &descriptor->essence_container_ul); |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
891 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 892 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
|
893 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
|
894 st->codec->height = descriptor->height; |
1202 | 895 st->codec->bits_per_sample = descriptor->bits_per_sample; /* Uncompressed */ |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
896 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
1225 | 897 container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, &descriptor->essence_container_ul); |
1224
b6eb59aa44ca
add codec detection based on essence container ul
bcoudurier
parents:
1223
diff
changeset
|
898 if (st->codec->codec_id == CODEC_ID_NONE) |
1225 | 899 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
|
900 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
|
901 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
|
902 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
|
903 /* 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
|
904 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
|
905 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
|
906 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
|
907 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
|
908 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
|
909 } 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
|
910 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
|
911 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
|
912 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
|
913 st->codec->codec_id = CODEC_ID_PCM_S32BE; |
1364 | 914 if (descriptor->essence_container_ul[13] == 0x01) /* D-10 Mapping */ |
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
|
915 st->codec->channels = 8; /* force channels to 8 */ |
1348 | 916 } else if (st->codec->codec_id == CODEC_ID_MP2) { |
917 st->need_parsing = 1; | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
918 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
919 } |
1227 | 920 if (container_ul && container_ul->wrapping == Clip) { |
1226 | 921 dprintf("stream %d: clip wrapped essence\n", st->index); |
922 st->need_parsing = 1; | |
923 } | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
924 } |
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
925 return 0; |
1186 | 926 } |
927 | |
1210 | 928 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = { |
929 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2F,0x00 }, mxf_read_metadata_preface }, | |
930 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_metadata_content_storage }, | |
931 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_metadata_source_package }, | |
932 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_metadata_material_package }, | |
933 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_metadata_sequence }, | |
934 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_metadata_source_clip }, | |
935 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_metadata_multiple_descriptor }, | |
936 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 }, mxf_read_metadata_generic_descriptor }, /* Generic Sound */ | |
937 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_metadata_generic_descriptor }, /* CDCI */ | |
938 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_metadata_generic_descriptor }, /* RGBA */ | |
939 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_metadata_generic_descriptor }, /* MPEG 2 Video */ | |
940 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_metadata_generic_descriptor }, /* Wave */ | |
941 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_metadata_generic_descriptor }, /* AES3 */ | |
942 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_metadata_track }, /* Static Track */ | |
943 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_metadata_track }, /* Generic Track */ | |
944 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL }, | |
945 }; | |
946 | |
1395 | 947 static int mxf_read_sync(ByteIOContext *pb, const uint8_t *key, unsigned size) |
948 { | |
949 int i, b; | |
950 for (i = 0; i < size && !url_feof(pb); i++) { | |
951 b = get_byte(pb); | |
952 if (b == key[0]) | |
953 i = 0; | |
954 else if (b != key[i]) | |
955 i = -1; | |
956 } | |
957 return i == size; | |
958 } | |
959 | |
1186 | 960 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
961 { | |
962 MXFContext *mxf = s->priv_data; | |
963 KLVPacket klv; | |
964 | |
1395 | 965 if (!mxf_read_sync(&s->pb, mxf_header_partition_pack_key, 14)) { |
966 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n"); | |
967 return -1; | |
968 } | |
969 url_fseek(&s->pb, -14, SEEK_CUR); | |
1186 | 970 mxf->fc = s; |
971 while (!url_feof(&s->pb)) { | |
1210 | 972 const MXFMetadataReadTableEntry *function; |
973 | |
1191 | 974 if (klv_read_packet(&klv, &s->pb) < 0) { |
975 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n"); | |
1186 | 976 return -1; |
1191 | 977 } |
1198 | 978 #ifdef DEBUG |
1340 | 979 PRINT_KEY("read header", klv.key); |
1198 | 980 #endif |
1210 | 981 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) { |
1186 | 982 /* FIXME avoid seek */ |
983 url_fseek(&s->pb, klv.offset, SEEK_SET); | |
984 break; | |
1210 | 985 } |
986 | |
987 for (function = mxf_metadata_read_table; function->read; function++) { | |
988 if (IS_KLV_KEY(klv.key, function->key)) { | |
989 if (function->read(mxf, &klv) < 0) { | |
990 av_log(s, AV_LOG_ERROR, "error reading header metadata\n"); | |
991 return -1; | |
992 } | |
993 break; | |
994 } | |
995 } | |
996 if (!function->read) | |
1186 | 997 url_fskip(&s->pb, klv.length); |
998 } | |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
999 return mxf_parse_structural_metadata(mxf); |
1186 | 1000 } |
1001 | |
1002 static int mxf_read_close(AVFormatContext *s) | |
1003 { | |
1004 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
|
1005 int i; |
1186 | 1006 |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1007 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
|
1008 av_freep(&mxf->essence_container_data_sets_refs); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1009 av_freep(&mxf->essence_containers_uls); |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1010 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
|
1011 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
|
1012 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
|
1013 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
|
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 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
|
1016 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
|
1017 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1018 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
|
1019 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
|
1020 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
|
1021 break; |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1022 default: |
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1023 break; |
1190
03c0b0e61e5b
demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents:
1189
diff
changeset
|
1024 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1025 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
|
1026 } |
1223
5f1bf54448e7
resolve strong refs in parse_structural_metadata since objects may not be ordered, use object oriented approach
bcoudurier
parents:
1218
diff
changeset
|
1027 av_freep(&mxf->metadata_sets); |
1186 | 1028 return 0; |
1029 } | |
1030 | |
1031 static int mxf_probe(AVProbeData *p) { | |
1211 | 1032 uint8_t *bufp = p->buf; |
1033 uint8_t *end = p->buf + p->buf_size; | |
1034 | |
1186 | 1035 if (p->buf_size < sizeof(mxf_header_partition_pack_key)) |
1036 return 0; | |
1037 | |
1211 | 1038 /* Must skip Run-In Sequence and search for MXF header partition pack key SMPTE 377M 5.5 */ |
1039 end -= sizeof(mxf_header_partition_pack_key); | |
1040 for (; bufp < end; bufp++) { | |
1231
e713080a7880
revert r5909, dont use non constant static variable, breaks multithreaded apps
bcoudurier
parents:
1230
diff
changeset
|
1041 if (IS_KLV_KEY(bufp, mxf_header_partition_pack_key)) |
1211 | 1042 return AVPROBE_SCORE_MAX; |
1043 } | |
1044 return 0; | |
1186 | 1045 } |
1046 | |
1343 | 1047 /* rudimentary binary seek */ |
1048 /* XXX: use MXF Index */ | |
1049 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags) | |
1050 { | |
1051 AVStream *st = s->streams[stream_index]; | |
1052 int64_t seconds; | |
1053 | |
1363 | 1054 if (!s->bit_rate) |
1343 | 1055 return -1; |
1363 | 1056 if (sample_time < 0) |
1057 sample_time = 0; | |
1343 | 1058 seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den); |
1059 url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET); | |
1395 | 1060 if (!mxf_read_sync(&s->pb, mxf_essence_element_key, 12)) |
1061 return -1; | |
1062 | |
1063 /* found KLV key */ | |
1064 url_fseek(&s->pb, -12, SEEK_CUR); | |
1065 av_update_cur_dts(s, st, sample_time); | |
1066 return 0; | |
1343 | 1067 } |
1186 | 1068 |
1069 AVInputFormat mxf_demuxer = { | |
1070 "mxf", | |
1071 "MXF format", | |
1072 sizeof(MXFContext), | |
1073 mxf_probe, | |
1074 mxf_read_header, | |
1075 mxf_read_packet, | |
1076 mxf_read_close, | |
1343 | 1077 mxf_read_seek, |
1186 | 1078 }; |