00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "avformat.h"
00049 #include "aes.h"
00050 #include "bytestream.h"
00051
00052 typedef uint8_t UID[16];
00053
00054 enum MXFMetadataSetType {
00055 AnyType,
00056 MaterialPackage,
00057 SourcePackage,
00058 SourceClip,
00059 TimecodeComponent,
00060 Sequence,
00061 MultipleDescriptor,
00062 Descriptor,
00063 Track,
00064 CryptoContext,
00065 };
00066
00067 typedef struct {
00068 UID uid;
00069 enum MXFMetadataSetType type;
00070 UID context_uid;
00071 UID source_container_ul;
00072 } MXFCryptoContext;
00073
00074 typedef struct {
00075 UID uid;
00076 enum MXFMetadataSetType type;
00077 UID source_package_uid;
00078 UID data_definition_ul;
00079 int64_t duration;
00080 int64_t start_position;
00081 int source_track_id;
00082 } MXFStructuralComponent;
00083
00084 typedef struct {
00085 UID uid;
00086 enum MXFMetadataSetType type;
00087 UID data_definition_ul;
00088 UID *structural_components_refs;
00089 int structural_components_count;
00090 int64_t duration;
00091 } MXFSequence;
00092
00093 typedef struct {
00094 UID uid;
00095 enum MXFMetadataSetType type;
00096 MXFSequence *sequence;
00097 UID sequence_ref;
00098 int track_id;
00099 uint8_t track_number[4];
00100 AVRational edit_rate;
00101 } MXFTrack;
00102
00103 typedef struct {
00104 UID uid;
00105 enum MXFMetadataSetType type;
00106 UID essence_container_ul;
00107 UID essence_codec_ul;
00108 AVRational sample_rate;
00109 AVRational aspect_ratio;
00110 int width;
00111 int height;
00112 int channels;
00113 int bits_per_sample;
00114 UID *sub_descriptors_refs;
00115 int sub_descriptors_count;
00116 int linked_track_id;
00117 uint8_t *extradata;
00118 int extradata_size;
00119 } MXFDescriptor;
00120
00121 typedef struct {
00122 UID uid;
00123 enum MXFMetadataSetType type;
00124 UID package_uid;
00125 UID *tracks_refs;
00126 int tracks_count;
00127 MXFDescriptor *descriptor;
00128 UID descriptor_ref;
00129 } MXFPackage;
00130
00131 typedef struct {
00132 UID uid;
00133 enum MXFMetadataSetType type;
00134 } MXFMetadataSet;
00135
00136 typedef struct {
00137 UID *packages_refs;
00138 int packages_count;
00139 MXFMetadataSet **metadata_sets;
00140 int metadata_sets_count;
00141 AVFormatContext *fc;
00142 struct AVAES *aesc;
00143 } MXFContext;
00144
00145 typedef struct {
00146 UID key;
00147 offset_t offset;
00148 uint64_t length;
00149 } KLVPacket;
00150
00151 enum MXFWrappingScheme {
00152 Frame,
00153 Clip,
00154 };
00155
00156 typedef struct {
00157 UID uid;
00158 enum CodecID id;
00159 enum MXFWrappingScheme wrapping;
00160 } MXFCodecUL;
00161
00162 typedef struct {
00163 UID uid;
00164 enum CodecType type;
00165 } MXFDataDefinitionUL;
00166
00167 typedef struct {
00168 const UID key;
00169 int (*read)();
00170 int ctx_size;
00171 enum MXFMetadataSetType type;
00172 } MXFMetadataReadTableEntry;
00173
00174
00175 static const uint8_t mxf_header_partition_pack_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x05,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x02 };
00176 static const uint8_t mxf_essence_element_key[] = { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01 };
00177 static const uint8_t mxf_klv_key[] = { 0x06,0x0e,0x2b,0x34 };
00178
00179 static const uint8_t mxf_encrypted_triplet_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 };
00180 static const uint8_t mxf_encrypted_essence_container[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0b,0x01,0x00 };
00181
00182 #define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
00183
00184 #define PRINT_KEY(pc, s, x) dprintf(pc, "%s %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", s, \
00185 (x)[0], (x)[1], (x)[2], (x)[3], (x)[4], (x)[5], (x)[6], (x)[7], (x)[8], (x)[9], (x)[10], (x)[11], (x)[12], (x)[13], (x)[14], (x)[15])
00186
00187 static int64_t klv_decode_ber_length(ByteIOContext *pb)
00188 {
00189 uint64_t size = get_byte(pb);
00190 if (size & 0x80) {
00191 int bytes_num = size & 0x7f;
00192
00193 if (bytes_num > 8)
00194 return -1;
00195 size = 0;
00196 while (bytes_num--)
00197 size = size << 8 | get_byte(pb);
00198 }
00199 return size;
00200 }
00201
00202 static int mxf_read_sync(ByteIOContext *pb, const uint8_t *key, unsigned size)
00203 {
00204 int i, b;
00205 for (i = 0; i < size && !url_feof(pb); i++) {
00206 b = get_byte(pb);
00207 if (b == key[0])
00208 i = 0;
00209 else if (b != key[i])
00210 i = -1;
00211 }
00212 return i == size;
00213 }
00214
00215 static int klv_read_packet(KLVPacket *klv, ByteIOContext *pb)
00216 {
00217 if (!mxf_read_sync(pb, mxf_klv_key, 4))
00218 return -1;
00219 klv->offset = url_ftell(pb) - 4;
00220 memcpy(klv->key, mxf_klv_key, 4);
00221 get_buffer(pb, klv->key + 4, 12);
00222 klv->length = klv_decode_ber_length(pb);
00223 return klv->length == -1 ? -1 : 0;
00224 }
00225
00226 static int mxf_get_stream_index(AVFormatContext *s, KLVPacket *klv)
00227 {
00228 int i;
00229
00230 for (i = 0; i < s->nb_streams; i++) {
00231 MXFTrack *track = s->streams[i]->priv_data;
00232
00233 if (!memcmp(klv->key + sizeof(mxf_essence_element_key), track->track_number, sizeof(track->track_number)))
00234 return i;
00235 }
00236
00237 return s->nb_streams == 1 ? 0 : -1;
00238 }
00239
00240
00241 static int mxf_get_d10_aes3_packet(ByteIOContext *pb, AVStream *st, AVPacket *pkt, int64_t length)
00242 {
00243 uint8_t buffer[61444];
00244 uint8_t *buf_ptr, *end_ptr, *data_ptr;
00245 int i;
00246
00247 if (length > 61444)
00248 return -1;
00249 get_buffer(pb, buffer, length);
00250 av_new_packet(pkt, length);
00251 data_ptr = pkt->data;
00252 end_ptr = buffer + length;
00253 buf_ptr = buffer + 4;
00254 for (; buf_ptr < end_ptr; ) {
00255 for (i = 0; i < st->codec->channels; i++) {
00256 uint32_t sample = bytestream_get_le32(&buf_ptr);
00257 if (st->codec->bits_per_sample == 24)
00258 bytestream_put_le24(&data_ptr, (sample >> 4) & 0xffffff);
00259 else
00260 bytestream_put_le16(&data_ptr, (sample >> 12) & 0xffff);
00261 }
00262 buf_ptr += 32 - st->codec->channels*4;
00263 }
00264 pkt->size = data_ptr - pkt->data;
00265 return 0;
00266 }
00267
00268 static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv)
00269 {
00270 static const uint8_t checkv[16] = {0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b, 0x43, 0x48, 0x55, 0x4b};
00271 MXFContext *mxf = s->priv_data;
00272 ByteIOContext *pb = &s->pb;
00273 offset_t end = url_ftell(pb) + klv->length;
00274 uint64_t size;
00275 uint64_t orig_size;
00276 uint64_t plaintext_size;
00277 uint8_t ivec[16];
00278 uint8_t tmpbuf[16];
00279 int index;
00280
00281 if (!mxf->aesc && s->key && s->keylen == 16) {
00282 mxf->aesc = av_malloc(av_aes_size);
00283 av_aes_init(mxf->aesc, s->key, 128, 1);
00284 }
00285
00286 url_fskip(pb, klv_decode_ber_length(pb));
00287
00288 klv_decode_ber_length(pb);
00289 plaintext_size = get_be64(pb);
00290
00291 klv_decode_ber_length(pb);
00292 get_buffer(pb, klv->key, 16);
00293 if (!IS_KLV_KEY(klv, mxf_essence_element_key))
00294 return -1;
00295 index = mxf_get_stream_index(s, klv);
00296 if (index < 0)
00297 return -1;
00298
00299 klv_decode_ber_length(pb);
00300 orig_size = get_be64(pb);
00301 if (orig_size < plaintext_size)
00302 return -1;
00303
00304 size = klv_decode_ber_length(pb);
00305 if (size < 32 || size - 32 < orig_size)
00306 return -1;
00307 get_buffer(pb, ivec, 16);
00308 get_buffer(pb, tmpbuf, 16);
00309 if (mxf->aesc)
00310 av_aes_crypt(mxf->aesc, tmpbuf, tmpbuf, 1, ivec, 1);
00311 if (memcmp(tmpbuf, checkv, 16))
00312 av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n");
00313 size -= 32;
00314 av_get_packet(pb, pkt, size);
00315 size -= plaintext_size;
00316 if (mxf->aesc)
00317 av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
00318 &pkt->data[plaintext_size], size >> 4, ivec, 1);
00319 pkt->size = orig_size;
00320 pkt->stream_index = index;
00321 url_fskip(pb, end - url_ftell(pb));
00322 return 0;
00323 }
00324
00325 static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
00326 {
00327 KLVPacket klv;
00328
00329 while (!url_feof(&s->pb)) {
00330 if (klv_read_packet(&klv, &s->pb) < 0)
00331 return -1;
00332 #ifdef DEBUG
00333 PRINT_KEY(s, "read packet", klv.key);
00334 #endif
00335 if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) {
00336 int res = mxf_decrypt_triplet(s, pkt, &klv);
00337 if (res < 0) {
00338 av_log(s, AV_LOG_ERROR, "invalid encoded triplet\n");
00339 return -1;
00340 }
00341 return 0;
00342 }
00343 if (IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
00344 int index = mxf_get_stream_index(s, &klv);
00345 if (index < 0) {
00346 av_log(s, AV_LOG_ERROR, "error getting stream index\n");
00347 url_fskip(&s->pb, klv.length);
00348 return -1;
00349 }
00350
00351 if (klv.key[12] == 0x06 && klv.key[13] == 0x01 && klv.key[14] == 0x10) {
00352 if (mxf_get_d10_aes3_packet(&s->pb, s->streams[index], pkt, klv.length) < 0) {
00353 av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
00354 return -1;
00355 }
00356 } else
00357 av_get_packet(&s->pb, pkt, klv.length);
00358 pkt->stream_index = index;
00359 pkt->pos = klv.offset;
00360 return 0;
00361 } else
00362 url_fskip(&s->pb, klv.length);
00363 }
00364 return AVERROR(EIO);
00365 }
00366
00367 static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
00368 {
00369 mxf->metadata_sets = av_realloc(mxf->metadata_sets, (mxf->metadata_sets_count + 1) * sizeof(*mxf->metadata_sets));
00370 mxf->metadata_sets[mxf->metadata_sets_count] = metadata_set;
00371 mxf->metadata_sets_count++;
00372 return 0;
00373 }
00374
00375 static int mxf_read_metadata_cryptographic_context(MXFCryptoContext *cryptocontext, ByteIOContext *pb, int tag)
00376 {
00377 switch(tag) {
00378 case 0xFFFE:
00379 get_buffer(pb, cryptocontext->context_uid, 16);
00380 break;
00381 case 0xFFFD:
00382 get_buffer(pb, cryptocontext->source_container_ul, 16);
00383 break;
00384 }
00385 return 0;
00386 }
00387
00388 static int mxf_read_metadata_content_storage(MXFContext *mxf, ByteIOContext *pb, int tag)
00389 {
00390 switch (tag) {
00391 case 0x1901:
00392 mxf->packages_count = get_be32(pb);
00393 if (mxf->packages_count >= UINT_MAX / sizeof(UID))
00394 return -1;
00395 mxf->packages_refs = av_malloc(mxf->packages_count * sizeof(UID));
00396 url_fskip(pb, 4);
00397 get_buffer(pb, (uint8_t *)mxf->packages_refs, mxf->packages_count * sizeof(UID));
00398 break;
00399 }
00400 return 0;
00401 }
00402
00403 static int mxf_read_metadata_source_clip(MXFStructuralComponent *source_clip, ByteIOContext *pb, int tag)
00404 {
00405 switch(tag) {
00406 case 0x0202:
00407 source_clip->duration = get_be64(pb);
00408 break;
00409 case 0x1201:
00410 source_clip->start_position = get_be64(pb);
00411 break;
00412 case 0x1101:
00413
00414 url_fskip(pb, 16);
00415 get_buffer(pb, source_clip->source_package_uid, 16);
00416 break;
00417 case 0x1102:
00418 source_clip->source_track_id = get_be32(pb);
00419 break;
00420 }
00421 return 0;
00422 }
00423
00424 static int mxf_read_metadata_material_package(MXFPackage *package, ByteIOContext *pb, int tag)
00425 {
00426 switch(tag) {
00427 case 0x4403:
00428 package->tracks_count = get_be32(pb);
00429 if (package->tracks_count >= UINT_MAX / sizeof(UID))
00430 return -1;
00431 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID));
00432 url_fskip(pb, 4);
00433 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID));
00434 break;
00435 }
00436 return 0;
00437 }
00438
00439 static int mxf_read_metadata_track(MXFTrack *track, ByteIOContext *pb, int tag)
00440 {
00441 switch(tag) {
00442 case 0x4801:
00443 track->track_id = get_be32(pb);
00444 break;
00445 case 0x4804:
00446 get_buffer(pb, track->track_number, 4);
00447 break;
00448 case 0x4B01:
00449 track->edit_rate.den = get_be32(pb);
00450 track->edit_rate.num = get_be32(pb);
00451 break;
00452 case 0x4803:
00453 get_buffer(pb, track->sequence_ref, 16);
00454 break;
00455 }
00456 return 0;
00457 }
00458
00459 static int mxf_read_metadata_sequence(MXFSequence *sequence, ByteIOContext *pb, int tag)
00460 {
00461 switch(tag) {
00462 case 0x0202:
00463 sequence->duration = get_be64(pb);
00464 break;
00465 case 0x0201:
00466 get_buffer(pb, sequence->data_definition_ul, 16);
00467 break;
00468 case 0x1001:
00469 sequence->structural_components_count = get_be32(pb);
00470 if (sequence->structural_components_count >= UINT_MAX / sizeof(UID))
00471 return -1;
00472 sequence->structural_components_refs = av_malloc(sequence->structural_components_count * sizeof(UID));
00473 url_fskip(pb, 4);
00474 get_buffer(pb, (uint8_t *)sequence->structural_components_refs, sequence->structural_components_count * sizeof(UID));
00475 break;
00476 }
00477 return 0;
00478 }
00479
00480 static int mxf_read_metadata_source_package(MXFPackage *package, ByteIOContext *pb, int tag)
00481 {
00482 switch(tag) {
00483 case 0x4403:
00484 package->tracks_count = get_be32(pb);
00485 if (package->tracks_count >= UINT_MAX / sizeof(UID))
00486 return -1;
00487 package->tracks_refs = av_malloc(package->tracks_count * sizeof(UID));
00488 url_fskip(pb, 4);
00489 get_buffer(pb, (uint8_t *)package->tracks_refs, package->tracks_count * sizeof(UID));
00490 break;
00491 case 0x4401:
00492
00493 url_fskip(pb, 16);
00494 get_buffer(pb, package->package_uid, 16);
00495 break;
00496 case 0x4701:
00497 get_buffer(pb, package->descriptor_ref, 16);
00498 break;
00499 }
00500 return 0;
00501 }
00502
00503 static void mxf_read_metadata_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor)
00504 {
00505 int code;
00506
00507 do {
00508 code = get_byte(pb);
00509 dprintf(NULL, "pixel layout: code 0x%x\n", code);
00510 switch (code) {
00511 case 0x52:
00512 descriptor->bits_per_sample += get_byte(pb);
00513 break;
00514 case 0x47:
00515 descriptor->bits_per_sample += get_byte(pb);
00516 break;
00517 case 0x42:
00518 descriptor->bits_per_sample += get_byte(pb);
00519 break;
00520 default:
00521 get_byte(pb);
00522 }
00523 } while (code != 0);
00524 }
00525
00526 static int mxf_read_metadata_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size)
00527 {
00528 switch(tag) {
00529 case 0x3F01:
00530 descriptor->sub_descriptors_count = get_be32(pb);
00531 if (descriptor->sub_descriptors_count >= UINT_MAX / sizeof(UID))
00532 return -1;
00533 descriptor->sub_descriptors_refs = av_malloc(descriptor->sub_descriptors_count * sizeof(UID));
00534 url_fskip(pb, 4);
00535 get_buffer(pb, (uint8_t *)descriptor->sub_descriptors_refs, descriptor->sub_descriptors_count * sizeof(UID));
00536 break;
00537 case 0x3004:
00538 get_buffer(pb, descriptor->essence_container_ul, 16);
00539 break;
00540 case 0x3006:
00541 descriptor->linked_track_id = get_be32(pb);
00542 break;
00543 case 0x3201:
00544 get_buffer(pb, descriptor->essence_codec_ul, 16);
00545 break;
00546 case 0x3203:
00547 descriptor->width = get_be32(pb);
00548 break;
00549 case 0x3202:
00550 descriptor->height = get_be32(pb);
00551 break;
00552 case 0x320E:
00553 descriptor->aspect_ratio.num = get_be32(pb);
00554 descriptor->aspect_ratio.den = get_be32(pb);
00555 break;
00556 case 0x3D03:
00557 descriptor->sample_rate.num = get_be32(pb);
00558 descriptor->sample_rate.den = get_be32(pb);
00559 break;
00560 case 0x3D06:
00561 get_buffer(pb, descriptor->essence_codec_ul, 16);
00562 break;
00563 case 0x3D07:
00564 descriptor->channels = get_be32(pb);
00565 break;
00566 case 0x3D01:
00567 descriptor->bits_per_sample = get_be32(pb);
00568 break;
00569 case 0x3401:
00570 mxf_read_metadata_pixel_layout(pb, descriptor);
00571 break;
00572 case 0x8201:
00573 descriptor->extradata = av_malloc(size);
00574 descriptor->extradata_size = size;
00575 get_buffer(pb, descriptor->extradata, size);
00576 break;
00577 }
00578 return 0;
00579 }
00580
00581
00582 static const MXFDataDefinitionUL mxf_data_definition_uls[] = {
00583 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x01,0x00,0x00,0x00 }, CODEC_TYPE_VIDEO },
00584 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x02,0x02,0x00,0x00,0x00 }, CODEC_TYPE_AUDIO },
00585 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x05,0x01,0x03,0x02,0x02,0x02,0x02,0x00,0x00 }, CODEC_TYPE_AUDIO },
00586 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_TYPE_DATA },
00587 };
00588
00589 static const MXFCodecUL mxf_codec_uls[] = {
00590
00591 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, CODEC_ID_MPEG2VIDEO, Frame },
00592
00593 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, CODEC_ID_MPEG2VIDEO, Frame },
00594 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 }, CODEC_ID_MPEG2VIDEO, Frame },
00595 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, CODEC_ID_MPEG2VIDEO, Frame },
00596 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 }, CODEC_ID_MPEG2VIDEO, Frame },
00597 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 }, CODEC_ID_MPEG2VIDEO, Frame },
00598 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 }, CODEC_ID_MPEG2VIDEO, Frame },
00599
00600 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame },
00601 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame },
00602
00603 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x03,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame },
00604
00605 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame },
00606 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame },
00607
00608 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x03 }, CODEC_ID_MPEG4, Frame },
00609 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x20,0x02,0x04 }, CODEC_ID_MPEG4, Frame },
00610
00611 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 }, CODEC_ID_DVVIDEO, Frame },
00612 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 }, CODEC_ID_DVVIDEO, Frame },
00613 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 }, CODEC_ID_DVVIDEO, Frame },
00614
00615 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x01,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_JPEG2000, Frame },
00616
00617 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x01,0x7F,0x00,0x00,0x00 }, CODEC_ID_RAWVIDEO, Frame },
00618
00619 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 }, CODEC_ID_PCM_S16LE, Frame },
00620 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x7F,0x00,0x00,0x00 }, CODEC_ID_PCM_S16LE, Frame },
00621 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x07,0x04,0x02,0x02,0x01,0x7E,0x00,0x00,0x00 }, CODEC_ID_PCM_S16BE, Frame },
00622 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x04,0x04,0x02,0x02,0x02,0x03,0x01,0x01,0x00 }, CODEC_ID_PCM_ALAW, Frame },
00623 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x01,0x00 }, CODEC_ID_AC3, Frame },
00624 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x02,0x03,0x02,0x05,0x00 }, CODEC_ID_MP2, Frame },
00625
00626 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE, Frame },
00627 };
00628
00629 static const MXFCodecUL mxf_picture_essence_container_uls[] = {
00630 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x60,0x01 }, CODEC_ID_MPEG2VIDEO, Frame },
00631 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xe0,0x02 }, CODEC_ID_MPEG2VIDEO, Clip },
00632 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x04,0x61,0x07 }, CODEC_ID_MPEG2VIDEO, Clip },
00633 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE, Frame },
00634 };
00635
00636 static const MXFCodecUL mxf_sound_essence_container_uls[] = {
00637 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x01,0x00 }, CODEC_ID_PCM_S16LE, Frame },
00638 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x06,0x03,0x00 }, CODEC_ID_PCM_S16LE, Frame },
00639 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, CODEC_ID_MP2, Frame },
00640 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x01 }, CODEC_ID_MP2, Frame },
00641 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x02 }, CODEC_ID_MP2, Clip },
00642 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, CODEC_ID_PCM_S16LE, Frame },
00643 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 }, CODEC_ID_PCM_S16LE, Frame },
00644 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, CODEC_ID_PCM_S16LE, Frame },
00645 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 }, CODEC_ID_PCM_S16LE, Frame },
00646 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, CODEC_ID_PCM_S16LE, Frame },
00647 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 }, CODEC_ID_PCM_S16LE, Frame },
00648 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE, Frame },
00649 };
00650
00651
00652
00653
00654
00655 static int mxf_match_uid(const UID key, const UID uid, int len)
00656 {
00657 int i;
00658 for (i = 0; i < len; i++) {
00659 if (i != 7 && key[i] != uid[i])
00660 return 0;
00661 }
00662 return 1;
00663 }
00664
00665 static const MXFCodecUL *mxf_get_codec_ul(const MXFCodecUL *uls, UID *uid)
00666 {
00667 while (uls->id != CODEC_ID_NONE) {
00668 if(mxf_match_uid(uls->uid, *uid, 16))
00669 break;
00670 uls++;
00671 }
00672 return uls;
00673 }
00674
00675 static enum CodecType mxf_get_codec_type(const MXFDataDefinitionUL *uls, UID *uid)
00676 {
00677 while (uls->type != CODEC_TYPE_DATA) {
00678 if(mxf_match_uid(uls->uid, *uid, 16))
00679 break;
00680 uls++;
00681 }
00682 return uls->type;
00683 }
00684
00685 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type)
00686 {
00687 int i;
00688
00689 if (!strong_ref)
00690 return NULL;
00691 for (i = 0; i < mxf->metadata_sets_count; i++) {
00692 if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) &&
00693 (type == AnyType || mxf->metadata_sets[i]->type == type)) {
00694 return mxf->metadata_sets[i];
00695 }
00696 }
00697 return NULL;
00698 }
00699
00700 static int mxf_parse_structural_metadata(MXFContext *mxf)
00701 {
00702 MXFPackage *material_package = NULL;
00703 MXFPackage *temp_package = NULL;
00704 int i, j, k;
00705
00706 dprintf(mxf->fc, "metadata sets count %d\n", mxf->metadata_sets_count);
00707
00708 for (i = 0; i < mxf->packages_count; i++) {
00709 material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage);
00710 if (material_package) break;
00711 }
00712 if (!material_package) {
00713 av_log(mxf->fc, AV_LOG_ERROR, "no material package found\n");
00714 return -1;
00715 }
00716
00717 for (i = 0; i < material_package->tracks_count; i++) {
00718 MXFPackage *source_package = NULL;
00719 MXFTrack *material_track = NULL;
00720 MXFTrack *source_track = NULL;
00721 MXFTrack *temp_track = NULL;
00722 MXFDescriptor *descriptor = NULL;
00723 MXFStructuralComponent *component = NULL;
00724 UID *essence_container_ul = NULL;
00725 const MXFCodecUL *codec_ul = NULL;
00726 const MXFCodecUL *container_ul = NULL;
00727 AVStream *st;
00728
00729 if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) {
00730 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n");
00731 continue;
00732 }
00733
00734 if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) {
00735 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n");
00736 return -1;
00737 }
00738
00739
00740 for (j = 0; j < material_track->sequence->structural_components_count; j++) {
00741
00742 component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], SourceClip);
00743 if (!component)
00744 continue;
00745
00746 for (k = 0; k < mxf->packages_count; k++) {
00747 temp_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[k], SourcePackage);
00748 if (!temp_package)
00749 continue;
00750 if (!memcmp(temp_package->package_uid, component->source_package_uid, 16)) {
00751 source_package = temp_package;
00752 break;
00753 }
00754 }
00755 if (!source_package) {
00756 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source package found\n", material_track->track_id);
00757 break;
00758 }
00759 for (k = 0; k < source_package->tracks_count; k++) {
00760 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k], Track))) {
00761 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
00762 return -1;
00763 }
00764 if (temp_track->track_id == component->source_track_id) {
00765 source_track = temp_track;
00766 break;
00767 }
00768 }
00769 if (!source_track) {
00770 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id);
00771 break;
00772 }
00773 }
00774 if (!source_track)
00775 continue;
00776
00777 st = av_new_stream(mxf->fc, source_track->track_id);
00778 st->priv_data = source_track;
00779 st->duration = component->duration;
00780 if (st->duration == -1)
00781 st->duration = AV_NOPTS_VALUE;
00782 st->start_time = component->start_position;
00783 av_set_pts_info(st, 64, material_track->edit_rate.num, material_track->edit_rate.den);
00784
00785 if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
00786 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
00787 return -1;
00788 }
00789
00790 #ifdef DEBUG
00791 PRINT_KEY(mxf->fc, "data definition ul", source_track->sequence->data_definition_ul);
00792 #endif
00793 st->codec->codec_type = mxf_get_codec_type(mxf_data_definition_uls, &source_track->sequence->data_definition_ul);
00794
00795 source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType);
00796 if (source_package->descriptor) {
00797 if (source_package->descriptor->type == MultipleDescriptor) {
00798 for (j = 0; j < source_package->descriptor->sub_descriptors_count; j++) {
00799 MXFDescriptor *sub_descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor->sub_descriptors_refs[j], Descriptor);
00800
00801 if (!sub_descriptor) {
00802 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n");
00803 continue;
00804 }
00805 if (sub_descriptor->linked_track_id == source_track->track_id) {
00806 descriptor = sub_descriptor;
00807 break;
00808 }
00809 }
00810 } else if (source_package->descriptor->type == Descriptor)
00811 descriptor = source_package->descriptor;
00812 }
00813 if (!descriptor) {
00814 av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index);
00815 continue;
00816 }
00817 #ifdef DEBUG
00818 PRINT_KEY(mxf->fc, "essence codec ul", descriptor->essence_codec_ul);
00819 PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul);
00820 #endif
00821 essence_container_ul = &descriptor->essence_container_ul;
00822
00823
00824 if (IS_KLV_KEY(essence_container_ul, mxf_encrypted_essence_container)) {
00825 av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n");
00826 for (k = 0; k < mxf->metadata_sets_count; k++) {
00827 MXFMetadataSet *metadata = mxf->metadata_sets[k];
00828 if (metadata->type == CryptoContext) {
00829 essence_container_ul = &((MXFCryptoContext *)metadata)->source_container_ul;
00830 break;
00831 }
00832 }
00833 }
00834
00835 codec_ul = mxf_get_codec_ul(mxf_codec_uls, &descriptor->essence_codec_ul);
00836 st->codec->codec_id = codec_ul->id;
00837 if (descriptor->extradata) {
00838 st->codec->extradata = descriptor->extradata;
00839 st->codec->extradata_size = descriptor->extradata_size;
00840 }
00841 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
00842 container_ul = mxf_get_codec_ul(mxf_picture_essence_container_uls, essence_container_ul);
00843 if (st->codec->codec_id == CODEC_ID_NONE)
00844 st->codec->codec_id = container_ul->id;
00845 st->codec->width = descriptor->width;
00846 st->codec->height = descriptor->height;
00847 st->codec->bits_per_sample = descriptor->bits_per_sample;
00848 st->need_parsing = AVSTREAM_PARSE_HEADERS;
00849 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
00850 container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, essence_container_ul);
00851 if (st->codec->codec_id == CODEC_ID_NONE)
00852 st->codec->codec_id = container_ul->id;
00853 st->codec->channels = descriptor->channels;
00854 st->codec->bits_per_sample = descriptor->bits_per_sample;
00855 st->codec->sample_rate = descriptor->sample_rate.num / descriptor->sample_rate.den;
00856
00857 if (st->codec->codec_id == CODEC_ID_PCM_S16LE) {
00858 if (descriptor->bits_per_sample == 24)
00859 st->codec->codec_id = CODEC_ID_PCM_S24LE;
00860 else if (descriptor->bits_per_sample == 32)
00861 st->codec->codec_id = CODEC_ID_PCM_S32LE;
00862 } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
00863 if (descriptor->bits_per_sample == 24)
00864 st->codec->codec_id = CODEC_ID_PCM_S24BE;
00865 else if (descriptor->bits_per_sample == 32)
00866 st->codec->codec_id = CODEC_ID_PCM_S32BE;
00867 } else if (st->codec->codec_id == CODEC_ID_MP2) {
00868 st->need_parsing = AVSTREAM_PARSE_FULL;
00869 }
00870 }
00871 if (container_ul && container_ul->wrapping == Clip) {
00872 dprintf(mxf->fc, "stream %d: clip wrapped essence\n", st->index);
00873 st->need_parsing = AVSTREAM_PARSE_FULL;
00874 }
00875 }
00876 return 0;
00877 }
00878
00879 static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
00880 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x18,0x00 }, mxf_read_metadata_content_storage, 0, AnyType },
00881 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x37,0x00 }, mxf_read_metadata_source_package, sizeof(MXFPackage), SourcePackage },
00882 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x36,0x00 }, mxf_read_metadata_material_package, sizeof(MXFPackage), MaterialPackage },
00883 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0F,0x00 }, mxf_read_metadata_sequence, sizeof(MXFSequence), Sequence },
00884 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x11,0x00 }, mxf_read_metadata_source_clip, sizeof(MXFStructuralComponent), SourceClip },
00885 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x44,0x00 }, mxf_read_metadata_generic_descriptor, sizeof(MXFDescriptor), MultipleDescriptor },
00886 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x42,0x00 }, mxf_read_metadata_generic_descriptor, sizeof(MXFDescriptor), Descriptor },
00887 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x28,0x00 }, mxf_read_metadata_generic_descriptor, sizeof(MXFDescriptor), Descriptor },
00888 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x29,0x00 }, mxf_read_metadata_generic_descriptor, sizeof(MXFDescriptor), Descriptor },
00889 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x51,0x00 }, mxf_read_metadata_generic_descriptor, sizeof(MXFDescriptor), Descriptor },
00890 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x48,0x00 }, mxf_read_metadata_generic_descriptor, sizeof(MXFDescriptor), Descriptor },
00891 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x47,0x00 }, mxf_read_metadata_generic_descriptor, sizeof(MXFDescriptor), Descriptor },
00892 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_metadata_track, sizeof(MXFTrack), Track },
00893 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_metadata_track, sizeof(MXFTrack), Track },
00894 { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_metadata_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext },
00895 { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType },
00896 };
00897
00898 static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, int (*read_child)(), int ctx_size, enum MXFMetadataSetType type)
00899 {
00900 ByteIOContext *pb = &mxf->fc->pb;
00901 MXFMetadataSet *ctx = ctx_size ? av_mallocz(ctx_size) : mxf;
00902 uint64_t klv_end= url_ftell(pb) + klv->length;
00903
00904 while (url_ftell(pb) + 4 < klv_end) {
00905 int tag = get_be16(pb);
00906 int size = get_be16(pb);
00907 uint64_t next= url_ftell(pb) + size;
00908
00909 if (!size) {
00910 av_log(mxf->fc, AV_LOG_ERROR, "local tag 0x%04X with 0 size\n", tag);
00911 continue;
00912 }
00913 if(ctx_size && tag == 0x3C0A)
00914 get_buffer(pb, ctx->uid, 16);
00915 else
00916 read_child(ctx, pb, tag, size);
00917
00918 url_fseek(pb, next, SEEK_SET);
00919 }
00920 if (ctx_size) ctx->type = type;
00921 return ctx_size ? mxf_add_metadata_set(mxf, ctx) : 0;
00922 }
00923
00924 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap)
00925 {
00926 MXFContext *mxf = s->priv_data;
00927 KLVPacket klv;
00928
00929 if (!mxf_read_sync(&s->pb, mxf_header_partition_pack_key, 14)) {
00930 av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n");
00931 return -1;
00932 }
00933 url_fseek(&s->pb, -14, SEEK_CUR);
00934 mxf->fc = s;
00935 while (!url_feof(&s->pb)) {
00936 const MXFMetadataReadTableEntry *metadata;
00937
00938 if (klv_read_packet(&klv, &s->pb) < 0)
00939 return -1;
00940 #ifdef DEBUG
00941 PRINT_KEY(s, "read header", klv.key);
00942 #endif
00943 if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) ||
00944 IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
00945
00946 url_fseek(&s->pb, klv.offset, SEEK_SET);
00947 break;
00948 }
00949
00950 for (metadata = mxf_metadata_read_table; metadata->read; metadata++) {
00951 if (IS_KLV_KEY(klv.key, metadata->key)) {
00952 if (mxf_read_local_tags(mxf, &klv, metadata->read, metadata->ctx_size, metadata->type) < 0) {
00953 av_log(s, AV_LOG_ERROR, "error reading header metadata\n");
00954 return -1;
00955 }
00956 break;
00957 }
00958 }
00959 if (!metadata->read)
00960 url_fskip(&s->pb, klv.length);
00961 }
00962 return mxf_parse_structural_metadata(mxf);
00963 }
00964
00965 static int mxf_read_close(AVFormatContext *s)
00966 {
00967 MXFContext *mxf = s->priv_data;
00968 int i;
00969
00970 av_freep(&mxf->packages_refs);
00971 for (i = 0; i < mxf->metadata_sets_count; i++) {
00972 switch (mxf->metadata_sets[i]->type) {
00973 case MultipleDescriptor:
00974 av_freep(&((MXFDescriptor *)mxf->metadata_sets[i])->sub_descriptors_refs);
00975 break;
00976 case Sequence:
00977 av_freep(&((MXFSequence *)mxf->metadata_sets[i])->structural_components_refs);
00978 break;
00979 case SourcePackage:
00980 case MaterialPackage:
00981 av_freep(&((MXFPackage *)mxf->metadata_sets[i])->tracks_refs);
00982 break;
00983 default:
00984 break;
00985 }
00986 av_freep(&mxf->metadata_sets[i]);
00987 }
00988 av_freep(&mxf->metadata_sets);
00989 av_freep(&mxf->aesc);
00990 return 0;
00991 }
00992
00993 static int mxf_probe(AVProbeData *p) {
00994 uint8_t *bufp = p->buf;
00995 uint8_t *end = p->buf + p->buf_size;
00996
00997 if (p->buf_size < sizeof(mxf_header_partition_pack_key))
00998 return 0;
00999
01000
01001 end -= sizeof(mxf_header_partition_pack_key);
01002 for (; bufp < end; bufp++) {
01003 if (IS_KLV_KEY(bufp, mxf_header_partition_pack_key))
01004 return AVPROBE_SCORE_MAX;
01005 }
01006 return 0;
01007 }
01008
01009
01010
01011 static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_time, int flags)
01012 {
01013 AVStream *st = s->streams[stream_index];
01014 int64_t seconds;
01015
01016 if (!s->bit_rate)
01017 return -1;
01018 if (sample_time < 0)
01019 sample_time = 0;
01020 seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
01021 url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET);
01022 av_update_cur_dts(s, st, sample_time);
01023 return 0;
01024 }
01025
01026 AVInputFormat mxf_demuxer = {
01027 "mxf",
01028 "MXF format",
01029 sizeof(MXFContext),
01030 mxf_probe,
01031 mxf_read_header,
01032 mxf_read_packet,
01033 mxf_read_close,
01034 mxf_read_seek,
01035 };