From cd8db59621ac57184253ba0be0b6c711854820cc Mon Sep 17 00:00:00 2001 From: Daniel Flehner Heen Date: Tue, 6 Dec 2022 00:11:26 +0100 Subject: [PATCH] Extracted CMX3600 adapter and related sample data and tests (#1487) * Removed the cmx_3600 adapter * Removed sample data only used by the cmx_3600 adapter * Add "extract_adapters" to CI triggers * otioz test called for an edl we removed. Replaced with an otio file * Converted screening_example.edl to screening_example.otio and used it in tests * Removed other adapter suffixes from plugin tests as they belong to adapters soon to be extracted * Autogenerated docs for CMX3600 removed Signed-off-by: apetrynet Signed-off-by: Eric Reinecke --- .../adapters/tests/test_maya_sequencer.py | 2 +- docs/tutorials/otio-plugins.md | 50 - .../builtin_adapters.plugin_manifest.json | 6 - .../opentimelineio/adapters/cmx_3600.py | 1395 ----------------- tests/sample_data/25fps.edl | 15 - tests/sample_data/avid_example.edl | 7 - tests/sample_data/cdl.edl | 13 - tests/sample_data/dissolve_test.edl | 11 - tests/sample_data/dissolve_test_2.edl | 11 - tests/sample_data/dissolve_test_3.edl | 15 - tests/sample_data/dissolve_test_4.edl | 12 - tests/sample_data/enabled.otio | 175 --- tests/sample_data/gap_test.edl | 8 - tests/sample_data/multi_audio.edl | 6 - tests/sample_data/no_spaces_test.edl | 33 - tests/sample_data/nucoda_example.edl | 7 - tests/sample_data/premiere_example.edl | 5 - tests/sample_data/screening_example.edl | 41 - tests/sample_data/screening_example.otio | 455 ++++++ tests/sample_data/speed_effects.edl | 1121 ------------- tests/sample_data/speed_effects_small.edl | 17 - tests/sample_data/timecode_mismatch.edl | 63 - tests/sample_data/transition_duration.edl | 8 - tests/sample_data/wipe_test.edl | 10 - tests/test_builtin_adapters.py | 2 +- tests/test_cdl.py | 119 -- tests/test_cmx_3600_adapter.py | 1330 ---------------- tests/test_console.py | 7 +- tests/test_examples.py | 5 +- tests/test_otiod.py | 2 +- tests/test_otioz.py | 2 +- tests/test_url_conversions.py | 2 +- 32 files changed, 466 insertions(+), 4489 deletions(-) delete mode 100644 src/py-opentimelineio/opentimelineio/adapters/cmx_3600.py delete mode 100755 tests/sample_data/25fps.edl delete mode 100644 tests/sample_data/avid_example.edl delete mode 100644 tests/sample_data/cdl.edl delete mode 100644 tests/sample_data/dissolve_test.edl delete mode 100644 tests/sample_data/dissolve_test_2.edl delete mode 100644 tests/sample_data/dissolve_test_3.edl delete mode 100644 tests/sample_data/dissolve_test_4.edl delete mode 100644 tests/sample_data/enabled.otio delete mode 100644 tests/sample_data/gap_test.edl delete mode 100644 tests/sample_data/multi_audio.edl delete mode 100644 tests/sample_data/no_spaces_test.edl delete mode 100644 tests/sample_data/nucoda_example.edl delete mode 100644 tests/sample_data/premiere_example.edl delete mode 100644 tests/sample_data/screening_example.edl create mode 100644 tests/sample_data/screening_example.otio delete mode 100644 tests/sample_data/speed_effects.edl delete mode 100644 tests/sample_data/speed_effects_small.edl delete mode 100644 tests/sample_data/timecode_mismatch.edl delete mode 100644 tests/sample_data/transition_duration.edl delete mode 100644 tests/sample_data/wipe_test.edl delete mode 100755 tests/test_cdl.py delete mode 100755 tests/test_cmx_3600_adapter.py diff --git a/contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py b/contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py index d0414d781..f1c08b6b7 100644 --- a/contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py +++ b/contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py @@ -10,7 +10,7 @@ import opentimelineio as otio SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.edl") +SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.otio") BASELINE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.ma") SETATTR_TO_CHECK = (".ef", ".sf", ".sn", ".se", ".ssf") diff --git a/docs/tutorials/otio-plugins.md b/docs/tutorials/otio-plugins.md index 924de10d8..66b232734 100644 --- a/docs/tutorials/otio-plugins.md +++ b/docs/tutorials/otio-plugins.md @@ -33,56 +33,6 @@ Adapter plugins convert to and from OpenTimelineIO. [Tutorial on how to write an adapter](write-an-adapter). -### cmx_3600 - -``` -OpenTimelineIO CMX 3600 EDL Adapter -``` - -*source*: `opentimelineio/adapters/cmx_3600.py` - - -*Supported Features (with arguments)*: - -- read_from_string: -``` -Reads a CMX Edit Decision List (EDL) from a string. - Since EDLs don't contain metadata specifying the rate they are meant - for, you may need to specify the rate parameter (default is 24). - By default, read_from_string will throw an exception if it discovers - invalid timecode in the EDL. For example, if a clip's record timecode - overlaps with the previous cut. Since this is a common mistake in - many EDLs, you can specify ignore_timecode_mismatch=True, which will - supress these errors and attempt to guess at the correct record - timecode based on the source timecode and adjacent cuts. - For best results, you may wish to do something like this: - - Example: - >>> try: - ... timeline = otio.adapters.read_from_string("mymovie.edl", rate=30) - ... except EDLParseError: - ... print('Log a warning here') - ... try: - ... timeline = otio.adapters.read_from_string( - ... "mymovie.edl", - ... rate=30, - ... ignore_timecode_mismatch=True) - ... except EDLParseError: - ... print('Log an error here') -``` - - input_str - - rate - - ignore_timecode_mismatch -- write_to_string: - - input_otio - - rate - - style - - reelname_len - - - - - ### fcp_xml ``` diff --git a/src/py-opentimelineio/opentimelineio/adapters/builtin_adapters.plugin_manifest.json b/src/py-opentimelineio/opentimelineio/adapters/builtin_adapters.plugin_manifest.json index 2614e36b8..ca23a913e 100644 --- a/src/py-opentimelineio/opentimelineio/adapters/builtin_adapters.plugin_manifest.json +++ b/src/py-opentimelineio/opentimelineio/adapters/builtin_adapters.plugin_manifest.json @@ -25,12 +25,6 @@ "filepath" : "otiod.py", "suffixes" : ["otiod"] }, - { - "OTIO_SCHEMA" : "Adapter.1", - "name" : "cmx_3600", - "filepath" : "cmx_3600.py", - "suffixes" : ["edl"] - }, { "OTIO_SCHEMA" : "Adapter.1", "name" : "svg", diff --git a/src/py-opentimelineio/opentimelineio/adapters/cmx_3600.py b/src/py-opentimelineio/opentimelineio/adapters/cmx_3600.py deleted file mode 100644 index de5df07c4..000000000 --- a/src/py-opentimelineio/opentimelineio/adapters/cmx_3600.py +++ /dev/null @@ -1,1395 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""OpenTimelineIO CMX 3600 EDL Adapter""" - -# Note: this adapter is not an ideal model for new adapters, but it works. -# If you want to write your own adapter, please see: -# https://opentimelineio.readthedocs.io/en/latest/tutorials/write-an-adapter.html# - -# TODO: Flesh out Attribute Handler -# TODO: Add line numbers to errors and warnings -# TODO: currently tracks with linked audio/video will lose their linkage when -# read into OTIO. - -import copy -import os -import re -import collections - -from .. import ( - exceptions, - schema, - opentime, -) - - -class EDLParseError(exceptions.OTIOError): - pass - - -# regex for parsing the playback speed of an M2 event -SPEED_EFFECT_RE = re.compile( - r"(?P.*?)\s*(?P-?[0-9\.]*)\s*(?P[0-9:]{11})$" -) - - -# these are all CMX_3600 transition codes -# the wipe is written in regex format because it is W### where the ### is -# a 'wipe code' -# @TODO: not currently read by the transition code -transition_regex_map = { - 'C': 'cut', - 'D': 'dissolve', - r'W\d{3}': 'wipe', - 'KB': 'key_background', - 'K': 'key_foreground', - 'KO': 'key_overlay' -} - -# CMX_3600 supports some shorthand for channel assignments -# We name the actual tracks V and A1,A2,A3,etc. -# This channel_map tells you which track to use for each channel shorthand. -# Channels not listed here are used as track names verbatim. -channel_map = { - 'A': ['A1'], - 'AA': ['A1', 'A2'], - 'B': ['V', 'A1'], - 'A2/V': ['V', 'A2'], - 'AA/V': ['V', 'A1', 'A2'] -} - - -# Currently, the 'style' argument determines -# the comment string for the media reference: -# 'avid': '* FROM CLIP:' (default) -# 'nucoda': '* FROM FILE:' -# 'premiere': None (If Adobe Premiere imports an EDL that uses -# a "FROM" comment will result in the clips -# being named UNKNOWN instead of using the reel or file name) -# When adding a new style, please be sure to add sufficient tests -# to verify both the new and existing styles. -VALID_EDL_STYLES = { - 'avid': 'CLIP', - 'nucoda': 'FILE', - 'premiere': None, -} - - -def _extend_source_range_duration(obj, duration): - obj.source_range = obj.source_range.duration_extended_by(duration) - - -class EDLParser: - def __init__(self, edl_string, rate=24, ignore_timecode_mismatch=False): - self.timeline = schema.Timeline() - - # Start with no tracks. They will be added as we encounter them. - # This dict maps a track name (e.g "A2" or "V") to an OTIO Track. - self.tracks_by_name = {} - - self.ignore_timecode_mismatch = ignore_timecode_mismatch - - self.parse_edl(edl_string, rate=rate) - - # TODO: Sort the tracks V, then A1,A2,etc. - - def add_clip(self, line, comments, rate=24, transition_line=None): - comment_handler = CommentHandler(comments) - clip_handler = ClipHandler( - line, - comment_handler.handled, - rate=rate, - transition_line=transition_line - ) - clip = clip_handler.clip - transition = clip_handler.transition - # Add unhandled comments as general comments to meta data. - if comment_handler.unhandled: - clip.metadata.setdefault("cmx_3600", {}) - clip.metadata['cmx_3600'].setdefault("comments", []) - clip.metadata['cmx_3600']['comments'] += ( - comment_handler.unhandled - ) - - # Add reel name to metadata - # A reel name of `AX` represents an unknown or auxilary source - # We don't currently track these sources outside of this adapter - # So lets skip adding AX reels as metadata for now, - # as that would dirty json outputs with non-relevant information - if clip_handler.reel and clip_handler.reel != 'AX': - clip.metadata.setdefault("cmx_3600", {}) - clip.metadata['cmx_3600']['reel'] = clip_handler.reel - - edl_rate = clip_handler.edl_rate - record_in = opentime.from_timecode( - clip_handler.record_tc_in, - edl_rate - ) - record_out = opentime.from_timecode( - clip_handler.record_tc_out, - edl_rate - ) - - src_duration = clip.duration() - rec_duration = record_out - record_in - if rec_duration != src_duration: - motion = comment_handler.handled.get('motion_effect') - freeze = comment_handler.handled.get('freeze_frame') - if motion is not None or freeze is not None: - # Adjust the clip to match the record duration - clip.source_range = opentime.TimeRange( - start_time=clip.source_range.start_time, - duration=rec_duration - ) - - if freeze is not None: - clip.effects.append(schema.FreezeFrame()) - # XXX remove 'FF' suffix (writing edl will add it back) - if clip.name.endswith(' FF'): - clip.name = clip.name[:-3] - elif motion is not None: - fps = float( - SPEED_EFFECT_RE.match(motion).group("speed") - ) - time_scalar = fps / rate - clip.effects.append( - schema.LinearTimeWarp(time_scalar=time_scalar) - ) - - elif self.ignore_timecode_mismatch: - # Pretend there was no problem by adjusting the record_out. - # Note that we don't actually use record_out after this - # point in the code, since all of the subsequent math uses - # the clip's source_range. Adjusting the record_out is - # just to document what the implications of ignoring the - # mismatch here entails. - record_out = record_in + src_duration - - else: - raise EDLParseError( - "Source and record duration don't match: {} != {}" - " for clip {}".format( - src_duration, - rec_duration, - clip.name - )) - - # Add clip instances to the tracks - tracks = self.tracks_for_channel(clip_handler.channel_code) - for track in tracks: - track_transition = transition - if len(tracks) > 1: - track_clip = copy.deepcopy(clip) - if transition: - track_transition = copy.deepcopy(transition) - else: - track_clip = clip - - if track.source_range is None: - zero = opentime.RationalTime(0, edl_rate) - track.source_range = opentime.TimeRange( - start_time=zero - record_in, - duration=zero - ) - - track_end = track.duration() - track.source_range.start_time - if record_in < track_end: - if self.ignore_timecode_mismatch: - # shift it over - record_in = track_end - record_out = record_in + rec_duration - else: - raise EDLParseError( - "Overlapping record in value: {} for clip {}".format( - clip_handler.record_tc_in, - track_clip.name - )) - - # If the next clip is supposed to start beyond the end of the - # clips we've accumulated so far, then we need to add a Gap - # to fill that space. This can happen when an EDL has record - # timecodes that are sparse (e.g. from a single track of a - # multi-track composition). - if record_in > track_end and len(track) > 0: - gap = schema.Gap() - gap.source_range = opentime.TimeRange( - start_time=opentime.RationalTime(0, edl_rate), - duration=record_in - track_end - ) - track.append(gap) - _extend_source_range_duration(track, gap.duration()) - - if track_transition: - if len(track) < 1: - raise EDLParseError( - "Transitions can't be at the very beginning of a track" - ) - track.append(track_transition) - track.append(track_clip) - _extend_source_range_duration(track, track_clip.duration()) - - def guess_kind_for_track_name(self, name): - if name.startswith("V"): - return schema.TrackKind.Video - if name.startswith("A"): - return schema.TrackKind.Audio - return schema.TrackKind.Video - - def tracks_for_channel(self, channel_code): - # Expand channel shorthand into a list of track names. - if channel_code in channel_map: - track_names = channel_map[channel_code] - else: - track_names = [channel_code] - - # Create any channels we don't already have - for track_name in track_names: - if track_name not in self.tracks_by_name: - track = schema.Track( - name=track_name, - kind=self.guess_kind_for_track_name(track_name) - ) - self.tracks_by_name[track_name] = track - self.timeline.tracks.append(track) - - # Return a list of actual tracks - return [self.tracks_by_name[c] for c in track_names] - - def parse_edl(self, edl_string, rate=24): - # edl 'events' can be comprised of an indeterminate amount of lines - # we are to translating 'events' to a single clip and transition - # then we add the transition and the clip to all channels the 'event' - # channel code is mapped to the transition given in the 'event' - # precedes the clip - - # remove all blank lines from the edl - edl_lines = [ - line for line in - (line.strip() for line in edl_string.splitlines()) if line - ] - - while edl_lines: - # a basic for loop wont work cleanly since we need to look ahead at - # array elements to determine what type of 'event' we are looking - # at - line = edl_lines.pop(0) - - if line.startswith('TITLE:'): - # this is the first line of interest in an edl - # it is required to be in the header - self.timeline.name = line.replace('TITLE:', '').strip() - - elif line.startswith('FCM'): - # this can occur either in the header or before any 'event' - # in both cases we can ignore it since it is meant for tape - # timecode - pass - - elif line.startswith('SPLIT'): - # this is the only comment preceding an 'event' that we care - # about in our context it simply means the next two clips will - # have the same comment data it is for reading purposes only - audio_delay = None - video_delay = None - - if 'AUDIO DELAY' in line: - audio_delay = line.split()[-1].strip() - if 'VIDEO DELAY' in line: - video_delay = line.split()[-1].strip() - if audio_delay and video_delay: - raise EDLParseError( - 'both audio and video delay declared after SPLIT.' - ) - if not (audio_delay or video_delay): - raise EDLParseError( - 'either audio or video delay declared after SPLIT.' - ) - - line_1 = edl_lines.pop(0) - line_2 = edl_lines.pop(0) - # TODO: check if transitions can happen in this case - comments = [] - while edl_lines: - if re.match(r'^\D', edl_lines[0]): - comments.append(edl_lines.pop(0)) - else: - break - self.add_clip(line_1, comments, rate=rate) - self.add_clip(line_2, comments, rate=rate) - # Check if the first character in the line is a digit - elif line[0].isdigit(): - transition_line = None - # all 'events' start_time with an edit decision. this is - # denoted by the line beginning with a padded integer 000-999 - comments = [] - event_id = int(re.match(r'^\d+', line).group(0)) - while edl_lines: - # Any non-numbered lines after an edit decision should be - # treated as 'comments'. - # Comments are string tags used by the reader to get extra - # information not able to be found in the restricted edl - # format. - # If the current event id is repeated it means that there is - # a transition between the current event and the preceding - # one. We collect it and process it when adding the clip. - m = re.match(r'^\d+', edl_lines[0]) - if not m: - comments.append(edl_lines.pop(0)) - else: - if int(m.group(0)) == event_id: - # It is not possible to have multiple transitions - # for the same event. - if transition_line: - raise EDLParseError( - 'Invalid transition %s' % edl_lines[0] - ) - # Same event id, this is a transition - transition_line = edl_lines.pop(0) - else: - # New event, stop collecting comments and transitions - break - - self.add_clip( - line, - comments, - rate=rate, - transition_line=transition_line - ) - else: - raise EDLParseError('Unknown event type') - - for track in self.timeline.tracks: - # if the source_range is the same as the available_range - # then we don't need to set it at all. - if track.source_range == track.available_range(): - track.source_range = None - - -class ClipHandler: - # /path/filename.[1001-1020].ext - image_sequence_pattern = re.compile( - r'.*\.(?P\[(?P[0-9]+)-(?P[0-9]+)\])\.\w+$' - ) - - def __init__(self, line, comment_data, rate=24, transition_line=None): - self.clip_num = None - self.reel = None - self.channel_code = None - self.edl_rate = rate - self.transition_id = None - self.transition_data = None - self.transition_type = None - self.source_tc_in = None - self.source_tc_out = None - self.record_tc_in = None - self.record_tc_out = None - self.clip = None - self.transition = None - self.parse(line) - if transition_line: - self.parse(transition_line) - self.clip = self.make_clip(comment_data) - if transition_line: - self.transition = self.make_transition(comment_data) - - def is_image_sequence(self, comment_data): - return self.image_sequence_pattern.search( - comment_data['media_reference'] - ) is not None - - def create_imagesequence_reference(self, comment_data): - regex_obj = self.image_sequence_pattern.search( - comment_data['media_reference'] - ) - - path, basename = os.path.split(comment_data['media_reference']) - prefix, suffix = basename.split(regex_obj.group('range')) - ref = schema.ImageSequenceReference( - target_url_base=path, - name_prefix=prefix, - name_suffix=suffix, - rate=self.edl_rate, - start_frame=int(regex_obj.group('start')), - frame_zero_padding=len(regex_obj.group('start')), - available_range=opentime.range_from_start_end_time( - opentime.from_timecode(self.source_tc_in, self.edl_rate), - opentime.from_timecode(self.source_tc_out, self.edl_rate) - ) - ) - - return ref - - def make_clip(self, comment_data): - clip = schema.Clip() - clip.name = str(self.clip_num) - - # BLACK/BL and BARS are called out as "Special Source Identifiers" in - # the documents referenced here: - # https://github.com/AcademySoftwareFoundation/OpenTimelineIO#cmx3600-edl - if self.reel in ['BL', 'BLACK']: - clip.media_reference = schema.GeneratorReference() - # TODO: Replace with enum, once one exists - clip.media_reference.generator_kind = 'black' - elif self.reel == 'BARS': - clip.media_reference = schema.GeneratorReference() - # TODO: Replace with enum, once one exists - clip.media_reference.generator_kind = 'SMPTEBars' - elif 'media_reference' in comment_data: - if self.is_image_sequence(comment_data): - clip.media_reference = self.create_imagesequence_reference( - comment_data - ) - else: - clip.media_reference = schema.ExternalReference() - clip.media_reference.target_url = comment_data[ - 'media_reference' - ] - else: - clip.media_reference = schema.MissingReference() - - # this could currently break without a 'FROM CLIP' comment. - # Without that there is no 'media_reference' Do we have a default - # clip name? - if 'clip_name' in comment_data: - clip.name = comment_data["clip_name"] - elif ( - clip.media_reference and - hasattr(clip.media_reference, 'target_url') and - clip.media_reference.target_url is not None - ): - clip.name = os.path.splitext( - os.path.basename(clip.media_reference.target_url) - )[0] - - elif ( - clip.media_reference and - hasattr(clip.media_reference, 'target_url_base') and - clip.media_reference.target_url_base is not None - ): - clip.name = os.path.splitext( - os.path.basename(_get_image_sequence_url(clip)) - )[0] - - asc_sop = comment_data.get('asc_sop', None) - asc_sat = comment_data.get('asc_sat', None) - if asc_sop or asc_sat: - slope = (1, 1, 1) - offset = (0, 0, 0) - power = (1, 1, 1) - sat = 1.0 - - if asc_sop: - triple = r'([-+]?[\d.]+),? ([-+]?[\d.]+),? ([-+]?[\d.]+),?' - m = re.match( - r'\(' - + triple - + r'\)\s*\(' - + triple + r'\)\s*\(' - + triple + r'\)', - asc_sop - ) - if m: - floats = [float(g) for g in m.groups()] - slope = [floats[0], floats[1], floats[2]] - offset = [floats[3], floats[4], floats[5]] - power = [floats[6], floats[7], floats[8]] - else: - raise EDLParseError( - f'Invalid ASC_SOP found: {asc_sop}') - - if asc_sat: - sat = float(asc_sat) - - clip.metadata['cdl'] = { - 'asc_sat': sat, - 'asc_sop': { - 'slope': slope, - 'offset': offset, - 'power': power - } - } - - # Get the clip name from "TO CLIP NAME" if present - if 'dest_clip_name' in comment_data: - clip.name = comment_data['dest_clip_name'] - - if 'locators' in comment_data: - # An example EDL locator line looks like this: - # * LOC: 01:00:01:14 RED ANIM FIX NEEDED - # We get the part after "LOC: " as the comment_data entry - # Given the fixed-width nature of these, we could be more - # strict about the field widths, but there are many - # variations of EDL, so if we are lenient then maybe we - # can handle more of them? Only real-world testing will - # determine this for sure... - for locator in comment_data['locators']: - m = re.match( - r'(\d\d:\d\d:\d\d:\d\d)\s+(\w*)(\s+|$)(.*)', - locator - ) - if not m: - # TODO: Should we report this as a warning somehow? - continue - - marker = schema.Marker() - marker.marked_range = opentime.TimeRange( - start_time=opentime.from_timecode( - m.group(1), - self.edl_rate - ), - duration=opentime.RationalTime() - ) - - # always write the source value into metadata, in case it - # is not a valid enum somehow. - color_parsed_from_file = m.group(2) - - marker.metadata.update({ - "cmx_3600": { - "color": color_parsed_from_file - } - }) - - # @TODO: if it is a valid - if hasattr( - schema.MarkerColor, - color_parsed_from_file.upper() - ): - marker.color = color_parsed_from_file.upper() - else: - marker.color = schema.MarkerColor.RED - - marker.name = m.group(4) - clip.markers.append(marker) - - clip.source_range = opentime.range_from_start_end_time( - opentime.from_timecode(self.source_tc_in, self.edl_rate), - opentime.from_timecode(self.source_tc_out, self.edl_rate) - ) - - return clip - - def parse(self, line): - fields = tuple(e.strip() for e in line.split() if e.strip()) - field_count = len(fields) - - if field_count == 9: - # has transition data - # this is for edits with timing or other needed info - # transition data for D and W*** transitions is a n integer that - # denotes frame count - # i haven't figured out how the key transitions (K, KB, KO) work - ( - self.transition_id, - self.reel, - self.channel_code, - self.transition_type, - self.transition_data, - self.source_tc_in, - self.source_tc_out, - self.record_tc_in, - self.record_tc_out - ) = fields - - elif field_count == 8: - edit_type = None - # no transition data - # this is for basic cuts - ( - self.clip_num, - self.reel, - self.channel_code, - edit_type, - self.source_tc_in, - self.source_tc_out, - self.record_tc_in, - self.record_tc_out - ) = fields - # Double check it is a cut - if edit_type not in ["C"]: - raise EDLParseError( - 'incorrect edit type {} in form statement: {}'.format( - edit_type, line, - ) - ) - else: - raise EDLParseError( - 'incorrect number of fields [{}] in form statement: {}' - ''.format(field_count, line)) - - # Frame numbers (not just timecode) are ok - for prop in [ - 'source_tc_in', - 'source_tc_out', - 'record_tc_in', - 'record_tc_out' - ]: - if ':' not in getattr(self, prop): - setattr( - self, - prop, - opentime.to_timecode( - opentime.from_frames( - int(getattr(self, prop)), - self.edl_rate - ), - self.edl_rate - ) - ) - - def make_transition(self, comment_data): - # Do some sanity check - if not self.clip: - raise RuntimeError("Transitions can't be handled without a clip") - if self.transition_id != self.clip_num: - raise EDLParseError( - 'transition and event id mismatch: {} vs {}'.format( - self.transaction_id, self.clip_num, - ) - ) - if re.match(r'W(\d{3})', self.transition_type): - otio_transition_type = "SMPTE_Wipe" - elif self.transition_type in ['D']: - otio_transition_type = schema.TransitionTypes.SMPTE_Dissolve - else: - raise EDLParseError( - "Transition type '{}' not supported by the CMX EDL reader " - "currently.".format(self.transition_type) - ) - # TODO: support delayed transition like described here: - # https://xmil.biz/EDL-X/CMX3600.pdf - transition_duration = opentime.RationalTime( - float(self.transition_data), - self.clip.source_range.duration.rate - ) - # Note: Transitions in EDLs are unconventionally represented. - # - # Where a transition might normally be visualized like: - # |---57.0 Trans 43.0----| - # |------Clip1 102.0------|----------Clip2 143.0----------|Clip3 24.0| - # - # In an EDL it can be thought of more like this: - # |---0.0 Trans 100.0----| - # |Clip1 45.0|----------------Clip2 200.0-----------------|Clip3 24.0| - # - # So the transition starts at the beginning of the clip with `duration` - # frames from the previous clip. - - # Give the transition a detailed name if we can - transition_name = '{} to {}'.format( - otio_transition_type, - self.clip.name, - ) - if 'dest_clip_name' in comment_data: - if 'clip_name' in comment_data: - transition_name = '{} from {} to {}'.format( - otio_transition_type, - comment_data['clip_name'], - comment_data['dest_clip_name'], - ) - - new_trx = schema.Transition( - name=transition_name, - # only supported type at the moment - transition_type=otio_transition_type, - metadata={ - 'cmx_3600': { - 'transition': self.transition_type, - 'transition_duration': transition_duration.value, - } - }, - ) - new_trx.in_offset = opentime.RationalTime( - 0, - transition_duration.rate - ) - new_trx.out_offset = transition_duration - return new_trx - - -class CommentHandler: - # this is the for that all comment 'id' tags take - regex_template = r'\*?\s*{id}:?\s*(?P.*)' - - # this should be a map of all known comments that we can read - # 'FROM CLIP' or 'FROM FILE' is a required comment to link media - # An exception is raised if both 'FROM CLIP' and 'FROM FILE' are found - # needs to be ordered so that FROM CLIP NAME gets matched before FROM CLIP - comment_id_map = collections.OrderedDict([ - ('FROM CLIP NAME', 'clip_name'), - ('TO CLIP NAME', 'dest_clip_name'), - ('FROM CLIP', 'media_reference'), - ('FROM FILE', 'media_reference'), - ('LOC', 'locators'), - ('ASC_SOP', 'asc_sop'), - ('ASC_SAT', 'asc_sat'), - ('M2', 'motion_effect'), - ('\\* FREEZE FRAME', 'freeze_frame'), - ('\\* OTIO REFERENCE [a-zA-Z]+', 'media_reference'), - ]) - - def __init__(self, comments): - self.handled = {} - self.unhandled = [] - for comment in comments: - self.parse(comment) - - def parse(self, comment): - for comment_id, comment_type in self.comment_id_map.items(): - regex = self.regex_template.format(id=comment_id) - match = re.match(regex, comment) - if match: - comment_body = match.group('comment_body').strip() - - # Special case for locators. There can be multiple locators per clip. - if comment_type == 'locators': - try: - self.handled[comment_type].append(comment_body) - except KeyError: - self.handled[comment_type] = [comment_body] - - else: - self.handled[comment_type] = comment_body - - break - else: - stripped = comment.lstrip('*').strip() - if stripped: - self.unhandled.append(stripped) - - -def read_from_string(input_str, rate=24, ignore_timecode_mismatch=False): - """Reads a CMX Edit Decision List (EDL) from a string. - Since EDLs don't contain metadata specifying the rate they are meant - for, you may need to specify the rate parameter (default is 24). - By default, read_from_string will throw an exception if it discovers - invalid timecode in the EDL. For example, if a clip's record timecode - overlaps with the previous cut. Since this is a common mistake in - many EDLs, you can specify ignore_timecode_mismatch=True, which will - supress these errors and attempt to guess at the correct record - timecode based on the source timecode and adjacent cuts. - For best results, you may wish to do something like this: - - Example: - >>> try: - ... timeline = otio.adapters.read_from_string("mymovie.edl", rate=30) - ... except EDLParseError: - ... print('Log a warning here') - ... try: - ... timeline = otio.adapters.read_from_string( - ... "mymovie.edl", - ... rate=30, - ... ignore_timecode_mismatch=True) - ... except EDLParseError: - ... print('Log an error here') - """ - parser = EDLParser( - input_str, - rate=float(rate), - ignore_timecode_mismatch=ignore_timecode_mismatch - ) - result = parser.timeline - return result - - -def write_to_string(input_otio, rate=None, style='avid', reelname_len=8): - # TODO: We should have convenience functions in Timeline for this? - # also only works for a single video track at the moment - - video_tracks = [t for t in input_otio.tracks - if t.kind == schema.TrackKind.Video and t.enabled] - audio_tracks = [t for t in input_otio.tracks - if t.kind == schema.TrackKind.Audio and t.enabled] - - if len(video_tracks) != 1: - raise exceptions.NotSupportedError( - "Only a single video track is supported, got: {}".format( - len(video_tracks) - ) - ) - - if len(audio_tracks) > 2: - raise exceptions.NotSupportedError( - "No more than 2 audio tracks are supported." - ) - # if audio_tracks: - # raise exceptions.NotSupportedError( - # "No audio tracks are currently supported." - # ) - - # TODO: We should try to detect the frame rate and output an - # appropriate "FCM: NON-DROP FRAME" etc here. - - writer = EDLWriter( - tracks=input_otio.tracks, - # Assume all rates are the same as the 1st track's - rate=rate or input_otio.tracks[0].duration().rate, - style=style, - reelname_len=reelname_len - ) - - return writer.get_content_for_track_at_index(0, title=input_otio.name) - - -class EDLWriter: - def __init__(self, tracks, rate, style, reelname_len=8): - self._tracks = tracks - self._rate = rate - self._style = style - self._reelname_len = reelname_len - - if style not in VALID_EDL_STYLES: - raise exceptions.NotSupportedError( - "The EDL style '{}' is not supported.".format( - style - ) - ) - - def get_content_for_track_at_index(self, idx, title): - track = self._tracks[idx] - - # Add a gap if the last child is a transition. - if isinstance(track[-1], schema.Transition): - gap = schema.Gap( - source_range=opentime.TimeRange( - start_time=track[-1].duration(), - duration=opentime.RationalTime(0.0, self._rate) - ) - ) - track.append(gap) - - # Note: Transitions in EDLs are unconventionally represented. - # - # Where a transition might normally be visualized like: - # |---57.0 Trans 43.0----| - # |------Clip1 102.0------|----------Clip2 143.0----------|Clip3 24.0| - # - # In an EDL it can be thought of more like this: - # |---0.0 Trans 100.0----| - # |Clip1 45.0|----------------Clip2 200.0-----------------|Clip3 24.0| - - # Adjust cut points to match EDL event representation. - for idx, child in enumerate(track): - if isinstance(child, schema.Transition): - if idx != 0: - # Shorten the a-side - _extend_source_range_duration(track[idx - 1], -child.in_offset) - - # Lengthen the b-side - sr = track[idx + 1].source_range - track[idx + 1].source_range = opentime.TimeRange( - sr.start_time - child.in_offset, - sr.duration + child.in_offset - ) - - # Just clean up the transition for goodness sake - in_offset = child.in_offset - child.in_offset = opentime.RationalTime(0.0, self._rate) - child.out_offset += in_offset - - # Group events into either simple clip/a-side or transition and b-side - # to match EDL edit/event representation and edit numbers. - events = [] - for idx, child in enumerate(track): - if isinstance(child, schema.Transition): - # Transition will be captured in subsequent iteration. - continue - - prv = track[idx - 1] if idx > 0 else None - - if isinstance(prv, schema.Transition): - events.append( - DissolveEvent( - events[-1] if len(events) else None, - prv, - child, - self._tracks, - track.kind, - self._rate, - self._style, - self._reelname_len - ) - ) - elif isinstance(child, schema.Clip): - if child.enabled: - events.append( - Event( - child, - self._tracks, - track.kind, - self._rate, - self._style, - self._reelname_len - ) - ) - else: - pass - elif isinstance(child, schema.Gap): - # Gaps are represented as missing record timecode, no event - # needed. - pass - - content = f"TITLE: {title}\n\n" if title else '' - if track.enabled: - # Convert each event/dissolve-event into plain text. - for idx, event in enumerate(events): - event.edit_number = idx + 1 - content += event.to_edl_format() + '\n' - - return content - - -def _supported_timing_effects(clip): - return [ - fx for fx in clip.effects - if isinstance(fx, schema.LinearTimeWarp) - ] - - -def _relevant_timing_effect(clip): - # check to see if there is more than one timing effect - effects = _supported_timing_effects(clip) - - if effects != clip.effects: - for thing in clip.effects: - if thing not in effects and isinstance(thing, schema.TimeEffect): - raise exceptions.NotSupportedError( - "Clip contains timing effects not supported by the EDL" - " adapter.\nClip: {}".format(str(clip))) - - timing_effect = None - if effects: - timing_effect = effects[0] - if len(effects) > 1: - raise exceptions.NotSupportedError( - "EDL Adapter only allows one timing effect / clip." - ) - - return timing_effect - - -class Event: - def __init__( - self, - clip, - tracks, - kind, - rate, - style, - reelname_len - ): - - # Premiere style uses AX for the reel name - if style == 'premiere': - reel = 'AX' - else: - reel = _reel_from_clip(clip, reelname_len) - - line = EventLine(kind, rate, reel=reel) - line.source_in = clip.source_range.start_time - line.source_out = clip.source_range.end_time_exclusive() - - timing_effect = _relevant_timing_effect(clip) - - if timing_effect: - if timing_effect.effect_name == "FreezeFrame": - line.source_out = line.source_in + opentime.RationalTime( - 1, - line.source_in.rate - ) - elif timing_effect.effect_name == "LinearTimeWarp": - value = clip.trimmed_range().duration.value / timing_effect.time_scalar - line.source_out = ( - line.source_in + opentime.RationalTime(value, rate)) - - range_in_timeline = clip.transformed_time_range( - clip.trimmed_range(), - tracks - ) - line.record_in = range_in_timeline.start_time - line.record_out = range_in_timeline.end_time_exclusive() - self.line = line - - self.comments = _generate_comment_lines( - clip=clip, - style=style, - edl_rate=rate, - reelname_len=reelname_len, - from_or_to='FROM' - ) - - self.clip = clip - self.source_out = line.source_out - self.record_out = line.record_out - self.reel = line.reel - - def __str__(self): - return '{type}({name})'.format( - type=self.clip.schema_name(), - name=self.clip.name - ) - - def to_edl_format(self): - """ - Example output: - 002 AX V C 00:00:00:00 00:00:00:05 00:00:00:05 00:00:00:10 - * FROM CLIP NAME: test clip2 - * FROM FILE: S:\\var\\tmp\\test.exr - - """ - lines = [self.line.to_edl_format(self.edit_number)] - lines += self.comments if len(self.comments) else [] - - return "\n".join(lines) - - -class DissolveEvent: - - def __init__( - self, - a_side_event, - transition, - b_side_clip, - tracks, - kind, - rate, - style, - reelname_len - ): - # Note: We don't make the A-Side event line here as it is represented - # by its own event (edit number). - - cut_line = EventLine(kind, rate) - - if a_side_event: - cut_line.reel = a_side_event.reel - cut_line.source_in = a_side_event.source_out - cut_line.source_out = a_side_event.source_out - cut_line.record_in = a_side_event.record_out - cut_line.record_out = a_side_event.record_out - - self.from_comments = _generate_comment_lines( - clip=a_side_event.clip, - style=style, - edl_rate=rate, - reelname_len=reelname_len, - from_or_to='FROM' - ) - else: - cut_line.reel = 'BL' - cut_line.source_in = opentime.RationalTime(0.0, rate) - cut_line.source_out = opentime.RationalTime(0.0, rate) - cut_line.record_in = opentime.RationalTime(0.0, rate) - cut_line.record_out = opentime.RationalTime(0.0, rate) - - self.cut_line = cut_line - - dslve_line = EventLine( - kind, - rate, - reel=_reel_from_clip(b_side_clip, reelname_len) - ) - dslve_line.source_in = b_side_clip.source_range.start_time - dslve_line.source_out = b_side_clip.source_range.end_time_exclusive() - range_in_timeline = b_side_clip.transformed_time_range( - b_side_clip.trimmed_range(), - tracks - ) - dslve_line.record_in = range_in_timeline.start_time - dslve_line.record_out = range_in_timeline.end_time_exclusive() - dslve_line.dissolve_length = transition.out_offset - self.dissolve_line = dslve_line - - self.to_comments = _generate_comment_lines( - clip=b_side_clip, - style=style, - edl_rate=rate, - reelname_len=reelname_len, - from_or_to='TO' - ) - - self.a_side_event = a_side_event - self.transition = transition - self.b_side_clip = b_side_clip - - # Expose so that any subsequent dissolves can borrow their values. - self.clip = b_side_clip - self.source_out = dslve_line.source_out - self.record_out = dslve_line.record_out - self.reel = dslve_line.reel - - def __str__(self): - a_side = self.a_side_event - return '{a_type}({a_name}) -> {b_type}({b_name})'.format( - a_type=a_side.clip.schema_name() if a_side else '', - a_name=a_side.clip.name if a_side else '', - b_type=self.b_side_clip.schema_name(), - b_name=self.b_side_clip.name - ) - - def to_edl_format(self): - """ - Example output: - - Cross dissolve... - 002 Clip1 V C 00:00:07:08 00:00:07:08 00:00:01:21 00:00:01:21 - 002 Clip2 V D 100 00:00:09:07 00:00:17:15 00:00:01:21 00:00:10:05 - * FROM CLIP NAME: Clip1 - * FROM CLIP: /var/tmp/clip1.001.exr - * TO CLIP NAME: Clip2 - * TO CLIP: /var/tmp/clip2.001.exr - - Fade in... - 001 BL V C 00:00:00:00 00:00:00:00 00:00:00:00 00:00:00:00 - 001 My_Clip V D 012 00:00:02:02 00:00:03:04 00:00:00:00 00:00:01:02 - * TO CLIP NAME: My Clip - * TO FILE: /var/tmp/clip.001.exr - - Fade out... - 002 My_Clip V C 00:00:01:12 00:00:01:12 00:00:00:12 00:00:00:12 - 002 BL V D 012 00:00:00:00 00:00:00:12 00:00:00:12 00:00:01:00 - * FROM CLIP NAME: My Clip - * FROM FILE: /var/tmp/clip.001.exr - """ - - lines = [ - self.cut_line.to_edl_format(self.edit_number), - self.dissolve_line.to_edl_format(self.edit_number) - ] - lines += self.from_comments if hasattr(self, 'from_comments') else [] - lines += self.to_comments if len(self.to_comments) else [] - - return "\n".join(lines) - - -class EventLine: - def __init__(self, kind, rate, reel='AX'): - self.reel = reel - self._kind = 'V' if kind == schema.TrackKind.Video else 'A' - self._rate = rate - - self.source_in = opentime.RationalTime(0.0, rate=rate) - self.source_out = opentime.RationalTime(0.0, rate=rate) - self.record_in = opentime.RationalTime(0.0, rate=rate) - self.record_out = opentime.RationalTime(0.0, rate=rate) - - self.dissolve_length = opentime.RationalTime(0.0, rate) - - def to_edl_format(self, edit_number): - ser = { - 'edit': edit_number, - 'reel': self.reel, - 'kind': self._kind, - 'src_in': opentime.to_timecode(self.source_in, self._rate), - 'src_out': opentime.to_timecode(self.source_out, self._rate), - 'rec_in': opentime.to_timecode(self.record_in, self._rate), - 'rec_out': opentime.to_timecode(self.record_out, self._rate), - 'diss': int( - opentime.to_frames(self.dissolve_length, self._rate) - ), - } - - if self.is_dissolve(): - return "{edit:03d} {reel:8} {kind:5} D {diss:03d} " \ - "{src_in} {src_out} {rec_in} {rec_out}".format(**ser) - else: - return "{edit:03d} {reel:8} {kind:5} C " \ - "{src_in} {src_out} {rec_in} {rec_out}".format(**ser) - - def is_dissolve(self): - return self.dissolve_length.value > 0 - - -def _generate_comment_lines( - clip, - style, - edl_rate, - reelname_len, - from_or_to='FROM' -): - lines = [] - url = None - - if not clip or isinstance(clip, schema.Gap): - return [] - - suffix = '' - timing_effect = _relevant_timing_effect(clip) - if timing_effect and timing_effect.effect_name == 'FreezeFrame': - suffix = ' FF' - - if clip.media_reference: - if hasattr(clip.media_reference, 'target_url'): - url = clip.media_reference.target_url - - elif hasattr(clip.media_reference, 'abstract_target_url'): - url = _get_image_sequence_url(clip) - - if url: - # Premiere style uses the base name of the media reference - if style == 'premiere': - clip.name = os.path.basename(clip.media_reference.target_url) - else: - url = clip.name - - if from_or_to not in ['FROM', 'TO']: - raise exceptions.NotSupportedError( - "The clip FROM or TO value '{}' is not supported.".format( - from_or_to - ) - ) - - if timing_effect and isinstance(timing_effect, schema.LinearTimeWarp): - lines.append( - 'M2 {}\t\t{}\t\t\t{}'.format( - clip.name, - timing_effect.time_scalar * edl_rate, - opentime.to_timecode( - clip.trimmed_range().start_time, - edl_rate - ) - ) - ) - - if clip.name: - # Avid Media Composer outputs two spaces before the - # clip name so we match that. - lines.append( - "* {from_or_to} CLIP NAME: {name}{suffix}".format( - from_or_to=from_or_to, - name=os.path.basename(url) if style == 'premiere' else clip.name, - suffix=suffix - ) - ) - if timing_effect and timing_effect.effect_name == "FreezeFrame": - lines.append('* * FREEZE FRAME') - - # If the style has a spec, apply it and add it as a comment - style_spec = VALID_EDL_STYLES.get(style) - if url: - if style_spec: - lines.append("* {from_or_to} {style_spec}: {url}".format( - from_or_to=from_or_to, - style_spec=style_spec, - url=_flip_windows_slashes(url) - )) - else: - lines.append("* OTIO REFERENCE {from_or_to}: {url}".format( - from_or_to=from_or_to, - url=_flip_windows_slashes(url) - )) - - if reelname_len and not clip.metadata.get('cmx_3600', {}).get('reel'): - lines.append("* OTIO TRUNCATED REEL NAME FROM: {url}".format( - url=os.path.basename(_flip_windows_slashes(url or clip.name)) - )) - - if style == 'premiere': - clip.metadata.setdefault('cmx_3600', {}) - clip.metadata['cmx_3600'].update({'reel': 'AX'}) - - cdl = clip.metadata.get('cdl') - if cdl: - asc_sop = cdl.get('asc_sop') - asc_sat = cdl.get('asc_sat') - if asc_sop: - lines.append( - "*ASC_SOP ({} {} {}) ({} {} {}) ({} {} {})".format( - asc_sop['slope'][0], - asc_sop['slope'][1], - asc_sop['slope'][2], - asc_sop['offset'][0], - asc_sop['offset'][1], - asc_sop['offset'][2], - asc_sop['power'][0], - asc_sop['power'][1], - asc_sop['power'][2] - )) - if asc_sat: - lines.append("*ASC_SAT {}".format( - asc_sat - )) - - # Output any markers on this clip - for marker in clip.markers: - timecode = opentime.to_timecode( - marker.marked_range.start_time, - edl_rate - ) - - color = marker.color - meta = marker.metadata.get("cmx_3600") - if not color and meta and meta.get("color"): - color = meta.get("color").upper() - comment = (marker.name or '').upper() - lines.append(f"* LOC: {timecode} {color:7} {comment}") - - # If we are carrying any unhandled CMX 3600 comments on this clip - # then output them blindly. - extra_comments = clip.metadata.get('cmx_3600', {}).get('comments', []) - for comment in extra_comments: - lines.append(f"* {comment}") - - return lines - - -def _get_image_sequence_url(clip): - ref = clip.media_reference - start_frame, end_frame = ref.frame_range_for_time_range( - clip.trimmed_range() - ) - - frame_range_str = '[{start}-{end}]'.format( - start=start_frame, - end=end_frame - ) - - url = clip.media_reference.abstract_target_url(frame_range_str) - - return url - - -def _flip_windows_slashes(path): - return re.sub(r'\\', '/', path) - - -def _reel_from_clip(clip, reelname_len): - if isinstance(clip, schema.Gap): - return 'BL' - - elif clip.metadata.get('cmx_3600', {}).get('reel'): - return clip.metadata.get('cmx_3600').get('reel') - - _reel = clip.name or 'AX' - - valid_refs = (schema.ExternalReference, schema.ImageSequenceReference) - if isinstance(clip.media_reference, valid_refs): - if clip.media_reference.name: - _reel = clip.media_reference.name - - elif hasattr(clip.media_reference, 'target_url'): - _reel = os.path.basename( - clip.media_reference.target_url - ) - - else: - _reel = _get_image_sequence_url(clip) - - # Flip Windows slashes - _reel = os.path.basename(_flip_windows_slashes(_reel)) - - # Strip extension - reel = re.sub(r'([.][a-zA-Z]+)$', '', _reel) - - if reelname_len: - # Remove non valid characters - reel = re.sub(r'[^ a-zA-Z0-9]+', '', reel) - - if len(reel) > reelname_len: - reel = reel[:reelname_len] - - elif len(reel) < reelname_len: - reel += ' ' * (reelname_len - len(reel)) - - return reel diff --git a/tests/sample_data/25fps.edl b/tests/sample_data/25fps.edl deleted file mode 100755 index 69312ba69..000000000 --- a/tests/sample_data/25fps.edl +++ /dev/null @@ -1,15 +0,0 @@ - -TITLE: SQ0002_A2 -FCM: NON-DROP FRAME -001 SC00.JPG V C 01:00:00:00 01:00:06:11 00:00:00:00 00:00:06:11 -* FROM CLIP NAME: sq001_s001 -* sq001_s001 -002 SC00.JPG V C 01:00:00:00 01:00:08:00 00:00:06:11 00:00:14:11 -* FROM CLIP NAME: sq001_s002 -* sq001_s002 -003 SC00.JPG V C 01:00:00:00 01:00:03:11 00:00:14:11 00:00:17:22 -* FROM CLIP NAME: sq001_s003 -* sq001_s003 -004 SC00.JPG V C 01:00:00:00 01:00:01:24 00:00:17:22 00:00:19:21 -* FROM CLIP NAME: sq001_s004 -* sq001_s004 diff --git a/tests/sample_data/avid_example.edl b/tests/sample_data/avid_example.edl deleted file mode 100644 index 243ba5e91..000000000 --- a/tests/sample_data/avid_example.edl +++ /dev/null @@ -1,7 +0,0 @@ -TITLE: Avid_Example.01 -001 ZZ100_50 V C 01:00:04:05 01:00:05:12 00:59:53:11 00:59:54:18 -* FROM CLIP NAME: take_1 -* FROM CLIP: S:\path\to\ZZ100_501.take_1.0001.exr -002 ZZ100_50 V C 01:00:06:13 01:00:08:15 00:59:54:18 00:59:56:20 -* FROM CLIP NAME: take_2 -* FROM CLIP: S:\path\to\ZZ100_502A.take_2.0101.exr diff --git a/tests/sample_data/cdl.edl b/tests/sample_data/cdl.edl deleted file mode 100644 index 8021d64de..000000000 --- a/tests/sample_data/cdl.edl +++ /dev/null @@ -1,13 +0,0 @@ -TITLE: CDL_Example_Formatted_Many_Ways.01 - -001 AX V C 01:00:04:05 01:00:05:12 00:00:00:00 00:00:01:07 -* FROM CLIP NAME: ZZ100_501 (LAY3) -*ASC_SOP (0.1 0.2 0.3) (1.0 -0.0122 0.0305) (1.0 0.0 1.0) -*ASC_SAT 0.9 -* SOURCE FILE: ZZ100_501.LAY3.01 - -002 AX V C 01:00:04:05 01:00:05:12 00:00:01:07 00:00:02:14 -* FROM CLIP NAME: ZZ100_501 (LAY3) -* ASC_SOP: (0.1 0.2 0.3) (1.0 -0.0122 0.0305) (1.0 0.0 1.0) -* ASC_SAT: 0.9 -* SOURCE FILE: ZZ100_501.LAY3.01 diff --git a/tests/sample_data/dissolve_test.edl b/tests/sample_data/dissolve_test.edl deleted file mode 100644 index cadc0b55e..000000000 --- a/tests/sample_data/dissolve_test.edl +++ /dev/null @@ -1,11 +0,0 @@ -TITLE: dissolve test -FCM: NON-DROP FRAME -001 TST V C 01:00:04:05 01:00:04:14 01:00:00:00 01:00:00:09 -* FROM CLIP NAME: clip_A -002 TST V C 01:00:04:14 01:00:04:14 01:00:00:09 01:00:00:09 -002 TST V D 010 01:00:08:08 01:00:08:18 01:00:00:09 01:00:00:19 -* BLEND, DISSOLVE -* FROM CLIP NAME: clip_A -* TO CLIP NAME: clip_B -003 TST V C 01:00:08:18 01:00:08:19 01:00:00:19 01:00:00:20 -* FROM CLIP NAME: clip_B diff --git a/tests/sample_data/dissolve_test_2.edl b/tests/sample_data/dissolve_test_2.edl deleted file mode 100644 index d205446e9..000000000 --- a/tests/sample_data/dissolve_test_2.edl +++ /dev/null @@ -1,11 +0,0 @@ -TITLE: dissolve_test_2 -FCM: NON-DROP FRAME -001 TST V C 01:00:04:05 01:00:04:10 01:00:00:00 01:00:00:05 -* FROM CLIP NAME: clip_A -002 TST V C 01:00:04:10 01:00:04:10 01:00:00:05 01:00:00:05 -002 TST V D 010 01:00:08:04 01:00:08:14 01:00:00:05 01:00:00:15 -* BLEND, DISSOLVE -* FROM CLIP NAME: clip_A -* TO CLIP NAME: clip_B -003 TST V C 01:00:08:14 01:00:08:19 01:00:00:15 01:00:00:20 -* FROM CLIP NAME: clip_B diff --git a/tests/sample_data/dissolve_test_3.edl b/tests/sample_data/dissolve_test_3.edl deleted file mode 100644 index 8d875147d..000000000 --- a/tests/sample_data/dissolve_test_3.edl +++ /dev/null @@ -1,15 +0,0 @@ -TITLE: dissolve test 3 -FCM: NON-DROP FRAME - -001 AX V C 01:00:03:23 01:00:06:12 01:00:00:00 01:00:02:13 -* FROM CLIP NAME: Clip_A.mov - -002 AX V C 01:00:06:00 01:00:06:00 01:00:02:13 01:00:02:13 -FCM: NON-DROP FRAME -002 AX V D 030 01:00:33:22 01:00:35:04 01:00:02:13 01:00:03:19 -EFFECTS NAME IS CROSS DISSOLVE -* FROM CLIP NAME: Clip_B.mov -* TO CLIP NAME: Clip_C.mov - -003 AX V C 01:00:00:00 01:00:01:22 01:00:03:19 01:00:05:17 -* FROM CLIP NAME: Clip_D.mov diff --git a/tests/sample_data/dissolve_test_4.edl b/tests/sample_data/dissolve_test_4.edl deleted file mode 100644 index 1263d8339..000000000 --- a/tests/sample_data/dissolve_test_4.edl +++ /dev/null @@ -1,12 +0,0 @@ -TITLE: TRANSITION_TEST_2 -FCM: NON-DROP FRAME -001 ABC0000. V C 01:00:06:18 01:00:08:00 01:04:11:17 01:04:12:23 -002 ABC0010. V C 01:00:06:15 01:00:08:18 01:04:12:23 01:04:15:02 -003 ABC0020. V C 01:00:08:18 01:00:08:18 01:04:15:02 01:04:15:02 -003 ABC0020. V D 035 01:00:06:22 01:00:10:07 01:04:15:02 01:04:18:11 -* BLEND, DISSOLVE -004 ABC0030. V C 01:00:10:07 01:00:10:07 01:04:18:11 01:04:18:11 -004 ABC0030. V D 064 01:00:06:10 01:00:09:22 01:04:18:11 01:04:21:23 -* BLEND, DISSOLVE -005 ABC0040. V C 01:00:08:14 01:00:12:14 01:04:21:23 01:04:25:23 -060 ABC0050. V C 01:00:12:06 01:00:17:21 01:04:25:23 01:04:31:14 diff --git a/tests/sample_data/enabled.otio b/tests/sample_data/enabled.otio deleted file mode 100644 index 3945e9cb0..000000000 --- a/tests/sample_data/enabled.otio +++ /dev/null @@ -1,175 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "metadata": {}, - "name": "enable_test", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "enabled": true, - "media_reference": { - "OTIO_SCHEMA": "MissingReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 3 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0 - } - }, - "metadata": {}, - "name": null - }, - "metadata": {}, - "name": "Clip-001", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 3 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0 - } - } - }, - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "enabled": true, - "media_reference": { - "OTIO_SCHEMA": "MissingReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 5 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0 - } - }, - "metadata": {}, - "name": null - }, - "metadata": {}, - "name": "Clip-002", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 3 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 3 - } - } - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "enabled": true, - "metadata": {}, - "name": "Track-001", - "source_range": null - }, - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Gap.1", - "effects": [], - "markers": [], - "metadata": {}, - "name": "Gap A", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 3 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0 - } - } - }, - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "MissingReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 5 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0 - } - }, - "metadata": {}, - "name": null - }, - "metadata": {}, - "name": "Clip-003", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 3 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 3 - } - } - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "enabled": true, - "metadata": {}, - "name": "Track-002", - "source_range": null - } - ], - "effects": [], - "markers": [], - "metadata": {}, - "name": "tracks", - "source_range": null - } -} diff --git a/tests/sample_data/gap_test.edl b/tests/sample_data/gap_test.edl deleted file mode 100644 index 4845cc781..000000000 --- a/tests/sample_data/gap_test.edl +++ /dev/null @@ -1,8 +0,0 @@ -TITLE: gap test -FCM: NON-DROP FRAME -001 SHOT1 V C 00:10:00:00 00:10:01:00 00:00:00:00 00:00:01:00 -FROM CLIP NAME: shot1 -002 SHOT2 V C 23:00:00:00 23:00:01:00 00:00:01:16 00:00:02:16 -FROM CLIP NAME: shot2 -003 SHOT3 V C 10:00:00:00 10:00:01:00 00:00:04:06 00:00:05:06 -FROM CLIP NAME: shot3 diff --git a/tests/sample_data/multi_audio.edl b/tests/sample_data/multi_audio.edl deleted file mode 100644 index bb7c17cf1..000000000 --- a/tests/sample_data/multi_audio.edl +++ /dev/null @@ -1,6 +0,0 @@ -TITLE: MultiAudio -FCM: NON-DROP FRAME - -001 AX AA C 00:00:00:00 00:56:55:22 00:00:00:00 00:56:55:22 -* FROM CLIP NAME: AX -AUD 3 diff --git a/tests/sample_data/no_spaces_test.edl b/tests/sample_data/no_spaces_test.edl deleted file mode 100644 index a0975f68b..000000000 --- a/tests/sample_data/no_spaces_test.edl +++ /dev/null @@ -1,33 +0,0 @@ -TITLE: Example_Screening.01 -FCM: NON-DROP FRAME -001 ZZ100_50 V C 01:00:04:05 01:00:05:12 00:59:53:11 00:59:54:18 -*FROM CLIP NAME: ZZ100_501 (LAY3) -*SOURCE FILE: ZZ100_501.LAY3.01 -002 ZZ100_50 V C 01:00:06:13 01:00:08:15 00:59:54:18 00:59:56:20 -*FROM CLIP NAME: ZZ100_502A (LAY3) -*SOURCE FILE: ZZ100_502A.LAY3.02 -003 ZZ100_50 V C 01:00:08:09 01:00:09:13 00:59:56:20 00:59:58:00 -*FROM CLIP NAME: ZZ100_503A (LAY1) -*SOURCE FILE: ZZ100_503A.LAY1.01 -004 ZZ100_50 V C 01:00:10:01 01:00:14:20 00:59:58:00 01:00:02:19 -*FROM CLIP NAME: ZZ100_504C (LAY1) -*LOC: 01:00:01:14 RED ANIM FIX NEEDED -*LOC: 01:00:02:14 PINK ANIM FIX NEEDED -*SOURCE FILE: ZZ100_504C.LAY1.02 -005 ZZ100_50 V C 01:00:14:17 01:00:18:22 01:00:02:19 01:00:07:00 -*FROM CLIP NAME: ZZ100_504B (LAY1) -*SOURCE FILE: ZZ100_504B.LAY1.02 -006 ZZ100_50 V C 01:00:04:05 01:00:10:22 01:00:07:00 01:00:13:17 -*FROM CLIP NAME: ZZ100_507C (LAY2) -*SOURCE FILE: ZZ100_507C.LAY2.01 -007 ZZ100_50 V C 01:00:09:12 01:00:16:14 01:00:13:17 01:00:20:19 -*FROM CLIP NAME: ZZ100_508 (LAY2) -*LOC: 01:00:15:13 GREEN -*SOURCE FILE: ZZ100_508.LAY2.02 -008 ZZ100_51 V C 01:00:13:10 01:00:19:02 01:00:20:19 01:00:26:11 -*FROM CLIP NAME: ZZ100_510 (LAY1) -*SOURCE FILE: ZZ100_510.LAY1.02 -009 ZZ100_51 V C 01:00:04:05 01:00:14:22 01:00:26:11 01:00:37:04 -*AVX2 EFFECT, RESIZE -*FROM CLIP NAME: ZZ100_510B (LAY1) -*SOURCE FILE: ZZ100_510B.LAY1.02 diff --git a/tests/sample_data/nucoda_example.edl b/tests/sample_data/nucoda_example.edl deleted file mode 100644 index 88e869cab..000000000 --- a/tests/sample_data/nucoda_example.edl +++ /dev/null @@ -1,7 +0,0 @@ -TITLE: Nucoda_Example.01 -001 ZZ100_50 V C 01:00:04:05 01:00:05:12 00:59:53:11 00:59:54:18 -* FROM CLIP NAME: take_1 -* FROM FILE: S:\path\to\ZZ100_501.take_1.0001.exr -002 ZZ100_50 V C 01:00:06:13 01:00:08:15 00:59:54:18 00:59:56:20 -* FROM CLIP NAME: take_2 -* FROM FILE: S:\path\to\ZZ100_502A.take_2.0101.exr diff --git a/tests/sample_data/premiere_example.edl b/tests/sample_data/premiere_example.edl deleted file mode 100644 index 0ff55c0a9..000000000 --- a/tests/sample_data/premiere_example.edl +++ /dev/null @@ -1,5 +0,0 @@ -TITLE: Premiere_Example.01 -001 AX V C 01:00:04:05 01:00:05:12 00:59:53:11 00:59:54:18 -* FROM CLIP NAME: ZZ100_501.take_1.0001.exr -002 AX V C 01:00:06:13 01:00:08:15 00:59:54:18 00:59:56:20 -* FROM CLIP NAME: ZZ100_502A.take_2.0101.exr diff --git a/tests/sample_data/screening_example.edl b/tests/sample_data/screening_example.edl deleted file mode 100644 index e5c11b581..000000000 --- a/tests/sample_data/screening_example.edl +++ /dev/null @@ -1,41 +0,0 @@ -TITLE: Example_Screening.01 -FCM: NON-DROP FRAME - -001 ZZ100_50 V C 01:00:04:05 01:00:05:12 00:59:53:11 00:59:54:18 - -* FROM CLIP NAME: ZZ100_501 (LAY3) - -* SOURCE FILE: ZZ100_501.LAY3.01 -002 ZZ100_50 V C 01:00:06:13 01:00:08:15 00:59:54:18 00:59:56:20 -* FROM CLIP NAME: ZZ100_502A (LAY3) -* SOURCE FILE: ZZ100_502A.LAY3.02 -003 ZZ100_50 V C 01:00:08:09 01:00:09:13 00:59:56:20 00:59:58:00 -* FROM CLIP NAME: ZZ100_503A (LAY1) -* SOURCE FILE: ZZ100_503A.LAY1.01 -004 ZZ100_50 V C 01:00:10:01 01:00:14:20 00:59:58:00 01:00:02:19 -* FROM CLIP NAME: ZZ100_504C (LAY1) -* LOC: 01:00:01:14 RED ANIM FIX NEEDED -* LOC: 01:00:02:14 PINK ANIM FIX NEEDED -* SOURCE FILE: ZZ100_504C.LAY1.02 -005 ZZ100_50 V C 01:00:14:17 01:00:18:22 01:00:02:19 01:00:07:00 -* FROM CLIP NAME: ZZ100_504B (LAY1) -* SOURCE FILE: ZZ100_504B.LAY1.02 -006 ZZ100_50 V C 01:00:04:05 01:00:10:22 01:00:07:00 01:00:13:17 -* FROM CLIP NAME: ZZ100_507C (LAY2) -* SOURCE FILE: ZZ100_507C.LAY2.01 -007 ZZ100_50 V C 01:00:09:12 01:00:16:14 01:00:13:17 01:00:20:19 -* FROM CLIP NAME: ZZ100_508 (LAY2) -* LOC: 01:00:15:13 GREEN -* SOURCE FILE: ZZ100_508.LAY2.02 - -008 ZZ100_51 V C 01:00:13:10 01:00:19:02 01:00:20:19 01:00:26:11 - -* FROM CLIP NAME: ZZ100_510 (LAY1) -* SOURCE FILE: ZZ100_510.LAY1.02 - -009 ZZ100_51 V C 01:00:04:05 01:00:14:22 01:00:26:11 01:00:37:04 -* AVX2 EFFECT, RESIZE -* FROM CLIP NAME: ZZ100_510B (LAY1) - -* SOURCE FILE: ZZ100_510B.LAY1.02 - diff --git a/tests/sample_data/screening_example.otio b/tests/sample_data/screening_example.otio new file mode 100644 index 000000000..dff5649e5 --- /dev/null +++ b/tests/sample_data/screening_example.otio @@ -0,0 +1,455 @@ +{ + "OTIO_SCHEMA": "Timeline.1", + "metadata": {}, + "name": "Example_Screening.01", + "global_start_time": null, + "tracks": { + "OTIO_SCHEMA": "Stack.1", + "metadata": {}, + "name": "tracks", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Track.1", + "metadata": {}, + "name": "V", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1049.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": -86243.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_501.LAY3.01" + ], + "reel": "ZZ100_50" + } + }, + "name": "ZZ100_501 (LAY3)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 31.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86501.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_502A.LAY3.02" + ], + "reel": "ZZ100_50" + } + }, + "name": "ZZ100_502A (LAY3)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 50.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86557.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_503A.LAY1.01" + ], + "reel": "ZZ100_50" + } + }, + "name": "ZZ100_503A (LAY1)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 28.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86601.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_504C.LAY1.02" + ], + "reel": "ZZ100_50" + } + }, + "name": "ZZ100_504C (LAY1)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 115.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86641.0 + } + }, + "effects": [], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "cmx_3600": { + "color": "RED" + } + }, + "name": "ANIM FIX NEEDED", + "color": "RED", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 1.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86438.0 + } + } + }, + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "cmx_3600": { + "color": "PINK" + } + }, + "name": "ANIM FIX NEEDED", + "color": "PINK", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 1.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86462.0 + } + } + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_504B.LAY1.02" + ], + "reel": "ZZ100_50" + } + }, + "name": "ZZ100_504B (LAY1)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86753.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_507C.LAY2.01" + ], + "reel": "ZZ100_50" + } + }, + "name": "ZZ100_507C (LAY2)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 161.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86501.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_508.LAY2.02" + ], + "reel": "ZZ100_50" + } + }, + "name": "ZZ100_508 (LAY2)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 170.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86628.0 + } + }, + "effects": [], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "cmx_3600": { + "color": "GREEN" + } + }, + "name": "", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 1.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86773.0 + } + } + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "SOURCE FILE: ZZ100_510.LAY1.02" + ], + "reel": "ZZ100_51" + } + }, + "name": "ZZ100_510 (LAY1)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 136.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86722.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "cmx_3600": { + "comments": [ + "AVX2 EFFECT, RESIZE", + "SOURCE FILE: ZZ100_510B.LAY1.02" + ], + "reel": "ZZ100_51" + } + }, + "name": "ZZ100_510B (LAY1)", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 257.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86501.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "MissingReference.1", + "metadata": {}, + "name": "", + "available_range": null, + "available_image_bounds": null + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Video" + } + ] + } +} \ No newline at end of file diff --git a/tests/sample_data/speed_effects.edl b/tests/sample_data/speed_effects.edl deleted file mode 100644 index c33580dbe..000000000 --- a/tests/sample_data/speed_effects.edl +++ /dev/null @@ -1,1121 +0,0 @@ -TITLE: Speed_Effects_Test_2018.02.13 -000001 Z677_4C. V C 01:00:01:21 01:00:07:03 01:00:00:00 01:00:05:06 -* FROM CLIP NAME: Z677_4C (ANIM10) -000002 Z677_5.P V C 01:00:05:05 01:00:06:03 01:00:05:06 01:00:06:04 -* FROM CLIP NAME: Z677_5 (PHASE129) -000003 Z677_6.P V C 01:00:05:19 01:00:14:07 01:00:06:04 01:00:14:16 -* FROM CLIP NAME: Z677_6 (PHASE154) -000004 Z677_5B. V C 01:00:14:15 01:00:16:14 01:00:14:16 01:00:16:15 -* FROM CLIP NAME: Z677_5B (PHASE131) -000005 Z677_10C V C 01:00:16:14 01:00:19:06 01:00:16:15 01:00:19:07 -* FROM CLIP NAME: Z677_10C (PHASE142) -000006 Z677_11C V C 01:00:18:03 01:00:19:02 01:00:19:07 01:00:20:06 -* FROM CLIP NAME: Z677_11C (PHASE139) -000007 Z677_12. V C 01:00:19:22 01:00:20:09 01:00:20:06 01:00:20:17 -* FROM CLIP NAME: Z677_12 (PHASE128) -000008 Z677_13. V C 01:00:04:05 01:00:04:22 01:00:20:17 01:00:21:10 -* FROM CLIP NAME: Z677_13 (PHASE146) -000009 Z677_13A V C 01:00:04:20 01:00:07:19 01:00:21:10 01:00:24:09 -* FROM CLIP NAME: Z677_13A (PHASE168) -000010 Z677_15. V C 01:00:04:23 01:00:10:16 01:00:24:09 01:00:30:02 -* FROM CLIP NAME: Z677_15 (ANIM29) -000011 Z677_18E V C 01:00:02:20 01:00:10:12 01:00:30:02 01:00:37:18 -* FROM CLIP NAME: Z677_18E (PHASE148) -000012 Z677_20A V C 01:00:04:09 01:00:10:19 01:00:37:18 01:00:44:04 -* FROM CLIP NAME: Z677_20A (ANIM23) -000013 Z677_21A V C 01:00:11:08 01:00:13:05 01:00:44:04 01:00:46:01 -* FROM CLIP NAME: Z677_21A (ANIM17) -000014 Z677_20E V C 01:00:12:15 01:00:18:02 01:00:46:01 01:00:51:12 -* FROM CLIP NAME: Z677_20E (ANIM22) -000015 Z677_23. V C 01:00:17:22 01:00:20:05 01:00:51:12 01:00:53:19 -* FROM CLIP NAME: Z677_23 (ANIM17) -000016 Z677_20F V C 01:00:22:05 01:00:24:17 01:00:53:19 01:00:56:07 -* FROM CLIP NAME: Z677_20F (ANIM14) -000017 Z677_25. V C 01:00:24:14 01:00:25:08 01:00:56:07 01:00:57:01 -* FROM CLIP NAME: Z677_25 (ANIM22) -000018 Z677_26A V C 01:00:24:22 01:00:26:08 01:00:57:01 01:00:58:11 -* FROM CLIP NAME: Z677_26A (ANIM20) -000019 Z677_28B V C 01:00:25:10 01:00:27:07 01:00:58:11 01:01:00:08 -* FROM CLIP NAME: Z677_28B (ANIM19) -000020 Z677_32C V C 01:00:26:12 01:00:30:19 01:01:00:08 01:01:04:15 -* FROM CLIP NAME: Z677_32C (ANIM21) -000021 Z678_101 V C 01:00:04:06 01:00:06:15 01:01:04:15 01:01:07:00 -* FROM CLIP NAME: Z678_101B (LAY3) -000022 Z678_101 V C 01:00:08:22 01:00:19:09 01:01:07:00 01:01:17:11 -* FROM CLIP NAME: Z678_101E (LAY7) -000023 Z678_1D. V C 01:00:04:02 01:00:06:05 01:01:17:11 01:01:19:14 -* FROM CLIP NAME: Z678_1D (LAY4) -000024 678_ALL. V C 01:00:06:08 01:00:08:10 01:01:19:14 01:01:21:16 -* FROM CLIP NAME: Z678_2A (LAY2) -000025 678_ALL. V C 01:00:03:18 01:00:07:01 01:01:21:16 01:01:24:23 -* FROM CLIP NAME: Z678_3B (LAY2) -000026 Z678_2B. V C 01:00:12:13 01:00:15:15 01:01:24:23 01:01:28:01 -* FROM CLIP NAME: Z678_2B (LAY7) -000027 Z678_4D. V C 01:00:16:09 01:00:19:17 01:01:28:01 01:01:31:09 -* FROM CLIP NAME: Z678_4D (LAY6) -000028 Z678_5.L V C 01:00:18:07 01:00:21:13 01:01:31:09 01:01:34:15 -* FROM CLIP NAME: Z678_5 (LAY10) -000029 678_ALL. V C 01:00:21:22 01:00:23:03 01:01:34:15 01:01:35:20 -* FROM CLIP NAME: Z678_9 (LAY8) -000030 678_ALL. V C 01:00:21:10 01:00:22:14 01:01:35:20 01:01:37:00 -* FROM CLIP NAME: Z678_8 (LAY4) -000031 Z678_5B. V C 01:00:18:17 01:00:19:18 01:01:37:00 01:01:38:01 -* FROM CLIP NAME: Z678_5B (LAY1) -000032 678_ALL. V C 01:00:06:08 01:00:07:11 01:01:38:01 01:01:39:04 -* FROM CLIP NAME: Z678_11 (LAY4) -000033 Z678_12E V C 01:00:04:21 01:00:06:21 01:01:39:04 01:01:41:04 -* FROM CLIP NAME: Z678_12E (LAY1) -000034 Z678_14. V C 01:00:09:10 01:00:12:04 01:01:41:04 01:01:43:22 -* FROM CLIP NAME: Z678_14 (LAY8) -000035 Z678_11D V C 01:00:14:10 01:00:14:23 01:01:43:22 01:01:44:11 -* FROM CLIP NAME: Z678_11D (LAY5) -000036 Z678_16B V C 01:00:10:19 01:00:12:08 01:01:44:11 01:01:46:00 -* FROM CLIP NAME: Z678_16B (LAY4) -000037 Z678_16S V C 01:00:12:00 01:00:13:09 01:01:46:00 01:01:47:09 -* FROM CLIP NAME: Z678_16S (LAY2) -000038 Z678_16Q V C 01:00:12:17 01:00:14:00 01:01:47:09 01:01:48:16 -* FROM CLIP NAME: Z678_16Q (LAY1) -000039 Z598_101 V C 01:00:01:04 01:00:03:02 01:01:48:16 01:01:50:14 -* FROM CLIP NAME: Z598_101K (LAY1) -000040 Z678_18D V C 01:00:12:19 01:00:15:12 01:01:50:14 01:01:53:07 -* FROM CLIP NAME: Z678_18D (LAY2) -000041 Z678_16T V C 01:00:16:06 01:00:18:19 01:01:53:07 01:01:55:20 -* FROM CLIP NAME: Z678_16T (LAY1) -000042 Z598_101 V C 01:00:03:16 01:00:10:19 01:01:55:20 01:02:02:23 -* FROM CLIP NAME: Z598_101J (LAY4) -000043 Z598_102 V C 01:00:08:17 01:00:11:03 01:02:02:23 01:02:05:09 -* FROM CLIP NAME: Z598_102H (LAY2) -000044 Z598_102 V C 01:00:09:20 01:00:10:21 01:02:05:09 01:02:06:10 -* FROM CLIP NAME: Z598_102J (LAY1) -000045 Z598_102 V C 01:00:11:14 01:00:25:23 01:02:06:10 01:02:20:19 -* FROM CLIP NAME: Z598_102M (LAY3) -000046 Z598_105 V C 01:00:04:05 01:00:06:14 01:02:20:19 01:02:23:04 -* FROM CLIP NAME: Z598_105B (LAY3) -000047 Z598_107 V C 01:00:05:02 01:00:15:06 01:02:23:04 01:02:33:08 -* FROM CLIP NAME: Z598_107 (LAY5) -000048 Z598_108 V C 01:00:04:21 01:00:09:09 01:02:33:08 01:02:37:20 -* FROM CLIP NAME: Z598_108B (LAY1) -000049 Z598_109 V C 01:00:04:20 01:00:09:20 01:02:37:20 01:02:42:20 -* FROM CLIP NAME: Z598_109A (LAY3) -000050 Z598_111 V C 01:00:12:19 01:00:16:04 01:02:42:20 01:02:46:05 -* FROM CLIP NAME: Z598_111B (LAY5) -000051 Z598_114 V C 01:00:08:21 01:00:13:12 01:02:46:05 01:02:50:20 -* FROM CLIP NAME: Z598_114J (LAY4) -000052 Z598_COM V C 01:00:11:16 01:00:13:05 01:02:50:20 01:02:52:09 -* FROM CLIP NAME: Z598_114G (LAY2) -000053 ANIMTEST V C 01:00:16:06 01:00:24:12 01:02:52:09 01:03:00:15 -* FROM CLIP NAME: Z598_ANIMTEST_ZZZ_12 (ANIM9) -000054 Z598_116 V C 01:00:04:09 01:00:06:04 01:03:00:15 01:03:02:10 -* FROM CLIP NAME: Z598_116A (LAY5) -000055 Z598_117 V C 01:00:03:03 01:00:06:02 01:03:02:10 01:03:05:09 -* FROM CLIP NAME: Z598_117A (LAY1) -000056 Z598_COM V C 01:00:05:02 01:00:06:03 01:03:05:09 01:03:06:10 -* FROM CLIP NAME: Z598_118 (LAY7) -000057 Z598_COM V C 01:00:06:03 01:00:07:02 01:03:06:10 01:03:07:09 -* FROM CLIP NAME: Z598_119 (LAY6) -000058 Z598_120 V C 01:00:06:06 01:00:07:15 01:03:07:09 01:03:08:18 -* FROM CLIP NAME: Z598_120 (LAY9) -000059 Z598_121 V C 01:00:08:00 01:00:10:06 01:03:08:18 01:03:11:00 -* FROM CLIP NAME: Z598_121 (LAY9) -000060 Z598_122 V C 01:00:13:03 01:00:18:18 01:03:11:00 01:03:16:15 -* FROM CLIP NAME: Z598_122A (LAY6) -000061 Z598_125 V C 01:00:22:08 01:00:23:17 01:03:16:15 01:03:18:00 -* FROM CLIP NAME: Z598_125B (LAY3) -000062 Z598_128 V C 01:00:28:10 01:00:29:20 01:03:18:00 01:03:19:10 -* FROM CLIP NAME: Z598_128A (LAY4) -000063 Z598_COM V C 01:00:31:04 01:00:34:04 01:03:19:10 01:03:22:10 -* FROM CLIP NAME: Z598_129 (LAY8) -000064 Z598_130 V C 01:00:37:09 01:00:39:05 01:03:22:10 01:03:24:06 -* FROM CLIP NAME: Z598_130 (LAY10) -000065 Z598_133 V C 01:00:42:02 01:00:43:08 01:03:24:06 01:03:25:12 -* FROM CLIP NAME: Z598_133 (LAY8) -000066 Z598_COM V C 01:00:44:22 01:00:46:01 01:03:25:12 01:03:26:15 -* FROM CLIP NAME: Z598_134A (LAY1) -000067 Z598_135 V C 01:00:49:20 01:00:51:05 01:03:26:15 01:03:28:00 -* FROM CLIP NAME: Z598_135A (LAY4) -000068 Z598_COM V C 01:00:53:21 01:00:57:10 01:03:28:00 01:03:31:13 -* FROM CLIP NAME: Z598_140 (LAY5) -000069 Z598_142 V C 01:00:57:06 01:00:58:17 01:03:31:13 01:03:33:00 -* FROM CLIP NAME: Z598_142 (LAY8) -000070 Z598_143 V C 01:01:01:09 01:01:01:22 01:03:33:00 01:03:33:13 -* FROM CLIP NAME: Z598_143 (LAY6) -000071 Z598_COM V C 01:01:09:08 01:01:10:08 01:03:33:13 01:03:34:13 -* FROM CLIP NAME: Z598_147 (LAY6) -000072 Z598_COM V C 01:01:12:00 01:01:12:11 01:03:34:13 01:03:35:00 -* FROM CLIP NAME: Z598_148 (LAY7) -000073 Z598_149 V C 01:01:13:09 01:01:13:18 01:03:35:00 01:03:35:09 -* FROM CLIP NAME: Z598_149 (LAY8) -000074 Z598_COM V C 01:01:18:21 01:01:19:22 01:03:35:09 01:03:36:10 -* FROM CLIP NAME: Z598_151 (LAY6) -000075 Z598_152 V C 01:01:21:11 01:01:25:02 01:03:36:10 01:03:40:01 -* FROM CLIP NAME: Z598_152C (LAY4) -000076 Z598_157 V C 01:01:26:23 01:01:31:19 01:03:40:01 01:03:44:21 -* FROM CLIP NAME: Z598_157B (LAY2) -000077 Z598_158 V C 01:01:32:21 01:01:34:00 01:03:44:21 01:03:46:00 -* FROM CLIP NAME: Z598_158 (LAY6) -000078 Z598_159 V C 01:01:33:04 01:01:35:11 01:03:46:00 01:03:48:07 -* FROM CLIP NAME: Z598_159A (LAY1) -000079 Z598_158 V C 01:01:32:12 01:01:34:00 01:03:48:07 01:03:49:19 -* FROM CLIP NAME: Z598_158A (LAY1) -000080 Z598_161 V C 01:01:32:23 01:01:38:07 01:03:49:19 01:03:55:03 -* FROM CLIP NAME: Z598_161C (LAY4) -000081 Z598_162 V C 01:01:37:19 01:01:40:14 01:03:55:03 01:03:57:22 -* FROM CLIP NAME: Z598_162B (LAY3) -000082 Z598_COM V C 01:00:04:05 01:00:09:07 01:03:57:22 01:04:03:00 -* FROM CLIP NAME: Z598_163A (LAY4) -000083 Z678_19A V C 01:00:04:07 01:00:07:18 01:04:03:00 01:04:06:11 -* FROM CLIP NAME: Z678_19A (LAY14) -000084 Z678_20A V C 01:00:04:05 01:00:10:10 01:04:06:11 01:04:12:16 -* FROM CLIP NAME: Z678_20A (LAY11) -000085 Z678_21A V C 01:00:04:05 01:00:11:08 01:04:12:16 01:04:19:19 -* FROM CLIP NAME: Z678_21A (LAY13) -000086 Z678_22A V C 01:00:15:06 01:00:23:22 01:04:19:19 01:04:28:11 -* FROM CLIP NAME: Z678_22A (LAY11) -000087 Z678_23K V C 01:00:24:04 01:00:25:17 01:04:28:11 01:04:30:00 -* FROM CLIP NAME: Z678_23K (LAY4) -000088 Z678_23J V C 01:00:24:13 01:00:26:03 01:04:30:00 01:04:31:14 -* FROM CLIP NAME: Z678_23J (LAY4) -000089 Z678_24. V C 01:00:04:05 01:00:07:09 01:04:31:14 01:04:34:18 -* FROM CLIP NAME: Z678_24 (LAY7) -000090 Z678_25D V C 01:00:04:05 01:00:10:02 01:04:34:18 01:04:40:15 -* FROM CLIP NAME: Z678_25D (LAY2) -000091 Z678_26B V C 01:00:04:05 01:00:09:03 01:04:40:15 01:04:45:13 -* FROM CLIP NAME: Z678_26B (LAY5) -000092 Z678_27A V C 01:00:40:20 01:00:45:10 01:04:45:13 01:04:50:03 -* FROM CLIP NAME: Z678_27A (LAY4) -000093 Z678_29. V C 01:00:51:14 01:00:53:18 01:04:50:03 01:04:52:07 -* FROM CLIP NAME: Z678_29 (LAY5) -000094 Z678_28. V C 01:00:53:09 01:00:55:21 01:04:52:07 01:04:54:19 -* FROM CLIP NAME: Z678_28 (LAY10) -000095 678_ALL. V C 01:00:54:12 01:00:58:11 01:04:54:19 01:04:58:18 -* FROM CLIP NAME: Z678_27B (LAY2) -000096 Z678_30A V C 01:00:58:08 01:01:03:20 01:04:58:18 01:05:04:06 -* FROM CLIP NAME: Z678_30A (LAY5) -000097 Z678_23N V C 01:00:24:06 01:00:25:18 01:05:04:06 01:05:05:18 -* FROM CLIP NAME: Z678_23N (LAY1) -000098 Z678_23Q V C 01:00:24:05 01:00:25:18 01:05:05:18 01:05:07:07 -* FROM CLIP NAME: Z678_23Q (LAY1) -000099 678_ALL. V C 01:01:04:23 01:01:06:00 01:05:07:07 01:05:08:08 -* FROM CLIP NAME: Z678_31 (LAY4) -000100 Z678_34. V C 01:01:05:19 01:01:08:18 01:05:08:08 01:05:11:07 -* FROM CLIP NAME: Z678_34 (LAY7) -000101 Z598_165 V C 01:00:04:05 01:00:08:04 01:05:11:07 01:05:15:06 -* FROM CLIP NAME: Z598_165A (LAY5) -000102 Z598_COM V C 01:00:04:05 01:00:11:07 01:05:15:06 01:05:22:08 -* FROM CLIP NAME: Z598_166 (LAY11) -000103 Z598_168 V C 01:00:10:10 01:00:11:19 01:05:22:08 01:05:23:17 -* FROM CLIP NAME: Z598_168A (LAY3) -000104 Z598_COM V C 01:00:13:03 01:00:14:05 01:05:23:17 01:05:24:19 -* FROM CLIP NAME: Z598_169A (LAY1) -000105 Z598_170 V C 01:00:14:07 01:00:16:05 01:05:24:19 01:05:26:17 -* FROM CLIP NAME: Z598_170 (LAY10) -000106 Z598_171 V C 01:00:15:02 01:00:17:01 01:05:26:17 01:05:28:16 -* FROM CLIP NAME: Z598_171 (LAY8) -000107 Z598_COM V C 01:00:17:11 01:00:18:22 01:05:28:16 01:05:30:03 -* FROM CLIP NAME: Z598_172 (LAY7) -000108 Z598_COM V C 01:00:04:05 01:00:05:19 01:05:30:03 01:05:31:17 -* FROM CLIP NAME: Z598_173 (LAY6) -000109 Z598_174 V C 01:00:04:23 01:00:09:19 01:05:31:17 01:05:36:13 -* FROM CLIP NAME: Z598_174B (LAY2) -000110 Z598_COM V C 01:00:11:10 01:00:13:06 01:05:36:13 01:05:38:09 -* FROM CLIP NAME: Z598_178 (LAY5) -000111 Z598_179 V C 01:00:13:06 01:00:20:11 01:05:38:09 01:05:45:14 -* FROM CLIP NAME: Z598_179C (LAY2) -000112 Z598_182 V C 01:00:04:05 01:00:09:04 01:05:45:14 01:05:50:13 -* FROM CLIP NAME: Z598_182 (LAY13) -000113 Z598_COM V C 01:00:08:22 01:00:10:07 01:05:50:13 01:05:51:22 -* FROM CLIP NAME: Z598_183M (LAY1) -000114 Z598_182 V C 01:00:10:20 01:00:11:21 01:05:51:22 01:05:52:23 -* FROM CLIP NAME: Z598_182B (LAY1) -000115 Z598_183 V C 01:00:11:01 01:00:11:14 01:05:52:23 01:05:53:12 -* FROM CLIP NAME: Z598_183P (LAY1) -000116 Z598_COM V C 01:00:07:00 01:00:08:03 01:05:53:12 01:05:54:15 -* FROM CLIP NAME: Z598_186 (LAY5) -000117 Z598_183 V C 01:00:08:09 01:00:11:11 01:05:54:15 01:05:57:17 -* FROM CLIP NAME: Z598_183N (LAY3) -000118 Z598_188 V C 01:00:11:15 01:00:12:17 01:05:57:17 01:05:58:19 -* FROM CLIP NAME: Z598_188A (LAY1) -000119 Z598_189 V C 01:00:18:03 01:00:19:17 01:05:58:19 01:06:00:09 -* FROM CLIP NAME: Z598_189A (LAY6) -000120 Z598_COM V C 01:00:19:17 01:00:20:17 01:06:00:09 01:06:01:09 -* FROM CLIP NAME: Z598_190 (LAY10) -000121 Z598_188 V C 01:00:12:15 01:00:16:02 01:06:01:09 01:06:04:20 -* FROM CLIP NAME: Z598_188B (LAY1) -000122 Z598_COM V C 01:00:23:13 01:00:24:09 01:06:04:20 01:06:05:16 -* FROM CLIP NAME: Z598_194 (LAY8) -000123 Z598_COM V C 01:00:16:08 01:00:17:16 01:06:05:16 01:06:07:00 -* FROM CLIP NAME: Z598_188 (LAY11) -000124 Z598_183 V C 01:00:16:14 01:00:18:05 01:06:07:00 01:06:08:15 -* FROM CLIP NAME: Z598_183Q (LAY1) -000125 Z598_196 V C 01:00:27:01 01:00:28:06 01:06:08:15 01:06:09:20 -* FROM CLIP NAME: Z598_196A (LAY1) -000126 Z598_183 V C 01:00:17:21 01:00:19:21 01:06:09:20 01:06:11:20 -* FROM CLIP NAME: Z598_183S (LAY1) -000127 Z598_198 V C 01:00:03:17 01:00:06:04 01:06:11:20 01:06:14:07 -* FROM CLIP NAME: Z598_198B (LAY5) -000128 Z598_201 V C 01:00:07:06 01:00:09:20 01:06:14:07 01:06:16:21 -* FROM CLIP NAME: Z598_201 (LAY10) -000129 Z598_202 V C 01:00:10:09 01:00:13:22 01:06:16:21 01:06:20:10 -* FROM CLIP NAME: Z598_202 (LAY18) -000130 Z598_203 V C 01:00:13:10 01:00:16:00 01:06:20:10 01:06:23:00 -* FROM CLIP NAME: Z598_203B (LAY6) -000131 Z598_COM V C 01:00:05:09 01:00:07:13 01:06:23:00 01:06:25:04 -* FROM CLIP NAME: Z598_204 (LAY12) -000132 Z598_205 V C 01:00:06:17 01:00:12:14 01:06:25:04 01:06:31:01 -* FROM CLIP NAME: Z598_205 (LAY10) -000133 Z598_212 V C 01:00:04:05 01:00:06:06 01:06:31:01 01:06:33:02 -* FROM CLIP NAME: Z598_212C (LAY1) -000134 Z598_COM V C 01:00:04:07 01:00:06:08 01:06:33:02 01:06:35:03 -* FROM CLIP NAME: Z598_209 (LAY3) -000135 Z598_212 V C 01:00:08:13 01:00:09:19 01:06:35:03 01:06:36:09 -* FROM CLIP NAME: Z598_212A (LAY8) -000136 Z598_COM V C 01:00:09:21 01:00:11:05 01:06:36:09 01:06:37:17 -* FROM CLIP NAME: Z598_211 (LAY6) -000137 Z598_212 V C 01:00:10:09 01:00:13:10 01:06:37:17 01:06:40:18 -* FROM CLIP NAME: Z598_212B (LAY6) -000138 Z598_216 V C 01:00:12:12 01:00:16:08 01:06:40:18 01:06:44:14 -* FROM CLIP NAME: Z598_216B (LAY1) -000139 Z682_1B. V C 01:00:04:09 01:00:10:15 01:06:44:14 01:06:50:20 -* FROM CLIP NAME: Z682_1B (LAY3) -000140 Z682_2C. V C 01:00:04:05 01:00:05:17 01:06:50:20 01:06:52:08 -* FROM CLIP NAME: Z682_2C (LAY1) -000141 Z682_3A. V C 01:00:04:05 01:00:05:13 01:06:52:08 01:06:53:16 -* FROM CLIP NAME: Z682_3A (LAY1) -000142 Z682_4.L V C 01:00:04:05 01:00:06:01 01:06:53:16 01:06:55:12 -* FROM CLIP NAME: Z682_4 (LAY5) -000143 Z682_6.L V C 01:00:04:09 01:00:06:17 01:06:55:12 01:06:57:20 -* FROM CLIP NAME: Z682_6 (LAY4) -000144 Z682_7A. V C 01:00:04:15 01:00:07:01 01:06:57:20 01:07:00:06 -* FROM CLIP NAME: Z682_7A (LAY3) -000145 Z682_8.L V C 01:00:04:05 01:00:06:08 01:07:00:06 01:07:02:09 -* FROM CLIP NAME: Z682_8 (LAY3) -000146 Z682_9.L V C 01:00:04:02 01:00:07:06 01:07:02:09 01:07:05:13 -* FROM CLIP NAME: Z682_9 (LAY5) -000147 Z682_10C V C 01:00:07:09 01:00:09:15 01:07:05:13 01:07:07:19 -* FROM CLIP NAME: Z682_10C (LAY3) -000148 Z682_11B V C 01:00:09:19 01:00:12:07 01:07:07:19 01:07:10:07 -* FROM CLIP NAME: Z682_11B (LAY3) -000149 Z682_13. V C 01:00:04:05 01:00:08:21 01:07:10:07 01:07:14:23 -* FROM CLIP NAME: Z682_13 (LAY6) -000150 Z682_52A V C 01:00:04:05 01:00:07:08 01:07:14:23 01:07:18:02 -* FROM CLIP NAME: Z682_52A (LAY1) -000151 Z682_24E V C 01:00:04:05 01:00:06:23 01:07:18:02 01:07:20:20 -* FROM CLIP NAME: Z682_24E (LAY2) -000152 Z682_25E V C 01:00:05:11 01:00:08:06 01:07:20:20 01:07:23:15 -* FROM CLIP NAME: Z682_25E (LAY2) -000153 Z682_26E V C 01:00:06:09 01:00:09:03 01:07:23:15 01:07:26:09 -* FROM CLIP NAME: Z682_26E (LAY1) -000154 Z682_53. V C 01:00:04:05 01:00:07:12 01:07:26:09 01:07:29:16 -* FROM CLIP NAME: Z682_53 (LAY7) -000155 Z682_54B V C 01:00:06:07 01:00:14:22 01:07:29:16 01:07:38:07 -* FROM CLIP NAME: Z682_54B (LAY4) -000156 Z682_55A V C 01:00:04:05 01:00:06:12 01:07:38:07 01:07:40:14 -* FROM CLIP NAME: Z682_55A (LAY5) -000157 Z682_56. V C 01:00:04:05 01:00:07:10 01:07:40:14 01:07:43:19 -* FROM CLIP NAME: Z682_56 (LAY6) -000158 Z682_57. V C 01:00:06:04 01:00:08:20 01:07:43:19 01:07:46:11 -* FROM CLIP NAME: Z682_57 (LAY7) -000159 Z682_58. V C 01:00:04:19 01:00:07:00 01:07:46:11 01:07:48:16 -* FROM CLIP NAME: Z682_58 (LAY5) -000160 Z682_59. V C 01:00:04:18 01:00:06:00 01:07:48:16 01:07:49:22 -* FROM CLIP NAME: Z682_59 (LAY10) -000161 Z682_60A V C 01:00:05:00 01:00:07:05 01:07:49:22 01:07:52:03 -* FROM CLIP NAME: Z682_60A (LAY2) -000162 Z682_62D V C 01:00:05:11 01:00:08:12 01:07:52:03 01:07:55:04 -* FROM CLIP NAME: Z682_62D (LAY4) -000163 Z682_101 V C 01:00:03:23 01:00:06:23 01:07:55:04 01:07:58:04 -* FROM CLIP NAME: Z682_101G (LAY4) -000164 Z682_102 V C 01:00:08:22 01:00:10:16 01:07:58:04 01:07:59:22 -* FROM CLIP NAME: Z682_102M (LAY3) -000165 Z682_103 V C 01:00:11:02 01:00:12:15 01:07:59:22 01:08:01:11 -* FROM CLIP NAME: Z682_103P (LAY4) -000166 Z682_105 V C 01:00:04:09 01:00:04:23 01:08:01:11 01:08:02:01 -* FROM CLIP NAME: Z682_105 (LAY2) -000167 Z682_103 V C 01:00:13:07 01:00:14:17 01:08:02:01 01:08:03:11 -* FROM CLIP NAME: Z682_103U (LAY1) -000168 Z682_103 V C 01:00:13:22 01:00:15:12 01:08:03:11 01:08:05:01 -* FROM CLIP NAME: Z682_103N (LAY4) -000169 Z682_105 V C 01:00:04:22 01:00:05:11 01:08:05:01 01:08:05:14 -* FROM CLIP NAME: Z682_105A (LAY1) -000170 Z682_103 V C 01:00:15:03 01:00:16:00 01:08:05:14 01:08:06:11 -* FROM CLIP NAME: Z682_103V (LAY1) -000171 Z682_110 V C 01:00:15:22 01:00:17:12 01:08:06:11 01:08:08:01 -* FROM CLIP NAME: Z682_110B (LAY1) -000172 Z682_103 V C 01:00:16:03 01:00:18:03 01:08:08:01 01:08:10:01 -* FROM CLIP NAME: Z682_103M (LAY6) -000173 Z682_113 V C 01:00:04:04 01:00:06:01 01:08:10:01 01:08:11:22 -* FROM CLIP NAME: Z682_113B (LAY5) -000174 Z682_114 V C 01:00:05:00 01:00:06:23 01:08:11:22 01:08:13:21 -* FROM CLIP NAME: Z682_114B (LAY2) -000175 Z682_115 V C 01:00:11:19 01:00:15:17 01:08:13:21 01:08:17:19 -* FROM CLIP NAME: Z682_115G (LAY3) -000176 Z682_116 V C 01:00:04:05 01:00:05:17 01:08:17:19 01:08:19:07 -* FROM CLIP NAME: Z682_116 (LAY2) -000177 Z682_117 V C 01:00:02:17 01:00:06:14 01:08:19:07 01:08:23:04 -* FROM CLIP NAME: Z682_117P (LAY4) -000178 Z682_151 V C 01:00:04:01 01:00:06:19 01:08:23:04 01:08:25:22 -* FROM CLIP NAME: Z682_151C (LAY3) -000179 Z682_153 V C 01:00:06:20 01:00:08:00 01:08:25:22 01:08:27:02 -* FROM CLIP NAME: Z682_153A (LAY3) -000180 Z682_154 V C 01:00:06:06 01:00:07:04 01:08:27:02 01:08:28:00 -* FROM CLIP NAME: Z682_154 (LAY6) -000181 Z682_155 V C 01:00:08:22 01:00:10:00 01:08:28:00 01:08:29:02 -* FROM CLIP NAME: Z682_155B (LAY2) -000182 Z682_156 V C 01:00:10:00 01:00:10:22 01:08:29:02 01:08:30:00 -* FROM CLIP NAME: Z682_156 (LAY3) -000183 Z682_156 V C 01:00:10:21 01:00:10:22 01:08:30:00 01:08:30:17 -M2 Z682_156 000.0 01:00:10:21 -* FROM CLIP NAME: Z682_156 (LAY3) FF -* * FREEZE FRAME -000184 Z682_157 V C 01:00:10:20 01:00:10:21 01:08:30:17 01:08:30:18 -M2 Z682_157 000.0 01:00:10:20 -* FROM CLIP NAME: Z682_157 (LAY2) FF -* * FREEZE FRAME -000185 Z682_157 V C 01:00:10:20 01:00:11:14 01:08:30:18 01:08:31:12 -* FROM CLIP NAME: Z682_157 (LAY2) -000186 Z682_156 V C 01:00:11:08 01:00:12:12 01:08:31:12 01:08:32:16 -* FROM CLIP NAME: Z682_156C (LAY3) -000187 Z682_157 V C 01:00:12:20 01:00:14:09 01:08:32:16 01:08:34:05 -* FROM CLIP NAME: Z682_157C (LAY1) -000188 Z682_160 V C 01:00:14:07 01:00:18:03 01:08:34:05 01:08:38:01 -* FROM CLIP NAME: Z682_160 (LAY7) -000189 Z682_161 V C 01:00:17:14 01:00:18:10 01:08:38:01 01:08:38:21 -* FROM CLIP NAME: Z682_161 (LAY3) -000190 Z682_162 V C 01:00:18:06 01:00:20:00 01:08:38:21 01:08:40:15 -* FROM CLIP NAME: Z682_162D (LAY2) -000191 Z682_165 V C 01:00:19:17 01:00:23:04 01:08:40:15 01:08:44:02 -* FROM CLIP NAME: Z682_165 (LAY5) -000192 Z682_162 V C 01:00:22:09 01:00:24:02 01:08:44:02 01:08:45:19 -* FROM CLIP NAME: Z682_162E (LAY3) -000193 Z682_165 V C 01:00:24:10 01:00:25:06 01:08:45:19 01:08:46:15 -* FROM CLIP NAME: Z682_165A (LAY1) -000194 Z682_168 V C 01:00:25:00 01:00:26:11 01:08:46:15 01:08:48:02 -* FROM CLIP NAME: Z682_168 (LAY3) -000195 Z682_165 V C 01:00:26:08 01:00:27:08 01:08:48:02 01:08:49:02 -* FROM CLIP NAME: Z682_165E (LAY3) -000196 Z682_170 V C 01:00:27:10 01:00:28:02 01:08:49:02 01:08:49:18 -* FROM CLIP NAME: Z682_170A (LAY1) -000197 Z682_165 V C 01:00:28:09 01:00:29:15 01:08:49:18 01:08:51:00 -* FROM CLIP NAME: Z682_165F (LAY1) -000198 Z682_172 V C 01:00:29:14 01:00:30:03 01:08:51:00 01:08:51:13 -* FROM CLIP NAME: Z682_172 (LAY3) -000199 Z682_201 V C 01:00:04:05 01:00:05:00 01:08:51:13 01:08:52:08 -* FROM CLIP NAME: Z682_201 (LAY7) -000200 Z682_202 V C 01:00:05:01 01:00:05:23 01:08:52:08 01:08:53:06 -* FROM CLIP NAME: Z682_202C (LAY4) -000201 Z682_203 V C 01:00:05:16 01:00:06:09 01:08:53:06 01:08:53:23 -* FROM CLIP NAME: Z682_203 (LAY5) -000202 Z682_204 V C 01:00:06:12 01:00:08:10 01:08:53:23 01:08:55:21 -* FROM CLIP NAME: Z682_204B (LAY6) -000203 Z682_205 V C 01:00:08:15 01:00:10:13 01:08:55:21 01:08:57:19 -* FROM CLIP NAME: Z682_205B (LAY2) -000204 Z682_206 V C 01:00:10:16 01:00:12:05 01:08:57:19 01:08:59:08 -* FROM CLIP NAME: Z682_206B (LAY5) -000205 Z682_207 V C 01:00:12:00 01:00:13:05 01:08:59:08 01:09:00:13 -* FROM CLIP NAME: Z682_207A (LAY3) -000206 Z682_208 V C 01:00:04:06 01:00:05:02 01:09:00:13 01:09:01:09 -* FROM CLIP NAME: Z682_208 (LAY5) -000207 Z682_209 V C 01:00:04:10 01:00:05:09 01:09:01:09 01:09:02:08 -* FROM CLIP NAME: Z682_209 (LAY5) -000208 Z682_210 V C 01:00:04:07 01:00:12:16 01:09:02:08 01:09:10:17 -* FROM CLIP NAME: Z682_210 (LAY9) -000209 Z682_211 V C 01:00:04:06 01:00:05:14 01:09:10:17 01:09:12:01 -* FROM CLIP NAME: Z682_211F (LAY2) -000210 Z682_211 V C 01:00:05:14 01:00:09:18 01:09:12:01 01:09:16:05 -* FROM CLIP NAME: Z682_211E (LAY5) -000211 Z682_214 V C 01:00:10:12 01:00:12:05 01:09:16:05 01:09:17:22 -* FROM CLIP NAME: Z682_214H (LAY5) -000212 Z682_214 V C 01:00:12:02 01:00:13:19 01:09:17:22 01:09:19:15 -* FROM CLIP NAME: Z682_214S (LAY1) -000213 Z682_214 V C 01:00:13:20 01:00:17:01 01:09:19:15 01:09:22:20 -* FROM CLIP NAME: Z682_214B (LAY5) -000214 Z682_214 V C 01:00:17:18 01:00:21:01 01:09:22:20 01:09:26:03 -* FROM CLIP NAME: Z682_214K (LAY6) -000215 Z682_214 V C 01:00:17:23 01:00:20:11 01:09:26:03 01:09:28:15 -* FROM CLIP NAME: Z682_214V (LAY2) -000216 Z682_214 V C 01:00:20:02 01:00:24:00 01:09:28:15 01:09:32:13 -* FROM CLIP NAME: Z682_214U (LAY3) -000217 Z682_214 V C 01:00:25:05 01:00:32:09 01:09:32:13 01:09:39:17 -* FROM CLIP NAME: Z682_214N (LAY6) -000218 Z682_252 V C 01:00:05:11 01:00:08:09 01:09:39:17 01:09:42:15 -* FROM CLIP NAME: Z682_252 (LAY6) -000219 Z682_253 V C 01:00:04:00 01:00:06:09 01:09:42:15 01:09:45:00 -* FROM CLIP NAME: Z682_253B (LAY2) -000220 Z682_254 V C 01:00:04:19 01:00:06:05 01:09:45:00 01:09:46:10 -* FROM CLIP NAME: Z682_254 (LAY4) -000221 Z682_255 V C 01:00:04:05 01:00:05:02 01:09:46:10 01:09:47:07 -* FROM CLIP NAME: Z682_255A (LAY1) -000222 Z682_255 V C 01:00:06:11 01:00:07:23 01:09:47:07 01:09:48:19 -* FROM CLIP NAME: Z682_255B (LAY2) -000223 Z682_257 V C 01:00:04:05 01:00:05:13 01:09:48:19 01:09:50:03 -* FROM CLIP NAME: Z682_257 (LAY2) -000224 Z682_258 V C 01:00:04:05 01:00:05:01 01:09:50:03 01:09:50:23 -* FROM CLIP NAME: Z682_258A (LAY2) -000225 Z682_259 V C 01:00:04:05 01:00:05:12 01:09:50:23 01:09:52:06 -* FROM CLIP NAME: Z682_259F (LAY1) -000226 Z682_260 V C 01:00:04:08 01:00:05:19 01:09:52:06 01:09:53:17 -* FROM CLIP NAME: Z682_260 (LAY2) -000227 Z683_RYA V C 01:00:04:05 01:00:08:23 01:09:53:17 01:09:58:11 -* FROM CLIP NAME: Z683_1B (LAY3) -000228 Z683_3B. V C 01:00:09:00 01:00:12:22 01:09:58:11 01:10:02:09 -* FROM CLIP NAME: Z683_3B (LAY3) -000229 Z683_4A. V C 01:00:13:07 01:00:15:17 01:10:02:09 01:10:04:19 -* FROM CLIP NAME: Z683_4A (LAY3) -000230 Z683_5B. V C 01:00:16:13 01:00:17:03 01:10:04:19 01:10:05:09 -* FROM CLIP NAME: Z683_5B (LAY3) -000231 Z683_5K. V C 01:00:16:06 01:00:18:10 01:10:05:09 01:10:07:13 -* FROM CLIP NAME: Z683_5K (LAY3) -000232 Z683_5H. V C 01:00:16:21 01:00:18:00 01:10:07:13 01:10:08:16 -* FROM CLIP NAME: Z683_5H (LAY8) -000233 Z683_7D. V C 01:00:20:00 01:00:25:05 01:10:08:16 01:10:13:21 -* FROM CLIP NAME: Z683_7D (LAY4) -000234 Z683_10B V C 01:00:24:08 01:00:26:07 01:10:13:21 01:10:15:20 -* FROM CLIP NAME: Z683_10B (LAY2) -000235 Z683_11. V C 01:00:26:04 01:00:26:18 01:10:15:20 01:10:16:10 -* FROM CLIP NAME: Z683_11 (LAY7) -000236 Z683_11A V C 01:00:26:19 01:00:28:01 01:10:16:10 01:10:17:16 -* FROM CLIP NAME: Z683_11A (LAY8) -000237 Z683_RYA V C 01:00:26:20 01:00:27:14 01:10:17:16 01:10:18:10 -* FROM CLIP NAME: Z683_12A (LAY9) -000238 Z683_12K V C 01:00:27:15 01:00:29:02 01:10:18:10 01:10:19:21 -* FROM CLIP NAME: Z683_12K (LAY3) -000239 Z683_13D V C 01:00:29:15 01:00:30:06 01:10:19:21 01:10:20:12 -* FROM CLIP NAME: Z683_13D (LAY2) -000240 Z683_18. V C 01:00:30:14 01:00:31:22 01:10:20:12 01:10:21:20 -* FROM CLIP NAME: Z683_18 (LAY7) -000241 Z683_RYA V C 01:00:32:14 01:00:34:04 01:10:21:20 01:10:23:10 -* FROM CLIP NAME: Z683_18D (LAY3) -000242 Z683_14C V C 01:00:28:07 01:00:30:22 01:10:23:10 01:10:26:01 -* FROM CLIP NAME: Z683_14C (LAY9) -000243 Z683_16. V C 01:00:31:01 01:00:32:13 01:10:26:01 01:10:27:13 -* FROM CLIP NAME: Z683_16 (LAY4) -000244 Z683_18C V C 01:00:33:12 01:00:34:11 01:10:27:13 01:10:28:12 -* FROM CLIP NAME: Z683_18C (LAY4) -000245 Z683_19A V C 01:00:35:10 01:00:36:20 01:10:28:12 01:10:29:22 -* FROM CLIP NAME: Z683_19A (LAY3) -000246 Z683_52A V C 01:00:04:07 01:00:05:09 01:10:29:22 01:10:31:00 -* FROM CLIP NAME: Z683_52A (LAY17) -000247 Z683_53. V C 01:00:05:11 01:00:06:12 01:10:31:00 01:10:32:01 -* FROM CLIP NAME: Z683_53 (LAY4) -000248 Z683_55. V C 01:00:04:05 01:00:07:15 01:10:32:01 01:10:35:11 -* FROM CLIP NAME: Z683_55 (LAY14) -000249 Z683_56A V C 01:00:05:16 01:00:06:14 01:10:35:11 01:10:36:09 -* FROM CLIP NAME: Z683_56A (LAY2) -000250 Z683_57C V C 01:00:08:09 01:00:09:18 01:10:36:09 01:10:37:18 -* FROM CLIP NAME: Z683_57C (LAY3) -000251 Z683_59A V C 01:00:08:03 01:00:09:23 01:10:37:18 01:10:39:14 -* FROM CLIP NAME: Z683_59A (LAY10) -000252 Z683_60A V C 01:00:09:16 01:00:11:04 01:10:39:14 01:10:41:02 -* FROM CLIP NAME: Z683_60A (LAY5) -000253 Z683_61. V C 01:00:11:20 01:00:12:22 01:10:41:02 01:10:42:04 -* FROM CLIP NAME: Z683_61 (LAY5) -000254 Z683_62. V C 01:00:13:03 01:00:15:10 01:10:42:04 01:10:44:11 -* FROM CLIP NAME: Z683_62 (LAY9) -000255 Z683_63. V C 01:00:14:23 01:00:17:02 01:10:44:11 01:10:46:14 -* FROM CLIP NAME: Z683_63 (LAY5) -000256 Z683_71C V C 01:00:04:16 01:00:08:10 01:10:46:14 01:10:50:08 -* FROM CLIP NAME: Z683_71C (LAY1) -000257 Z683_73. V C 01:00:07:20 01:00:09:02 01:10:50:08 01:10:51:14 -* FROM CLIP NAME: Z683_73 (LAY5) -000258 Z683_74B V C 01:00:10:17 01:00:11:22 01:10:51:14 01:10:52:19 -* FROM CLIP NAME: Z683_74B (LAY5) -000259 Z683_75A V C 01:00:04:14 01:00:06:20 01:10:52:19 01:10:55:01 -* FROM CLIP NAME: Z683_75A (LAY3) -000260 Z683_76C V C 01:00:06:09 01:00:07:14 01:10:55:01 01:10:56:06 -* FROM CLIP NAME: Z683_76C (LAY3) -000261 Z683_76B V C 01:00:07:01 01:00:07:18 01:10:56:06 01:10:56:23 -* FROM CLIP NAME: Z683_76B (LAY4) -000262 Z683_76A V C 01:00:08:05 01:00:09:01 01:10:56:23 01:10:57:19 -* FROM CLIP NAME: Z683_76A (LAY4) -000263 Z683_76. V C 01:00:09:06 01:00:11:20 01:10:57:19 01:11:00:09 -* FROM CLIP NAME: Z683_76 (LAY5) -000264 Z683_77. V C 01:00:12:13 01:00:13:06 01:11:00:09 01:11:01:02 -* FROM CLIP NAME: Z683_77 (LAY5) -000265 Z683_78. V C 01:00:12:20 01:00:13:15 01:11:01:02 01:11:01:21 -* FROM CLIP NAME: Z683_78 (LAY5) -000266 700_EPIL V C 01:00:00:01 01:00:00:03 01:11:01:21 01:11:01:23 -* FROM CLIP NAME: LG_BLACK239 (REN2) -000267 Z683_53D V C 01:00:42:11 01:00:44:01 01:11:01:23 01:11:03:13 -* FROM CLIP NAME: Z683_53D (LAY7) -000268 Z683_80B V C 01:00:04:05 01:00:06:06 01:11:03:13 01:11:05:14 -* FROM CLIP NAME: Z683_80B (LAY3) -000269 Z683_81. V C 01:00:05:23 01:00:06:15 01:11:05:14 01:11:06:06 -* FROM CLIP NAME: Z683_81 (LAY5) -000270 Z683_82. V C 01:00:07:11 01:00:08:10 01:11:06:06 01:11:07:05 -* FROM CLIP NAME: Z683_82 (LAY7) -000271 Z683_80. V C 01:00:08:18 01:00:10:12 01:11:07:05 01:11:08:23 -* FROM CLIP NAME: Z683_80 (LAY7) -000272 Z683_84. V C 01:00:11:06 01:00:11:18 01:11:08:23 01:11:09:11 -* FROM CLIP NAME: Z683_84 (LAY5) -000273 Z683_84A V C 01:00:11:23 01:00:12:14 01:11:09:11 01:11:10:02 -* FROM CLIP NAME: Z683_84A (LAY3) -000274 Z683_85B V C 01:00:42:05 01:00:43:00 01:11:10:02 01:11:10:21 -* FROM CLIP NAME: Z683_85B (LAY3) -000275 Z683_86. V C 01:00:43:03 01:00:44:18 01:11:10:21 01:11:12:12 -* FROM CLIP NAME: Z683_86 (LAY4) -000276 Z688_801 V C 01:00:05:23 01:00:08:11 01:11:12:12 01:11:15:00 -* FROM CLIP NAME: Z688_801C (LAY4) -000277 Z686_1.A V C 01:00:04:04 01:00:05:20 01:11:15:00 01:11:16:16 -* FROM CLIP NAME: Z686_1 (ANIM10) -000278 Z686_2.R V C 01:00:04:05 01:00:06:12 01:11:16:16 01:11:18:23 -* FROM CLIP NAME: Z686_2 (RENDER-ANIM17) -000279 Z686_3E. V C 01:00:03:23 01:00:09:06 01:11:18:23 01:11:24:06 -* FROM CLIP NAME: Z686_3E (ANIM9) -000280 Z686_4C. V C 01:00:04:05 01:00:09:19 01:11:24:06 01:11:29:20 -* FROM CLIP NAME: Z686_4C (LAY1) -000281 Z686_5A. V C 01:00:04:04 01:00:06:00 01:11:29:20 01:11:31:16 -* FROM CLIP NAME: Z686_5A (LAY2) -000282 Z686_5A. V C 01:00:06:00 01:00:08:22 01:11:31:16 01:11:33:04 -M2 Z686_5A. 047.6 01:00:06:00 -* FROM CLIP NAME: Z686_5A (LAY2) (47.56 FPS) -000283 Z686_7.R V C 01:00:09:15 01:00:10:07 01:11:33:04 01:11:33:20 -* FROM CLIP NAME: Z686_7 (RENDER-ANIM20) -000284 Z684_1Q. V C 01:00:04:20 01:00:06:19 01:11:33:20 01:11:35:19 -* FROM CLIP NAME: Z684_1Q (LAY5) -000285 Z683_102 V C 01:00:06:07 01:00:07:21 01:11:35:19 01:11:37:09 -* FROM CLIP NAME: Z683_102 (LAY5) -000286 Z683_201 V C 01:00:07:23 01:00:11:20 01:11:37:09 01:11:41:06 -* FROM CLIP NAME: Z683_201A (LAY3) -000287 Z683_202 V C 01:00:12:10 01:00:15:21 01:11:41:06 01:11:44:17 -* FROM CLIP NAME: Z683_202 (LAY4) -000288 Z683_203 V C 01:00:14:03 01:00:14:20 01:11:44:17 01:11:45:10 -* FROM CLIP NAME: Z683_203 (LAY6) -000289 Z683_204 V C 01:00:16:11 01:00:17:08 01:11:45:10 01:11:46:07 -* FROM CLIP NAME: Z683_204 (LAY3) -000290 Z683_203 V C 01:00:14:18 01:00:16:10 01:11:46:07 01:11:47:23 -* FROM CLIP NAME: Z683_203A (LAY3) -000291 Z683_204 V C 01:00:16:12 01:00:19:22 01:11:47:23 01:11:51:09 -* FROM CLIP NAME: Z683_204A (LAY3) -000292 Z683_205 V C 01:00:19:08 01:00:25:03 01:11:51:09 01:11:57:04 -* FROM CLIP NAME: Z683_205A (LAY5) -000293 Z686_51B V C 01:00:04:05 01:00:06:01 01:11:57:04 01:11:59:00 -* FROM CLIP NAME: Z686_51B (LAY1) -000294 Z684_201 V C 01:00:05:12 01:00:07:09 01:11:59:00 01:12:00:21 -* FROM CLIP NAME: Z684_201C (LAY3) -000295 Z683_301 V C 01:00:15:14 01:00:17:09 01:12:00:21 01:12:02:16 -* FROM CLIP NAME: Z683_301D (LAY3) -000296 Z683_302 V C 01:00:16:21 01:00:18:01 01:12:02:16 01:12:03:20 -* FROM CLIP NAME: Z683_302A (LAY2) -000297 Z683_303 V C 01:00:18:01 01:00:19:18 01:12:03:20 01:12:05:13 -* FROM CLIP NAME: Z683_303A (LAY2) -000298 Z683_353 V C 01:00:07:01 01:00:08:06 01:12:05:13 01:12:06:18 -* FROM CLIP NAME: Z683_353A (LAY4) -000299 Z683_351 V C 01:00:04:05 01:00:05:17 01:12:06:18 01:12:08:06 -* FROM CLIP NAME: Z683_351 (LAY6) -000300 Z683_352 V C 01:00:06:00 01:00:07:07 01:12:08:06 01:12:09:13 -* FROM CLIP NAME: Z683_352 (LAY5) -000301 Z683_229 V C 01:00:08:00 01:00:09:11 01:12:09:13 01:12:11:00 -* FROM CLIP NAME: Z683_229C (LAY6) -000302 Z683_232 V C 01:00:07:22 01:00:12:11 01:12:11:00 01:12:15:13 -* FROM CLIP NAME: Z683_232F (LAY8) -000303 Z686_101 V C 01:00:04:07 01:00:05:14 01:12:15:13 01:12:16:20 -* FROM CLIP NAME: Z686_101 (LAY2) -000304 Z686_102 V C 01:00:04:19 01:00:06:14 01:12:16:20 01:12:18:15 -* FROM CLIP NAME: Z686_102A (LAY1) -000305 Z686_105 V C 01:00:07:13 01:00:09:08 01:12:18:15 01:12:20:10 -* FROM CLIP NAME: Z686_105B (LAY1) -000306 Z686_106 V C 01:00:08:01 01:00:08:17 01:12:20:10 01:12:21:02 -* FROM CLIP NAME: Z686_106B (LAY1) -000307 Z686_107 V C 01:00:08:05 01:00:10:04 01:12:21:02 01:12:23:01 -* FROM CLIP NAME: Z686_107A (LAY2) -000308 Z683_355 V C 01:00:08:22 01:00:10:04 01:12:23:01 01:12:24:07 -* FROM CLIP NAME: Z683_355A (LAY1) -000309 Z683_356 V C 01:00:10:03 01:00:11:03 01:12:24:07 01:12:25:07 -* FROM CLIP NAME: Z683_356 (LAY7) -000310 Z683_357 V C 01:00:11:06 01:00:11:14 01:12:25:07 01:12:25:15 -* FROM CLIP NAME: Z683_357A (LAY1) -000311 Z683_359 V C 01:00:11:12 01:00:13:12 01:12:25:15 01:12:27:15 -* FROM CLIP NAME: Z683_359 (LAY5) -000312 Z684_301 V C 01:00:03:14 01:00:04:14 01:12:27:15 01:12:28:15 -* FROM CLIP NAME: Z684_301B (LAY3) -000313 Z684_301 V C 01:00:04:14 01:00:08:04 01:12:28:15 01:12:32:05 -* FROM CLIP NAME: Z684_301E (LAY4) -000314 Z684_303 V C 01:00:08:00 01:00:09:00 01:12:32:05 01:12:33:05 -* FROM CLIP NAME: Z684_303 (LAY7) -000315 Z684_304 V C 01:00:09:07 01:00:10:13 01:12:33:05 01:12:34:11 -* FROM CLIP NAME: Z684_304 (LAY7) -000316 Z684_306 V C 01:00:10:11 01:00:12:13 01:12:34:11 01:12:36:13 -* FROM CLIP NAME: Z684_306A (LAY5) -000317 Z684_307 V C 01:00:04:05 01:00:06:02 01:12:36:13 01:12:38:10 -* FROM CLIP NAME: Z684_307A (LAY4) -000318 Z684_309 V C 01:00:04:16 01:00:06:04 01:12:38:10 01:12:39:22 -* FROM CLIP NAME: Z684_309 (LAY12) -000319 Z684_310 V C 01:00:07:02 01:00:08:02 01:12:39:22 01:12:40:22 -* FROM CLIP NAME: Z684_310A (LAY4) -000320 Z684_311 V C 01:00:07:23 01:00:10:19 01:12:40:22 01:12:43:18 -* FROM CLIP NAME: Z684_311 (LAY12) -000321 Z684_312 V C 01:00:10:17 01:00:11:23 01:12:43:18 01:12:45:00 -* FROM CLIP NAME: Z684_312 (LAY11) -000322 Z684_313 V C 01:00:12:03 01:00:13:07 01:12:45:00 01:12:46:04 -* FROM CLIP NAME: Z684_313 (LAY12) -000323 Z684_314 V C 01:00:13:00 01:00:14:23 01:12:46:04 01:12:48:03 -* FROM CLIP NAME: Z684_314A (LAY4) -000324 Z684_316 V C 01:00:15:11 01:00:16:21 01:12:48:03 01:12:49:13 -* FROM CLIP NAME: Z684_316 (LAY10) -000325 Z684_317 V C 01:00:16:12 01:00:17:04 01:12:49:13 01:12:50:05 -* FROM CLIP NAME: Z684_317 (LAY10) -000326 Z684_318 V C 01:00:17:03 01:00:18:00 01:12:50:05 01:12:51:02 -* FROM CLIP NAME: Z684_318A (LAY7) -000327 Z684_319 V C 01:00:17:14 01:00:18:00 01:12:51:02 01:12:51:12 -* FROM CLIP NAME: Z684_319 (LAY10) -000328 Z684_320 V C 01:00:18:22 01:00:19:19 01:12:51:12 01:12:52:09 -* FROM CLIP NAME: Z684_320 (LAY13) -000329 Z684_321 V C 01:00:19:09 01:00:20:12 01:12:52:09 01:12:53:12 -* FROM CLIP NAME: Z684_321 (LAY9) -000330 Z684_322 V C 01:00:19:23 01:00:20:22 01:12:53:12 01:12:54:11 -* FROM CLIP NAME: Z684_322 (LAY9) -000331 Z684_323 V C 01:00:21:07 01:00:24:04 01:12:54:11 01:12:57:08 -* FROM CLIP NAME: Z684_323 (LAY9) -000332 Z683_401 V C 01:00:12:18 01:00:15:06 01:12:57:08 01:12:59:20 -* FROM CLIP NAME: Z683_401 (LAY3) -000333 Z683_402 V C 01:00:14:22 01:00:17:05 01:12:59:20 01:13:02:03 -* FROM CLIP NAME: Z683_402A (LAY2) -000334 Z683_403 V C 01:00:16:21 01:00:19:02 01:13:02:03 01:13:04:08 -* FROM CLIP NAME: Z683_403A (LAY5) -000335 Z683_404 V C 01:00:19:00 01:00:20:23 01:13:04:08 01:13:06:07 -* FROM CLIP NAME: Z683_404A (LAY5) -000336 Z683_405 V C 01:00:20:01 01:00:22:20 01:13:06:07 01:13:09:02 -* FROM CLIP NAME: Z683_405 (LAY3) -000337 Z683_406 V C 01:00:23:02 01:00:25:23 01:13:09:02 01:13:11:23 -* FROM CLIP NAME: Z683_406 (LAY5) -000338 Z683_407 V C 01:00:26:03 01:00:27:09 01:13:11:23 01:13:13:05 -* FROM CLIP NAME: Z683_407 (LAY3) -000339 Z683_408 V C 01:00:26:19 01:00:29:03 01:13:13:05 01:13:15:13 -* FROM CLIP NAME: Z683_408A (LAY2) -000340 Z684_401 V C 01:00:03:10 01:00:04:17 01:13:15:13 01:13:16:20 -* FROM CLIP NAME: Z684_401 (LAY9) -000341 Z684_402 V C 01:00:05:17 01:00:07:09 01:13:16:20 01:13:18:12 -* FROM CLIP NAME: Z684_402A (LAY5) -000342 Z684_403 V C 01:00:07:05 01:00:08:23 01:13:18:12 01:13:20:06 -* FROM CLIP NAME: Z684_403 (LAY6) -000343 Z684_401 V C 01:00:08:11 01:00:11:15 01:13:20:06 01:13:23:10 -* FROM CLIP NAME: Z684_401B (LAY3) -000344 Z684_404 V C 01:00:11:01 01:00:11:21 01:13:23:10 01:13:24:06 -* FROM CLIP NAME: Z684_404 (LAY4) -000345 Z684_401 V C 01:00:12:06 01:00:13:01 01:13:24:06 01:13:25:01 -* FROM CLIP NAME: Z684_401C (LAY4) -000346 Z684_403 V C 01:00:13:21 01:00:15:13 01:13:25:01 01:13:26:17 -* FROM CLIP NAME: Z684_403B (LAY3) -000347 Z684_401 V C 01:00:14:21 01:00:17:07 01:13:26:17 01:13:29:03 -* FROM CLIP NAME: Z684_401D (LAY3) -000348 Z684_403 V C 01:00:17:16 01:00:19:07 01:13:29:03 01:13:30:18 -* FROM CLIP NAME: Z684_403C (LAY3) -000349 Z684_406 V C 01:00:17:10 01:00:18:21 01:13:30:18 01:13:32:05 -* FROM CLIP NAME: Z684_406 (LAY5) -000350 Z684_401 V C 01:00:18:06 01:00:20:20 01:13:32:05 01:13:34:19 -* FROM CLIP NAME: Z684_401E (LAY3) -000351 Z684_408 V C 01:00:21:00 01:00:22:09 01:13:34:19 01:13:36:04 -* FROM CLIP NAME: Z684_408A (LAY3) -000352 Z684_403 V C 01:00:22:02 01:00:23:00 01:13:36:04 01:13:37:02 -* FROM CLIP NAME: Z684_403D (LAY3) -000353 Z684_409 V C 01:00:22:21 01:00:24:14 01:13:37:02 01:13:38:19 -* FROM CLIP NAME: Z684_409 (LAY7) -000354 Z684_401 V C 01:00:24:03 01:00:27:12 01:13:38:19 01:13:42:04 -* FROM CLIP NAME: Z684_401F (LAY3) -000355 Z688_1K. V C 01:00:04:05 01:00:05:23 01:13:42:04 01:13:43:22 -* FROM CLIP NAME: Z688_1K (LAY1) -000356 Z688_2F. V C 01:00:04:05 01:00:06:21 01:13:43:22 01:13:46:14 -* FROM CLIP NAME: Z688_2F (LAY1) -000357 Z688_FIX V C 01:00:04:05 01:00:07:00 01:13:46:14 01:13:49:09 -* FROM CLIP NAME: Z688_3C (LAY1) -000358 Z688_FIX V C 01:00:04:06 01:00:13:04 01:13:49:09 01:13:58:07 -* FROM CLIP NAME: Z688_4E (LAY1) -000359 Z688_5A. V C 01:00:04:05 01:00:05:13 01:13:58:07 01:13:59:15 -* FROM CLIP NAME: Z688_5A (LAY3) -000360 Z688_6E. V C 01:00:05:13 01:00:06:08 01:13:59:15 01:14:00:10 -* FROM CLIP NAME: Z688_6E (LAY4) -000361 Z688_8C. V C 01:00:03:20 01:00:10:03 01:14:00:10 01:14:06:17 -* FROM CLIP NAME: Z688_8C (LAY4) -000362 Z688_10E V C 01:00:04:05 01:00:14:14 01:14:06:17 01:14:17:02 -* FROM CLIP NAME: Z688_10E (LAY5) -000363 Z688_12B V C 01:00:11:03 01:00:13:19 01:14:17:02 01:14:19:18 -* FROM CLIP NAME: Z688_12B (LAY1) -000364 Z688_15C V C 01:00:01:16 01:00:03:22 01:14:19:18 01:14:22:00 -* FROM CLIP NAME: Z688_15C (LAY4) -000365 Z688_16. V C 01:00:06:12 01:00:09:12 01:14:22:00 01:14:25:00 -* FROM CLIP NAME: Z688_16 (LAY3) -000366 Z684_SHO V C 01:00:04:05 01:00:05:05 01:14:25:00 01:14:26:00 -* FROM CLIP NAME: Z684_501 (LAY8) -000367 Z684_SHO V C 01:00:05:16 01:00:07:15 01:14:26:00 01:14:27:23 -* FROM CLIP NAME: Z684_502A (LAY2) -000368 Z684_503 V C 01:00:07:06 01:00:09:01 01:14:27:23 01:14:29:18 -* FROM CLIP NAME: Z684_503A (LAY7) -000369 Z684_SHO V C 01:00:08:03 01:00:08:16 01:14:29:18 01:14:30:07 -* FROM CLIP NAME: Z684_504A (LAY6) -000370 Z684_SHO V C 01:00:09:15 01:00:10:19 01:14:30:07 01:14:31:11 -* FROM CLIP NAME: Z684_508A (LAY3) -000371 Z684_SHO V C 01:00:08:01 01:00:09:10 01:14:31:11 01:14:32:20 -* FROM CLIP NAME: Z684_505A (LAY2) -000372 Z684_508 V C 01:00:12:08 01:00:14:00 01:14:32:20 01:14:34:12 -* FROM CLIP NAME: Z684_508B (LAY1) -000373 Z684_510 V C 01:00:12:11 01:00:15:18 01:14:34:12 01:14:37:19 -* FROM CLIP NAME: Z684_510A (LAY5) -000374 Z684_SHO V C 01:00:15:08 01:00:16:14 01:14:37:19 01:14:39:01 -* FROM CLIP NAME: Z684_511A (LAY2) -000375 Z684_511 V C 01:00:16:14 01:00:17:21 01:14:39:01 01:14:40:08 -* FROM CLIP NAME: Z684_511B (LAY2) -000376 Z684_SHO V C 01:00:16:09 01:00:17:10 01:14:40:08 01:14:41:09 -* FROM CLIP NAME: Z684_515E (LAY2) -000377 Z684_511 V C 01:00:19:02 01:00:21:23 01:14:41:09 01:14:44:06 -* FROM CLIP NAME: Z684_511D (LAY1) -000378 Z688_101 V C 01:00:03:09 01:00:10:01 01:14:44:06 01:14:50:22 -* FROM CLIP NAME: Z688_101F (LAY3) -000379 Z688_AGR V C 01:00:08:09 01:00:10:12 01:14:50:22 01:14:53:01 -* FROM CLIP NAME: Z688_103A (LAY2) -000380 Z688_AGR V C 01:00:10:12 01:00:12:17 01:14:53:01 01:14:55:06 -* FROM CLIP NAME: Z688_104 (LAY4) -000381 Z688_105 V C 01:00:11:22 01:00:13:09 01:14:55:06 01:14:56:17 -* FROM CLIP NAME: Z688_105 (LAY4) -000382 Z688_101 V C 01:00:13:09 01:00:14:13 01:14:56:17 01:14:57:21 -* FROM CLIP NAME: Z688_101C (LAY4) -000383 Z688_AGR V C 01:00:14:05 01:00:15:00 01:14:57:21 01:14:58:16 -* FROM CLIP NAME: Z688_106 (LAY3) -000384 Z688_107 V C 01:00:14:22 01:00:15:15 01:14:58:16 01:14:59:09 -* FROM CLIP NAME: Z688_107A (LAY5) -000385 Z688_107 V C 01:00:15:07 01:00:17:19 01:14:59:09 01:15:01:21 -* FROM CLIP NAME: Z688_107E (LAY10) -000386 Z684_601 V C 01:00:03:19 01:00:05:18 01:15:01:21 01:15:03:20 -* FROM CLIP NAME: Z684_601 (LAY6) -000387 Z684_602 V C 01:00:05:20 01:00:07:17 01:15:03:20 01:15:05:17 -* FROM CLIP NAME: Z684_602A (LAY7) -000388 Z684_604 V C 01:00:08:08 01:00:10:04 01:15:05:17 01:15:07:13 -* FROM CLIP NAME: Z684_604 (LAY9) -000389 Z684_605 V C 01:00:11:03 01:00:12:13 01:15:07:13 01:15:08:23 -* FROM CLIP NAME: Z684_605A (LAY3) -000390 Z684_604 V C 01:00:11:06 01:00:13:02 01:15:08:23 01:15:10:19 -* FROM CLIP NAME: Z684_604A (LAY3) -000391 Z684_605 V C 01:00:11:19 01:00:13:09 01:15:10:19 01:15:12:09 -* FROM CLIP NAME: Z684_605B (LAY1) -000392 Z684_604 V C 01:00:13:17 01:00:14:13 01:15:12:09 01:15:13:05 -* FROM CLIP NAME: Z684_604B (LAY1) -000393 Z684_605 V C 01:00:13:16 01:00:14:15 01:15:13:05 01:15:14:04 -* FROM CLIP NAME: Z684_605C (LAY1) -000394 Z684_604 V C 01:00:15:09 01:00:16:09 01:15:14:04 01:15:15:04 -* FROM CLIP NAME: Z684_604C (LAY1) -000395 Z684_611 V C 01:00:16:18 01:00:19:08 01:15:15:04 01:15:17:18 -* FROM CLIP NAME: Z684_611 (LAY9) -000396 Z684_612 V C 01:00:18:20 01:00:21:17 01:15:17:18 01:15:20:15 -* FROM CLIP NAME: Z684_612A (LAY2) -000397 Z684_611 V C 01:00:21:22 01:00:24:06 01:15:20:15 01:15:22:23 -* FROM CLIP NAME: Z684_611B (LAY4) -000398 Z688_201 V C 01:00:04:05 01:00:05:12 01:15:22:23 01:15:24:06 -* FROM CLIP NAME: Z688_201A (LAY8) -000399 Z688_202 V C 01:00:05:15 01:00:06:20 01:15:24:06 01:15:25:11 -* FROM CLIP NAME: Z688_202B (LAY3) -000400 Z688_AGR V C 01:00:06:20 01:00:07:16 01:15:25:11 01:15:26:07 -* FROM CLIP NAME: Z688_203A (LAY5) -000401 Z688_206 V C 01:00:07:11 01:00:09:11 01:15:26:07 01:15:28:07 -* FROM CLIP NAME: Z688_206A (LAY6) -000402 Z688_AGR V C 01:00:09:09 01:00:10:12 01:15:28:07 01:15:29:10 -* FROM CLIP NAME: Z688_206 (LAY9) -000403 Z684_701 V C 01:00:04:08 01:00:07:07 01:15:29:10 01:15:32:09 -* FROM CLIP NAME: Z684_701 (LAY8) -000404 Z684_702 V C 01:00:07:01 01:00:08:10 01:15:32:09 01:15:33:18 -* FROM CLIP NAME: Z684_702 (LAY13) -000405 Z684_703 V C 01:00:08:09 01:00:10:08 01:15:33:18 01:15:35:17 -* FROM CLIP NAME: Z684_703 (LAY8) -000406 Z684_704 V C 01:00:09:18 01:00:10:18 01:15:35:17 01:15:36:17 -* FROM CLIP NAME: Z684_704 (LAY9) -000407 Z684_705 V C 01:00:10:22 01:00:11:08 01:15:36:17 01:15:37:03 -* FROM CLIP NAME: Z684_705 (LAY8) -000408 Z684_706 V C 01:00:11:08 01:00:12:02 01:15:37:03 01:15:37:21 -* FROM CLIP NAME: Z684_706 (LAY8) -000409 Z684_707 V C 01:00:12:01 01:00:13:04 01:15:37:21 01:15:39:00 -* FROM CLIP NAME: Z684_707 (LAY9) -000410 Z684_708 V C 01:00:13:06 01:00:16:02 01:15:39:00 01:15:41:20 -* FROM CLIP NAME: Z684_708 (LAY12) -000411 Z684_709 V C 01:00:16:03 01:00:16:23 01:15:41:20 01:15:42:16 -* FROM CLIP NAME: Z684_709A (LAY5) -000412 Z684_710 V C 01:00:16:08 01:00:17:01 01:15:42:16 01:15:43:09 -* FROM CLIP NAME: Z684_710 (LAY8) -000413 Z684_711 V C 01:00:17:02 01:00:17:17 01:15:43:09 01:15:44:00 -* FROM CLIP NAME: Z684_711 (LAY8) -000414 Z684_712 V C 01:00:17:17 01:00:18:07 01:15:44:00 01:15:44:14 -* FROM CLIP NAME: Z684_712 (LAY9) -000415 Z684_713 V C 01:00:18:06 01:00:21:19 01:15:44:14 01:15:48:03 -* FROM CLIP NAME: Z684_713C (LAY3) -000416 Z684_717 V C 01:00:21:20 01:00:25:08 01:15:48:03 01:15:51:15 -* FROM CLIP NAME: Z684_717A (LAY7) -000417 Z684_719 V C 01:00:04:05 01:00:06:09 01:15:51:15 01:15:53:19 -* FROM CLIP NAME: Z684_719B (LAY5) -000418 Z686_151 V C 01:00:04:10 01:00:06:10 01:15:53:19 01:15:55:19 -* FROM CLIP NAME: Z686_151 (LAY4) -000419 Z686_152 V C 01:00:07:02 01:00:09:02 01:15:55:19 01:15:57:19 -* FROM CLIP NAME: Z686_152G (LAY3) -000420 Z686_153 V C 01:00:11:01 01:00:13:07 01:15:57:19 01:16:00:01 -* FROM CLIP NAME: Z686_153A (LAY3) -000421 Z686_154 V C 01:00:14:14 01:00:16:09 01:16:00:01 01:16:01:20 -* FROM CLIP NAME: Z686_154A (LAY2) -000422 Z686_153 V C 01:00:13:07 01:00:15:16 01:16:01:20 01:16:04:05 -* FROM CLIP NAME: Z686_153E (LAY1) -000423 Z686_154 V C 01:00:16:11 01:00:18:20 01:16:04:05 01:16:06:14 -* FROM CLIP NAME: Z686_154D (LAY5) -000424 Z688_303 V C 01:00:04:00 01:00:06:00 01:16:06:14 01:16:08:14 -* FROM CLIP NAME: Z688_303B (LAY10) -000425 Z688_503 V C 01:00:05:22 01:00:06:22 01:16:08:14 01:16:09:14 -* FROM CLIP NAME: Z688_503B (LAY3) -000426 Z688_503 V C 01:00:06:18 01:00:08:23 01:16:09:14 01:16:11:19 -* FROM CLIP NAME: Z688_503J (LAY6) -000427 Z693_1A. V C 01:00:01:01 01:00:04:10 01:16:11:19 01:16:15:04 -* FROM CLIP NAME: Z693_1A (LAY7) -000428 Z693_2.L V C 01:00:04:09 01:00:05:16 01:16:15:04 01:16:16:11 -* FROM CLIP NAME: Z693_2 (LAY3) -000429 Z693_4A. V C 01:00:04:12 01:00:06:15 01:16:16:11 01:16:18:14 -* FROM CLIP NAME: Z693_4A (LAY4) -000430 Z693_5A. V C 01:00:03:22 01:00:05:00 01:16:18:14 01:16:19:16 -* FROM CLIP NAME: Z693_5A (LAY2) -000431 Z688_302 V C 01:00:04:18 01:00:06:03 01:16:19:16 01:16:21:01 -* FROM CLIP NAME: Z688_302A (LAY4) -000432 Z688_401 V C 01:00:03:20 01:00:05:06 01:16:21:01 01:16:22:11 -* FROM CLIP NAME: Z688_401F (LAY4) -000433 Z688_404 V C 01:00:04:15 01:00:07:04 01:16:22:11 01:16:25:00 -* FROM CLIP NAME: Z688_404B (LAY1) -000434 Z693_101 V C 01:00:04:13 01:00:05:12 01:16:25:00 01:16:25:23 -* FROM CLIP NAME: Z693_101 (LAY5) -000435 Z693_102 V C 01:00:04:19 01:00:07:12 01:16:25:23 01:16:28:16 -* FROM CLIP NAME: Z693_102A (LAY3) -000436 Z693_103 V C 01:00:04:05 01:00:06:14 01:16:28:16 01:16:31:01 -* FROM CLIP NAME: Z693_103 (LAY15) -000437 Z693_108 V C 01:00:04:05 01:00:08:01 01:16:31:01 01:16:34:21 -* FROM CLIP NAME: Z693_108G (LAY5) -000438 Z693_110 V C 01:00:04:21 01:00:06:21 01:16:34:21 01:16:36:21 -* FROM CLIP NAME: Z693_110B (LAY3) -000439 Z688_503 V C 01:00:06:12 01:00:08:03 01:16:36:21 01:16:38:12 -* FROM CLIP NAME: Z688_503A (LAY4) -000440 Z688_503 V C 01:00:07:03 01:00:08:05 01:16:38:12 01:16:39:14 -* FROM CLIP NAME: Z688_503F (LAY5) -000441 Z688_505 V C 01:00:04:06 01:00:05:18 01:16:39:14 01:16:41:02 -* FROM CLIP NAME: Z688_505A (LAY7) -000442 Z688_504 V C 01:00:05:00 01:00:06:17 01:16:41:02 01:16:42:19 -* FROM CLIP NAME: Z688_504 (LAY10) -000443 Z693_201 V C 01:00:04:05 01:00:06:20 01:16:42:19 01:16:45:10 -* FROM CLIP NAME: Z693_201 (EDITORIAL10) -000444 Z693_202 V C 01:00:04:05 01:00:04:21 01:16:45:10 01:16:46:02 -* FROM CLIP NAME: Z693_202 (LAY4) -000445 Z693_203 V C 01:00:04:07 01:00:04:16 01:16:46:02 01:16:46:11 -* FROM CLIP NAME: Z693_203 (LAY3) -000446 Z693_204 V C 01:00:04:05 01:00:05:07 01:16:46:11 01:16:47:13 -* FROM CLIP NAME: Z693_204 (LAY6) -000447 Z693_108 V C 01:00:06:15 01:00:07:19 01:16:47:13 01:16:48:17 -* FROM CLIP NAME: Z693_108A (LAY5) -000448 Z693_206 V C 01:00:04:05 01:00:05:01 01:16:48:17 01:16:49:13 -* FROM CLIP NAME: Z693_206 (LAY10) -000449 Z693_205 V C 01:00:05:08 01:00:06:19 01:16:49:13 01:16:51:00 -* FROM CLIP NAME: Z693_205A (LAY5) -000450 Z688_AGR V C 01:00:12:03 01:00:13:04 01:16:51:00 01:16:52:01 -* FROM CLIP NAME: Z688_601 (LAY5) -000451 Z688_AGR V C 01:00:12:11 01:00:13:01 01:16:52:01 01:16:52:15 -* FROM CLIP NAME: Z688_602 (LAY5) -000452 Z688_603 V C 01:00:13:04 01:00:13:22 01:16:52:15 01:16:53:09 -* FROM CLIP NAME: Z688_603 (LAY9) -000453 Z688_604 V C 01:00:04:23 01:00:06:18 01:16:53:09 01:16:55:04 -* FROM CLIP NAME: Z688_604C (LAY5) -000454 Z688_651 V C 01:00:04:06 01:00:06:14 01:16:55:04 01:16:57:12 -* FROM CLIP NAME: Z688_651 (LAY13) -000455 Z688_653 V C 01:00:06:01 01:00:07:01 01:16:57:12 01:16:58:12 -* FROM CLIP NAME: Z688_653C (LAY10) -000456 Z688_653 V C 01:00:07:15 01:00:11:03 01:16:58:12 01:17:02:00 -* FROM CLIP NAME: Z688_653G (LAY8) -000457 Z693_401 V C 01:00:04:12 01:00:05:07 01:17:02:00 01:17:02:19 -* FROM CLIP NAME: Z693_401 (LAY4) -000458 Z688_653 V C 01:00:06:16 01:00:07:06 01:17:02:19 01:17:03:09 -* FROM CLIP NAME: Z688_653B (LAY2) -000459 Z688_652 V C 01:00:07:09 01:00:07:21 01:17:03:09 01:17:03:21 -* FROM CLIP NAME: Z688_652F (LAY2) -000460 Z688_654 V C 01:00:07:07 01:00:08:08 01:17:03:21 01:17:04:22 -* FROM CLIP NAME: Z688_654 (LAY4) -000461 Z688_AGR V C 01:00:04:08 01:00:05:12 01:17:04:22 01:17:06:02 -* FROM CLIP NAME: Z688_701A (LAY6) -000462 Z693_301 V C 01:00:04:14 01:00:06:04 01:17:06:02 01:17:07:16 -* FROM CLIP NAME: Z693_301 (LAY5) -000463 Z693_502 V C 01:00:04:17 01:00:05:09 01:17:07:16 01:17:08:08 -* FROM CLIP NAME: Z693_502 (LAY10) -000464 Z693_501 V C 01:00:04:06 01:00:04:23 01:17:08:08 01:17:09:01 -* FROM CLIP NAME: Z693_501 (LAY10) -000465 Z688_701 V C 01:00:05:05 01:00:06:09 01:17:09:01 01:17:10:05 -* FROM CLIP NAME: Z688_701F (LAY1) -000466 Z693_601 V C 01:00:04:05 01:00:05:02 01:17:10:05 01:17:11:02 -* FROM CLIP NAME: Z693_601 (LAY7) -000467 Z688_751 V C 01:00:04:05 01:00:05:08 01:17:11:02 01:17:12:05 -* FROM CLIP NAME: Z688_751B (LAY3) -000468 Z693_701 V C 01:00:04:05 01:00:05:08 01:17:12:05 01:17:13:08 -* FROM CLIP NAME: Z693_701 (LAY10) -000469 Z693_702 V C 01:00:05:11 01:00:06:04 01:17:13:08 01:17:14:01 -* FROM CLIP NAME: Z693_702 (LAY5) -000470 Z693_701 V C 01:00:04:14 01:00:07:17 01:17:14:01 01:17:17:04 -* FROM CLIP NAME: Z693_701G (LAY1) -000471 Z693_701 V C 01:00:07:14 01:00:08:12 01:17:17:04 01:17:18:02 -* FROM CLIP NAME: Z693_701M (LAY1) -000472 Z694_MLE V C 01:00:13:19 01:00:15:05 01:17:18:02 01:17:19:12 -* FROM CLIP NAME: Z694_51 (LAY2) -000473 Z694_51B V C 01:00:14:21 01:00:15:13 01:17:19:12 01:17:20:04 -* FROM CLIP NAME: Z694_51B (LAY2) -000474 Z694_51B V C 01:00:15:13 01:00:16:04 01:17:20:04 01:17:20:10 -M2 Z694_51B 068.0 01:00:15:13 -* FROM CLIP NAME: Z694_51B (LAY2) (68.00 FPS) -000475 Z694_51B V C 01:00:16:05 01:00:17:18 01:17:20:10 01:17:21:05 -M2 Z694_51B 047.8 01:00:16:05 -* FROM CLIP NAME: Z694_51B (LAY2) (47.75 FPS) -000476 Z694_54. V C 01:00:16:15 01:00:18:22 01:17:21:05 01:17:22:09 -M2 Z694_54. 048.0 01:00:16:15 -* FROM CLIP NAME: Z694_54 (LAY5) (48.00 FPS) -000477 Z694_54. V C 01:00:18:22 01:00:18:23 01:17:22:09 01:17:22:10 -* FROM CLIP NAME: Z694_54 (LAY5) -000478 Z694_MLE V C 01:00:17:16 01:00:18:15 01:17:22:10 01:17:23:04 -M2 Z694_MLE 029.9 01:00:17:16 -* FROM CLIP NAME: Z694_56C (LAY2) (29.87 FPS) -000479 Z694_MLE V C 01:00:18:15 01:00:19:08 01:17:23:04 01:17:23:16 -M2 Z694_MLE 035.1 01:00:18:15 -* FROM CLIP NAME: Z694_56C (LAY2) (35.08 FPS) -000480 Z694_MLE V C 01:00:18:19 01:00:21:11 01:17:23:16 01:17:25:11 -M2 Z694_MLE 036.2 01:00:18:19 -* FROM CLIP NAME: Z694_56B (LAY5) (36.21 FPS) -000481 Z694_56D V C 01:00:21:09 01:00:23:00 01:17:25:11 01:17:27:02 -* FROM CLIP NAME: Z694_56D (LAY4) -000482 Z694_MLE V C 01:00:17:07 01:00:18:09 01:17:27:02 01:17:28:04 -* FROM CLIP NAME: Z694_151 (LAY3) -000483 Z694_MLE V C 01:00:18:09 01:00:19:01 01:17:28:04 01:17:28:13 -M2 Z694_MLE 045.3 01:00:18:09 -* FROM CLIP NAME: Z694_151 (LAY3) (45.33 FPS) -000484 Z694_MLE V C 01:00:19:01 01:00:20:01 01:17:28:13 01:17:29:13 -* FROM CLIP NAME: Z694_151 (LAY3) -000485 Z694_154 V C 01:00:21:12 01:00:23:21 01:17:29:13 01:17:31:22 -* FROM CLIP NAME: Z694_154 (LAY3) -000486 Z694_MLE V C 01:00:20:10 01:00:22:22 01:17:31:22 01:17:34:10 -* FROM CLIP NAME: Z694_152A (LAY2) -000487 Z694_MLE V C 01:00:22:22 01:00:25:09 01:17:34:10 01:17:36:21 -* FROM CLIP NAME: Z694_153 (LAY2) -000488 Z694_SHI V C 01:00:25:01 01:00:33:09 01:17:36:21 01:17:41:02 -M2 Z694_SHI 047.9 01:00:25:01 -* FROM CLIP NAME: Z694_ZZZ_1T (FX7) (47.88 FPS) -000489 DEVFX_HY V C 01:00:10:04 01:00:12:13 01:17:41:02 01:17:43:11 -* FROM CLIP NAME: DEVFX_ZZZ_3 (FX2) -000490 Z694_201 V C 01:00:04:11 01:00:06:10 01:17:43:11 01:17:45:10 -* FROM CLIP NAME: Z694_201C (LAY2) -000491 Z694_202 V C 01:00:04:15 01:00:13:02 01:17:45:10 01:17:53:21 -* FROM CLIP NAME: Z694_202 (LAY7) -000492 Z694_252 V C 01:00:04:05 01:00:07:01 01:17:53:21 01:17:56:17 -* FROM CLIP NAME: Z694_252A (LAY2) -000493 Z694_204 V C 01:00:04:05 01:00:06:19 01:17:56:17 01:17:59:07 -* FROM CLIP NAME: Z694_204A (LAY2) -000494 Z694_301 V C 01:00:04:05 01:00:10:22 01:17:59:07 01:18:06:00 -* FROM CLIP NAME: Z694_301H (LAY1) -000495 Z694_301 V C 01:00:11:21 01:00:13:05 01:18:06:00 01:18:07:08 -* FROM CLIP NAME: Z694_301H (LAY1) -000496 Z694_302 V C 01:00:10:22 01:00:14:19 01:18:07:08 01:18:11:05 -* FROM CLIP NAME: Z694_302E (LAY2) -000497 Z694_305 V C 01:00:15:15 01:00:18:00 01:18:11:05 01:18:13:14 -* FROM CLIP NAME: Z694_305E (LAY1) -000498 Z694_305 V C 01:00:18:09 01:00:19:17 01:18:13:14 01:18:14:22 -* FROM CLIP NAME: Z694_305F (LAY4) -000499 Z694_305 V C 01:00:15:15 01:00:18:21 01:18:14:22 01:18:18:04 -* FROM CLIP NAME: Z694_305J (LAY4) -000500 Z694_306 V C 01:00:20:08 01:00:29:09 01:18:18:04 01:18:27:05 -* FROM CLIP NAME: Z694_306D (LAY2) -000501 Z694_307 V C 01:00:26:05 01:00:26:06 01:18:27:05 01:18:28:03 -M2 Z694_307 000.0 01:00:26:05 -* FROM CLIP NAME: Z694_307 (LAY11) FF -* * FREEZE FRAME -000502 Z694_307 V C 01:00:26:05 01:00:30:23 01:18:28:03 01:18:32:21 -* FROM CLIP NAME: Z694_307 (LAY11) -000503 Z694_307 V C 01:00:31:07 01:00:32:18 01:18:32:21 01:18:34:08 -* FROM CLIP NAME: Z694_307 (LAY11) -000504 Z694_307 V C 01:00:32:17 01:00:32:18 01:18:34:08 01:18:35:00 -M2 Z694_307 000.0 01:00:32:17 -* FROM CLIP NAME: Z694_307 (LAY11) FF -* * FREEZE FRAME -000505 Z694_307 V C 01:00:31:14 01:00:36:01 01:18:35:00 01:18:39:11 -* FROM CLIP NAME: Z694_307J (LAY2) -000506 Z694_307 V C 01:00:35:10 01:00:36:23 01:18:39:11 01:18:41:00 -* FROM CLIP NAME: Z694_307K (LAY5) -000507 Z694_307 V C 01:00:37:11 01:00:38:20 01:18:41:00 01:18:42:09 -* FROM CLIP NAME: Z694_307K (LAY5) -000508 Z694_307 V C 01:00:38:20 01:00:38:21 01:18:42:09 01:18:42:20 -M2 Z694_307 000.0 01:00:38:20 -* FROM CLIP NAME: Z694_307K (LAY5) FF -* * FREEZE FRAME -000509 Z694_307 V C 01:00:38:11 01:00:38:12 01:18:42:20 01:18:44:02 -M2 Z694_307 000.0 01:00:38:11 -* FROM CLIP NAME: Z694_307M (LAY2) FF -* * FREEZE FRAME -000510 Z694_307 V C 01:00:38:12 01:00:38:21 01:18:44:02 01:18:44:11 -* FROM CLIP NAME: Z694_307M (LAY2) -000511 Z694_307 V C 01:00:38:21 01:00:38:22 01:18:44:11 01:18:45:00 -M2 Z694_307 000.0 01:00:38:21 -* FROM CLIP NAME: Z694_307M (LAY2) FF -* * FREEZE FRAME -000512 Z694_307 V C 01:00:38:22 01:00:39:09 01:18:45:00 01:18:45:11 -* FROM CLIP NAME: Z694_307M (LAY2) -000513 Z694_307 V C 01:00:40:05 01:00:40:16 01:18:45:11 01:18:45:22 -* FROM CLIP NAME: Z694_307T (LAY1) -000514 Z694_307 V C 01:00:43:06 01:00:44:13 01:18:45:22 01:18:47:05 -* FROM CLIP NAME: Z694_307T (LAY1) -000515 Z700_101 V C 01:00:04:05 01:00:06:20 01:18:47:05 01:18:49:20 -* FROM CLIP NAME: Z700_101 (LAY6) -000516 Z700_102 V C 01:00:06:21 01:00:20:05 01:18:49:20 01:19:03:04 -* FROM CLIP NAME: Z700_102C (LAY2) -000517 Z700_201 V C 01:00:04:05 01:00:06:02 01:19:03:04 01:19:05:01 -* FROM CLIP NAME: Z700_201E (ANIM4) -000518 Z700_203 V C 01:00:04:23 01:00:07:07 01:19:05:01 01:19:07:09 -* FROM CLIP NAME: Z700_203C (ANIM6) -000519 Z700_202 V C 01:00:07:12 01:00:10:06 01:19:07:09 01:19:10:03 -* FROM CLIP NAME: Z700_202B (ANIM11) -000520 Z700_203 V C 01:00:11:19 01:00:16:04 01:19:10:03 01:19:14:12 -* FROM CLIP NAME: Z700_203B (ANIM8) -000521 Z700_204 V C 01:00:16:15 01:00:18:03 01:19:14:12 01:19:16:00 -* FROM CLIP NAME: Z700_204 (ANIM9) -000522 Z700_205 V C 01:00:17:11 01:00:18:14 01:19:16:00 01:19:17:03 -* FROM CLIP NAME: Z700_205B (ANIM8) -000523 Z700_206 V C 01:00:18:10 01:00:23:11 01:19:17:03 01:19:22:04 -* FROM CLIP NAME: Z700_206 (ANIM7) -000524 Z700_303 V C 01:00:17:13 01:00:20:21 01:19:22:04 01:19:25:12 -* FROM CLIP NAME: Z700_303F (LAY7) -000525 Z700_303 V C 01:00:06:04 01:00:07:18 01:19:25:12 01:19:27:02 -* FROM CLIP NAME: Z700_303B (LAY1) -000526 Z700_303 V C 01:00:07:18 01:00:10:03 01:19:27:02 01:19:28:05 -M2 Z700_303 052.6 01:00:07:18 -* FROM CLIP NAME: Z700_303B (LAY1) -000527 Z700_304 V C 01:00:04:18 01:00:06:23 01:19:28:05 01:19:30:10 -* FROM CLIP NAME: Z700_304 (LAY6) -000528 Z700_305 V C 01:00:04:05 01:00:07:09 01:19:30:10 01:19:33:14 -* FROM CLIP NAME: Z700_305A (LAY2) -000529 Z700_306 V C 01:00:07:08 01:00:13:00 01:19:33:14 01:19:39:06 -* FROM CLIP NAME: Z700_306A (ANIM13) -000530 Z700_307 V C 01:00:13:04 01:00:15:05 01:19:39:06 01:19:41:07 -* FROM CLIP NAME: Z700_307 (ANIM10) -000531 Z700_308 V C 01:00:16:01 01:00:19:08 01:19:41:07 01:19:44:14 -* FROM CLIP NAME: Z700_308 (ANIM16) -000532 Z700_309 V C 01:00:19:20 01:00:24:19 01:19:44:14 01:19:49:13 -* FROM CLIP NAME: Z700_309A (ANIM7) -000533 Z700_310 V C 01:00:24:00 01:00:25:14 01:19:49:13 01:19:51:03 -* FROM CLIP NAME: Z700_310A (ANIM11) -000534 Z700_311 V C 01:00:25:21 01:00:37:22 01:19:51:03 01:20:03:04 -* FROM CLIP NAME: Z700_311A (ANIM8) -000535 Z700_312 V C 01:00:38:01 01:00:40:08 01:20:03:04 01:20:05:11 -* FROM CLIP NAME: Z700_312A (ANIM6) -000536 Z700_313 V C 01:00:40:12 01:00:43:11 01:20:05:11 01:20:08:10 -* FROM CLIP NAME: Z700_313 (LAY8) -000537 Z700_314 V C 01:00:43:13 01:00:45:05 01:20:08:10 01:20:10:02 -* FROM CLIP NAME: Z700_314 (ANIM11) -000538 Z700_315 V C 01:00:44:19 01:00:47:18 01:20:10:02 01:20:13:01 -* FROM CLIP NAME: Z700_315 (ANIM9) -000539 Z700_316 V C 01:00:47:04 01:00:49:04 01:20:13:01 01:20:15:01 -* FROM CLIP NAME: Z700_316 (ANIM11) -000540 Z700_317 V C 01:00:48:00 01:00:53:13 01:20:15:01 01:20:20:14 -* FROM CLIP NAME: Z700_317E (ANIM10) -000541 Z700_318 V C 01:00:55:21 01:01:03:06 01:20:20:14 01:20:27:23 -* FROM CLIP NAME: Z700_318 (ANIM14) -000542 Z700_401 V C 01:00:04:08 01:00:09:13 01:20:27:23 01:20:33:04 -* FROM CLIP NAME: Z700_401 (ANIM20) -000543 Z700_402 V C 01:00:09:05 01:00:09:19 01:20:33:04 01:20:33:18 -* FROM CLIP NAME: Z700_402 (PHASE114) -000544 Z700_403 V C 01:00:10:12 01:00:12:03 01:20:33:18 01:20:35:09 -* FROM CLIP NAME: Z700_403 (LAY6) -000545 Z700_404 V C 01:00:10:21 01:00:12:11 01:20:35:09 01:20:36:23 -* FROM CLIP NAME: Z700_404B (LAY3) -000546 Z700_405 V C 01:00:13:05 01:00:14:21 01:20:36:23 01:20:38:15 -* FROM CLIP NAME: Z700_405B (LAY1) -000547 700_EPIL V C 01:00:00:01 01:00:15:16 01:20:38:15 01:20:54:06 -* FROM CLIP NAME: ZZZ_700_ENDLOGO (STORY2) -000548 700_EPIL V C 01:00:00:01 01:00:09:13 01:20:54:06 01:21:03:18 -* FROM CLIP NAME: LG_BLACK239 (REN2) diff --git a/tests/sample_data/speed_effects_small.edl b/tests/sample_data/speed_effects_small.edl deleted file mode 100644 index 1e15298c8..000000000 --- a/tests/sample_data/speed_effects_small.edl +++ /dev/null @@ -1,17 +0,0 @@ -TITLE: Speed_Effects_Test_2018.02.13 - -001 Z677_4C. V C 01:00:01:21 01:00:07:03 01:00:00:00 01:00:05:06 -* FROM CLIP NAME: Z677_4C (ANIM10) -002 Z682_156 V C 01:00:10:21 01:00:10:22 01:08:30:00 01:08:30:17 -M2 Z682_156 000.0 01:00:10:21 -* FROM CLIP NAME: Z682_156 (LAY3) FF -* * FREEZE FRAME -003 Z682_157 V C 01:00:10:20 01:00:10:21 01:08:30:17 01:08:30:18 -M2 Z682_157 000.0 01:00:10:20 -* FROM CLIP NAME: Z682_157 (LAY2) FF -* * FREEZE FRAME -004 Z682_157 V C 01:00:10:20 01:00:11:14 01:08:30:18 01:08:31:12 -* FROM CLIP NAME: Z682_157 (LAY2) -005 Z686_5A. V C 01:00:06:00 01:00:08:22 01:11:31:16 01:11:33:04 -M2 Z686_5A. 047.6 01:00:06:00 -* FROM CLIP NAME: Z686_5A (LAY2) (47.56 FPS) diff --git a/tests/sample_data/timecode_mismatch.edl b/tests/sample_data/timecode_mismatch.edl deleted file mode 100644 index 59a2ff33e..000000000 --- a/tests/sample_data/timecode_mismatch.edl +++ /dev/null @@ -1,63 +0,0 @@ - -TITLE: SQ0002_A2 -FCM: NON-DROP FRAME -001 SC00.JPG V C 01:00:00:00 01:00:06:11 00:00:00:00 00:00:06:11 -* FROM CLIP NAME: sq001_s001 -* sq001_s001 -002 SC00.JPG V C 01:00:00:00 01:00:08:00 00:00:06:11 00:00:14:11 -* FROM CLIP NAME: sq001_s002 -* sq001_s002 -003 SC00.JPG V C 01:00:00:00 01:00:03:11 00:00:14:11 00:00:17:22 -* FROM CLIP NAME: sq001_s003 -* sq001_s003 -004 SC00.JPG V C 01:00:00:00 01:00:01:24 00:00:17:22 00:00:19:19 -* FROM CLIP NAME: sq001_s004 -* sq001_s004 -005 SC00.JPG V C 01:00:00:00 01:00:01:06 00:00:19:21 00:00:22:02 -* FROM CLIP NAME: sq001_s005 -* sq001_s005 -006 SC00.JPG V C 01:00:00:00 01:00:01:01 00:00:22:02 00:00:23:03 -* FROM CLIP NAME: sq001_s006 -* sq001_s006 -007 SC00.JPG V C 01:00:00:00 01:00:02:19 00:00:23:03 00:00:25:22 -* FROM CLIP NAME: sq001_s007 -* sq001_s007 -008 SC00.JPG V C 01:00:00:00 01:00:02:04 00:00:25:22 00:00:28:01 -* FROM CLIP NAME: sq001_s008 -* sq001_s008 -009 SC00.JPG V C 01:00:00:00 01:00:02:01 00:00:28:01 00:00:30:06 -* FROM CLIP NAME: sq001_s009 -* sq001_s009 -010 SC00.JPG V C 01:00:00:00 01:00:03:20 00:00:30:06 00:00:33:22 -* FROM CLIP NAME: sq001_s0010 -* sq001_s0010 -011 SC00.JPG V C 01:00:00:00 01:00:02:24 00:00:33:22 00:00:36:21 -* FROM CLIP NAME: sq001_s0011 -* sq001_s0011 -012 SC00.JPG V C 01:00:00:00 01:00:08:21 00:00:36:21 00:00:45:17 -* FROM CLIP NAME: sq001_s0012 -* sq001_s0012 -013 SC00.JPG V C 01:00:00:00 01:00:02:00 00:00:45:17 00:00:47:17 -* FROM CLIP NAME: sq001_s0013 -* sq001_s0013 -014 SC00.JPG V C 01:00:00:00 01:00:04:19 00:00:47:17 00:00:52:11 -* FROM CLIP NAME: sq001_s0020 -* sq001_s0014 -015 SC00.JPG V C 01:00:00:00 01:00:08:10 00:00:52:11 00:01:00:21 -* FROM CLIP NAME: sq001_s0015 -* sq001_s0015 -016 SC00.JPG V C 01:00:00:00 01:00:00:15 00:01:00:21 00:01:01:11 -* FROM CLIP NAME: sq001_s0016 -* sq001_s0016 -017 SC00.JPG V C 01:00:00:00 01:00:00:11 00:01:01:11 00:01:01:22 -* FROM CLIP NAME: sq001_s0017 -* sq001_s0017 -018 SC00.JPG V C 01:00:00:00 01:00:00:14 00:01:01:22 00:01:02:11 -* FROM CLIP NAME: sq001_s0018 -* sq001_s0018 -019 SC00.JPG V C 01:00:00:00 01:00:06:15 00:01:02:11 00:01:09:01 -* FROM CLIP NAME: sq001_s0019 -* sq001_s0019 -020 SC00.JPG V C 01:00:00:00 01:00:02:13 00:01:09:01 00:01:11:14 -* FROM CLIP NAME: sq001_s0020 -* sq001_s0020 diff --git a/tests/sample_data/transition_duration.edl b/tests/sample_data/transition_duration.edl deleted file mode 100644 index 4f6cb6755..000000000 --- a/tests/sample_data/transition_duration.edl +++ /dev/null @@ -1,8 +0,0 @@ -TITLE: TRANSITION_DURATION_TEST -FCM: NON-DROP FRAME -001 ABC0100. V C 01:00:12:15 01:00:17:01 01:00:48:20 01:00:53:06 -002 ABC0200. V C 01:00:11:07 01:00:14:09 01:00:53:06 01:00:56:08 -003 ABC0200. V C 01:00:14:09 01:00:14:09 01:00:56:08 01:00:56:08 -003 ABC0300. V D 026 01:00:10:08 01:00:13:09 01:00:56:08 01:00:59:09 -* BLEND, DISSOLVE -004 ABC0400. V C 01:00:11:09 01:00:17:20 01:00:59:09 01:01:05:20 diff --git a/tests/sample_data/wipe_test.edl b/tests/sample_data/wipe_test.edl deleted file mode 100644 index a80ce61a2..000000000 --- a/tests/sample_data/wipe_test.edl +++ /dev/null @@ -1,10 +0,0 @@ -TITLE: wipe test -FCM: NON-DROP FRAME -001 TST V C 01:00:04:05 01:00:04:14 01:00:00:00 01:00:00:09 -* FROM CLIP NAME: clip_A -002 TST V C 01:00:04:14 01:00:04:14 01:00:00:09 01:00:00:09 -002 TST V W001 010 01:00:08:08 01:00:08:18 01:00:00:09 01:00:00:19 -* FROM CLIP NAME: clip_A -* TO CLIP NAME: clip_B -003 TST V C 01:00:08:18 01:00:08:19 01:00:00:19 01:00:00:20 -* FROM CLIP NAME: clip_B diff --git a/tests/test_builtin_adapters.py b/tests/test_builtin_adapters.py index c3f171c6d..633cd9ff1 100755 --- a/tests/test_builtin_adapters.py +++ b/tests/test_builtin_adapters.py @@ -17,7 +17,7 @@ SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.edl") +SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.otio") class BuiltInAdapterTest(unittest.TestCase, otio_test_utils.OTIOAssertions): diff --git a/tests/test_cdl.py b/tests/test_cdl.py deleted file mode 100755 index bbb8694c6..000000000 --- a/tests/test_cdl.py +++ /dev/null @@ -1,119 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -# python -import os -import unittest - -import opentimelineio as otio - -__doc__ = """Test CDL support in the EDL adapter.""" - -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -CDL_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "cdl.edl") - - -class CDLAdapterTest(unittest.TestCase): - def test_cdl_read(self): - edl_path = CDL_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(edl_path) - self.assertTrue(timeline is not None) - self.assertEqual(len(timeline.tracks), 1) - self.assertEqual(len(timeline.tracks[0]), 2) - for clip in timeline.tracks[0]: - # clip = timeline.tracks[0][0] - self.assertEqual( - clip.name, - "ZZ100_501 (LAY3)" - ) - self.assertEqual( - clip.source_range.duration, - otio.opentime.from_timecode("00:00:01:07", 24) - ) - cdl = clip.metadata.get("cdl", {}) - self.assertEqual( - cdl.get("asc_sat"), - 0.9 - ) - self.assertEqual( - list(cdl.get("asc_sop").get("slope")), - [0.1, 0.2, 0.3] - ) - self.assertEqual( - list(cdl.get("asc_sop").get("offset")), - [1.0000, -0.0122, 0.0305] - ) - self.assertEqual( - list(cdl.get("asc_sop").get("power")), - [1.0000, 0.0000, 1.0000] - ) - - def test_cdl_read_with_commas(self): - # This EDL was generated with Premiere Pro using the CDL master effect - # on a clip - cdl = """TITLE: Sequence 01 -FCM: NON-DROP FRAME - -000001 A006C014_1701069O V C 04:34:41:13 04:34:41:16 00:00:00:00 00:00:00:03 -* FROM CLIP NAME: A006C014_1701069O_LOG_NO_LUT.mov -* ASC_SOP: (1.1549, 1.1469, 1.1422000000000001)(-0.067799999999999999, -0.055500000000000001, -0.032300000000000002)(1.1325000000000001, 1.1351, 1.1221000000000001) -* ASC_SAT: 1.2988 -""" # noqa: E501 - timeline = otio.adapters.read_from_string(cdl, "cmx_3600") - - clip = timeline.tracks[0][0] - cdl_metadata = clip.metadata["cdl"] - - ref_sop_values = { - "slope": [ - 1.1549, - 1.1469, - 1.1422000000000001, - ], - "offset": [ - -0.067799999999999999, - -0.055500000000000001, - -0.032300000000000002, - ], - "power": [ - 1.1325000000000001, - 1.1351, - 1.1221000000000001, - ], - } - - self.assertAlmostEqual(cdl_metadata["asc_sat"], 1.2988) - for function in ("slope", "offset", "power"): - comparisons = zip( - cdl_metadata["asc_sop"][function], ref_sop_values[function] - ) - for value_comp, ref_comp in comparisons: - self.assertAlmostEqual( - value_comp, ref_comp, msg=f"mismatch in {function}" - ) - - def test_cdl_round_trip(self): - original = """TITLE: Example_Screening.01 - -001 AX V C 01:00:04:05 01:00:05:12 00:00:00:00 00:00:01:07 -* FROM CLIP NAME: ZZ100_501 (LAY3) -*ASC_SOP (0.1 0.2 0.3) (1.0 -0.0122 0.0305) (1.0 0.0 1.0) -*ASC_SAT 0.9 -* SOURCE FILE: ZZ100_501.LAY3.01 -""" - expected = """TITLE: Example_Screening.01 - -001 ZZ100501 V C 01:00:04:05 01:00:05:12 00:00:00:00 00:00:01:07 -* FROM CLIP NAME: ZZ100_501 (LAY3) -* OTIO TRUNCATED REEL NAME FROM: ZZ100_501 (LAY3) -*ASC_SOP (0.1 0.2 0.3) (1.0 -0.0122 0.0305) (1.0 0.0 1.0) -*ASC_SAT 0.9 -* SOURCE FILE: ZZ100_501.LAY3.01 -""" - timeline = otio.adapters.read_from_string(original, "cmx_3600") - output = otio.adapters.write_to_string(timeline, "cmx_3600") - self.assertMultiLineEqual(expected, output) - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_cmx_3600_adapter.py b/tests/test_cmx_3600_adapter.py deleted file mode 100755 index 1c228135f..000000000 --- a/tests/test_cmx_3600_adapter.py +++ /dev/null @@ -1,1330 +0,0 @@ -#!/usr/bin/env python -# -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Test the CMX 3600 EDL adapter.""" - -# python -import os -import unittest - -import opentimelineio as otio -import opentimelineio.test_utils as otio_test_utils -from opentimelineio.adapters import cmx_3600 - -from tempfile import TemporaryDirectory # noqa: F401 -import tempfile - -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.edl") -AVID_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "avid_example.edl") -NUCODA_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "nucoda_example.edl") -PREMIERE_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "premiere_example.edl") -EXEMPLE_25_FPS_PATH = os.path.join(SAMPLE_DATA_DIR, "25fps.edl") -NO_SPACES_PATH = os.path.join(SAMPLE_DATA_DIR, "no_spaces_test.edl") -DISSOLVE_TEST = os.path.join(SAMPLE_DATA_DIR, "dissolve_test.edl") -DISSOLVE_TEST_2 = os.path.join(SAMPLE_DATA_DIR, "dissolve_test_2.edl") -DISSOLVE_TEST_3 = os.path.join(SAMPLE_DATA_DIR, "dissolve_test_3.edl") -DISSOLVE_TEST_4 = os.path.join(SAMPLE_DATA_DIR, "dissolve_test_4.edl") -GAP_TEST = os.path.join(SAMPLE_DATA_DIR, "gap_test.edl") -WIPE_TEST = os.path.join(SAMPLE_DATA_DIR, "wipe_test.edl") -TIMECODE_MISMATCH_TEST = os.path.join(SAMPLE_DATA_DIR, "timecode_mismatch.edl") -SPEED_EFFECTS_TEST = os.path.join(SAMPLE_DATA_DIR, "speed_effects.edl") -SPEED_EFFECTS_TEST_SMALL = os.path.join(SAMPLE_DATA_DIR, "speed_effects_small.edl") -MULTIPLE_TARGET_AUDIO_PATH = os.path.join(SAMPLE_DATA_DIR, "multi_audio.edl") -TRANSITION_DURATION_TEST = os.path.join(SAMPLE_DATA_DIR, "transition_duration.edl") -ENABLED_TEST = os.path.join(SAMPLE_DATA_DIR, "enabled.otio") - - -class EDLAdapterTest(unittest.TestCase, otio_test_utils.OTIOAssertions): - maxDiff = None - - def test_edl_read(self): - edl_path = SCREENING_EXAMPLE_PATH - fps = 24 - timeline = otio.adapters.read_from_file(edl_path) - self.assertTrue(timeline is not None) - self.assertEqual(len(timeline.tracks), 1) - self.assertEqual(len(timeline.tracks[0]), 9) - self.assertEqual( - timeline.tracks[0][0].name, - "ZZ100_501 (LAY3)" - ) - self.assertEqual( - timeline.tracks[0][0].source_range.duration, - otio.opentime.from_timecode("00:00:01:07", fps) - ) - self.assertEqual( - timeline.tracks[0][1].name, - "ZZ100_502A (LAY3)" - ) - self.assertEqual( - timeline.tracks[0][1].source_range.duration, - otio.opentime.from_timecode("00:00:02:02", fps) - ) - self.assertEqual( - timeline.tracks[0][2].name, - "ZZ100_503A (LAY1)" - ) - self.assertEqual( - timeline.tracks[0][2].source_range.duration, - otio.opentime.from_timecode("00:00:01:04", fps) - ) - self.assertEqual( - timeline.tracks[0][3].name, - "ZZ100_504C (LAY1)" - ) - self.assertEqual( - timeline.tracks[0][3].source_range.duration, - otio.opentime.from_timecode("00:00:04:19", fps) - ) - - self.assertEqual(len(timeline.tracks[0][3].markers), 2) - marker = timeline.tracks[0][3].markers[0] - self.assertEqual(marker.name, "ANIM FIX NEEDED") - self.assertEqual(marker.metadata.get("cmx_3600").get("color"), "RED") - self.assertEqual( - marker.marked_range.start_time, - otio.opentime.from_timecode("01:00:01:14", fps) - ) - self.assertEqual(marker.color, otio.schema.MarkerColor.RED) - - unnamed_marker = timeline.tracks[0][6].markers[0] - self.assertEqual(unnamed_marker.name, '') - - self.assertEqual( - timeline.tracks[0][4].name, - "ZZ100_504B (LAY1)" - ) - self.assertEqual( - timeline.tracks[0][4].source_range.duration, - otio.opentime.from_timecode("00:00:04:05", fps) - ) - self.assertEqual( - timeline.tracks[0][5].name, - "ZZ100_507C (LAY2)" - ) - self.assertEqual( - timeline.tracks[0][5].source_range.duration, - otio.opentime.from_timecode("00:00:06:17", fps) - ) - self.assertEqual( - timeline.tracks[0][6].name, - "ZZ100_508 (LAY2)" - ) - self.assertEqual( - timeline.tracks[0][6].source_range.duration, - otio.opentime.from_timecode("00:00:07:02", fps) - ) - self.assertEqual( - timeline.tracks[0][7].name, - "ZZ100_510 (LAY1)" - ) - self.assertEqual( - timeline.tracks[0][7].source_range.duration, - otio.opentime.from_timecode("00:00:05:16", fps) - ) - self.assertEqual( - timeline.tracks[0][8].name, - "ZZ100_510B (LAY1)" - ) - self.assertEqual( - timeline.tracks[0][8].source_range.duration, - otio.opentime.from_timecode("00:00:10:17", fps) - ) - - def test_reelname_length(self): - track = otio.schema.Track() - tl = otio.schema.Timeline("test_timeline", tracks=[track]) - rt = otio.opentime.RationalTime(5.0, 24.0) - - long_mr = otio.schema.ExternalReference( - target_url="/var/tmp/test_a_really_really_long_filename.mov" - ) - - tr = otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(0.0, 24.0), - duration=rt - ) - - cl = otio.schema.Clip( - name="test clip1", - media_reference=long_mr, - source_range=tr, - ) - - track.name = "V1" - track.append(cl) - - # Test default behavior - result = otio.adapters.write_to_string(tl, adapter_name="cmx_3600") - - expected = '''TITLE: test_timeline - -001 testarea V C 00:00:00:00 00:00:00:05 00:00:00:00 00:00:00:05 -* FROM CLIP NAME: test clip1 -* FROM CLIP: /var/tmp/test_a_really_really_long_filename.mov -* OTIO TRUNCATED REEL NAME FROM: test_a_really_really_long_filename.mov -''' - - self.assertMultiLineEqual(result, expected) - - # Keep full filename (minus extension) as reelname - result = otio.adapters.write_to_string( - tl, - adapter_name="cmx_3600", - reelname_len=None - ) - expected = '''TITLE: test_timeline - -001 test_a_really_really_long_filename \ -V C 00:00:00:00 00:00:00:05 00:00:00:00 00:00:00:05 -* FROM CLIP NAME: test clip1 -* FROM CLIP: /var/tmp/test_a_really_really_long_filename.mov -''' - - self.assertMultiLineEqual(result, expected) - - # Make sure reel name is only 12 characters long - result = otio.adapters.write_to_string( - tl, - adapter_name="cmx_3600", - reelname_len=12 - ) - expected = '''TITLE: test_timeline - -001 testareallyr V C 00:00:00:00 00:00:00:05 00:00:00:00 00:00:00:05 -* FROM CLIP NAME: test clip1 -* FROM CLIP: /var/tmp/test_a_really_really_long_filename.mov -* OTIO TRUNCATED REEL NAME FROM: test_a_really_really_long_filename.mov -''' - - self.assertMultiLineEqual(result, expected) - - def test_edl_round_trip_mem2disk2mem(self): - track = otio.schema.Track() - tl = otio.schema.Timeline("test_timeline", tracks=[track]) - rt = otio.opentime.RationalTime(5.0, 24.0) - mr = otio.schema.ExternalReference(target_url="/var/tmp/test.mov") - md = { - "cmx_3600": { - "reel": "test", - "comments": ["OTIO TRUNCATED REEL NAME FROM: test.mov"] - } - } - - tr = otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(0.0, 24.0), - duration=rt - ) - - cl = otio.schema.Clip( - name="test clip1", - media_reference=mr, - source_range=tr, - metadata=md - ) - cl2 = otio.schema.Clip( - name="test clip2", - media_reference=mr.clone(), - source_range=tr, - metadata=md - ) - cl3 = otio.schema.Clip( - name="test clip3", - media_reference=mr.clone(), - source_range=tr, - metadata=md - ) - cl4 = otio.schema.Clip( - name="test clip3_ff", - media_reference=mr.clone(), - source_range=tr, - metadata=md - ) - - cl4.effects[:] = [otio.schema.FreezeFrame()] - cl5 = otio.schema.Clip( - name="test clip5 (speed)", - media_reference=mr.clone(), - source_range=tr, - metadata=md - ) - cl5.effects[:] = [otio.schema.LinearTimeWarp(time_scalar=2.0)] - track.name = "V" - track.append(cl) - track.extend([cl2, cl3]) - track.append(cl4) - track.append(cl5) - - result = otio.adapters.write_to_string(tl, adapter_name="cmx_3600") - new_otio = otio.adapters.read_from_string( - result, - adapter_name="cmx_3600" - ) - - # directly compare clip with speed effect - self.assertEqual( - len(new_otio.tracks[0][3].effects), - 1 - ) - self.assertEqual( - new_otio.tracks[0][3].name, - tl.tracks[0][3].name - ) - - self.assertJsonEqual(new_otio, tl) - - # ensure that an error is raised if more than one effect is present - cl5.effects.append(otio.schema.FreezeFrame()) - with self.assertRaises(otio.exceptions.NotSupportedError): - otio.adapters.write_to_string(tl, "cmx_3600") - - # blank effect should pass through and be ignored - cl5.effects[:] = [otio.schema.Effect()] - otio.adapters.write_to_string(tl, "cmx_3600") - - # but a timing effect should raise an exception - cl5.effects[:] = [otio.schema.TimeEffect()] - with self.assertRaises(otio.exceptions.NotSupportedError): - otio.adapters.write_to_string(tl, "cmx_3600") - - def test_edl_round_trip_disk2mem2disk_speed_effects(self): - test_edl = SPEED_EFFECTS_TEST_SMALL - timeline = otio.adapters.read_from_file(test_edl) - - with tempfile.TemporaryDirectory() as temp_dir: - tmp_path = os.path.join( - temp_dir, - "test_edl_round_trip_disk2mem2disk_speed_effects.edl" - ) - - otio.adapters.write_to_file(timeline, tmp_path) - - result = otio.adapters.read_from_file(tmp_path) - - # When debugging, you can use this to see the difference in the OTIO - # otio.adapters.otio_json.write_to_file(timeline, "/tmp/original.otio") - # otio.adapters.otio_json.write_to_file(result, "/tmp/output.otio") - # os.system("xxdiff /tmp/{original,output}.otio") - - # When debugging, use this to see the difference in the EDLs on disk - # os.system("xxdiff {} {}&".format(test_edl, tmp_path)) - - # The in-memory OTIO representation should be the same - self.assertJsonEqual(timeline, result) - - def test_edl_round_trip_disk2mem2disk(self): - timeline = otio.adapters.read_from_file(SCREENING_EXAMPLE_PATH) - - with tempfile.TemporaryDirectory() as temp_dir: - tmp_path = os.path.join( - temp_dir, - "test_edl_round_trip_disk2mem2disk.edl" - ) - - otio.adapters.write_to_file(timeline, tmp_path) - - result = otio.adapters.read_from_file(tmp_path) - - # When debugging, you can use this to see the difference in the OTIO - # otio.adapters.otio_json.write_to_file(timeline, "/tmp/original.otio") - # otio.adapters.otio_json.write_to_file(result, "/tmp/output.otio") - # os.system("opendiff /tmp/{original,output}.otio") - - original_json = otio.adapters.otio_json.write_to_string(timeline) - output_json = otio.adapters.otio_json.write_to_string(result) - self.assertMultiLineEqual(original_json, output_json) - - # The in-memory OTIO representation should be the same - self.assertIsOTIOEquivalentTo(timeline, result) - - # When debugging, use this to see the difference in the EDLs on disk - # os.system("opendiff {} {}".format(SCREENING_EXAMPLE_PATH, tmp_path)) - - # But the EDL text on disk are *not* byte-for-byte identical - with open(SCREENING_EXAMPLE_PATH) as original_file: - with open(tmp_path) as output_file: - self.assertNotEqual(original_file.read(), output_file.read()) - - def test_regex_flexibility(self): - timeline = otio.adapters.read_from_file(SCREENING_EXAMPLE_PATH) - no_spaces = otio.adapters.read_from_file(NO_SPACES_PATH) - self.assertIsOTIOEquivalentTo(timeline, no_spaces) - - def test_clip_with_tab_and_space_delimiters(self): - timeline = otio.adapters.read_from_string( - '001 Z10 V C\t\t01:00:04:05 01:00:05:12 00:59:53:11 00:59:54:18', - adapter_name="cmx_3600" - ) - self.assertTrue(timeline is not None) - self.assertEqual(len(timeline.tracks), 1) - self.assertEqual( - timeline.tracks[0].kind, - otio.schema.TrackKind.Video - ) - self.assertEqual(len(timeline.tracks[0]), 1) - self.assertEqual( - timeline.tracks[0][0].source_range.start_time.value, - 86501 - ) - self.assertEqual( - timeline.tracks[0][0].source_range.duration.value, - 31 - ) - - def test_imagesequence_read(self): - trunced_edl1 = '''TITLE: Image Sequence Write - -001 myimages V C 01:00:01:00 01:00:02:12 00:00:00:00 00:00:01:12 -* FROM CLIP NAME: my_image_sequence -* FROM CLIP: /media/path/my_image_sequence.[1025-1060].ext -* OTIO TRUNCATED REEL NAME FROM: my_image_sequence.[1025-1060].ext -''' - rate = 24 - tl1 = otio.adapters.read_from_string(trunced_edl1, 'cmx_3600', rate=rate) - self.assertIsInstance(tl1, otio.schema.Timeline) - - clip1 = tl1.tracks[0][0] - media_ref1 = clip1.media_reference - self.assertIsInstance(media_ref1, otio.schema.ImageSequenceReference) - self.assertEqual(media_ref1.start_frame, 1025) - self.assertEqual(media_ref1.end_frame(), 1060) - self.assertEqual( - clip1.available_range(), - otio.opentime.range_from_start_end_time( - otio.opentime.from_timecode('01:00:01:00', rate), - otio.opentime.from_timecode('01:00:02:12', rate) - ) - ) - - # Make sure regex works and uses ExternalReference for non sequences - trunced_edl2 = '''TITLE: Image Sequence Write - -001 myimages V C 01:00:01:00 01:00:02:12 00:00:00:00 00:00:01:12 -* FROM CLIP NAME: my_image_sequence -* FROM CLIP: /media/path/my_image_file.1025.ext -* OTIO TRUNCATED REEL NAME FROM: my_image_file.1025.ext -''' - - tl2 = otio.adapters.read_from_string(trunced_edl2, 'cmx_3600', rate=rate) - clip2 = tl2.tracks[0][0] - media_ref2 = clip2.media_reference - self.assertIsInstance(media_ref2, otio.schema.ExternalReference) - - trunced_edl3 = '''TITLE: Image Sequence Write - -001 myimages V C 01:00:01:00 01:00:02:12 00:00:00:00 00:00:01:12 -* FROM CLIP NAME: my_image_sequence -* FROM CLIP: /media/path/my_image_file.[1025].ext -* OTIO TRUNCATED REEL NAME FROM: my_image_file.[1025].ext -''' - tl3 = otio.adapters.read_from_string(trunced_edl3, 'cmx_3600', rate=rate) - clip3 = tl3.tracks[0][0] - media_ref3 = clip3.media_reference - self.assertIsInstance(media_ref3, otio.schema.ExternalReference) - - def test_imagesequence_write(self): - rate = 24 - tl = otio.schema.Timeline('Image Sequence Write') - track = otio.schema.Track('V1') - tl.tracks.append(track) - - clip = otio.schema.Clip( - name='my_image_sequence', - source_range=otio.opentime.range_from_start_end_time( - otio.opentime.from_timecode('01:00:01:00', rate), - otio.opentime.from_timecode('01:00:02:12', rate) - ), - media_reference=otio.schema.ImageSequenceReference( - target_url_base='/media/path/', - name_prefix='my_image_sequence.', - name_suffix='.ext', - rate=rate, - start_frame=1001, - frame_zero_padding=4, - available_range=otio.opentime.range_from_start_end_time( - otio.opentime.from_timecode('01:00:00:00', rate), - otio.opentime.from_timecode('01:00:03:00', rate) - ) - ) - ) - track.append(clip) - - # Default behavior - result1 = otio.adapters.write_to_string(tl, 'cmx_3600', rate=rate) - - expected_result1 = '''TITLE: Image Sequence Write - -001 myimages V C 01:00:01:00 01:00:02:12 00:00:00:00 00:00:01:12 -* FROM CLIP NAME: my_image_sequence -* FROM CLIP: /media/path/my_image_sequence.[1025-1060].ext -* OTIO TRUNCATED REEL NAME FROM: my_image_sequence.[1025-1060].ext -''' - self.assertMultiLineEqual(result1, expected_result1) - - # Only trunc extension in reel name - result2 = otio.adapters.write_to_string( - tl, - 'cmx_3600', - rate=24, - reelname_len=None - ) - - expected_result2 = '''TITLE: Image Sequence Write - -001 my_image_sequence.[1025-1060] V C \ -01:00:01:00 01:00:02:12 00:00:00:00 00:00:01:12 -* FROM CLIP NAME: my_image_sequence -* FROM CLIP: /media/path/my_image_sequence.[1025-1060].ext -''' - self.assertMultiLineEqual(result2, expected_result2) - - def test_dissolve_parse(self): - tl = otio.adapters.read_from_file(DISSOLVE_TEST) - # clip/transition/clip/clip - self.assertEqual(len(tl.tracks[0]), 4) - - self.assertTrue(isinstance(tl.tracks[0][1], otio.schema.Transition)) - self.assertEqual(tl.tracks[0][0].duration().value, 9) - # The visible range must contains all the frames needed for the transition - # Edit duration + transition duration - self.assertEqual(tl.tracks[0][0].visible_range().duration.to_frames(), 19) - self.assertEqual(tl.tracks[0][0].name, "clip_A") - self.assertEqual(tl.tracks[0][1].duration().value, 10) - self.assertEqual(tl.tracks[0][1].name, "SMPTE_Dissolve from clip_A to clip_B") - self.assertEqual(tl.tracks[0][2].duration().value, 10) - self.assertEqual(tl.tracks[0][2].visible_range().duration.value, 10) - self.assertEqual(tl.tracks[0][2].name, "clip_B") - self.assertEqual(tl.tracks[0][3].duration().value, 1) - self.assertEqual(tl.tracks[0][2].name, "clip_B") - - def test_dissolve_parse_middle(self): - tl = otio.adapters.read_from_file(DISSOLVE_TEST_2) - trck = tl.tracks[0] - # 3 clips and 1 transition - self.assertEqual(len(trck), 4) - - self.assertTrue(isinstance(trck[1], otio.schema.Transition)) - - self.assertEqual(trck[0].duration().value, 5) - self.assertEqual(trck[0].visible_range().duration.to_frames(), 15) - self.assertEqual(trck[1].duration().value, 10) - self.assertEqual(trck[1].name, "SMPTE_Dissolve from clip_A to clip_B") - - self.assertEqual( - trck[2].source_range.start_time.value, - otio.opentime.from_timecode('01:00:08:04', 24).value - ) - self.assertEqual(trck[2].name, "clip_B") - self.assertEqual(trck[2].duration().value, 10) - self.assertEqual(trck[2].visible_range().duration.value, 10) - - self.assertEqual(tl.tracks[0][0].visible_range().duration.to_frames(), 15) - - def test_dissolve_parse_full_clip_dissolve(self): - tl = otio.adapters.read_from_file(DISSOLVE_TEST_3) - self.assertEqual(len(tl.tracks[0]), 4) - - self.assertTrue(isinstance(tl.tracks[0][1], otio.schema.Transition)) - - trck = tl.tracks[0] - clip_a = trck[0] - self.assertEqual(clip_a.name, "Clip_A.mov") - self.assertEqual(clip_a.duration().value, 61) - self.assertEqual(clip_a.visible_range().duration.value, 61 + 30) - - transition = trck[1] - # Note: clip names in the EDL are wrong, the transition is actually - # from Clip_A to Clip_B - self.assertEqual( - transition.name, - "SMPTE_Dissolve from Clip_B.mov to Clip_C.mov" - ) - self.assertEqual(transition.in_offset.value, 0) - self.assertEqual(transition.out_offset.value, 30) - - clip_c = trck[2] - self.assertEqual(clip_c.name, "Clip_C.mov") - self.assertEqual(clip_c.source_range.start_time.value, 86400 + (33 * 24 + 22)) - self.assertEqual(clip_c.duration().value, 30) - self.assertEqual(clip_c.visible_range().duration.value, 30) - - clip_d = trck[3] - self.assertEqual(clip_d.name, "Clip_D.mov") - self.assertEqual(clip_d.source_range.start_time.value, 86400) - self.assertEqual(clip_d.duration().value, 46) - - def test_dissolve_with_odd_frame_count_maintains_length(self): - # EXERCISE - tl = otio.adapters.read_from_string( - '1 CLPA V C 00:00:04:17 00:00:07:02 00:00:00:00 00:00:02:09\n' - '2 CLPA V C 00:00:07:02 00:00:07:02 00:00:02:09 00:00:02:09\n' - '2 CLPB V D 027 00:00:06:18 00:00:07:21 00:00:02:09 00:00:03:12\n' - '3 CLPB V C 00:00:07:21 00:00:15:21 00:00:03:12 00:00:11:12\n', - adapter_name="cmx_3600" - ) - - # VALIDATE - self.assertEqual(tl.duration().value, (11 * 24) + 12) - - def test_wipe_parse(self): - tl = otio.adapters.read_from_file(WIPE_TEST) - self.assertEqual(len(tl.tracks[0]), 4) - - wipe = tl.tracks[0][1] - self.assertTrue(isinstance(wipe, otio.schema.Transition)) - self.assertEqual(wipe.transition_type, "SMPTE_Wipe") - self.assertEqual(wipe.metadata["cmx_3600"]["transition"], "W001") - - self.assertEqual(tl.tracks[0][0].duration().value, 9) - self.assertEqual(tl.tracks[0][0].visible_range().duration.value, 19) - - self.assertEqual(tl.tracks[0][2].duration().value, 10) - self.assertEqual(tl.tracks[0][2].visible_range().duration.value, 10) - - self.assertEqual(tl.tracks[0][3].duration().value, 1) - - def test_fade_to_black(self): - # EXERCISE - tl = otio.adapters.read_from_string( - '1 CLPA V C 00:00:03:18 00:00:12:15 00:00:00:00 00:00:08:21\n' - '2 CLPA V C 00:00:12:15 00:00:12:15 00:00:08:21 00:00:08:21\n' - '2 BL V D 024 00:00:00:00 00:00:01:00 00:00:08:21 00:00:09:21\n', - adapter_name="cmx_3600" - ) - - # VALIDATE - self.assertEqual(len(tl.tracks[0]), 3) - self.assertTrue(isinstance(tl.tracks[0][1], otio.schema.Transition)) - self.assertTrue(isinstance(tl.tracks[0][2], otio.schema.Clip)) - self.assertEqual(tl.tracks[0][2].media_reference.generator_kind, 'black') - self.assertEqual(tl.tracks[0][2].duration().value, 24) - self.assertEqual(tl.tracks[0][2].source_range.start_time.value, 0) - - def test_edl_round_trip_with_transitions(self): - with tempfile.TemporaryDirectory() as temp_dir: - # Notes: - # - the writer does not handle wipes, only dissolves - # - the writer can generate invalid EDLs if spaces are in reel names. - for edl_file in [ - DISSOLVE_TEST, - DISSOLVE_TEST_2, - DISSOLVE_TEST_3, - DISSOLVE_TEST_4 - ]: - edl_name = os.path.basename(edl_file) - timeline = otio.adapters.read_from_file(edl_file) - tmp_path = os.path.join( - temp_dir, - f'test_edl_round_trip_{edl_name}' - ) - otio.adapters.write_to_file(timeline, tmp_path) - - result = otio.adapters.read_from_file(tmp_path) - self.assertEqual(len(timeline.tracks), len(result.tracks)) - for track, res_track in zip(timeline.tracks, result.tracks): - self.assertEqual(len(track), len(res_track)) - for child, res_child in zip(track, res_track): - self.assertEqual(type(child), type(res_child)) - if isinstance(child, otio.schema.Transition): - self.assertEqual(child.in_offset, res_child.in_offset) - self.assertEqual(child.out_offset, res_child.out_offset) - self.assertEqual( - child.transition_type, res_child.transition_type - ) - else: - self.assertEqual(child.source_range, res_child.source_range) - - def test_edl_25fps(self): - # EXERCISE - edl_path = EXEMPLE_25_FPS_PATH - fps = 25 - timeline = otio.adapters.read_from_file(edl_path, rate=fps) - track = timeline.tracks[0] - self.assertEqual(track[0].source_range.duration.value, 161) - self.assertEqual(track[1].source_range.duration.value, 200) - self.assertEqual(track[2].source_range.duration.value, 86) - self.assertEqual(track[3].source_range.duration.value, 49) - - def test_record_gaps(self): - edl_path = GAP_TEST - timeline = otio.adapters.read_from_file(edl_path) - track = timeline.tracks[0] - self.assertEqual(len(track), 5) - self.assertEqual(track.duration().value, 5 * 24 + 6) - clip1, gapA, clip2, gapB, clip3 = track[:] - self.assertEqual(clip1.source_range.duration.value, 24) - self.assertEqual(clip2.source_range.duration.value, 24) - self.assertEqual(clip3.source_range.duration.value, 24) - self.assertEqual(gapA.duration().value, 16) - self.assertEqual(gapB.duration().value, 38) - self.assertEqual(clip1.range_in_parent().duration.value, 24) - self.assertEqual(clip2.range_in_parent().duration.value, 24) - self.assertEqual(clip3.range_in_parent().duration.value, 24) - self.assertEqual( - [item.range_in_parent() for item in track], - [ - otio.opentime.TimeRange( - otio.opentime.from_frames(0, 24), - otio.opentime.from_frames(24, 24) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(24, 24), - otio.opentime.from_frames(16, 24) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(40, 24), - otio.opentime.from_frames(24, 24) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(64, 24), - otio.opentime.from_frames(38, 24) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(102, 24), - otio.opentime.from_frames(24, 24) - ) - ] - ) - - def test_read_generators(self): - # EXERCISE - tl = otio.adapters.read_from_string( - '1 BL V C 00:00:00:00 00:00:01:00 00:00:00:00 00:00:01:00\n' - '2 BLACK V C 00:00:00:00 00:00:01:00 00:00:01:00 00:00:02:00\n' - '3 BARS V C 00:00:00:00 00:00:01:00 00:00:02:00 00:00:03:00\n', - adapter_name="cmx_3600" - ) - - # VALIDATE - self.assertEqual( - tl.tracks[0][0].media_reference.generator_kind, - 'black' - ) - self.assertEqual( - tl.tracks[0][1].media_reference.generator_kind, - 'black' - ) - self.assertEqual( - tl.tracks[0][2].media_reference.generator_kind, - 'SMPTEBars' - ) - - def test_style_edl_read(self): - edl_paths = [AVID_EXAMPLE_PATH, NUCODA_EXAMPLE_PATH, PREMIERE_EXAMPLE_PATH] - for edl_path in edl_paths: - fps = 24 - timeline = otio.adapters.read_from_file(edl_path) - self.assertTrue(timeline is not None) - self.assertEqual(len(timeline.tracks), 1) - self.assertEqual(len(timeline.tracks[0]), 2) - - # If cannot assertEqual fails with clip name - # Attempt to assertEqual with - try: - self.assertEqual( - timeline.tracks[0][0].name, - "take_1" - ) - except AssertionError: - self.assertEqual( - timeline.tracks[0][0].name, - "ZZ100_501.take_1.0001.exr" - ) - self.assertEqual( - timeline.tracks[0][0].source_range.duration, - otio.opentime.from_timecode("00:00:01:07", fps) - ) - - try: - self.assertIsOTIOEquivalentTo( - timeline.tracks[0][0].media_reference, - otio.schema.ExternalReference( - target_url=r"S:\path\to\ZZ100_501.take_1.0001.exr" - ) - ) - except AssertionError: - self.assertIsOTIOEquivalentTo( - timeline.tracks[0][0].media_reference, - otio.schema.MissingReference() - ) - - try: - self.assertEqual( - timeline.tracks[0][1].name, - "take_2" - ) - except AssertionError: - self.assertEqual( - timeline.tracks[0][1].name, - "ZZ100_502A.take_2.0101.exr" - ) - - self.assertEqual( - timeline.tracks[0][1].source_range.duration, - otio.opentime.from_timecode("00:00:02:02", fps) - ) - - try: - self.assertIsOTIOEquivalentTo( - timeline.tracks[0][1].media_reference, - otio.schema.ExternalReference( - target_url=r"S:\path\to\ZZ100_502A.take_2.0101.exr" - ) - ) - except AssertionError: - self.assertIsOTIOEquivalentTo( - timeline.tracks[0][1].media_reference, - otio.schema.MissingReference() - ) - - def test_style_edl_write(self): - track = otio.schema.Track() - tl = otio.schema.Timeline("temp", tracks=[track]) - rt = otio.opentime.RationalTime(5.0, 24.0) - mr = otio.schema.ExternalReference(target_url=r"S:/var/tmp/test.exr") - - tr = otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(0.0, 24.0), - duration=rt - ) - cl = otio.schema.Clip( - name="test clip1", - media_reference=mr, - source_range=tr, - ) - gap = otio.schema.Gap( - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(0, 24.0), - duration=otio.opentime.RationalTime(24.0, 24.0), - ) - ) - cl2 = otio.schema.Clip( - name="test clip2", - media_reference=mr.clone(), - source_range=tr, - ) - tl.tracks[0].name = "V" - tl.tracks[0].append(cl) - tl.tracks[0].append(gap) - tl.tracks[0].append(cl2) - - tl.name = 'test_nucoda_timeline' - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='nucoda' - ) - - expected = r'''TITLE: test_nucoda_timeline - -001 test V C 00:00:00:00 00:00:00:05 00:00:00:00 00:00:00:05 -* FROM CLIP NAME: test clip1 -* FROM FILE: S:/var/tmp/test.exr -* OTIO TRUNCATED REEL NAME FROM: test.exr -002 test V C 00:00:00:00 00:00:00:05 00:00:01:05 00:00:01:10 -* FROM CLIP NAME: test clip2 -* FROM FILE: S:/var/tmp/test.exr -* OTIO TRUNCATED REEL NAME FROM: test.exr -''' - - self.assertMultiLineEqual(result, expected) - - tl.name = 'test_avid_timeline' - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='avid' - ) - - expected = r'''TITLE: test_avid_timeline - -001 test V C 00:00:00:00 00:00:00:05 00:00:00:00 00:00:00:05 -* FROM CLIP NAME: test clip1 -* FROM CLIP: S:/var/tmp/test.exr -* OTIO TRUNCATED REEL NAME FROM: test.exr -002 test V C 00:00:00:00 00:00:00:05 00:00:01:05 00:00:01:10 -* FROM CLIP NAME: test clip2 -* FROM CLIP: S:/var/tmp/test.exr -* OTIO TRUNCATED REEL NAME FROM: test.exr -''' - - self.assertMultiLineEqual(result, expected) - - tl.name = 'test_premiere_timeline' - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='premiere' - ) - - expected = r'''TITLE: test_premiere_timeline - -001 AX V C 00:00:00:00 00:00:00:05 00:00:00:00 00:00:00:05 -* FROM CLIP NAME: test.exr -* OTIO REFERENCE FROM: S:/var/tmp/test.exr -* OTIO TRUNCATED REEL NAME FROM: test.exr -002 AX V C 00:00:00:00 00:00:00:05 00:00:01:05 00:00:01:10 -* FROM CLIP NAME: test.exr -* OTIO REFERENCE FROM: S:/var/tmp/test.exr -* OTIO TRUNCATED REEL NAME FROM: test.exr -''' - - self.assertMultiLineEqual(result, expected) - - def test_reels_edl_round_trip_string2mem2string(self): - - sample_data = r'''TITLE: Reels_Example.01 - -001 ZZ100_50 V C 01:00:04:05 01:00:05:12 00:59:53:11 00:59:54:18 -* FROM CLIP NAME: take_1 -* FROM FILE: S:/path/to/ZZ100_501.take_1.0001.exr -002 ZZ100_50 V C 01:00:06:13 01:00:08:15 00:59:54:18 00:59:56:20 -* FROM CLIP NAME: take_2 -* FROM FILE: S:/path/to/ZZ100_502A.take_2.0101.exr -''' - - timeline = otio.adapters.read_from_string(sample_data, adapter_name="cmx_3600") - otio_data = otio.adapters.write_to_string(timeline, adapter_name="cmx_3600", - style="nucoda") - self.assertMultiLineEqual(sample_data, otio_data) - - def test_nucoda_edl_write_with_transition(self): - track = otio.schema.Track() - tl = otio.schema.Timeline( - "Example CrossDissolve", - tracks=[track] - ) - - cl = otio.schema.Clip( - 'Clip1', - metadata={'cmx_3600': {'reel': 'Clip1'}}, - media_reference=otio.schema.ExternalReference( - target_url="/var/tmp/clip1.001.exr" - ), - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(131.0, 24.0), - duration=otio.opentime.RationalTime(102.0, 24.0) - ) - ) - trans = otio.schema.Transition( - in_offset=otio.opentime.RationalTime(57.0, 24.0), - out_offset=otio.opentime.RationalTime(43.0, 24.0) - ) - cl2 = otio.schema.Clip( - 'Clip2', - metadata={'cmx_3600': {'reel': 'Clip2'}}, - media_reference=otio.schema.ExternalReference( - target_url="/var/tmp/clip2.001.exr" - ), - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(280.0, 24.0), - duration=otio.opentime.RationalTime(143.0, 24.0) - ) - ) - cl3 = otio.schema.Clip( - 'Clip3', - metadata={'cmx_3600': {'reel': 'Clip3'}}, - media_reference=otio.schema.ExternalReference( - target_url="/var/tmp/clip3.001.exr" - ), - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(0.0, 24.0), - duration=otio.opentime.RationalTime(24.0, 24.0) - ) - ) - tl.tracks[0].extend([cl, trans, cl2, cl3]) - - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='nucoda' - ) - - expected = r'''TITLE: Example CrossDissolve - -001 Clip1 V C 00:00:05:11 00:00:07:08 00:00:00:00 00:00:01:21 -* FROM CLIP NAME: Clip1 -* FROM FILE: /var/tmp/clip1.001.exr -002 Clip1 V C 00:00:07:08 00:00:07:08 00:00:01:21 00:00:01:21 -002 Clip2 V D 100 00:00:09:07 00:00:17:15 00:00:01:21 00:00:10:05 -* FROM CLIP NAME: Clip1 -* FROM FILE: /var/tmp/clip1.001.exr -* TO CLIP NAME: Clip2 -* TO FILE: /var/tmp/clip2.001.exr -003 Clip3 V C 00:00:00:00 00:00:01:00 00:00:10:05 00:00:11:05 -* FROM CLIP NAME: Clip3 -* FROM FILE: /var/tmp/clip3.001.exr -''' - - self.assertMultiLineEqual(result, expected) - - def test_nucoda_edl_write_fade_in(self): - track = otio.schema.Track() - tl = otio.schema.Timeline( - "Example Fade In", - tracks=[track] - ) - - trans = otio.schema.Transition( - in_offset=otio.opentime.RationalTime(0.0, 24.0), - out_offset=otio.opentime.RationalTime(12.0, 24.0) - ) - cl = otio.schema.Clip( - 'My Clip', - metadata={'cmx_3600': {'reel': 'My_Clip'}}, - media_reference=otio.schema.ExternalReference( - target_url="/var/tmp/clip.001.exr" - ), - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(50.0, 24.0), - duration=otio.opentime.RationalTime(26.0, 24.0) - ) - ) - tl.tracks[0].extend([trans, cl]) - - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='nucoda' - ) - - expected = r'''TITLE: Example Fade In - -001 BL V C 00:00:00:00 00:00:00:00 00:00:00:00 00:00:00:00 -001 My_Clip V D 012 00:00:02:02 00:00:03:04 00:00:00:00 00:00:01:02 -* TO CLIP NAME: My Clip -* TO FILE: /var/tmp/clip.001.exr -''' - - self.assertMultiLineEqual(result, expected) - - def test_nucoda_edl_write_fade_out(self): - track = otio.schema.Track() - tl = otio.schema.Timeline( - "Example Fade Out", - tracks=[track] - ) - - cl = otio.schema.Clip( - 'My Clip', - metadata={'cmx_3600': {'reel': 'My_Clip'}}, - media_reference=otio.schema.ExternalReference( - target_url="/var/tmp/clip.001.exr" - ), - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(24.0, 24.0), - duration=otio.opentime.RationalTime(24.0, 24.0) - ) - ) - trans = otio.schema.Transition( - in_offset=otio.opentime.RationalTime(12.0, 24.0), - out_offset=otio.opentime.RationalTime(0.0, 24.0) - ) - tl.tracks[0].extend([cl, trans]) - - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='nucoda' - ) - - expected = r'''TITLE: Example Fade Out - -001 My_Clip V C 00:00:01:00 00:00:01:12 00:00:00:00 00:00:00:12 -* FROM CLIP NAME: My Clip -* FROM FILE: /var/tmp/clip.001.exr -002 My_Clip V C 00:00:01:12 00:00:01:12 00:00:00:12 00:00:00:12 -002 BL V D 012 00:00:00:00 00:00:00:12 00:00:00:12 00:00:01:00 -* FROM CLIP NAME: My Clip -* FROM FILE: /var/tmp/clip.001.exr -''' - - self.assertMultiLineEqual(result, expected) - - def test_nucoda_edl_write_with_double_transition(self): - track = otio.schema.Track() - tl = otio.schema.Timeline("Double Transition", tracks=[track]) - - cl = otio.schema.Clip( - metadata={'cmx_3600': {'reel': 'Reel1'}}, - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(24.0, 24.0), - duration=otio.opentime.RationalTime(24.0, 24.0) - ) - ) - trans = otio.schema.Transition( - in_offset=otio.opentime.RationalTime(6.0, 24.0), - out_offset=otio.opentime.RationalTime(6.0, 24.0) - ) - cl2 = otio.schema.Clip( - metadata={'cmx_3600': {'reel': 'Reel2'}}, - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(24.0, 24.0), - duration=otio.opentime.RationalTime(24.0, 24.0) - ) - ) - trans2 = otio.schema.Transition( - in_offset=otio.opentime.RationalTime(6.0, 24.0), - out_offset=otio.opentime.RationalTime(6.0, 24.0) - ) - cl3 = otio.schema.Clip( - metadata={'cmx_3600': {'reel': 'Reel3'}}, - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(24.0, 24.0), - duration=otio.opentime.RationalTime(24.0, 24.0) - ) - ) - tl.tracks[0].extend([cl, trans, cl2, trans2, cl3]) - - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='nucoda' - ) - - expected = '''TITLE: Double Transition - -001 Reel1 V C 00:00:01:00 00:00:01:18 00:00:00:00 00:00:00:18 -002 Reel1 V C 00:00:01:18 00:00:01:18 00:00:00:18 00:00:00:18 -002 Reel2 V D 012 00:00:00:18 00:00:01:18 00:00:00:18 00:00:01:18 -003 Reel2 V C 00:00:01:18 00:00:01:18 00:00:01:18 00:00:01:18 -003 Reel3 V D 012 00:00:00:18 00:00:02:00 00:00:01:18 00:00:03:00 -''' - - self.assertMultiLineEqual(result, expected) - - def test_read_edl_with_multiple_target_audio_tracks(self): - tl = otio.adapters.read_from_file(MULTIPLE_TARGET_AUDIO_PATH) - - self.assertEqual(len(tl.audio_tracks()), 2) - - first_track, second_track = tl.audio_tracks() - self.assertEqual(first_track.name, "A1") - self.assertEqual(second_track.name, "A2") - - self.assertEqual(first_track[0].name, "AX") - self.assertEqual(second_track[0].name, "AX") - - expected_range = otio.opentime.TimeRange( - duration=otio.opentime.from_timecode("00:56:55:22", rate=24) - ) - self.assertEqual(first_track[0].source_range, expected_range) - self.assertEqual(second_track[0].source_range, expected_range) - - def test_custom_reel_names(self): - track = otio.schema.Track() - tl = otio.schema.Timeline(tracks=[track]) - tr = otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(1.0, 24.0), - duration=otio.opentime.RationalTime(24.0, 24.0) - ) - cl = otio.schema.Clip( - source_range=tr - ) - cl.metadata['cmx_3600'] = { - 'reel': 'v330_21f' - } - tl.tracks[0].append(cl) - - result = otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='nucoda' - ) - - self.assertEqual( - result, - '001 v330_21f V C ' - '00:00:00:01 00:00:01:01 00:00:00:00 00:00:01:00\n' - ) - - def test_invalid_edl_style_raises_exception(self): - tl = otio.adapters.read_from_string( - '001 AX V C ' - '00:00:00:00 00:00:00:05 00:00:00:00 00:00:00:05\n', - adapter_name="cmx_3600" - ) - with self.assertRaises(otio.exceptions.NotSupportedError): - otio.adapters.write_to_string( - tl, - adapter_name='cmx_3600', - style='bogus' - ) - - def test_invalid_record_timecode(self): - with self.assertRaises(ValueError): - tl = otio.adapters.read_from_file(TIMECODE_MISMATCH_TEST) - with self.assertRaises(cmx_3600.EDLParseError): - tl = otio.adapters.read_from_file(TIMECODE_MISMATCH_TEST, rate=25) - tl = otio.adapters.read_from_file( - TIMECODE_MISMATCH_TEST, - rate=25, - ignore_timecode_mismatch=True - ) - self.assertEqual( - tl.tracks[0][3].range_in_parent(), - otio.opentime.TimeRange( - start_time=otio.opentime.from_timecode("00:00:17:22", 25), - duration=otio.opentime.from_timecode("00:00:01:24", 25) - ) - ) - - def test_can_read_frame_cut_points(self): - # EXERCISE - tl = otio.adapters.read_from_string( - '1 CLPA V C 113 170 0 57\n' - '2 CLPA V C 170 170 57 57\n' - '2 CLPB V D 027 162 189 57 84\n' - '3 CLPB V C 189 381 84 276\n', - adapter_name="cmx_3600" - ) - - # VALIDATE - self.assertEqual(tl.duration().value, 276) - self.assertEqual(len(tl.tracks[0]), 4) - self.assertEqual(tl.tracks[0][0].duration().value, 57) - self.assertEqual(tl.tracks[0][0].visible_range().duration.value, 57 + 27) - self.assertEqual(tl.tracks[0][1].in_offset.value, 0) - self.assertEqual(tl.tracks[0][1].out_offset.value, 27) - self.assertEqual(tl.tracks[0][2].duration().value, 27) - self.assertEqual(tl.tracks[0][3].duration().value, 276 - 84) - - def test_speed_effects(self): - tl = otio.adapters.read_from_file( - SPEED_EFFECTS_TEST - ) - self.assertEqual( - tl.duration(), - otio.opentime.from_timecode("00:21:03:18", 24) - ) - - # Look for a clip with a freeze frame effect - clip = tl.tracks[0][182] - self.assertEqual(clip.name, "Z682_156 (LAY3)") - self.assertTrue( - clip.effects and clip.effects[0].effect_name == 'FreezeFrame' - ) - self.assertEqual( - clip.duration(), - otio.opentime.from_timecode("00:00:00:17", 24) - ) - clip = tl.tracks[0][182] - # TODO: We should be able to ask for the source without the effect - # self.assertEqual( - # clip.source_range, - # otio.opentime.TimeRange( - # start_time=otio.opentime.from_timecode("01:00:10:21", 24), - # duration=otio.opentime.from_timecode("00:00:00:01", 24) - # ) - # ) - self.assertEqual( - clip.range_in_parent(), - otio.opentime.TimeRange( - start_time=otio.opentime.from_timecode("00:08:30:00", 24), - duration=otio.opentime.from_timecode("00:00:00:17", 24) - ) - ) - - # Look for a clip with an M2 effect - clip = tl.tracks[0][281] - self.assertEqual( - clip.name, - "Z686_5A (LAY2) (47.56 FPS)" - ) - self.assertTrue( - clip.effects and clip.effects[0].effect_name == "LinearTimeWarp" - ) - self.assertAlmostEqual(clip.effects[0].time_scalar, 1.98333333) - - self.assertIsNone( - clip.metadata.get("cmx_3600", {}).get("motion") - ) - self.assertEqual( - clip.duration(), - otio.opentime.from_timecode("00:00:01:12", 24) - ) - # TODO: We should be able to ask for the source without the effect - # self.assertEqual( - # clip.source_range, - # otio.opentime.TimeRange( - # start_time=otio.opentime.from_timecode("01:00:06:00", 24), - # duration=otio.opentime.from_timecode("00:00:02:22", 24) - # ) - # ) - self.assertEqual( - clip.range_in_parent(), - otio.opentime.TimeRange( - start_time=otio.opentime.from_timecode("00:11:31:16", 24), - duration=otio.opentime.from_timecode("00:00:01:12", 24) - ) - ) - - def test_transition_duration(self): - tl = otio.adapters.read_from_file(TRANSITION_DURATION_TEST) - self.assertEqual(len(tl.tracks[0]), 5) - - self.assertIsInstance(tl.tracks[0][2], otio.schema.Transition) - - self.assertEqual(tl.tracks[0][2].duration().value, 26.0) - - def test_three_part_transition(self): - """ - Test A->B->C Transition - """ - tl = otio.adapters.read_from_file(DISSOLVE_TEST_4) - self.assertEqual(len(tl.tracks[0]), 8) - - self.assertEqual(tl.tracks[0][0].duration().value, 30.0) - self.assertEqual(tl.tracks[0][1].duration().value, 51.0) - self.assertEqual(tl.tracks[0][1].visible_range().duration.value, 51 + 35) - self.assertIsInstance(tl.tracks[0][2], otio.schema.Transition) - self.assertEqual(tl.tracks[0][2].duration().value, 35.0) - self.assertEqual(tl.tracks[0][3].duration().value, 81.0) - self.assertEqual(tl.tracks[0][3].visible_range().duration.value, 81 + 64) - self.assertIsInstance(tl.tracks[0][4], otio.schema.Transition) - self.assertEqual(tl.tracks[0][4].duration().value, 64.0) - self.assertEqual(tl.tracks[0][5].duration().value, 84.0) - self.assertEqual(tl.tracks[0][5].visible_range().duration.value, 84.0) - self.assertEqual(tl.tracks[0][6].duration().value, 96.0) - self.assertEqual(tl.tracks[0][7].duration().value, 135.0) - - def test_enabled(self): - tl = otio.adapters.read_from_file(ENABLED_TEST) - # Exception is raised because the OTIO file has two tracks and cmx_3600 only - # supports one - with self.assertRaises(otio.exceptions.NotSupportedError): - otio.adapters.write_to_string(tl, adapter_name="cmx_3600") - - # Disable top track so we only have one track - tl.tracks[1].enabled = False - result = otio.adapters.write_to_string(tl, adapter_name="cmx_3600") - expected = r'''TITLE: enable_test - -001 Clip001 V C 00:00:00:00 00:00:00:03 00:00:00:00 00:00:00:03 -* FROM CLIP NAME: Clip-001 -* OTIO TRUNCATED REEL NAME FROM: Clip-001 -002 Clip002 V C 00:00:00:03 00:00:00:06 00:00:00:03 00:00:00:06 -* FROM CLIP NAME: Clip-002 -* OTIO TRUNCATED REEL NAME FROM: Clip-002 -''' - - self.assertMultiLineEqual(result, expected) - - # Disable first clip in the track - tl.tracks[0].find_children()[0].enabled = False - result = otio.adapters.write_to_string(tl, adapter_name="cmx_3600") - expected = r'''TITLE: enable_test - -001 Clip002 V C 00:00:00:03 00:00:00:06 00:00:00:03 00:00:00:06 -* FROM CLIP NAME: Clip-002 -* OTIO TRUNCATED REEL NAME FROM: Clip-002 -''' - - self.assertMultiLineEqual(result, expected) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_console.py b/tests/test_console.py index a1e2b71c2..8046e2f47 100755 --- a/tests/test_console.py +++ b/tests/test_console.py @@ -24,7 +24,7 @@ MULTITRACK_PATH = os.path.join(SAMPLE_DATA_DIR, "multitrack.otio") PREMIERE_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "premiere_example.xml") -SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.edl") +SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.otio") SIMPLE_CUT_PATH = os.path.join(SAMPLE_DATA_DIR, "simple_cut.otio") TRANSITION_PATH = os.path.join(SAMPLE_DATA_DIR, "transition.otio") @@ -122,7 +122,7 @@ class OTIOCatTests(ConsoleTester, unittest.TestCase): test_module = otio_console.otiocat def test_basic(self): - sys.argv = ['otiocat', SCREENING_EXAMPLE_PATH, "-a", "rate=24.0"] + sys.argv = ['otiocat', SCREENING_EXAMPLE_PATH] self.run_test() self.assertIn('"name": "Example_Screening.01",', sys.stdout.getvalue()) @@ -172,8 +172,7 @@ def test_basic(self): '-i', SCREENING_EXAMPLE_PATH, '-o', temp_file, '-O', 'otio_json', - '--tracks', '0', - "-a", "rate=24", + '--tracks', '0' ] self.run_test() diff --git a/tests/test_examples.py b/tests/test_examples.py index fbac9dcff..ab3b49022 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -32,8 +32,9 @@ def test_duration(self): ) known = otio.adapters.read_from_file(temp_file) - # checks against a couple of the adapters - for suffix in [".xml", ".edl", ".otio"]: + # TODO: add checks against a couple of the adapters. + # This used to include .edl and .xml + for suffix in [".otio"]: this_test_file = temp_file.replace(".otio", suffix) subprocess.check_call( [sys.executable, examples_path, this_test_file], diff --git a/tests/test_otiod.py b/tests/test_otiod.py index f62253c91..aef9eef8e 100644 --- a/tests/test_otiod.py +++ b/tests/test_otiod.py @@ -14,7 +14,7 @@ from opentimelineio.adapters import file_bundle_utils SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.edl") +SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.otio") MEDIA_EXAMPLE_PATH_REL = os.path.relpath( os.path.join( diff --git a/tests/test_otioz.py b/tests/test_otioz.py index 09ed409e8..f9337b8e9 100644 --- a/tests/test_otioz.py +++ b/tests/test_otioz.py @@ -16,7 +16,7 @@ import opentimelineio.test_utils as otio_test_utils SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.edl") +SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.otio") MEDIA_EXAMPLE_PATH_REL = os.path.relpath( os.path.join( SAMPLE_DATA_DIR, diff --git a/tests/test_url_conversions.py b/tests/test_url_conversions.py index 04ef4398e..2e51901c9 100644 --- a/tests/test_url_conversions.py +++ b/tests/test_url_conversions.py @@ -9,7 +9,7 @@ import opentimelineio as otio SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.edl") +SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.otio") MEDIA_EXAMPLE_PATH_REL = os.path.relpath( os.path.join( os.path.dirname(__file__),