diff --git a/crates/aaf/src/aaf/read.rs b/crates/aaf/src/aaf/read.rs index e565f0eaa..31c841c5d 100644 --- a/crates/aaf/src/aaf/read.rs +++ b/crates/aaf/src/aaf/read.rs @@ -386,8 +386,9 @@ impl R<'_> { fn clip(&mut self, c: &Obj, rate: (i64, i64), kind: CKind, master_key: Option) -> CItem { let len = units_to_ticks(len_of(c), rate.0, rate.1); - let name = tagged_values(c, pid::COMPONENT_USER_COMMENTS).into_iter().find(|(k, _)| k == "Clip Name").map(|(_, v)| v).unwrap_or_default(); + let tagged_name = tagged_values(c, pid::COMPONENT_USER_COMMENTS).into_iter().find(|(k, _)| k == "Clip Name").map(|(_, v)| v); let (Some(id), Some(slot)) = (c.mob_id(pid::SOURCE_ID), c.u32(pid::SOURCE_MOB_SLOT_ID)) else { return CItem::Filler(len) }; + let name = tagged_name.or_else(|| self.mobs.get(&id).and_then(|mob| mob.string(pid::MOB_NAME))).unwrap_or_default(); if id == [0; 32] { return CItem::Filler(len); } diff --git a/crates/aaf/src/aaf/tests.rs b/crates/aaf/src/aaf/tests.rs index 315f84250..3e7794471 100644 --- a/crates/aaf/src/aaf/tests.rs +++ b/crates/aaf/src/aaf/tests.rs @@ -473,6 +473,32 @@ fn audio_tracks_keep_their_names() { } } +#[test] +fn unnamed_source_clip_uses_the_referenced_master_name() { + let mut doc = crate::testdoc::sound_only(None); + let name = doc.sources[0].name.clone(); + for item in &mut doc.compositions[0].tracks[0].items { + if let CItem::Clip(clip) = item { + clip.name = name.clone(); + } + } + let mut root = store::read(&written(&doc, false)).unwrap(); + let content = strong_mut(strong_mut(&mut root, pid::ROOT_HEADER), pid::CONTENT); + let master = objs_mut(content, pid::MOBS).iter_mut().find(|m| m.class == cls::MASTER_MOB).unwrap(); + master.set(pid::MOB_NAME, Value::Data(store::utf16z("Master edit"))); + let bytes = store::write(&root, craft_cfb::Version::V4).unwrap(); + let back = read_clean(&bytes); + let clip = back.compositions[0].tracks[0] + .items + .iter() + .find_map(|item| match item { + CItem::Clip(c) => Some(c), + _ => None, + }) + .unwrap(); + assert_eq!(clip.name, "Master edit"); +} + #[test] fn sound_source_offsets_use_audio_sample_rate_on_disk() { let doc = crate::testdoc::sound_only(None);