annotate mxf.c @ 1197:75bfe00a5d30 libavformat

get rid of DECLARED_ALIGNED
author bcoudurier
date Sat, 29 Jul 2006 13:13:08 +0000
parents a2a8d2c544aa
children 228e2357ff93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
1 /*
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
2 * MXF demuxer.
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
3 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>.
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
4 *
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
9 *
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
13 * Lesser General Public License for more details.
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
14 *
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
18 */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
19
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
20 /*
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
21 * References
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
22 * SMPTE 336M KLV Data Encoding Protocol Using Key-Length-Value
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
23 * SMPTE 377M MXF File Format Specifications
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
24 * SMPTE 378M Operational Pattern 1a
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
25 * SMPTE 379M MXF Generic Container
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
26 * SMPTE 381M Mapping MPEG Streams into the MXF Generic Container
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
27 * SMPTE 382M Mapping AES3 and Broadcast Wave Audio into the MXF Generic Container
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
28 * SMPTE 383M Mapping DV-DIF Data to the MXF Generic Container
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
29 *
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
30 * Principle
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
31 * Search for Track numbers which will identify essence element KLV packets.
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
32 * 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
33 * Material Package contains tracks with reference to SourcePackage tracks.
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
34 * Search for Descriptors (Picture, Sound) which contains codec info and parameters.
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
35 * Assign Descriptors to correct Tracks.
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
36 *
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
37 * Metadata reading functions read Local Tags, get InstanceUID(0x3C0A) and then resolve Strong Reference from another object.
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
38 * Returns -1 if Strong Reference could not be resolved.
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
39 *
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
40 * 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
41 * Only tracks with associated descriptors will be decoded. "Highly Desirable" SMPTE 377M D.1
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
42 * Only descriptors with EssenceSoundCompression or PictureEssenceCoding will be taken into account. "D/req" SMPTE 377M
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
43 */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
44
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
45 //#define DEBUG
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
46
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
47 #include "avformat.h"
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
48
1197
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
49 typedef uint8_t UID[16];
1189
fb1a9ccffe89 declare and use UID type
bcoudurier
parents: 1188
diff changeset
50
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
51 enum MXFPackageType {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
52 MaterialPackage,
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
53 SourcePackage,
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
54 };
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
55
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
56 enum MXFStructuralComponentType {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
57 Timecode,
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
58 SourceClip,
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
59 };
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
60
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
61 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
62 UID uid;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
63 UID 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
64 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
65 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
66 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
67 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
68 enum MXFStructuralComponentType type;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
69 } MXFStructuralComponent;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
70
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
71 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
72 UID uid;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
73 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
74 MXFStructuralComponent **structural_components;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
75 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
76 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
77 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
78 } MXFSequence;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
79
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
80 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
81 UID uid;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
82 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
83 UID sequence_ref;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
84 int track_id;
1197
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
85 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
86 AVRational edit_rate;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
87 } MXFTrack;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
88
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
89 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
90 UID uid;
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
91 UID essence_container_ul;
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
92 UID essence_codec_ul;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
93 AVRational sample_rate;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
94 AVRational aspect_ratio;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
95 int width;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
96 int height;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
97 int channels;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
98 int bits_per_sample;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
99 struct MXFDescriptor **sub_descriptors;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
100 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
101 int sub_descriptors_count;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
102 int linked_track_id;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
103 } MXFDescriptor;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
104
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
105 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
106 UID uid;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
107 UID package_uid;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
108 MXFTrack **tracks;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
109 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
110 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
111 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
112 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
113 enum MXFPackageType type;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
114 } MXFPackage;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
115
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
116 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
117 UID uid;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
118 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
119 } MXFEssenceContainerData;
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 MXFContext {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
122 MXFPackage **packages;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
123 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
124 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
125 MXFEssenceContainerData **essence_container_data_sets;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
126 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
127 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
128 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
129 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
130 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
131 UID content_storage_uid;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
132 AVFormatContext *fc;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
133 } MXFContext;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
134
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
135 typedef struct KLVPacket {
1189
fb1a9ccffe89 declare and use UID type
bcoudurier
parents: 1188
diff changeset
136 UID key;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
137 offset_t offset;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
138 uint64_t length;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
139 } KLVPacket;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
140
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
141 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
142 UID uid;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
143 enum CodecID id;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
144 } MXFCodecUL;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
145
1195
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
146 static const UID mxf_metadata_preface_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x2F,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
147 static const UID mxf_metadata_content_storage_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
148 static const UID mxf_metadata_source_package_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
149 static const UID mxf_metadata_material_package_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
150 static const UID mxf_metadata_sequence_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
151 static const UID mxf_metadata_source_clip_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
152 static const UID mxf_metadata_multiple_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
153 static const UID mxf_metadata_generic_sound_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
154 static const UID mxf_metadata_cdci_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
155 static const UID mxf_metadata_mpegvideo_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
156 static const UID mxf_metadata_wave_descriptor_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
157 static const UID mxf_metadata_static_track_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 };
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
158 static const UID mxf_metadata_track_key = { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3b,0x00 };
1189
fb1a9ccffe89 declare and use UID type
bcoudurier
parents: 1188
diff changeset
159
fb1a9ccffe89 declare and use UID type
bcoudurier
parents: 1188
diff changeset
160 /* partial keys to match */
1195
a2a8d2c544aa cosmetics
bcoudurier
parents: 1194
diff changeset
161 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 };
1197
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
162 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 };
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
163
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
164 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
165
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
166 #define PRINT_KEY(x) \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
167 do { \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
168 int iterpk; \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
169 for (iterpk = 0; iterpk < 16; iterpk++) { \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
170 av_log(NULL, AV_LOG_DEBUG, "%02X ", x[iterpk]); \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
171 } \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
172 av_log(NULL, AV_LOG_DEBUG, "\n"); \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
173 } while (0); \
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
174
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
175 static int64_t klv_decode_ber_length(ByteIOContext *pb)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
176 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
177 int64_t size = 0;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
178 uint8_t length = get_byte(pb);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
179 int type = length >> 7;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
180
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
181 if (type) { /* long form */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
182 int bytes_num = length & 0x7f;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
183 /* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
184 if (bytes_num > 8)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
185 return -1;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
186 while (bytes_num--)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
187 size = size << 8 | get_byte(pb);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
188 } else {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
189 size = length & 0x7f;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
190 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
191 return size;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
192 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
193
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
194 static int klv_read_packet(KLVPacket *klv, ByteIOContext *pb)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
195 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
196 klv->offset = url_ftell(pb);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
197 get_buffer(pb, klv->key, 16);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
198 klv->length = klv_decode_ber_length(pb);
1194
f20dada04de5 use ternary
bcoudurier
parents: 1193
diff changeset
199 return klv->length == -1 ? -1 : 0;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
200 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
201
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
202 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
203 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
204 int i;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
205
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
206 for (i = 0; i < s->nb_streams; i++) {
1197
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
207 MXFTrack *track = s->streams[i]->priv_data;
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
208 /* SMPTE 379M 7.3 */
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
209 if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number)))
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
210 return i;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
211 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
212 return -1;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
213 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
214
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
215 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
216 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
217 KLVPacket klv;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
218
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
219 while (!url_feof(&s->pb)) {
1191
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
220 if (klv_read_packet(&klv, &s->pb) < 0) {
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
221 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n");
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
222 return -1;
1191
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
223 }
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
224 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
225 av_get_packet(&s->pb, pkt, klv.length);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
226 pkt->stream_index = mxf_get_stream_index(s, &klv);
1194
f20dada04de5 use ternary
bcoudurier
parents: 1193
diff changeset
227 return pkt->stream_index == -1 ? -1 : 0;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
228 } else
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
229 url_fskip(&s->pb, klv.length);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
230 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
231 return AVERROR_IO;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
232 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
233
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
234 static int mxf_read_metadata_preface(MXFContext *mxf, KLVPacket *klv)
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
235 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
236 ByteIOContext *pb = &mxf->fc->pb;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
237 int bytes_read = 0;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
238
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
239 while (bytes_read < klv->length) {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
240 int tag = get_be16(pb);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
241 int size = get_be16(pb); /* SMPTE 336M Table 8 KLV specified length, 0x53 */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
242
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
243 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
244 case 0x3B03:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
245 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
246 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
247 case 0x3B09:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
248 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
249 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
250 case 0x3B0A:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
251 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
252 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
253 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
254 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
255 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
256 get_buffer(pb, mxf->essence_containers_uls, mxf->essence_containers_uls_count * sizeof(UID));
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
257 break;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
258 default:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
259 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
260 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
261 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
262 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
263 return 0;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
264 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
265
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
266 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
267 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
268 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
269 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
270
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
271 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
272 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
273 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
274
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
275 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
276 switch (tag) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
277 case 0x1901:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
278 mxf->packages_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
279 if (mxf->packages_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
280 mxf->packages_count >= UINT_MAX / sizeof(*mxf->packages))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
281 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
282 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
283 mxf->packages = av_mallocz(mxf->packages_count * sizeof(*mxf->packages));
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
284 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
285 get_buffer(pb, mxf->packages_refs, 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
286 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
287 case 0x1902:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
288 mxf->essence_container_data_sets_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
289 if (mxf->essence_container_data_sets_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
290 mxf->essence_container_data_sets_count >= UINT_MAX / sizeof(*mxf->essence_container_data_sets))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
291 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
292 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
293 mxf->essence_container_data_sets = av_mallocz(mxf->essence_container_data_sets_count * sizeof(*mxf->essence_container_data_sets));
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
294 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
295 get_buffer(pb, mxf->essence_container_data_sets_refs, mxf->essence_container_data_sets_count * sizeof(UID));
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
296 break;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
297 default:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
298 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
299 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
300 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
301 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
302 return 0;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
303 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
304
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
305 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
306 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
307 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
308 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
309 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
310 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
311
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
312 source_clip->type = SourceClip;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
313 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
314 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
315 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
316
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
317 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
318 switch (tag) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
319 case 0x3C0A:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
320 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
321 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
322 case 0x0202:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
323 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
324 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
325 case 0x1201:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
326 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
327 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
328 case 0x1101:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
329 /* 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
330 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
331 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
332 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
333 case 0x1102:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
334 source_clip->source_track_id = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
335 break;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
336 default:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
337 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
338 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
339 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
340 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
341 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
342 if (mxf->packages[i]) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
343 for (j = 0; j < mxf->packages[i]->tracks_count; j++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
344 if (mxf->packages[i]->tracks[j] && mxf->packages[i]->tracks[j]->sequence) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
345 for (k = 0; k < mxf->packages[i]->tracks[j]->sequence->structural_components_count; k++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
346 if (!memcmp(mxf->packages[i]->tracks[j]->sequence->structural_components_refs[k], 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
347 mxf->packages[i]->tracks[j]->sequence->structural_components[k] = source_clip;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
348 return 0;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
349 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
350 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
351 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
352 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
353 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
354 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
355 return -1;
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
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
358 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
359 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
360 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
361 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
362 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
363 int i;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
364
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
365 package->type = MaterialPackage;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
366 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
367 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
368 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
369
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
370 switch (tag) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
371 case 0x3C0A:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
372 get_buffer(pb, package->uid, 16);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
373 break;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
374 case 0x4403:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
375 package->tracks_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
376 if (package->tracks_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
377 package->tracks_count >= UINT_MAX / sizeof(*package->tracks))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
378 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
379 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
380 package->tracks = av_mallocz(package->tracks_count * sizeof(*package->tracks));
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
381 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
382 get_buffer(pb, package->tracks_refs, package->tracks_count * sizeof(UID));
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
383 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
384 default:
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
385 url_fskip(pb, size);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
386 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
387 bytes_read += size + 4;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
388 }
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
389 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
390 if (!memcmp(mxf->packages_refs[i], 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
391 mxf->packages[i] = package;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
392 return 0;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
393 }
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
394 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
395 return -1;
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
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
398 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
399 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
400 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
401 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
402 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
403 int i, j;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
404
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
405 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
406 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
407 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
408
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
409 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
410 switch (tag) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
411 case 0x3C0A:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
412 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
413 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
414 case 0x4801:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
415 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
416 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
417 case 0x4804:
1197
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
418 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
419 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
420 case 0x4B01:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
421 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
422 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
423 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
424 case 0x4803:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
425 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
426 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
427 default:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
428 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
429 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
430 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
431 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
432 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
433 if (mxf->packages[i]) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
434 for (j = 0; j < mxf->packages[i]->tracks_count; j++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
435 if (!memcmp(mxf->packages[i]->tracks_refs[j], 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
436 mxf->packages[i]->tracks[j] = track;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
437 return 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 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
440 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
441 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
442 return -1;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
443 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
444
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
445 static int mxf_read_metadata_sequence(MXFContext *mxf, KLVPacket *klv)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
446 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
447 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
448 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
449 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
450 int i, j;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
451
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
452 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
453 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
454 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
455
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
456 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
457 switch (tag) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
458 case 0x3C0A:
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, 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
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 case 0x0202:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
462 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
463 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
464 case 0x0201:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
465 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
466 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
467 case 0x1001:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
468 sequence->structural_components_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
469 if (sequence->structural_components_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
470 sequence->structural_components_count >= UINT_MAX / sizeof(*sequence->structural_components))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
471 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
472 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
473 sequence->structural_components = av_mallocz(sequence->structural_components_count * sizeof(*sequence->structural_components));
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
474 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
475 get_buffer(pb, sequence->structural_components_refs, 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
476 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
477 default:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
478 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
479 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
480 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
481 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
482 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
483 if (mxf->packages[i]) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
484 for (j = 0; j < mxf->packages[i]->tracks_count; j++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
485 if (mxf->packages[i]->tracks[j]) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
486 if (!memcmp(mxf->packages[i]->tracks[j]->sequence_ref, 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
487 mxf->packages[i]->tracks[j]->sequence = sequence;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
488 return 0;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
489 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
490 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
491 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
492 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
493 }
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 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
496
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
497 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
498 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
499 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
500 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
501 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
502 int i;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
503
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
504 package->type = SourcePackage;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
505 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
506 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
507 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
508
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
509 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
510 switch (tag) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
511 case 0x3C0A:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
512 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
513 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
514 case 0x4403:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
515 package->tracks_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
516 if (package->tracks_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
517 package->tracks_count >= UINT_MAX / sizeof(*package->tracks))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
518 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
519 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
520 package->tracks = av_mallocz(package->tracks_count * sizeof(*package->tracks));
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
521 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
522 get_buffer(pb, package->tracks_refs, 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
523 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
524 case 0x4401:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
525 /* 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
526 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
527 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
528 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
529 case 0x4701:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
530 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
531 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
532 default:
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, size);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
534 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
535 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
536 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
537 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
538 if (!memcmp(mxf->packages_refs[i], 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
539 mxf->packages[i] = package;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
540 return 0;
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 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
543 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
544 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
545
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
546 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
547 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
548 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
549 MXFDescriptor *descriptor = av_mallocz(sizeof(*descriptor));
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
550 int bytes_read = 0;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
551 int i;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
552
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
553 while (bytes_read < klv->length) {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
554 int tag = get_be16(pb);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
555 int size = get_be16(pb); /* KLV specified by 0x53 */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
556
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
557 dprintf("tag 0x%04X, size %d\n", tag, size);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
558 switch (tag) {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
559 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
560 get_buffer(pb, descriptor->uid, 16);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
561 break;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
562 case 0x3F01:
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
563 descriptor->sub_descriptors_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
564 if (descriptor->sub_descriptors_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
565 descriptor->sub_descriptors_count >= UINT_MAX / sizeof(*descriptor->sub_descriptors))
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 descriptor->sub_descriptors = av_mallocz(descriptor->sub_descriptors_count * sizeof(*descriptor->sub_descriptors));
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
569 url_fskip(pb, 4); /* useless size of objects, always 16 according to specs */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
570 get_buffer(pb, descriptor->sub_descriptors_refs, descriptor->sub_descriptors_count * sizeof(UID));
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
571 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
572 default:
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
573 url_fskip(pb, size);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
574 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
575 bytes_read += size + 4;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
576 }
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
577 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
578 if (mxf->packages[i]) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
579 if (!memcmp(mxf->packages[i]->descriptor_ref, descriptor->uid, 16)) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
580 mxf->packages[i]->descriptor = descriptor;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
581 return 0;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
582 }
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
583 }
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
584 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
585 return -1;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
586 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
587
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
588 static int mxf_read_metadata_generic_descriptor(MXFContext *mxf, KLVPacket *klv)
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
589 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
590 ByteIOContext *pb = &mxf->fc->pb;
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
591 MXFDescriptor *descriptor = av_mallocz(sizeof(*descriptor));
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
592 int bytes_read = 0;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
593 int i, j;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
594
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
595 while (bytes_read < klv->length) {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
596 int tag = get_be16(pb);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
597 int size = get_be16(pb); /* KLV specified by 0x53 */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
598
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
599 dprintf("tag 0x%04X, size %d\n", tag, size);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
600 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
601 case 0x3C0A:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
602 get_buffer(pb, descriptor->uid, 16);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
603 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
604 case 0x3004:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
605 get_buffer(pb, descriptor->essence_container_ul, 16);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
606 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
607 case 0x3006:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
608 descriptor->linked_track_id = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
609 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
610 case 0x3201: /* PictureEssenceCoding */
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
611 get_buffer(pb, descriptor->essence_codec_ul, 16);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
612 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
613 case 0x3203:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
614 descriptor->width = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
615 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
616 case 0x3202:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
617 descriptor->height = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
618 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
619 case 0x320E:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
620 descriptor->aspect_ratio.num = get_be32(pb);
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
621 descriptor->aspect_ratio.den = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
622 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
623 case 0x3D03:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
624 descriptor->sample_rate.num = get_be32(pb);
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
625 descriptor->sample_rate.den = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
626 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
627 case 0x3D06: /* SoundEssenceCompression */
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
628 get_buffer(pb, descriptor->essence_codec_ul, 16);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
629 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
630 case 0x3D07:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
631 descriptor->channels = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
632 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
633 case 0x3D01:
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
634 descriptor->bits_per_sample = get_be32(pb);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
635 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
636 default:
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
637 url_fskip(pb, size);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
638 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
639 bytes_read += size + 4;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
640 }
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
641 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
642 if (mxf->packages[i]) {
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
643 if (!memcmp(mxf->packages[i]->descriptor_ref, descriptor->uid, 16)) {
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
644 mxf->packages[i]->descriptor = descriptor;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
645 return 0;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
646 } else if (mxf->packages[i]->descriptor) { /* MultipleDescriptor */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
647 for (j = 0; j < mxf->packages[i]->descriptor->sub_descriptors_count; j++) {
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
648 if (!memcmp(mxf->packages[i]->descriptor->sub_descriptors_refs[j], descriptor->uid, 16)) {
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
649 mxf->packages[i]->descriptor->sub_descriptors[j] = descriptor;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
650 return 0;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
651 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
652 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
653 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
654 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
655 }
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
656 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
657 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
658
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
659 /* SMPTE RP224 http://www.smpte-ra.org/mdd/index.html */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
660 static const UID picture_essence_track_ul = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x01,0x00,0x00,0x00 };
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
661 static const UID sound_essence_track_ul = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x00,0x00,0x00 };
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
662
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
663 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
664 /* PictureEssenceCoding */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
665 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, CODEC_ID_MPEG2VIDEO }, /* I-Frame */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
666 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, CODEC_ID_MPEG2VIDEO }, /* Long GoP */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
667 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, CODEC_ID_MPEG2VIDEO }, /* Long GoP */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
668 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, CODEC_ID_MPEG2VIDEO }, /* D-10 30Mbps PAL */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
669 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, CODEC_ID_MPEG2VIDEO }, /* D-10 50Mbps PAL */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
670 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 }, CODEC_ID_DVVIDEO }, /* DVCPRO50 PAL */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
671 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 }, CODEC_ID_DVVIDEO }, /* DVCPRO25 PAL */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
672 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 }, CODEC_ID_DVVIDEO }, /* DV25 IEC PAL */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
673 /* SoundEssenceCompression */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
674 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x7F,0x00,0x00,0x00 }, 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
675 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x02,0x02,0x01,0x7E,0x00,0x00,0x00 }, CODEC_ID_PCM_S16BE }, /* From Omneon MXF file */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
676 };
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
677
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
678 static enum CodecID mxf_get_codec_id(const MXFCodecUL *uls, UID *uid)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
679 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
680 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
681 if(!memcmp(uls->uid, *uid, 16))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
682 return uls->id;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
683 uls++;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
684 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
685 return 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
686 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
687
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
688 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
689 {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
690 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
691 MXFPackage *source_package = NULL;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
692 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
693
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
694 /* 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
695 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
696 if (mxf->packages[i]->type == MaterialPackage) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
697 material_package = mxf->packages[i];
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
698 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
699 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
700 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
701 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
702 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
703 return -1;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
704 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
705
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
706 for (i = 0; i < material_package->tracks_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
707 MXFTrack *material_track = material_package->tracks[i];
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
708 MXFTrack *source_track = NULL;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
709 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
710 MXFStructuralComponent *component = NULL;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
711 AVStream *st;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
712
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
713 /* 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
714 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
715 component = material_track->sequence->structural_components[j];
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
716 /* TODO: handle timecode component */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
717 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
718 continue;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
719
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
720 for (k = 0; k < mxf->packages_count; k++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
721 if (!memcmp(mxf->packages[k]->package_uid, component->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
722 source_package = mxf->packages[k];
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
723 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
724 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
725 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
726 if (!source_package) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
727 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source 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
728 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
729 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
730 for (k = 0; k < source_package->tracks_count; k++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
731 if (source_package->tracks[k]->track_id == component->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
732 source_track = source_package->tracks[k];
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
733 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
734 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
735 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
736 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
737 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
738 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
739 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
740 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
741 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
742 continue;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
743
1197
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
744 st = av_new_stream(mxf->fc, source_track->track_id);
75bfe00a5d30 get rid of DECLARED_ALIGNED
bcoudurier
parents: 1195
diff changeset
745 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
746 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
747 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
748 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
749 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
750 av_set_pts_info(st, 64, material_track->edit_rate.num, material_track->edit_rate.den);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
751 #ifdef DEBUG
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
752 PRINT_KEY(source_track->sequence->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
753 #endif
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
754 if (!memcmp(source_track->sequence->data_definition_ul, picture_essence_track_ul, 16))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
755 st->codec->codec_type = CODEC_TYPE_VIDEO;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
756 else if (!memcmp(source_track->sequence->data_definition_ul, sound_essence_track_ul, 16))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
757 st->codec->codec_type = CODEC_TYPE_AUDIO;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
758 else
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
759 st->codec->codec_type = CODEC_TYPE_DATA;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
760
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
761 if (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
762 if (source_package->descriptor->sub_descriptors_count > 0) { /* SourcePackage has MultipleDescriptor */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
763 for (j = 0; j < source_package->descriptor->sub_descriptors_count; j++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
764 if (source_package->descriptor->sub_descriptors[j]) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
765 if (source_package->descriptor->sub_descriptors[j]->linked_track_id == source_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
766 descriptor = source_package->descriptor->sub_descriptors[j];
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
767 break;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
768 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
769 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
770 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
771 } else {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
772 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
773 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
774 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
775 if (!descriptor) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
776 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
777 continue;
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 #ifdef DEBUG
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
780 PRINT_KEY(descriptor->essence_codec_ul);
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
781 #endif
1192
ad731bdb7365 rename variables
bcoudurier
parents: 1191
diff changeset
782 st->codec->codec_id = mxf_get_codec_id(mxf_codec_uls, &descriptor->essence_codec_ul);
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
783 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
784 st->codec->width = descriptor->width;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
785 st->codec->height = descriptor->height;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
786 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
787 st->codec->channels = descriptor->channels;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
788 st->codec->bits_per_sample = descriptor->bits_per_sample;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
789 st->codec->sample_rate = descriptor->sample_rate.num / descriptor->sample_rate.den;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
790 /* TODO: implement CODEC_ID_RAWAUDIO */
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
791 if (st->codec->codec_id == CODEC_ID_PCM_S16LE) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
792 if (descriptor->bits_per_sample == 24)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
793 st->codec->codec_id = CODEC_ID_PCM_S24LE;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
794 else if (descriptor->bits_per_sample == 32)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
795 st->codec->codec_id = CODEC_ID_PCM_S32LE;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
796 } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
797 if (descriptor->bits_per_sample == 24)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
798 st->codec->codec_id = CODEC_ID_PCM_S24BE;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
799 else if (descriptor->bits_per_sample == 32)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
800 st->codec->codec_id = CODEC_ID_PCM_S32BE;
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
801 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
802 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
803 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
804 return 0;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
805 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
806
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
807 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
808 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
809 MXFContext *mxf = s->priv_data;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
810 KLVPacket klv;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
811 int ret = 0;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
812
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
813 mxf->fc = s;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
814 while (!url_feof(&s->pb)) {
1191
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
815 if (klv_read_packet(&klv, &s->pb) < 0) {
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
816 av_log(s, AV_LOG_ERROR, "error reading KLV packet\n");
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
817 return -1;
1191
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
818 }
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
819 if (IS_KLV_KEY(klv.key, mxf_metadata_track_key))
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
820 ret = mxf_read_metadata_track(mxf, &klv);
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
821 else if (IS_KLV_KEY(klv.key, mxf_metadata_static_track_key))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
822 ret = mxf_read_metadata_track(mxf, &klv);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
823 else if (IS_KLV_KEY(klv.key, mxf_metadata_source_package_key))
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
824 ret = mxf_read_metadata_source_package(mxf, &klv);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
825 else if (IS_KLV_KEY(klv.key, mxf_metadata_sequence_key))
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
826 ret = mxf_read_metadata_sequence(mxf, &klv);
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
827 else if (IS_KLV_KEY(klv.key, mxf_metadata_material_package_key))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
828 ret = mxf_read_metadata_material_package(mxf, &klv);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
829 else if (IS_KLV_KEY(klv.key, mxf_metadata_source_clip_key))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
830 ret = mxf_read_metadata_source_clip(mxf, &klv);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
831 else if (IS_KLV_KEY(klv.key, mxf_metadata_multiple_descriptor_key))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
832 ret = mxf_read_metadata_multiple_descriptor(mxf, &klv);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
833 else if (IS_KLV_KEY(klv.key, mxf_metadata_wave_descriptor_key))
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
834 ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
835 else if (IS_KLV_KEY(klv.key, mxf_metadata_mpegvideo_descriptor_key))
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
836 ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
837 else if (IS_KLV_KEY(klv.key, mxf_metadata_cdci_descriptor_key))
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
838 ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
839 else if (IS_KLV_KEY(klv.key, mxf_metadata_generic_sound_descriptor_key))
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
840 ret = mxf_read_metadata_generic_descriptor(mxf, &klv);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
841 else if (IS_KLV_KEY(klv.key, mxf_metadata_preface_key))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
842 ret = mxf_read_metadata_preface(mxf, &klv);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
843 else if (IS_KLV_KEY(klv.key, mxf_metadata_content_storage_key))
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
844 ret = mxf_read_metadata_content_storage(mxf, &klv);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
845 else if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
846 /* FIXME avoid seek */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
847 url_fseek(&s->pb, klv.offset, SEEK_SET);
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
848 break;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
849 } else
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
850 url_fskip(&s->pb, klv.length);
1191
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
851 if (ret < 0) {
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
852 av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
853 return ret;
1191
976a91cec1ad add error messages
bcoudurier
parents: 1190
diff changeset
854 }
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
855 }
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
856 return mxf_parse_structural_metadata(mxf);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
857 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
858
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
859 static int mxf_read_close(AVFormatContext *s)
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
860 {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
861 MXFContext *mxf = s->priv_data;
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
862 int i, j, k;
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
863
1190
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
864 for (i = 0; i < mxf->packages_count; i++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
865 for (j = 0; j < mxf->packages[i]->tracks_count; j++) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
866 for (k = 0; k < mxf->packages[i]->tracks[j]->sequence->structural_components_count; k++)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
867 av_freep(&mxf->packages[i]->tracks[j]->sequence->structural_components[k]);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
868 av_freep(&mxf->packages[i]->tracks[j]->sequence->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
869 av_freep(&mxf->packages[i]->tracks[j]->sequence->structural_components);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
870 av_freep(&mxf->packages[i]->tracks[j]->sequence);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
871 av_freep(&mxf->packages[i]->tracks[j]);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
872 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
873 av_freep(&mxf->packages[i]->tracks_refs);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
874 av_freep(&mxf->packages[i]->tracks);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
875 if (mxf->packages[i]->descriptor) {
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
876 for (k = 0; k < mxf->packages[i]->descriptor->sub_descriptors_count; k++)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
877 av_freep(&mxf->packages[i]->descriptor->sub_descriptors[k]);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
878 av_freep(&mxf->packages[i]->descriptor->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
879 av_freep(&mxf->packages[i]->descriptor->sub_descriptors);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
880 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
881 av_freep(&mxf->packages[i]->descriptor);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
882 av_freep(&mxf->packages[i]);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
883 }
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
884 av_freep(&mxf->packages_refs);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
885 av_freep(&mxf->packages);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
886 for (i = 0; i < mxf->essence_container_data_sets_count; i++)
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
887 av_freep(&mxf->essence_container_data_sets[i]);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
888 av_freep(&mxf->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
889 av_freep(&mxf->essence_container_data_sets);
03c0b0e61e5b demuxer reworked, more accurate parsing, prepare handling of other operational patterns, streaming demuxing, simplified codec detection
bcoudurier
parents: 1189
diff changeset
890 av_freep(&mxf->essence_containers_uls);
1186
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
891 return 0;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
892 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
893
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
894 static int mxf_probe(AVProbeData *p) {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
895 /* KLV packet describing MXF header partition pack */
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
896 if (p->buf_size < sizeof(mxf_header_partition_pack_key))
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
897 return 0;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
898
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
899 if (IS_KLV_KEY(p->buf, mxf_header_partition_pack_key))
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
900 return AVPROBE_SCORE_MAX;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
901 else
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
902 return 0;
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
903 }
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
904
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
905
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
906 AVInputFormat mxf_demuxer = {
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
907 "mxf",
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
908 "MXF format",
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
909 sizeof(MXFContext),
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
910 mxf_probe,
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
911 mxf_read_header,
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
912 mxf_read_packet,
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
913 mxf_read_close,
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
914 NULL,
fbdd53c2a12d MXF demuxer
bcoudurier
parents:
diff changeset
915 };