Lines Matching defs:mxf
64 #include "mxf.h"
448 static int klv_read_packet(MXFContext *mxf, KLVPacket *klv, AVIOContext *pb)
454 if (klv->offset < mxf->run_in)
484 static int find_body_sid_by_absolute_offset(MXFContext *mxf, int64_t offset)
491 b = mxf->partitions_count;
495 pack_ofs = mxf->partitions[m].pack_ofs;
504 return mxf->partitions[a].body_sid;
619 MXFContext *mxf = s->priv_data;
630 if (!mxf->aesc && s->key && s->keylen == 16) {
631 mxf->aesc = av_aes_alloc();
632 if (!mxf->aesc)
634 av_aes_init(mxf->aesc, s->key, 128, 1);
650 body_sid = find_body_sid_by_absolute_offset(mxf, klv->offset);
665 if (mxf->aesc)
666 av_aes_crypt(mxf->aesc, tmpbuf, tmpbuf, 1, ivec, 1);
676 if (mxf->aesc)
677 av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
687 MXFContext *mxf = arg;
696 av_log(mxf->fc, AV_LOG_ERROR, "item_num %d is too large\n", item_num);
699 if (mxf->local_tags)
700 av_log(mxf->fc, AV_LOG_VERBOSE, "Multiple primer packs\n");
701 av_free(mxf->local_tags);
702 mxf->local_tags_count = 0;
703 mxf->local_tags = av_calloc(item_num, item_len);
704 if (!mxf->local_tags)
706 mxf->local_tags_count = item_num;
707 avio_read(pb, mxf->local_tags, item_num*item_len);
713 MXFContext *mxf = arg;
714 AVFormatContext *s = mxf->fc;
721 if (mxf->partitions_count >= INT_MAX / 2)
724 av_assert0(klv_offset >= mxf->run_in);
726 tmp_part = av_realloc_array(mxf->partitions, mxf->partitions_count + 1, sizeof(*mxf->partitions));
729 mxf->partitions = tmp_part;
731 if (mxf->parsing_backward) {
733 * this makes the entries in mxf->partitions sorted by offset */
734 memmove(&mxf->partitions[mxf->last_forward_partition+1],
735 &mxf->partitions[mxf->last_forward_partition],
736 (mxf->partitions_count - mxf->last_forward_partition)*sizeof(*mxf->partitions));
737 partition = mxf->current_partition = &mxf->partitions[mxf->last_forward_partition];
739 mxf->last_forward_partition++;
740 partition = mxf->current_partition = &mxf->partitions[mxf->partitions_count];
744 mxf->partitions_count++;
759 av_log(mxf->fc, AV_LOG_ERROR, "unknown partition type %i\n", uid[13]);
769 if (this_partition != klv_offset - mxf->run_in) {
770 av_log(mxf->fc, AV_LOG_ERROR,
772 this_partition, klv_offset - mxf->run_in);
786 av_log(mxf->fc, AV_LOG_ERROR, "Failed reading UID\n");
799 av_log(mxf->fc, AV_LOG_ERROR,
803 if (!mxf->parsing_backward && mxf->last_forward_partition > 1) {
805 mxf->partitions + mxf->last_forward_partition - 2;
806 partition->previous_partition = prev->pack_ofs - mxf->run_in;
812 av_log(mxf->fc, AV_LOG_ERROR,
819 if (mxf->footer_partition && mxf->footer_partition != footer_partition) {
820 av_log(mxf->fc, AV_LOG_ERROR,
822 mxf->footer_partition, footer_partition);
824 mxf->footer_partition = footer_partition;
828 av_log(mxf->fc, AV_LOG_TRACE,
839 mxf->run_in + partition->previous_partition >= klv_offset) {
840 av_log(mxf->fc, AV_LOG_ERROR,
845 if (op[12] == 1 && op[13] == 1) mxf->op = OP1a;
846 else if (op[12] == 1 && op[13] == 2) mxf->op = OP1b;
847 else if (op[12] == 1 && op[13] == 3) mxf->op = OP1c;
848 else if (op[12] == 2 && op[13] == 1) mxf->op = OP2a;
849 else if (op[12] == 2 && op[13] == 2) mxf->op = OP2b;
850 else if (op[12] == 2 && op[13] == 3) mxf->op = OP2c;
851 else if (op[12] == 3 && op[13] == 1) mxf->op = OP3a;
852 else if (op[12] == 3 && op[13] == 2) mxf->op = OP3b;
853 else if (op[12] == 3 && op[13] == 3) mxf->op = OP3c;
854 else if (op[12] == 64&& op[13] == 1) mxf->op = OPSONYOpt;
858 * 2011_DCPTEST_24FPS.V.mxf - two ECs, OP1a
859 * abcdefghiv016f56415e.mxf - zero ECs, OPAtom, output by Avid AirSpeed */
864 if (!mxf->op)
865 av_log(mxf->fc, AV_LOG_WARNING,
870 mxf->op = op;
872 mxf->op = OPAtom;
874 av_log(mxf->fc, AV_LOG_ERROR, "unknown operational pattern: %02xh %02xh - guessing OP1a\n", op[12], op[13]);
875 mxf->op = OP1a;
879 av_log(mxf->fc, AV_LOG_WARNING, "invalid KAGSize %"PRId32" - guessing ",
882 if (mxf->op == OPSONYOpt)
887 av_log(mxf->fc, AV_LOG_WARNING, "%"PRId32"\n", partition->kag_size);
909 static int mxf_add_metadata_set(MXFContext *mxf, MXFMetadataSet **metadata_set)
918 for (int i = 0; i < mxf->metadata_sets_count; i++) {
919 if (!memcmp((*metadata_set)->uid, mxf->metadata_sets[i]->uid, 16) && type == mxf->metadata_sets[i]->type) {
920 uint64_t old_s = mxf->metadata_sets[i]->partition_score;
929 tmp = av_realloc_array(mxf->metadata_sets, mxf->metadata_sets_count + 1, sizeof(*mxf->metadata_sets));
934 mxf->metadata_sets = tmp;
935 mxf->metadata_sets[mxf->metadata_sets_count] = *metadata_set;
936 mxf->metadata_sets_count++;
1038 MXFContext *mxf = arg;
1041 if (mxf->packages_refs)
1042 av_log(mxf->fc, AV_LOG_VERBOSE, "Multiple packages_refs\n");
1043 return mxf_read_strong_ref_array(pb, &mxf->packages_refs, &mxf->packages_count);
1045 return mxf_read_strong_ref_array(pb, &mxf->essence_container_data_refs, &mxf->essence_container_data_count);
1390 /* Private uid used by SONY C0023S01.mxf */
1545 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMetadataSetType type)
1551 for (i = mxf->metadata_sets_count - 1; i >= 0; i--) {
1552 if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) &&
1553 (type == AnyType || mxf->metadata_sets[i]->type == type)) {
1554 return mxf->metadata_sets[i];
1608 { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4F }, 14, AV_CODEC_ID_PCM_S16LE }, /* 0001GL00.MXF.A1.mxf_opatom.mxf */
1704 static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segments, MXFIndexTableSegment ***sorted_segments)
1711 for (i = 0; i < mxf->metadata_sets_count; i++)
1712 if (mxf->metadata_sets[i]->type == IndexTableSegment)
1725 for (i = nb_segments = 0; i < mxf->metadata_sets_count; i++) {
1726 if (mxf->metadata_sets[i]->type == IndexTableSegment) {
1727 MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i];
1731 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n",
1791 static int mxf_absolute_bodysid_offset(MXFContext *mxf, int body_sid, int64_t offset, int64_t *offset_out, MXFPartition **partition_out)
1800 b = mxf->partitions_count;
1805 while (m < b && mxf->partitions[m].body_sid != body_sid)
1808 if (m < b && mxf->partitions[m].body_offset <= offset)
1815 last_p = &mxf->partitions[a];
1824 av_log(mxf->fc, AV_LOG_ERROR,
1834 static int64_t mxf_essence_container_end(MXFContext *mxf, int body_sid)
1836 for (int x = mxf->partitions_count - 1; x >= 0; x--) {
1837 MXFPartition *p = &mxf->partitions[x];
1852 static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_table, int64_t edit_unit, AVRational edit_rate, int64_t *edit_unit_out, int64_t *offset_out, MXFPartition **partition_out, int nag)
1874 av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" IndexEntryArray too small\n",
1885 return mxf_absolute_bodysid_offset(mxf, index_table->body_sid, offset_temp, offset_out, partition_out);
1897 av_log(mxf->fc, AV_LOG_ERROR, "failed to map EditUnit %"PRId64" in IndexSID %i to an offset\n", edit_unit, index_table->index_sid);
1902 static int mxf_compute_ptses_fake_index(MXFContext *mxf, MXFIndexTable *index_table)
1919 av_log(mxf->fc, AV_LOG_ERROR, "ignoring IndexSID %d, duration is too large\n", s->index_sid);
1968 * We do this by bucket sorting x by x+TemporalOffset[x] into mxf->ptses,
1969 * then settings ffstream(mxf)->first_dts = -max(TemporalOffset[x]).
1988 av_log(mxf->fc, AV_LOG_ERROR,
1997 av_log(mxf->fc, AV_LOG_ERROR,
2026 static int mxf_compute_index_tables(MXFContext *mxf)
2031 if ((ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments)) ||
2033 av_log(mxf->fc, AV_LOG_WARNING, "broken or empty index\n");
2040 mxf->nb_index_tables++;
2042 av_log(mxf->fc, AV_LOG_ERROR, "found inconsistent BodySID\n");
2048 mxf->index_tables = av_calloc(mxf->nb_index_tables,
2049 sizeof(*mxf->index_tables));
2050 if (!mxf->index_tables) {
2051 av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate index tables\n");
2063 mxf->index_tables[j].nb_segments++;
2066 for (i = j = 0; j < mxf->nb_index_tables; i += mxf->index_tables[j++].nb_segments) {
2067 MXFIndexTable *t = &mxf->index_tables[j];
2072 av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate IndexTableSegment"
2079 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i starts at EditUnit %"PRId64" - seeking may not work as expected\n",
2086 if ((ret = mxf_compute_ptses_fake_index(mxf, t)) < 0)
2089 for (k = 0; k < mxf->fc->nb_streams; k++) {
2090 MXFTrack *track = mxf->fc->streams[k]->priv_data;
2100 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has invalid IndexEditRate\n",
2110 av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment %i has zero IndexDuration and there's more than one segment\n",
2114 av_log(mxf->fc, AV_LOG_WARNING, "no streams?\n");
2175 static MXFTimecodeComponent* mxf_resolve_timecode_component(MXFContext *mxf, UID *strong_ref)
2180 component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
2189 return mxf_resolve_strong_ref(mxf, &pulldown->input_segment_ref, TimecodeComponent);
2196 static MXFPackage* mxf_resolve_source_package(MXFContext *mxf, UID package_ul, UID package_uid)
2201 for (i = 0; i < mxf->packages_count; i++) {
2202 package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], SourcePackage);
2212 static MXFDescriptor* mxf_resolve_multidescriptor(MXFContext *mxf, MXFDescriptor *descriptor, int track_id)
2222 file_descriptor = mxf_resolve_strong_ref(mxf, &descriptor->file_descriptors_refs[i], Descriptor);
2225 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve file descriptor strong ref\n");
2238 static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, MXFEssenceGroup *essence_group)
2251 component = mxf_resolve_strong_ref(mxf, &essence_group->structural_components_refs[i], SourceClip);
2255 if (!(package = mxf_resolve_source_package(mxf, component->source_package_ul, component->source_package_uid)))
2258 descriptor = mxf_resolve_strong_ref(mxf, &package->descriptor_ref, Descriptor);
2265 static MXFStructuralComponent* mxf_resolve_sourceclip(MXFContext *mxf, UID *strong_ref)
2269 component = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
2276 return mxf_resolve_essence_group_choice(mxf, (MXFEssenceGroup*) component);
2283 static int mxf_parse_package_comments(MXFContext *mxf, AVDictionary **pm, MXFPackage *package)
2290 tag = mxf_resolve_strong_ref(mxf, &package->comment_refs[i], TaggedValue);
2303 static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_track, AVStream *st)
2315 sourceclip = mxf_resolve_strong_ref(mxf, &source_track->sequence->structural_components_refs[i], SourceClip);
2319 if (!(physical_package = mxf_resolve_source_package(mxf, sourceclip->source_package_ul, sourceclip->source_package_uid)))
2332 if (!(physical_track = mxf_resolve_strong_ref(mxf, &physical_package->tracks_refs[j], Track))) {
2333 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
2337 if (!(physical_track->sequence = mxf_resolve_strong_ref(mxf, &physical_track->sequence_ref, Sequence))) {
2338 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
2344 av_log(mxf->fc, AV_LOG_WARNING,
2353 if (!(mxf_tc = mxf_resolve_timecode_component(mxf, &physical_track->sequence->structural_components_refs[k])))
2364 if (av_timecode_init(&tc, mxf_tc->rate, flags, start_position + mxf_tc->start_frame, mxf->fc) == 0) {
2375 static int mxf_add_metadata_stream(MXFContext *mxf, MXFTrack *track)
2384 component = mxf_resolve_sourceclip(mxf, &track->sequence->structural_components_refs[j]);
2392 st = avformat_new_stream(mxf->fc, NULL);
2394 av_log(mxf->fc, AV_LOG_ERROR, "could not allocate metadata stream\n");
2413 static enum AVColorRange mxf_get_color_range(MXFContext *mxf, MXFDescriptor *descriptor)
2429 avpriv_request_sample(mxf->fc, "Unrecognized CDCI color range (color diff range %d, b %d, w %d, depth %d)",
2458 static MXFMCASubDescriptor *find_mca_link_id(MXFContext *mxf, enum MXFMetadataSetType type, UID *mca_link_id)
2460 for (int k = 0; k < mxf->metadata_sets_count; k++) {
2461 MXFMCASubDescriptor *group = (MXFMCASubDescriptor*)mxf->metadata_sets[k];
2468 static int parse_mca_labels(MXFContext *mxf, MXFTrack *source_track, MXFDescriptor *descriptor, AVStream *st)
2480 MXFMCASubDescriptor *label = mxf_resolve_strong_ref(mxf, &descriptor->sub_descriptors_refs[i], AudioChannelLabelSubDescriptor);
2491 av_log(mxf->fc, AV_LOG_ERROR, "AudioChannelLabelSubDescriptor has invalid MCA channel ID %d\n", target_channel);
2505 MXFMCASubDescriptor *group = find_mca_link_id(mxf, SoundfieldGroupLabelSubDescriptor, &label->soundfield_group_link_id);
2509 MXFMCASubDescriptor *supergroup = find_mca_link_id(mxf, GroupOfSoundfieldGroupsLabelSubDescriptor,
2525 int ret = set_language(mxf->fc, language, &st->metadata);
2545 av_log(mxf->fc, AV_LOG_WARNING, "Designation of audio channel %d in stream #%d is unknown or unsupported, "
2552 av_log(mxf->fc, AV_LOG_WARNING, "%s audio channel is used multiple times in stream #%d, "
2558 av_log(mxf->fc, AV_LOG_WARNING, "stream #%d is not in in native channel order, "
2575 static int mxf_parse_structural_metadata(MXFContext *mxf)
2580 av_log(mxf->fc, AV_LOG_TRACE, "metadata sets count %d\n", mxf->metadata_sets_count);
2582 for (i = 0; i < mxf->packages_count; i++) {
2583 material_package = mxf_resolve_strong_ref(mxf, &mxf->packages_refs[i], MaterialPackage);
2587 av_log(mxf->fc, AV_LOG_ERROR, "no material package found\n");
2591 mxf_add_umid_metadata(&mxf->fc->metadata, "material_package_umid", material_package);
2593 av_dict_set(&mxf->fc->metadata, "material_package_name", material_package->name, 0);
2594 mxf_parse_package_comments(mxf, &mxf->fc->metadata, material_package);
2613 if (!(material_track = mxf_resolve_strong_ref(mxf, &material_package->tracks_refs[i], Track))) {
2614 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track strong ref\n");
2618 if ((component = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, TimecodeComponent))) {
2621 if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
2622 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
2626 if (!(material_track->sequence = mxf_resolve_strong_ref(mxf, &material_track->sequence_ref, Sequence))) {
2627 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve material track sequence strong ref\n");
2632 component = mxf_resolve_strong_ref(mxf, &material_track->sequence->structural_components_refs[j], TimecodeComponent);
2638 if (av_timecode_init(&tc, mxf_tc->rate, flags, mxf_tc->start_frame, mxf->fc) == 0) {
2639 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
2646 av_log(mxf->fc, AV_LOG_WARNING, "material track %d: has %d components\n",
2650 component = mxf_resolve_sourceclip(mxf, &material_track->sequence->structural_components_refs[j]);
2654 source_package = mxf_resolve_source_package(mxf, component->source_package_ul, component->source_package_uid);
2656 av_log(mxf->fc, AV_LOG_TRACE, "material track %d: no corresponding source package found\n", material_track->track_id);
2660 if (!(temp_track = mxf_resolve_strong_ref(mxf, &source_package->tracks_refs[k], Track))) {
2661 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track strong ref\n");
2671 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: no corresponding source track found\n", material_track->track_id);
2675 for (k = 0; k < mxf->essence_container_data_count; k++) {
2678 if (!(essence_data = mxf_resolve_strong_ref(mxf, &mxf->essence_container_data_refs[k], EssenceContainerData))) {
2679 av_log(mxf->fc, AV_LOG_TRACE, "could not resolve essence container data strong ref\n");
2693 if((ret = mxf_add_metadata_stream(mxf, material_track)))
2698 if (!(source_track->sequence = mxf_resolve_strong_ref(mxf, &source_track->sequence_ref, Sequence))) {
2699 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve source track sequence strong ref\n");
2704 /* 0001GL00.MXF.A1.mxf_opatom.mxf has the same SourcePackageID as 0001GL.MXF.V1.mxf_opatom.mxf
2707 av_log(mxf->fc, AV_LOG_ERROR, "material track %d: DataDefinition mismatch\n", material_track->track_id);
2711 st = avformat_new_stream(mxf->fc, NULL);
2713 av_log(mxf->fc, AV_LOG_ERROR, "could not allocate stream\n");
2721 source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType);
2722 descriptor = mxf_resolve_multidescriptor(mxf, source_package->descriptor, source_track->track_id);
2736 av_log(mxf->fc, AV_LOG_WARNING,
2749 PRINT_KEY(mxf->fc, "data definition ul", source_track->sequence->data_definition_ul);
2754 av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index);
2757 PRINT_KEY(mxf->fc, "essence codec ul", descriptor->essence_codec_ul);
2758 PRINT_KEY(mxf->fc, "essence container ul", descriptor->essence_container_ul);
2760 source_track->wrapping = (mxf->op == OPAtom) ? ClipWrapped : mxf_get_wrapping_kind(essence_container_ul);
2762 av_log(mxf->fc, AV_LOG_INFO, "wrapping of stream %d is unknown\n", st->index);
2766 av_log(mxf->fc, AV_LOG_INFO, "broken encrypted mxf file\n");
2767 for (k = 0; k < mxf->metadata_sets_count; k++) {
2768 MXFMetadataSet *metadata = mxf->metadata_sets[k];
2784 av_log(mxf->fc, AV_LOG_VERBOSE, "%s: Universal Label: ",
2787 av_log(mxf->fc, AV_LOG_VERBOSE, "%.2x",
2790 av_log(mxf->fc, AV_LOG_VERBOSE, ".");
2792 av_log(mxf->fc, AV_LOG_VERBOSE, "\n");
2800 mxf_parse_physical_source_package(mxf, source_track, st);
2815 av_log(mxf->fc, AV_LOG_INFO, "OneField frame layout isn't currently supported\n");
2824 av_log(mxf->fc, AV_LOG_DEBUG, "video_line_map: (%d, %d), field_dominance: %d\n",
2844 avpriv_request_sample(mxf->fc,
2858 avpriv_request_sample(mxf->fc,
2868 av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout);
2912 st->codecpar->color_range = mxf_get_color_range(mxf, descriptor);
2943 av_log(mxf->fc, AV_LOG_WARNING, "invalid sample rate (%d/%d) "
2973 av_log(mxf->fc, AV_LOG_ERROR, "Invalid number of channels %d, must be less than %d\n", descriptor->channels, FF_SANE_NB_CHANNELS);
2977 ret = parse_mca_labels(mxf, source_track, descriptor, st);
2990 if (mxf->eia608_extract &&
3015 for (int i = 0; i < mxf->fc->nb_streams; i++) {
3016 MXFTrack *track1 = mxf->fc->streams[i]->priv_data;
3018 for (int j = i + 1; j < mxf->fc->nb_streams; j++) {
3019 MXFTrack *track2 = mxf->fc->streams[j]->priv_data;
3026 av_log(mxf->fc, AV_LOG_ERROR, "stream %d and stream %d have the same BodySID (%d) "
3093 MXFContext *mxf = arg;
3094 AVFormatContext *s = mxf->fc;
3137 MXFContext *mxf = arg;
3138 AVFormatContext *s = mxf->fc;
3209 static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadFunc *read_child, int ctx_size, enum MXFMetadataSetType type)
3211 AVIOContext *pb = mxf->fc->pb;
3221 mxf_metadataset_init(meta, type, mxf->current_partition);
3224 ctx = mxf;
3240 av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x size %d\n", tag, size);
3242 av_log(mxf->fc, AV_LOG_ERROR, "local tag %#04x with 0 size\n", tag);
3247 for (i = 0; i < mxf->local_tags_count; i++) {
3248 int local_tag = AV_RB16(mxf->local_tags+i*18);
3250 memcpy(uid, mxf->local_tags+i*18+2, 16);
3251 av_log(mxf->fc, AV_LOG_TRACE, "local tag %#04x\n", local_tag);
3252 PRINT_KEY(mxf->fc, "uid", uid);
3266 * it extending past the end of the KLV though (zzuf5.mxf). */
3272 av_log(mxf->fc, AV_LOG_ERROR,
3279 return meta ? mxf_add_metadata_set(mxf, &meta) : 0;
3300 static int mxf_parse_klv(MXFContext *mxf, KLVPacket klv, MXFMetadataReadFunc *read,
3303 AVFormatContext *s = mxf->fc;
3306 res = mxf_read_local_tags(mxf, &klv, read, ctx_size, type);
3309 res = read(mxf, s->pb, 0, klv.length, klv.key, klv.offset);
3331 static int mxf_seek_to_previous_partition(MXFContext *mxf)
3333 AVIOContext *pb = mxf->fc->pb;
3338 if (!mxf->current_partition ||
3339 mxf->run_in + mxf->current_partition->previous_partition <= mxf->last_forward_tell)
3343 current_partition_ofs = mxf->current_partition->pack_ofs; //includes run-in
3344 avio_seek(pb, mxf->run_in + mxf->current_partition->previous_partition, SEEK_SET);
3345 mxf->current_partition = NULL;
3347 av_log(mxf->fc, AV_LOG_TRACE, "seeking to previous partition\n");
3350 * See deadlock2.mxf
3352 if ((ret = klv_read_packet(mxf, &klv, pb)) < 0) {
3353 av_log(mxf->fc, AV_LOG_ERROR, "failed to read PartitionPack KLV\n");
3358 av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition @ %" PRIx64 " isn't a PartitionPack\n", klv.offset);
3364 * to sync back up to it. See deadlock3.mxf
3367 av_log(mxf->fc, AV_LOG_ERROR, "PreviousPartition for PartitionPack @ %"
3372 if ((ret = mxf_parse_klv(mxf, klv, mxf_read_partition_pack, 0, 0)) < 0)
3382 static int mxf_parse_handle_essence(MXFContext *mxf)
3384 AVIOContext *pb = mxf->fc->pb;
3387 if (mxf->parsing_backward) {
3388 return mxf_seek_to_previous_partition(mxf);
3390 if (!mxf->footer_partition) {
3391 av_log(mxf->fc, AV_LOG_TRACE, "no FooterPartition\n");
3395 av_log(mxf->fc, AV_LOG_TRACE, "seeking to FooterPartition\n");
3398 mxf->last_forward_tell = avio_tell(pb);
3401 av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing FooterPartition\n");
3406 if ((ret = avio_seek(pb, mxf->run_in + mxf->footer_partition, SEEK_SET)) < 0) {
3407 av_log(mxf->fc, AV_LOG_ERROR,
3410 mxf->run_in + mxf->footer_partition, ret);
3414 mxf->current_partition = NULL;
3415 mxf->parsing_backward = 1;
3425 static int mxf_parse_handle_partition_or_eof(MXFContext *mxf)
3427 return mxf->parsing_backward ? mxf_seek_to_previous_partition(mxf) : 1;
3445 MXFContext *mxf = s->priv_data;
3448 for (x = 0; x < mxf->partitions_count; x++) {
3449 MXFPartition *p = &mxf->partitions[x];
3459 wrapping = (mxf->op == OPAtom) ? ClipWrapped : mxf_get_wrapping_by_body_sid(s, p->body_sid);
3468 if (x < mxf->partitions_count - 1)
3469 p->essence_length = mxf->partitions[x+1].pack_ofs - mxf->run_in - p->essence_offset;
3474 av_log(mxf->fc, AV_LOG_ERROR,
3476 x+1, mxf->partitions[x+1].pack_ofs - mxf->run_in);
3482 static MXFIndexTable *mxf_find_index_table(MXFContext *mxf, int index_sid)
3485 for (i = 0; i < mxf->nb_index_tables; i++)
3486 if (mxf->index_tables[i].index_sid == index_sid)
3487 return &mxf->index_tables[i];
3496 static void mxf_compute_edit_units_per_packet(MXFContext *mxf, AVStream *st)
3507 t = mxf_find_index_table(mxf, track->index_sid);
3527 static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st)
3540 for (i = 0; i < mxf->metadata_sets_count; i++) {
3541 if (mxf->metadata_sets[i]->type == IndexTableSegment) {
3542 MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i];
3549 for (i = 0; i < mxf->partitions_count; i++) {
3551 if (mxf->partitions[i].body_sid != track->body_sid)
3554 p = &mxf->partitions[i];
3572 av_log(mxf->fc, AV_LOG_WARNING, "guessing index for stream %d using edit unit byte count %d\n", st->index, edit_unit_byte_count);
3577 if ((ret = mxf_add_metadata_set(mxf, (MXFMetadataSet**)&segment)))
3598 MXFContext *mxf = s->priv_data;
3616 max_rip_length = ((file_size - mxf->run_in) / 105) * 12 + 28;
3629 if (klv_read_packet(mxf, &klv, s->pb) < 0 ||
3638 mxf->footer_partition = avio_rb64(s->pb);
3641 if (mxf->run_in + mxf->footer_partition >= file_size) {
3643 mxf->footer_partition = 0;
3647 avio_seek(s->pb, mxf->run_in, SEEK_SET);
3652 MXFContext *mxf = s->priv_data;
3658 mxf->last_forward_tell = INT64_MAX;
3665 mxf->fc = s;
3669 mxf->run_in = run_in;
3676 if (klv_read_packet(mxf, &klv, s->pb) < 0) {
3678 if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
3693 if (!mxf->current_partition) {
3694 av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to first PartitionPack\n");
3698 if (!mxf->current_partition->first_essence_klv.offset)
3699 mxf->current_partition->first_essence_klv = klv;
3705 if (mxf_parse_handle_essence(mxf) <= 0)
3708 } else if (mxf_is_partition_pack_key(klv.key) && mxf->current_partition) {
3710 if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
3712 else if (mxf->parsing_backward)
3719 if ((ret = mxf_parse_klv(mxf, klv, metadata->read, metadata->ctx_size, metadata->type)) < 0)
3739 if ((ret = mxf_parse_structural_metadata(mxf)) < 0)
3743 mxf_handle_missing_index_segment(mxf, s->streams[i]);
3745 if ((ret = mxf_compute_index_tables(mxf)) < 0)
3748 if (mxf->nb_index_tables > 1) {
3750 av_log(mxf->fc, AV_LOG_INFO, "got %i index tables - only the first one (IndexSID %i) will be used\n",
3751 mxf->nb_index_tables, mxf->index_tables[0].index_sid);
3752 } else if (mxf->nb_index_tables == 0 && mxf->op == OPAtom && (s->error_recognition & AV_EF_EXPLODE)) {
3753 av_log(mxf->fc, AV_LOG_ERROR, "cannot demux OPAtom without an index\n");
3760 mxf_compute_edit_units_per_packet(mxf, s->streams[i]);
3766 static int mxf_get_next_track_edit_unit(MXFContext *mxf, MXFTrack *track, int64_t current_offset, int64_t *edit_unit_out)
3769 MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3779 if (mxf_edit_unit_absolute_offset(mxf, t, m, track->edit_rate, NULL, &offset, NULL, 0) < 0)
3792 static int64_t mxf_compute_sample_count(MXFContext *mxf, AVStream *st,
3809 av_log(mxf->fc, AV_LOG_WARNING,
3823 static int64_t mxf_set_current_edit_unit(MXFContext *mxf, AVStream *st, int64_t current_offset, int resync)
3829 MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3834 if (mxf_edit_unit_absolute_offset(mxf, t, edit_unit + track->edit_units_per_packet, track->edit_rate, NULL, &next_ofs, NULL, 0) < 0 &&
3835 (next_ofs = mxf_essence_container_end(mxf, t->body_sid)) <= 0) {
3836 av_log(mxf->fc, AV_LOG_ERROR, "unable to compute the size of the last packet\n");
3845 av_log(mxf->fc, AV_LOG_ERROR, "cannot find current edit unit for stream %d, invalid index?\n", st->index);
3849 if (mxf_get_next_track_edit_unit(mxf, track, current_offset + 1, &new_edit_unit) < 0 || new_edit_unit <= 0) {
3850 av_log(mxf->fc, AV_LOG_ERROR, "failed to find next track edit unit in stream %d\n", st->index);
3855 track->sample_count = mxf_compute_sample_count(mxf, st, new_edit_unit);
3856 av_log(mxf->fc, AV_LOG_WARNING, "edit unit sync lost on stream %d, jumping from %"PRId64" to %"PRId64"\n", st->index, edit_unit, new_edit_unit);
3858 return mxf_set_current_edit_unit(mxf, st, current_offset, 0);
3861 static int mxf_set_audio_pts(MXFContext *mxf, AVCodecParameters *par,
3864 AVStream *st = mxf->fc->streams[pkt->stream_index];
3876 track->sample_count = mxf_compute_sample_count(mxf, st, av_rescale_q(track->sample_count, st->time_base, av_inv_q(track->edit_rate)) + 1);
3883 static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt)
3890 MXFIndexTable *t = mxf_find_index_table(mxf, track->index_sid);
3902 int ret = mxf_set_audio_pts(mxf, par, pkt);
3916 MXFContext *mxf = s->priv_data;
3923 if (pos < mxf->current_klv_data.next_klv - mxf->current_klv_data.length || pos >= mxf->current_klv_data.next_klv) {
3924 mxf->current_klv_data = (KLVPacket){{0}};
3925 ret = klv_read_packet(mxf, &klv, s->pb);
3941 klv = mxf->current_klv_data;
3947 int body_sid = find_body_sid_by_absolute_offset(mxf, klv.offset);
3966 next_ofs = mxf_set_current_edit_unit(mxf, st, pos, 1);
3981 mxf->current_klv_data = (KLVPacket){{0}};
3989 mxf->current_klv_data = klv;
4001 mxf->current_klv_data = (KLVPacket){{0}};
4004 } else if (mxf->eia608_extract &&
4008 mxf->current_klv_data = (KLVPacket){{0}};
4014 mxf->current_klv_data = (KLVPacket){{0}};
4021 ret = mxf_set_pts(mxf, st, pkt);
4023 mxf->current_klv_data = (KLVPacket){{0}};
4034 mxf->current_klv_data = (KLVPacket){{0}};
4042 MXFContext *mxf = s->priv_data;
4045 av_freep(&mxf->packages_refs);
4046 av_freep(&mxf->essence_container_data_refs);
4051 for (i = 0; i < mxf->metadata_sets_count; i++) {
4052 mxf_free_metadataset(mxf->metadata_sets + i, 1);
4054 mxf->metadata_sets_count = 0;
4055 av_freep(&mxf->partitions);
4056 av_freep(&mxf->metadata_sets);
4057 av_freep(&mxf->aesc);
4058 av_freep(&mxf->local_tags);
4060 if (mxf->index_tables) {
4061 for (i = 0; i < mxf->nb_index_tables; i++) {
4062 av_freep(&mxf->index_tables[i].segments);
4063 av_freep(&mxf->index_tables[i].ptses);
4064 av_freep(&mxf->index_tables[i].fake_index);
4065 av_freep(&mxf->index_tables[i].offsets);
4068 av_freep(&mxf->index_tables);
4104 MXFContext* mxf = s->priv_data;
4118 if (mxf->nb_index_tables <= 0) {
4130 mxf->current_klv_data = (KLVPacket){{0}};
4134 t = &mxf->index_tables[0];
4177 av_log(mxf->fc, AV_LOG_WARNING, "attempted seek in an UnknownWrapped essence\n");
4179 if ((ret = mxf_edit_unit_absolute_offset(mxf, t, sample_time, source_track->edit_rate, &sample_time, &seekpos, &partition, 1)) < 0)
4186 av_log(mxf->fc, AV_LOG_ERROR, "attempted seek out of clip wrapped KLV\n");
4189 mxf->current_klv_data = klv;
4191 mxf->current_klv_data = (KLVPacket){{0}};
4203 mxf_get_next_track_edit_unit(mxf, cur_track, seekpos, &track_edit_unit);
4204 cur_track->sample_count = mxf_compute_sample_count(mxf, cur_st, track_edit_unit);
4218 .class_name = "mxf",
4226 .name = "mxf",