From 16d4bd6cc1a7f212e480adc85d98fb5226db2539 Mon Sep 17 00:00:00 2001 From: Freeson Wang Date: Tue, 21 May 2019 16:32:04 -0700 Subject: [PATCH 1/2] To get the edit rate, look at the first child, not the first clip. This is necessary for tracks with all gaps --- opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py b/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py index 661a4d81a2..9e283d3747 100644 --- a/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py +++ b/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py @@ -273,7 +273,7 @@ def __init__(self, root_file_transcriber, otio_track): self.compositionmob = root_file_transcriber.compositionmob self.aaf_file = root_file_transcriber.aaf_file self.otio_track = otio_track - self.edit_rate = next(self.otio_track.each_clip()).duration().rate + self.edit_rate = next(self.otio_track.each_child()).duration().rate self.timeline_mobslot, self.sequence = self._create_timeline_mobslot() self.timeline_mobslot.name = self.otio_track.name From 39a64c2dfecd6b96d80bb4b2852e6410d37fe7cb Mon Sep 17 00:00:00 2001 From: Freeson Wang Date: Wed, 22 May 2019 16:15:09 -0700 Subject: [PATCH 2/2] Adding a test for just gaps.otio file --- .../adapters/tests/sample_data/gaps.otio | 118 ++++++++++++++++++ .../adapters/tests/test_aaf_adapter.py | 11 +- 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 opentimelineio_contrib/adapters/tests/sample_data/gaps.otio diff --git a/opentimelineio_contrib/adapters/tests/sample_data/gaps.otio b/opentimelineio_contrib/adapters/tests/sample_data/gaps.otio new file mode 100644 index 0000000000..caa9776165 --- /dev/null +++ b/opentimelineio_contrib/adapters/tests/sample_data/gaps.otio @@ -0,0 +1,118 @@ +{ + "OTIO_SCHEMA": "Timeline.1", + "global_start_time": null, + "metadata": {}, + "name": "gaps", + "tracks": { + "OTIO_SCHEMA": "Stack.1", + "children": [ + { + "OTIO_SCHEMA": "Track.1", + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "effects": [], + "markers": [], + "metadata": {}, + "name": "gap", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 60 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0 + } + } + } + ], + "effects": [], + "kind": "Video", + "markers": [], + "metadata": {}, + "name": null, + "source_range": null + }, + { + "OTIO_SCHEMA": "Track.1", + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "effects": [], + "markers": [], + "metadata": {}, + "name": "gap", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 600 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0 + } + } + }, + { + "OTIO_SCHEMA": "Gap.1", + "effects": [], + "markers": [], + "metadata": {}, + "name": "gap", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 480 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0 + } + } + }, + { + "OTIO_SCHEMA": "Gap.1", + "effects": [], + "markers": [], + "metadata": {}, + "name": "gap", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 300 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0 + } + } + } + ], + "effects": [], + "kind": "Video", + "markers": [], + "metadata": {}, + "name": null, + "source_range": null + } + ], + "effects": [], + "markers": [], + "metadata": {}, + "name": "tracks", + "source_range": null + } +} \ No newline at end of file diff --git a/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py b/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py index 0b0fb21561..980030170f 100644 --- a/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py +++ b/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py @@ -126,7 +126,10 @@ SAMPLE_DATA_DIR, "multiple_top_level_mobs.aaf" ) - +GAPS_OTIO_PATH = os.path.join( + SAMPLE_DATA_DIR, + "gaps.otio" +) try: lib_path = os.environ.get("OTIO_AAF_PYTHON_LIB") @@ -807,6 +810,12 @@ def test_multiple_top_level_mobs(self): class AAFWriterTests(unittest.TestCase): + def test_aaf_writer_gaps(self): + otio_timeline = otio.adapters.read_from_file(GAPS_OTIO_PATH) + fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') + otio.adapters.write_to_file(otio_timeline, tmp_aaf_path) + self._verify_aaf(tmp_aaf_path) + def test_aaf_writer_simple(self): self._verify_aaf(SIMPLE_EXAMPLE_PATH)