OpenTimelineIO
OpenTimelineIO copied to clipboard
Sequence returned <class 'aaf2.components.Sequence'> not implemented
Feature Request
- [x] New Feature
- [ ] Change Existing Behavior
Description
This sequence from Avid MCP seems to contain something that the aaf parser currently is not prepared for: SEQUENCE 2.zip
Context
To reproduce the issue, just try to open the sequence in otioview, it should fail after some seconds. otioview "E:\Downloads\COMPLEX SEQUENCE 2.aaf"
File "c:\users\emcodem\appdata\local\programs\python\python38\lib\site-packages\opentimelineio_contrib\adapters\advanced_authoring_format.py", line 130, in _find_timecode_mobs
File "c:\users\emcodem\appdata\local\programs\python\python38\lib\site-packages\aaf2\components.py", line 204, in walk
NotImplementedError: Sequence returned <class 'aaf2.components.Sequence'> not implemented
Hi all, I'm having the same issue here, with a different file (I'll check if I can share it and I'll update the comment eventually). I don't think it's coming from OTIO, it seems to be caused by the aaf2 module.
Here's the full traceback, for reference:
NotImplementedError Traceback (most recent call last)
<ipython-input-4-e11a35ebd11b> in <module>()
----> 1 timeline = otio.adapters.read_from_file(file_path)
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio/adapters/__init__.pyc in read_from_file(filepath, adapter_name, media_linker_name, media_linker_argument_map, **adapter_argument_map)
142 media_linker_name=media_linker_name,
143 media_linker_argument_map=media_linker_argument_map,
--> 144 **adapter_argument_map
145 )
146
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio/adapters/adapter.pyc in read_from_file(self, filepath, media_linker_name, media_linker_argument_map, hook_function_argument_map, **adapter_argument_map)
145 "read_from_file",
146 filepath=filepath,
--> 147 **adapter_argument_map
148 )
149
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio/plugins/python_plugin.pyc in _execute_function(self, func_name, **kwargs)
172 "Sorry, {} doesn't support {}.".format(self.name, func_name)
173 )
--> 174 return (getattr(self.module(), func_name)(**kwargs))
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in read_from_file(filepath, simplify, transcribe_log)
1149
1150 # Transcribe just the top-level mobs
-> 1151 result = _transcribe(top, parents=list(), edit_rate=None)
1152
1153 # AAF is typically more deeply nested than OTIO.
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe(item, parents, edit_rate, indent)
564 result = otio.schema.SerializableCollection()
565 for child in item:
--> 566 result.append(_transcribe(child, parents + [item], edit_rate, indent + 2))
567 else:
568 # For everything else, we just ignore it.
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe(item, parents, edit_rate, indent)
249
250 for slot in item.slots:
--> 251 track = _transcribe(slot, parents + [item], edit_rate, indent + 2)
252 _add_child(result.tracks, track, slot)
253
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe(item, parents, edit_rate, indent)
450 result = otio.schema.Track()
451
--> 452 child = _transcribe(item.segment, parents + [item], edit_rate, indent + 2)
453
454 _add_child(result, child, item.segment)
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe(item, parents, edit_rate, indent)
427
428 for slot in item.slots:
--> 429 child = _transcribe(slot, parents + [item], edit_rate, indent + 2)
430 _add_child(result, child, slot)
431
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe(item, parents, edit_rate, indent)
436
437 for component in item.components:
--> 438 child = _transcribe(component, parents + [item], edit_rate, indent + 2)
439 _add_child(result, child, component)
440
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe(item, parents, edit_rate, indent)
443 _transcribe_log(msg, indent)
444 result = _transcribe_operation_group(item, parents, metadata,
--> 445 edit_rate, indent + 2)
446
447 elif isinstance(item, aaf2.mobslots.TimelineMobSlot):
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe_operation_group(item, parents, metadata, edit_rate, indent)
891
892 for segment in item.getvalue("InputSegments"):
--> 893 child = _transcribe(segment, parents + [item], edit_rate, indent)
894 if child:
895 _add_child(result, child, segment)
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _transcribe(item, parents, edit_rate, indent)
264
265 # Evidently the last mob is the one with the timecode
--> 266 mobs = _find_timecode_mobs(item)
267
268 # Get the Timecode start and length values
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/opentimelineio_contrib/adapters/advanced_authoring_format.pyc in _find_timecode_mobs(item)
132 mobs = [item.mob]
133
--> 134 for c in item.walk():
135 if isinstance(c, aaf2.components.SourceClip):
136 mob = c.mob
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/aaf2/components.pyc in walk(self)
188 if isinstance(segment, SourceClip):
189 yield segment
--> 190 for item in segment.walk():
191 yield item
192
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/aaf2/components.pyc in walk(self)
188 if isinstance(segment, SourceClip):
189 yield segment
--> 190 for item in segment.walk():
191 yield item
192
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/aaf2/components.pyc in walk(self)
188 if isinstance(segment, SourceClip):
189 yield segment
--> 190 for item in segment.walk():
191 yield item
192
/Users/vvzen/miniconda2/envs/otio/lib/python2.7/site-packages/aaf2/components.pyc in walk(self)
204 raise NotImplementedError("Sequence returned {} not "
205 "implemented".format(
--> 206 type(segment)))
207
208 elif isinstance(segment, EssenceGroup):
NotImplementedError: Sequence returned <class 'aaf2.components.Sequence'> not implemented
Any headway made with this?
I'm on a macOS 10.14.6, python 3.10.9, otio 0.15.0 and pyaf2 1.6.0. Having the same issue.
I'm exporting test AAFs from Avid 2018.12.15. I've tried with/without edit protocol and with/without ProTools compatibility on AAF export. I've tried flattening multicams, minimizing as far down as one clip in one track. Tried both audio and video.
Referring this over to https://github.com/OpenTimelineIO/otio-aaf-adapter - all new development on the AAF adapter is being done there.