|
|
|
@@ -1508,6 +1508,32 @@ static MXFPackage* mxf_resolve_source_package(MXFContext *mxf, UID package_uid) |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
static MXFDescriptor* mxf_resolve_multidescriptor(MXFContext *mxf, MXFDescriptor *descriptor, int track_id) |
|
|
|
{ |
|
|
|
MXFDescriptor *sub_descriptor = NULL; |
|
|
|
int i; |
|
|
|
|
|
|
|
if (!descriptor) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
if (descriptor->type == MultipleDescriptor) { |
|
|
|
for (i = 0; i < descriptor->sub_descriptors_count; i++) { |
|
|
|
sub_descriptor = mxf_resolve_strong_ref(mxf, &descriptor->sub_descriptors_refs[i], Descriptor); |
|
|
|
|
|
|
|
if (!sub_descriptor) { |
|
|
|
av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n"); |
|
|
|
continue; |
|
|
|
} |
|
|
|
if (sub_descriptor->linked_track_id == track_id) { |
|
|
|
return sub_descriptor; |
|
|
|
} |
|
|
|
} |
|
|
|
} else if (descriptor->type == Descriptor) |
|
|
|
return descriptor; |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, MXFEssenceGroup *essence_group) |
|
|
|
{ |
|
|
|
MXFStructuralComponent *component = NULL; |
|
|
|
@@ -1529,12 +1555,8 @@ static MXFStructuralComponent* mxf_resolve_essence_group_choice(MXFContext *mxf, |
|
|
|
continue; |
|
|
|
|
|
|
|
descriptor = mxf_resolve_strong_ref(mxf, &package->descriptor_ref, Descriptor); |
|
|
|
if (descriptor){ |
|
|
|
/* HACK: force the duration of the component to match the duration of the descriptor */ |
|
|
|
if (descriptor->duration != AV_NOPTS_VALUE) |
|
|
|
component->duration = descriptor->duration; |
|
|
|
if (descriptor) |
|
|
|
return component; |
|
|
|
} |
|
|
|
} |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
@@ -1735,7 +1757,17 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) |
|
|
|
} |
|
|
|
st->id = source_track->track_id; |
|
|
|
st->priv_data = source_track; |
|
|
|
source_track->original_duration = st->duration = component->duration; |
|
|
|
|
|
|
|
source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType); |
|
|
|
descriptor = mxf_resolve_multidescriptor(mxf, source_package->descriptor, source_track->track_id); |
|
|
|
|
|
|
|
/* A SourceClip from a EssenceGroup may only be a single frame of essence data. The clips duration is then how many |
|
|
|
* frames its suppose to repeat for. Descriptor->duration, if present, contains the real duration of the essence data */ |
|
|
|
if (descriptor && descriptor->duration != AV_NOPTS_VALUE) |
|
|
|
source_track->original_duration = st->duration = FFMIN(descriptor->duration, component->duration); |
|
|
|
else |
|
|
|
source_track->original_duration = st->duration = component->duration; |
|
|
|
|
|
|
|
if (st->duration == -1) |
|
|
|
st->duration = AV_NOPTS_VALUE; |
|
|
|
st->start_time = component->start_position; |
|
|
|
@@ -1758,24 +1790,6 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) |
|
|
|
codec_ul = mxf_get_codec_ul(ff_mxf_data_definition_uls, &source_track->sequence->data_definition_ul); |
|
|
|
st->codec->codec_type = codec_ul->id; |
|
|
|
|
|
|
|
source_package->descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor_ref, AnyType); |
|
|
|
if (source_package->descriptor) { |
|
|
|
if (source_package->descriptor->type == MultipleDescriptor) { |
|
|
|
for (j = 0; j < source_package->descriptor->sub_descriptors_count; j++) { |
|
|
|
MXFDescriptor *sub_descriptor = mxf_resolve_strong_ref(mxf, &source_package->descriptor->sub_descriptors_refs[j], Descriptor); |
|
|
|
|
|
|
|
if (!sub_descriptor) { |
|
|
|
av_log(mxf->fc, AV_LOG_ERROR, "could not resolve sub descriptor strong ref\n"); |
|
|
|
continue; |
|
|
|
} |
|
|
|
if (sub_descriptor->linked_track_id == source_track->track_id) { |
|
|
|
descriptor = sub_descriptor; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} else if (source_package->descriptor->type == Descriptor) |
|
|
|
descriptor = source_package->descriptor; |
|
|
|
} |
|
|
|
if (!descriptor) { |
|
|
|
av_log(mxf->fc, AV_LOG_INFO, "source track %d: stream %d, no descriptor found\n", source_track->track_id, st->index); |
|
|
|
continue; |
|
|
|
|