diff --git a/.codecov.yml b/.codecov.yml index ae77e021c..def4bd852 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -18,10 +18,6 @@ comment: require_changes: no ignore: - - "contrib/opentimelineio_contrib/adapters/tests/test_rvsession.py" - - "contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py" - - "contrib/opentimelineio_contrib/adapters/tests/test_burnins.py" - - "contrib/opentimelineio_contrib/adapters/burnins.py" - "*aaf2*" - "*pkg_resources*" - "*pbr*" diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 789edb20d..664963fe9 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -131,6 +131,9 @@ jobs: mingw-w64-x86_64-cmake make git + - name: Ensure MSYS2 pip is updated + if: matrix.python-version == 'mingw64' + run: curl -sS https://bootstrap.pypa.io/get-pip.py | python - name: Set up Python ${{ matrix.python-version }} if: matrix.python-version != 'mingw64' uses: actions/setup-python@v4.3.0 diff --git a/MANIFEST.in b/MANIFEST.in index 567cb83e0..d73ee8897 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,5 @@ -include README.md CHANGELOG.md LICENSE.txt NOTICE.txt CMakeLists.txt +include README.md README_contrib.md CHANGELOG.md LICENSE.txt NOTICE.txt CMakeLists.txt recursive-include examples * -recursive-include contrib * recursive-include src * recursive-include tests * prune .github @@ -17,7 +16,6 @@ exclude CODE_OF_CONDUCT.md exclude CONTRIBUTING.md exclude CONTRIBUTORS.md exclude GOVERNANCE.md -exclude contrib/opentimelineio_contrib/adapters/Makefile exclude Makefile exclude */.DS_Store exclude .clang-format diff --git a/Makefile b/Makefile index 6b1e8224a..9bac2aeb0 100644 --- a/Makefile +++ b/Makefile @@ -46,16 +46,12 @@ OTIO_DEFAULT_MEDIA_LINKER = # run all the unit tests -test: test-core test-contrib +test: test-core test-core: python-version @echo "$(ccgreen)Running Core tests...$(ccend)" @python -m unittest discover -s tests $(TEST_ARGS) -test-contrib: python-version - @echo "$(ccgreen)Running Contrib tests...$(ccend)" - @${MAKE_PROG} -C contrib/opentimelineio_contrib/adapters test VERBOSE=$(VERBOSE) - # CI ################################### ci-prebuild: manifest lint @@ -65,10 +61,10 @@ ci-postbuild: coverage python-version: @python --version -coverage: coverage-core coverage-contrib coverage-report +coverage: coverage-core coverage-report coverage-report: - @${COV_PROG} combine .coverage* contrib/opentimelineio_contrib/adapters/.coverage* + @${COV_PROG} combine .coverage* @${COV_PROG} xml @${COV_PROG} report -m @@ -82,10 +78,7 @@ ifndef COV_PROG endif @${COV_PROG} run -p -m unittest discover tests -coverage-contrib: python-version - @${MAKE_PROG} -C contrib/opentimelineio_contrib/adapters coverage VERBOSE=$(VERBOSE) - -lcov: +lcov: ifndef LCOV_PROG $(error $(newline)$(ccred) lcov is not available please see:$(newline)$(ccend)\ $(ccblue) https://github.com/linux-test-project/lcov/blob/master/README $(ccend)) @@ -127,7 +120,6 @@ clean: ifdef COV_PROG @${COV_PROG} erase endif - @${MAKE_PROG} -C contrib/opentimelineio_contrib/adapters clean VERBOSE=$(VERBOSE) rm -vf *.whl @cd docs; ${MAKE_PROG} clean diff --git a/README.md b/README.md index b3b4ceba1..c8915f294 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,7 @@ For more information: https://github.com/AcademySoftwareFoundation/OpenTimelineI For more information about this, including supported formats, see: https://opentimelineio.readthedocs.io/en/latest/tutorials/adapters.html -Other Plugins -------------- - +All adapters except the native `.otio`, `.otioz` and `.otiod` have been relocated to separate repositories under the OpenTimelineIO organization located here: https://github.com/OpenTimelineIO The OTIO python bindings also support several other kinds of plugins, for more information see: * [Media Linkers](https://opentimelineio.readthedocs.io/en/latest/tutorials/write-a-media-linker.html) - Generate media references to local media according to your local conventions. diff --git a/contrib/README.md b/README_contrib.md similarity index 92% rename from contrib/README.md rename to README_contrib.md index 1ac37c66f..8626689c1 100644 --- a/contrib/README.md +++ b/README_contrib.md @@ -4,7 +4,7 @@ The contrib area was a place to host adapters and application plugins submitted by the OpenTimelineIO community. Those contributions may have involved challenging external dependencies, and may not have the same level of support as the core. -The team is in the process of phasing out this area in favor of using individual +The adapters previously found in the contrib area have been moved to individual repos within the [OpenTimelineIO GitHub Organization](https://github.com/OpenTimelineIO/). diff --git a/contrib/opentimelineio_contrib/__init__.py b/contrib/opentimelineio_contrib/__init__.py deleted file mode 100644 index 9d4c65d09..000000000 --- a/contrib/opentimelineio_contrib/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env python -# -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Unsupported contrib code for OpenTimelineIO.""" - -# flake8: noqa - -from . import ( - adapters -) diff --git a/contrib/opentimelineio_contrib/adapters/Makefile b/contrib/opentimelineio_contrib/adapters/Makefile deleted file mode 100644 index 7ab72381d..000000000 --- a/contrib/opentimelineio_contrib/adapters/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# Makefile for the contrib area - -TEST_ARGS= -COV_PROG := $(shell command -v coverage 2> /dev/null) - -ifeq ($(VERBOSE), 1) - TEST_ARGS:=-v -endif - -test: - @python -m unittest discover tests $(TEST_ARGS) - -coverage: -ifndef COV_PROG - $(error "coverage is not available please see: "\ - "https://coverage.readthedocs.io/en/coverage-4.2/install.html") -endif - @${COV_PROG} run --rcfile=../../../setup.cfg -p -m unittest discover tests - -coverage-report: coverage - @${COV_PROG} report -m - -clean: -ifdef COV_PROG - @${COV_PROG} erase -endif - diff --git a/contrib/opentimelineio_contrib/adapters/__init__.py b/contrib/opentimelineio_contrib/adapters/__init__.py deleted file mode 100644 index 686a8cb5f..000000000 --- a/contrib/opentimelineio_contrib/adapters/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project diff --git a/contrib/opentimelineio_contrib/adapters/aaf_adapter/__init__.py b/contrib/opentimelineio_contrib/adapters/aaf_adapter/__init__.py deleted file mode 100644 index 686a8cb5f..000000000 --- a/contrib/opentimelineio_contrib/adapters/aaf_adapter/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project diff --git a/contrib/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py b/contrib/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py deleted file mode 100644 index 63e6749e3..000000000 --- a/contrib/opentimelineio_contrib/adapters/aaf_adapter/aaf_writer.py +++ /dev/null @@ -1,776 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""AAF Adapter Transcriber - -Specifies how to transcribe an OpenTimelineIO file into an AAF file. -""" - -import aaf2 -import abc -import uuid -import opentimelineio as otio -import os -import copy -import re - - -AAF_PARAMETERDEF_PAN = aaf2.auid.AUID("e4962322-2267-11d3-8a4c-0050040ef7d2") -AAF_OPERATIONDEF_MONOAUDIOPAN = aaf2.auid.AUID("9d2ea893-0968-11d3-8a38-0050040ef7d2") -AAF_PARAMETERDEF_AVIDPARAMETERBYTEORDER = uuid.UUID( - "c0038672-a8cf-11d3-a05b-006094eb75cb") -AAF_PARAMETERDEF_AVIDEFFECTID = uuid.UUID( - "93994bd6-a81d-11d3-a05b-006094eb75cb") -AAF_PARAMETERDEF_AFX_FG_KEY_OPACITY_U = uuid.UUID( - "8d56813d-847e-11d5-935a-50f857c10000") -AAF_PARAMETERDEF_LEVEL = uuid.UUID("e4962320-2267-11d3-8a4c-0050040ef7d2") -AAF_VVAL_EXTRAPOLATION_ID = uuid.UUID("0e24dd54-66cd-4f1a-b0a0-670ac3a7a0b3") -AAF_OPERATIONDEF_SUBMASTER = uuid.UUID("f1db0f3d-8d64-11d3-80df-006008143e6f") - - -def _is_considered_gap(thing): - """Returns whether or not thiing can be considered gap. - - TODO: turns generators w/ kind "Slug" inito gap. Should probably generate - opaque black instead. - """ - if isinstance(thing, otio.schema.Gap): - return True - - if ( - isinstance(thing, otio.schema.Clip) - and isinstance( - thing.media_reference, - otio.schema.GeneratorReference) - ): - if thing.media_reference.generator_kind in ("Slug",): - return True - else: - raise otio.exceptions.NotSupportedError( - "AAF adapter does not support generator references of kind" - " '{}'".format(thing.media_reference.generator_kind) - ) - - return False - - -class AAFAdapterError(otio.exceptions.OTIOError): - pass - - -class AAFValidationError(AAFAdapterError): - pass - - -class AAFFileTranscriber: - """ - AAFFileTranscriber - - AAFFileTranscriber manages the file-level knowledge during a conversion from - otio to aaf. This includes keeping track of unique tapemobs and mastermobs. - """ - - def __init__(self, input_otio, aaf_file, **kwargs): - """ - AAFFileTranscriber requires an input timeline and an output pyaaf2 file handle. - - Args: - input_otio: an input OpenTimelineIO timeline - aaf_file: a pyaaf2 file handle to an output file - """ - self.aaf_file = aaf_file - self.compositionmob = self.aaf_file.create.CompositionMob() - self.compositionmob.name = input_otio.name - self.compositionmob.usage = "Usage_TopLevel" - self.aaf_file.content.mobs.append(self.compositionmob) - self._unique_mastermobs = {} - self._unique_tapemobs = {} - self._clip_mob_ids_map = _gather_clip_mob_ids(input_otio, **kwargs) - - def _unique_mastermob(self, otio_clip): - """Get a unique mastermob, identified by clip metadata mob id.""" - mob_id = self._clip_mob_ids_map.get(otio_clip) - mastermob = self._unique_mastermobs.get(mob_id) - if not mastermob: - mastermob = self.aaf_file.create.MasterMob() - mastermob.name = otio_clip.name - mastermob.mob_id = aaf2.mobid.MobID(mob_id) - self.aaf_file.content.mobs.append(mastermob) - self._unique_mastermobs[mob_id] = mastermob - return mastermob - - def _unique_tapemob(self, otio_clip): - """Get a unique tapemob, identified by clip metadata mob id.""" - mob_id = self._clip_mob_ids_map.get(otio_clip) - tapemob = self._unique_tapemobs.get(mob_id) - if not tapemob: - tapemob = self.aaf_file.create.SourceMob() - tapemob.name = otio_clip.name - tapemob.descriptor = self.aaf_file.create.ImportDescriptor() - # If the edit_rate is not an integer, we need - # to use drop frame with a nominal integer fps. - edit_rate = otio_clip.visible_range().duration.rate - timecode_fps = round(edit_rate) - tape_timecode_slot = tapemob.create_timecode_slot( - edit_rate=edit_rate, - timecode_fps=timecode_fps, - drop_frame=(edit_rate != timecode_fps) - ) - timecode_start = int( - otio_clip.media_reference.available_range.start_time.value - ) - timecode_length = int( - otio_clip.media_reference.available_range.duration.value - ) - - tape_timecode_slot.segment.start = int(timecode_start) - tape_timecode_slot.segment.length = int(timecode_length) - self.aaf_file.content.mobs.append(tapemob) - self._unique_tapemobs[mob_id] = tapemob - return tapemob - - def track_transcriber(self, otio_track): - """Return an appropriate _TrackTranscriber given an otio track.""" - if otio_track.kind == otio.schema.TrackKind.Video: - transcriber = VideoTrackTranscriber(self, otio_track) - elif otio_track.kind == otio.schema.TrackKind.Audio: - transcriber = AudioTrackTranscriber(self, otio_track) - else: - raise otio.exceptions.NotSupportedError( - f"Unsupported track kind: {otio_track.kind}") - return transcriber - - -def validate_metadata(timeline): - """Print a check of necessary metadata requirements for an otio timeline.""" - - all_checks = [__check(timeline, "duration().rate")] - edit_rate = __check(timeline, "duration().rate").value - - for child in timeline.find_children(): - checks = [] - if _is_considered_gap(child): - checks = [ - __check(child, "duration().rate").equals(edit_rate) - ] - if isinstance(child, otio.schema.Clip): - checks = [ - __check(child, "duration().rate").equals(edit_rate), - __check(child, "media_reference.available_range.duration.rate" - ).equals(edit_rate), - __check(child, "media_reference.available_range.start_time.rate" - ).equals(edit_rate) - ] - if isinstance(child, otio.schema.Transition): - checks = [ - __check(child, "duration().rate").equals(edit_rate), - __check(child, "metadata['AAF']['PointList']"), - __check(child, "metadata['AAF']['OperationGroup']['Operation']" - "['DataDefinition']['Name']"), - __check(child, "metadata['AAF']['OperationGroup']['Operation']" - "['Description']"), - __check(child, "metadata['AAF']['OperationGroup']['Operation']" - "['Name']"), - __check(child, "metadata['AAF']['CutPoint']") - ] - all_checks.extend(checks) - - if any(check.errors for check in all_checks): - raise AAFValidationError("\n" + "\n".join( - sum([check.errors for check in all_checks], []))) - - -def _gather_clip_mob_ids(input_otio, - prefer_file_mob_id=False, - use_empty_mob_ids=False, - **kwargs): - """ - Create dictionary of otio clips with their corresponding mob ids. - """ - - def _from_clip_metadata(clip): - """Get the MobID from the clip.metadata.""" - return clip.metadata.get("AAF", {}).get("SourceID") - - def _from_media_reference_metadata(clip): - """Get the MobID from the media_reference.metadata.""" - return (clip.media_reference.metadata.get("AAF", {}).get("MobID") or - clip.media_reference.metadata.get("AAF", {}).get("SourceID")) - - def _from_aaf_file(clip): - """ Get the MobID from the AAF file itself.""" - mob_id = None - target_url = clip.media_reference.target_url - if os.path.isfile(target_url) and target_url.endswith("aaf"): - with aaf2.open(clip.media_reference.target_url) as aaf_file: - mastermobs = list(aaf_file.content.mastermobs()) - if len(mastermobs) == 1: - mob_id = mastermobs[0].mob_id - return mob_id - - def _generate_empty_mobid(clip): - """Generate a meaningless MobID.""" - return aaf2.mobid.MobID.new() - - strategies = [ - _from_clip_metadata, - _from_media_reference_metadata, - _from_aaf_file - ] - - if prefer_file_mob_id: - strategies.remove(_from_aaf_file) - strategies.insert(0, _from_aaf_file) - - if use_empty_mob_ids: - strategies.append(_generate_empty_mobid) - - clip_mob_ids = {} - - for otio_clip in input_otio.find_clips(): - if _is_considered_gap(otio_clip): - continue - for strategy in strategies: - mob_id = strategy(otio_clip) - if mob_id: - clip_mob_ids[otio_clip] = mob_id - break - else: - raise AAFAdapterError(f"Cannot find mob ID for clip {otio_clip}") - - return clip_mob_ids - - -def _stackify_nested_groups(timeline): - """ - Ensure that all nesting in a given timeline is in a stack container. - This conforms with how AAF thinks about nesting, there needs - to be an outer container, even if it's just one object. - """ - copied = copy.deepcopy(timeline) - for track in copied.tracks: - for i, child in enumerate(track.find_children()): - is_nested = isinstance(child, otio.schema.Track) - is_parent_in_stack = isinstance(child.parent(), otio.schema.Stack) - if is_nested and not is_parent_in_stack: - stack = otio.schema.Stack() - track.remove(child) - stack.append(child) - track.insert(i, stack) - return copied - - -class _TrackTranscriber: - """ - _TrackTranscriber is the base class for the conversion of a given otio track. - - _TrackTranscriber is not meant to be used by itself. It provides the common - functionality to inherit from. We need an abstract base class because Audio and - Video are handled differently. - """ - __metaclass__ = abc.ABCMeta - - def __init__(self, root_file_transcriber, otio_track): - """ - _TrackTranscriber - - Args: - root_file_transcriber: the corresponding 'parent' AAFFileTranscriber object - otio_track: the given otio_track to convert - """ - self.root_file_transcriber = root_file_transcriber - self.compositionmob = root_file_transcriber.compositionmob - self.aaf_file = root_file_transcriber.aaf_file - self.otio_track = otio_track - self.edit_rate = self.otio_track.find_children()[0].duration().rate - self.timeline_mobslot, self.sequence = self._create_timeline_mobslot() - self.timeline_mobslot.name = self.otio_track.name - - def transcribe(self, otio_child): - """Transcribe otio child to corresponding AAF object""" - if _is_considered_gap(otio_child): - filler = self.aaf_filler(otio_child) - return filler - elif isinstance(otio_child, otio.schema.Transition): - transition = self.aaf_transition(otio_child) - return transition - elif isinstance(otio_child, otio.schema.Clip): - source_clip = self.aaf_sourceclip(otio_child) - return source_clip - elif isinstance(otio_child, otio.schema.Track): - sequence = self.aaf_sequence(otio_child) - return sequence - elif isinstance(otio_child, otio.schema.Stack): - operation_group = self.aaf_operation_group(otio_child) - return operation_group - else: - raise otio.exceptions.NotSupportedError( - f"Unsupported otio child type: {type(otio_child)}") - - @property - @abc.abstractmethod - def media_kind(self): - """Return the string for what kind of track this is.""" - pass - - @property - @abc.abstractmethod - def _master_mob_slot_id(self): - """ - Return the MasterMob Slot ID for the corresponding track media kind - """ - # MasterMob's and MasterMob slots have to be unique. We handle unique - # MasterMob's with _unique_mastermob(). We also need to protect against - # duplicate MasterMob slots. As of now, we mandate all picture clips to - # be created in MasterMob slot 1 and all sound clips to be created in - # MasterMob slot 2. While this is a little inadequate, it works for now - pass - - @abc.abstractmethod - def _create_timeline_mobslot(self): - """ - Return a timeline_mobslot and sequence for this track. - - In AAF, a TimelineMobSlot is a container for the Sequence. A Sequence is - analogous to an otio track. - - Returns: - Returns a tuple of (TimelineMobSlot, Sequence) - """ - pass - - @abc.abstractmethod - def default_descriptor(self, otio_clip): - pass - - @abc.abstractmethod - def _transition_parameters(self): - pass - - def aaf_filler(self, otio_gap): - """Convert an otio Gap into an aaf Filler""" - length = int(otio_gap.visible_range().duration.value) - filler = self.aaf_file.create.Filler(self.media_kind, length) - return filler - - def aaf_sourceclip(self, otio_clip): - """Convert an otio Clip into an aaf SourceClip""" - tapemob, tapemob_slot = self._create_tapemob(otio_clip) - filemob, filemob_slot = self._create_filemob(otio_clip, tapemob, tapemob_slot) - mastermob, mastermob_slot = self._create_mastermob(otio_clip, - filemob, - filemob_slot) - - # We need both `start_time` and `duration` - # Here `start` is the offset between `first` and `in` values. - - offset = (otio_clip.visible_range().start_time - - otio_clip.available_range().start_time) - start = offset.value - length = otio_clip.visible_range().duration.value - - compmob_clip = self.compositionmob.create_source_clip( - slot_id=self.timeline_mobslot.slot_id, - # XXX: Python3 requires these to be passed as explicit ints - start=int(start), - length=int(length), - media_kind=self.media_kind - ) - compmob_clip.mob = mastermob - compmob_clip.slot = mastermob_slot - compmob_clip.slot_id = mastermob_slot.slot_id - return compmob_clip - - def aaf_transition(self, otio_transition): - """Convert an otio Transition into an aaf Transition""" - if (otio_transition.transition_type != - otio.schema.TransitionTypes.SMPTE_Dissolve): - print( - "Unsupported transition type: {}".format( - otio_transition.transition_type)) - return None - - transition_params, varying_value = self._transition_parameters() - - interpolation_def = self.aaf_file.create.InterpolationDef( - aaf2.misc.LinearInterp, "LinearInterp", "Linear keyframe interpolation") - self.aaf_file.dictionary.register_def(interpolation_def) - varying_value["Interpolation"].value = ( - self.aaf_file.dictionary.lookup_interperlationdef("LinearInterp")) - - pointlist = otio_transition.metadata["AAF"]["PointList"] - - c1 = self.aaf_file.create.ControlPoint() - c1["EditHint"].value = "Proportional" - c1.value = pointlist[0]["Value"] - c1.time = pointlist[0]["Time"] - - c2 = self.aaf_file.create.ControlPoint() - c2["EditHint"].value = "Proportional" - c2.value = pointlist[1]["Value"] - c2.time = pointlist[1]["Time"] - - varying_value["PointList"].extend([c1, c2]) - - op_group_metadata = otio_transition.metadata["AAF"]["OperationGroup"] - effect_id = op_group_metadata["Operation"].get("Identification") - is_time_warp = op_group_metadata["Operation"].get("IsTimeWarp") - by_pass = op_group_metadata["Operation"].get("Bypass") - number_inputs = op_group_metadata["Operation"].get("NumberInputs") - operation_category = op_group_metadata["Operation"].get("OperationCategory") - data_def_name = op_group_metadata["Operation"]["DataDefinition"]["Name"] - data_def = self.aaf_file.dictionary.lookup_datadef(str(data_def_name)) - description = op_group_metadata["Operation"]["Description"] - op_def_name = otio_transition.metadata["AAF"][ - "OperationGroup" - ]["Operation"]["Name"] - - # Create OperationDefinition - op_def = self.aaf_file.create.OperationDef(uuid.UUID(effect_id), op_def_name) - self.aaf_file.dictionary.register_def(op_def) - op_def.media_kind = self.media_kind - datadef = self.aaf_file.dictionary.lookup_datadef(self.media_kind) - op_def["IsTimeWarp"].value = is_time_warp - op_def["Bypass"].value = by_pass - op_def["NumberInputs"].value = number_inputs - op_def["OperationCategory"].value = str(operation_category) - op_def["ParametersDefined"].extend(transition_params) - op_def["DataDefinition"].value = data_def - op_def["Description"].value = str(description) - - # Create OperationGroup - length = int(otio_transition.duration().value) - operation_group = self.aaf_file.create.OperationGroup(op_def, length) - operation_group["DataDefinition"].value = datadef - operation_group["Parameters"].append(varying_value) - - # Create Transition - transition = self.aaf_file.create.Transition(self.media_kind, length) - transition["OperationGroup"].value = operation_group - transition["CutPoint"].value = otio_transition.metadata["AAF"]["CutPoint"] - transition["DataDefinition"].value = datadef - return transition - - def aaf_sequence(self, otio_track): - """Convert an otio Track into an aaf Sequence""" - sequence = self.aaf_file.create.Sequence(media_kind=self.media_kind) - length = 0 - for nested_otio_child in otio_track: - result = self.transcribe(nested_otio_child) - length += result.length - sequence.components.append(result) - sequence.length = length - return sequence - - def aaf_operation_group(self, otio_stack): - """ - Create and return an OperationGroup which will contain other AAF objects - to support OTIO nesting - """ - # Create OperationDefinition - op_def = self.aaf_file.create.OperationDef(AAF_OPERATIONDEF_SUBMASTER, - "Submaster") - self.aaf_file.dictionary.register_def(op_def) - op_def.media_kind = self.media_kind - datadef = self.aaf_file.dictionary.lookup_datadef(self.media_kind) - - # These values are necessary for pyaaf2 OperationDefinitions - op_def["IsTimeWarp"].value = False - op_def["Bypass"].value = 0 - op_def["NumberInputs"].value = -1 - op_def["OperationCategory"].value = "OperationCategory_Effect" - op_def["DataDefinition"].value = datadef - - # Create OperationGroup - operation_group = self.aaf_file.create.OperationGroup(op_def) - operation_group.media_kind = self.media_kind - operation_group["DataDefinition"].value = datadef - - length = 0 - for nested_otio_child in otio_stack: - result = self.transcribe(nested_otio_child) - length += result.length - operation_group.segments.append(result) - operation_group.length = length - return operation_group - - def _create_tapemob(self, otio_clip): - """ - Return a physical sourcemob for an otio Clip based on the MobID. - - Returns: - Returns a tuple of (TapeMob, TapeMobSlot) - """ - tapemob = self.root_file_transcriber._unique_tapemob(otio_clip) - tapemob_slot = tapemob.create_empty_slot(self.edit_rate, self.media_kind) - tapemob_slot.segment.length = int( - otio_clip.media_reference.available_range.duration.value) - return tapemob, tapemob_slot - - def _create_filemob(self, otio_clip, tapemob, tapemob_slot): - """ - Return a file sourcemob for an otio Clip. Needs a tapemob and tapemob slot. - - Returns: - Returns a tuple of (FileMob, FileMobSlot) - """ - filemob = self.aaf_file.create.SourceMob() - self.aaf_file.content.mobs.append(filemob) - - filemob.descriptor = self.default_descriptor(otio_clip) - filemob_slot = filemob.create_timeline_slot(self.edit_rate) - filemob_clip = filemob.create_source_clip( - slot_id=filemob_slot.slot_id, - length=tapemob_slot.segment.length, - media_kind=tapemob_slot.segment.media_kind) - filemob_clip.mob = tapemob - filemob_clip.slot = tapemob_slot - filemob_clip.slot_id = tapemob_slot.slot_id - filemob_slot.segment = filemob_clip - return filemob, filemob_slot - - def _create_mastermob(self, otio_clip, filemob, filemob_slot): - """ - Return a mastermob for an otio Clip. Needs a filemob and filemob slot. - - Returns: - Returns a tuple of (MasterMob, MasterMobSlot) - """ - mastermob = self.root_file_transcriber._unique_mastermob(otio_clip) - timecode_length = int(otio_clip.media_reference.available_range.duration.value) - - try: - mastermob_slot = mastermob.slot_at(self._master_mob_slot_id) - except IndexError: - mastermob_slot = ( - mastermob.create_timeline_slot(edit_rate=self.edit_rate, - slot_id=self._master_mob_slot_id)) - mastermob_clip = mastermob.create_source_clip( - slot_id=mastermob_slot.slot_id, - length=timecode_length, - media_kind=self.media_kind) - mastermob_clip.mob = filemob - mastermob_clip.slot = filemob_slot - mastermob_clip.slot_id = filemob_slot.slot_id - mastermob_slot.segment = mastermob_clip - return mastermob, mastermob_slot - - -class VideoTrackTranscriber(_TrackTranscriber): - """Video track kind specialization of TrackTranscriber.""" - - @property - def media_kind(self): - return "picture" - - @property - def _master_mob_slot_id(self): - return 1 - - def _create_timeline_mobslot(self): - """ - Create a Sequence container (TimelineMobSlot) and Sequence. - - TimelineMobSlot --> Sequence - """ - timeline_mobslot = self.compositionmob.create_timeline_slot( - edit_rate=self.edit_rate) - sequence = self.aaf_file.create.Sequence(media_kind=self.media_kind) - timeline_mobslot.segment = sequence - return timeline_mobslot, sequence - - def default_descriptor(self, otio_clip): - # TODO: Determine if these values are the correct, and if so, - # maybe they should be in the AAF metadata - descriptor = self.aaf_file.create.CDCIDescriptor() - descriptor["ComponentWidth"].value = 8 - descriptor["HorizontalSubsampling"].value = 2 - descriptor["ImageAspectRatio"].value = "16/9" - descriptor["StoredWidth"].value = 1920 - descriptor["StoredHeight"].value = 1080 - descriptor["FrameLayout"].value = "FullFrame" - descriptor["VideoLineMap"].value = [42, 0] - descriptor["SampleRate"].value = 24 - descriptor["Length"].value = 1 - return descriptor - - def _transition_parameters(self): - """ - Return video transition parameters - """ - # Create ParameterDef for AvidParameterByteOrder - byteorder_typedef = self.aaf_file.dictionary.lookup_typedef("aafUInt16") - param_byteorder = self.aaf_file.create.ParameterDef( - AAF_PARAMETERDEF_AVIDPARAMETERBYTEORDER, - "AvidParameterByteOrder", - "", - byteorder_typedef) - self.aaf_file.dictionary.register_def(param_byteorder) - - # Create ParameterDef for AvidEffectID - avid_effect_typdef = self.aaf_file.dictionary.lookup_typedef("AvidBagOfBits") - param_effect_id = self.aaf_file.create.ParameterDef( - AAF_PARAMETERDEF_AVIDEFFECTID, - "AvidEffectID", - "", - avid_effect_typdef) - self.aaf_file.dictionary.register_def(param_effect_id) - - # Create ParameterDef for AFX_FG_KEY_OPACITY_U - opacity_param_def = self.aaf_file.dictionary.lookup_typedef("Rational") - opacity_param = self.aaf_file.create.ParameterDef( - AAF_PARAMETERDEF_AFX_FG_KEY_OPACITY_U, - "AFX_FG_KEY_OPACITY_U", - "", - opacity_param_def) - self.aaf_file.dictionary.register_def(opacity_param) - - # Create VaryingValue - opacity_u = self.aaf_file.create.VaryingValue() - opacity_u.parameterdef = self.aaf_file.dictionary.lookup_parameterdef( - "AFX_FG_KEY_OPACITY_U") - opacity_u["VVal_Extrapolation"].value = AAF_VVAL_EXTRAPOLATION_ID - opacity_u["VVal_FieldCount"].value = 1 - - return [param_byteorder, param_effect_id], opacity_u - - -class AudioTrackTranscriber(_TrackTranscriber): - """Audio track kind specialization of TrackTranscriber.""" - - @property - def media_kind(self): - return "sound" - - @property - def _master_mob_slot_id(self): - return 2 - - def aaf_sourceclip(self, otio_clip): - # Parameter Definition - typedef = self.aaf_file.dictionary.lookup_typedef("Rational") - param_def = self.aaf_file.create.ParameterDef(AAF_PARAMETERDEF_PAN, - "Pan", - "Pan", - typedef) - self.aaf_file.dictionary.register_def(param_def) - interp_def = self.aaf_file.create.InterpolationDef(aaf2.misc.LinearInterp, - "LinearInterp", - "LinearInterp") - self.aaf_file.dictionary.register_def(interp_def) - # PointList - length = int(otio_clip.duration().value) - c1 = self.aaf_file.create.ControlPoint() - c1["ControlPointSource"].value = 2 - c1["Time"].value = aaf2.rational.AAFRational(f"0/{length}") - c1["Value"].value = 0 - c2 = self.aaf_file.create.ControlPoint() - c2["ControlPointSource"].value = 2 - c2["Time"].value = aaf2.rational.AAFRational(f"{length - 1}/{length}") - c2["Value"].value = 0 - varying_value = self.aaf_file.create.VaryingValue() - varying_value.parameterdef = param_def - varying_value["Interpolation"].value = interp_def - varying_value["PointList"].extend([c1, c2]) - opgroup = self.timeline_mobslot.segment - opgroup.parameters.append(varying_value) - - return super().aaf_sourceclip(otio_clip) - - def _create_timeline_mobslot(self): - """ - Create a Sequence container (TimelineMobSlot) and Sequence. - Sequence needs to be in an OperationGroup. - - TimelineMobSlot --> OperationGroup --> Sequence - """ - # TimelineMobSlot - timeline_mobslot = self.compositionmob.create_sound_slot( - edit_rate=self.edit_rate) - # OperationDefinition - opdef = self.aaf_file.create.OperationDef(AAF_OPERATIONDEF_MONOAUDIOPAN, - "Audio Pan") - opdef.media_kind = self.media_kind - opdef["NumberInputs"].value = 1 - self.aaf_file.dictionary.register_def(opdef) - # OperationGroup - total_length = int(sum([t.duration().value for t in self.otio_track])) - opgroup = self.aaf_file.create.OperationGroup(opdef) - opgroup.media_kind = self.media_kind - opgroup.length = total_length - timeline_mobslot.segment = opgroup - # Sequence - sequence = self.aaf_file.create.Sequence(media_kind=self.media_kind) - sequence.length = total_length - opgroup.segments.append(sequence) - return timeline_mobslot, sequence - - def default_descriptor(self, otio_clip): - descriptor = self.aaf_file.create.PCMDescriptor() - descriptor["AverageBPS"].value = 96000 - descriptor["BlockAlign"].value = 2 - descriptor["QuantizationBits"].value = 16 - descriptor["AudioSamplingRate"].value = 48000 - descriptor["Channels"].value = 1 - descriptor["SampleRate"].value = 48000 - descriptor["Length"].value = int( - otio_clip.media_reference.available_range.duration.value - ) - return descriptor - - def _transition_parameters(self): - """ - Return audio transition parameters - """ - # Create ParameterDef for ParameterDef_Level - def_level_typedef = self.aaf_file.dictionary.lookup_typedef("Rational") - param_def_level = self.aaf_file.create.ParameterDef(AAF_PARAMETERDEF_LEVEL, - "ParameterDef_Level", - "", - def_level_typedef) - self.aaf_file.dictionary.register_def(param_def_level) - - # Create VaryingValue - level = self.aaf_file.create.VaryingValue() - level.parameterdef = ( - self.aaf_file.dictionary.lookup_parameterdef("ParameterDef_Level")) - - return [param_def_level], level - - -class __check: - """ - __check is a private helper class that safely gets values given to check - for existence and equality - """ - - def __init__(self, obj, tokenpath): - self.orig = obj - self.value = obj - self.errors = [] - self.tokenpath = tokenpath - try: - for token in re.split(r"[\.\[]", tokenpath): - if token.endswith("()"): - self.value = getattr(self.value, token.replace("()", ""))() - elif "]" in token: - self.value = self.value[token.strip("[]'\"")] - else: - self.value = getattr(self.value, token) - except Exception as e: - self.value = None - self.errors.append("{}{} {}.{} does not exist, {}".format( - self.orig.name if hasattr(self.orig, "name") else "", - type(self.orig), - type(self.orig).__name__, - self.tokenpath, e)) - - def equals(self, val): - """Check if the retrieved value is equal to a given value.""" - if self.value is not None and self.value != val: - self.errors.append( - "{}{} {}.{} not equal to {} (expected) != {} (actual)".format( - self.orig.name if hasattr(self.orig, "name") else "", - type(self.orig), - type(self.orig).__name__, self.tokenpath, val, self.value)) - return self diff --git a/contrib/opentimelineio_contrib/adapters/advanced_authoring_format.py b/contrib/opentimelineio_contrib/adapters/advanced_authoring_format.py deleted file mode 100644 index 41feb2bbd..000000000 --- a/contrib/opentimelineio_contrib/adapters/advanced_authoring_format.py +++ /dev/null @@ -1,1622 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""OpenTimelineIO Advanced Authoring Format (AAF) Adapter - -Depending on if/where PyAAF is installed, you may need to set this env var: - OTIO_AAF_PYTHON_LIB - should point at the PyAAF module. -""" -import colorsys -import copy -import numbers -import os -import sys - -import collections -import fractions -import opentimelineio as otio - -lib_path = os.environ.get("OTIO_AAF_PYTHON_LIB") -if lib_path and lib_path not in sys.path: - sys.path.insert(0, lib_path) - -import aaf2 # noqa: E402 -import aaf2.content # noqa: E402 -import aaf2.mobs # noqa: E402 -import aaf2.components # noqa: E402 -import aaf2.core # noqa: E402 -import aaf2.misc # noqa: E402 -from opentimelineio_contrib.adapters.aaf_adapter import aaf_writer # noqa: E402 - - -debug = False - -# If enabled, output recursive traversal info of _transcribe() method. -_TRANSCRIBE_DEBUG = False - -# bake keyframed parameter -_BAKE_KEYFRAMED_PROPERTIES_VALUES = False - -_PROPERTY_INTERPOLATION_MAP = { - aaf2.misc.ConstantInterp: "Constant", - aaf2.misc.LinearInterp: "Linear", - aaf2.misc.BezierInterpolator: "Bezier", - aaf2.misc.CubicInterpolator: "Cubic", -} - - -def _transcribe_log(s, indent=0, always_print=False): - if always_print or _TRANSCRIBE_DEBUG: - print("{}{}".format(" " * indent, s)) - - -class AAFAdapterError(otio.exceptions.OTIOError): - """ Raised for AAF adatper-specific errors. """ - - -def _get_parameter(item, parameter_name): - values = {value.name: value for value in item.parameters.value} - return values.get(parameter_name) - - -def _encoded_name(item): - - name = _get_name(item) - return name.encode("utf-8", "replace") - - -def _get_name(item): - if isinstance(item, aaf2.components.SourceClip): - try: - return item.mob.name or "Untitled SourceClip" - except AttributeError: - # Some AAFs produce this error: - # RuntimeError: failed with [-2146303738]: mob not found - return "SourceClip Missing Mob" - if hasattr(item, 'name'): - name = item.name - if name: - return name - return _get_class_name(item) - - -def _get_class_name(item): - if hasattr(item, "class_name"): - return item.class_name - else: - return item.__class__.__name__ - - -def _transcribe_property(prop, owner=None): - if isinstance(prop, (str, numbers.Integral, float, dict)): - return prop - elif isinstance(prop, set): - return list(prop) - elif isinstance(prop, list): - result = {} - for child in prop: - if hasattr(child, "name"): - if isinstance(child, aaf2.misc.VaryingValue): - # keyframed values - control_points = [] - for control_point in child["PointList"]: - try: - # Some values cannot be transcribed yet - control_points.append( - [ - control_point.time, - _transcribe_property(control_point.value), - ] - ) - except TypeError: - _transcribe_log( - "Unable to transcribe value for property: " - "'{}' (Type: '{}', Parent: '{}')".format( - child.name, type(child), prop - ) - ) - - # bake keyframe values for owner time range - baked_values = None - if _BAKE_KEYFRAMED_PROPERTIES_VALUES: - if isinstance(owner, aaf2.components.Component): - baked_values = [] - for t in range(0, owner.length): - baked_values.append([t, child.value_at(t)]) - else: - _transcribe_log( - "Unable to bake values for property: " - "'{}'. Owner: {}, Control Points: {}".format( - child.name, owner, control_points - ) - ) - - value_dict = { - "_aaf_keyframed_property": True, - "keyframe_values": control_points, - "keyframe_interpolation": _PROPERTY_INTERPOLATION_MAP.get( - child.interpolationdef.auid, "Linear" - ), - "keyframe_baked_values": baked_values - } - result[child.name] = value_dict - - elif hasattr(child, "value"): - # static value - result[child.name] = _transcribe_property(child.value, owner=owner) - else: - # @TODO: There may be more properties that we might want also. - # If you want to see what is being skipped, turn on debug. - if debug: - debug_message = "Skipping unrecognized property: '{}', parent '{}'" - _transcribe_log(debug_message.format(child, prop)) - return result - elif hasattr(prop, "properties"): - result = {} - for child in prop.properties(): - result[child.name] = _transcribe_property(child.value, owner=owner) - return result - else: - return str(prop) - - -def _otio_color_from_hue(hue): - """Return an OTIO marker color, based on hue in range of [0.0, 1.0]. - - Args: - hue (float): marker color hue value - - Returns: - otio.schema.MarkerColor: converted / estimated marker color - - """ - if hue <= 0.04 or hue > 0.93: - return otio.schema.MarkerColor.RED - if hue <= 0.13: - return otio.schema.MarkerColor.ORANGE - if hue <= 0.2: - return otio.schema.MarkerColor.YELLOW - if hue <= 0.43: - return otio.schema.MarkerColor.GREEN - if hue <= 0.52: - return otio.schema.MarkerColor.CYAN - if hue <= 0.74: - return otio.schema.MarkerColor.BLUE - if hue <= 0.82: - return otio.schema.MarkerColor.PURPLE - return otio.schema.MarkerColor.MAGENTA - - -def _marker_color_from_string(color): - """Tries to derive a valid marker color from a string. - - Args: - color (str): color name (e.g. "Yellow") - - Returns: - otio.schema.MarkerColor: matching color or `None` - """ - if not color: - return - - return getattr(otio.schema.MarkerColor, color.upper(), None) - - -def _convert_rgb_to_marker_color(rgb_dict): - """Returns a matching OTIO marker color for a given AAF color string. - - Adapted from `get_nearest_otio_color()` in the `xges.py` adapter. - - Args: - rgb_dict (dict): marker color as dict, - e.g. `"{'red': 41471, 'green': 12134, 'blue': 6564}"` - - Returns: - otio.schema.MarkerColor: converted / estimated marker color - - """ - - float_colors = { - (1.0, 0.0, 0.0): otio.schema.MarkerColor.RED, - (0.0, 1.0, 0.0): otio.schema.MarkerColor.GREEN, - (0.0, 0.0, 1.0): otio.schema.MarkerColor.BLUE, - (0.0, 0.0, 0.0): otio.schema.MarkerColor.BLACK, - (1.0, 1.0, 1.0): otio.schema.MarkerColor.WHITE, - } - - # convert from UInt to float - red = float(rgb_dict["red"]) / 65535.0 - green = float(rgb_dict["green"]) / 65535.0 - blue = float(rgb_dict["blue"]) / 65535.0 - rgb_float = (red, green, blue) - - # check for exact match - marker_color = float_colors.get(rgb_float) - if marker_color: - return marker_color - - # try to get an approxiate match based on hue - hue, lightness, saturation = colorsys.rgb_to_hls(red, green, blue) - nearest = None - if saturation < 0.2: - if lightness > 0.65: - nearest = otio.schema.MarkerColor.WHITE - else: - nearest = otio.schema.MarkerColor.BLACK - if nearest is None: - if lightness < 0.13: - nearest = otio.schema.MarkerColor.BLACK - if lightness > 0.9: - nearest = otio.schema.MarkerColor.WHITE - if nearest is None: - nearest = _otio_color_from_hue(hue) - if nearest == otio.schema.MarkerColor.RED and lightness > 0.53: - nearest = otio.schema.MarkerColor.PINK - if ( - nearest == otio.schema.MarkerColor.MAGENTA - and hue < 0.89 - and lightness < 0.42 - ): - # some darker magentas look more like purple - nearest = otio.schema.MarkerColor.PURPLE - - # default to red color - return nearest or otio.schema.MarkerColor.RED - - -def _find_timecode_mobs(item): - mobs = [item.mob] - - for c in item.walk(): - if isinstance(c, aaf2.components.SourceClip): - mob = c.mob - if mob: - mobs.append(mob) - else: - continue - else: - # This could be 'EssenceGroup', 'Pulldown' or other segment - # subclasses - # For example: - # An EssenceGroup is a Segment that has one or more - # alternate choices, each of which represent different variations - # of one actual piece of content. - # According to the AAF Object Specification and Edit Protocol - # documents: - # "Typically the different representations vary in essence format, - # compression, or frame size. The application is responsible for - # choosing the appropriate implementation of the essence." - # It also says they should all have the same length, but - # there might be nested Sequences inside which we're not attempting - # to handle here (yet). We'll need a concrete example to ensure - # we're doing the right thing. - # TODO: Is the Timecode for an EssenceGroup correct? - # TODO: Try CountChoices() and ChoiceAt(i) - # For now, lets just skip it. - continue - - return mobs - - -def timecode_values_are_same(timecodes): - """ - A SourceClip can have multiple timecode objects (for example an auxTC24 - value that got added via the Avid Bin column). As long as they have the - same start and length values, they can be treated as being the same. - """ - if len(timecodes) == 1: - return True - - start_set = set() - length_set = set() - - for timecode in timecodes: - start_set.add(timecode.getvalue('Start')) - length_set.add(timecode.getvalue('Length')) - - # If all timecode objects are having same start and length we can consider - # them equivalent. - if len(start_set) == 1 and len(length_set) == 1: - return True - - return False - - -def _extract_timecode_info(mob): - """Given a mob with a single timecode slot, return the timecode and length - in that slot as a tuple - """ - timecodes = [slot.segment for slot in mob.slots - if isinstance(slot.segment, aaf2.components.Timecode)] - - # Only use timecode if we have just one or multiple ones with same - # start/length. - if timecode_values_are_same(timecodes): - timecode = timecodes[0] - timecode_start = timecode.getvalue('Start') - timecode_length = timecode.getvalue('Length') - - if timecode_start is None or timecode_length is None: - raise otio.exceptions.NotSupportedError( - "Unexpected timecode value(s) in mob named: `{}`." - " `Start`: {}, `Length`: {}".format(mob.name, - timecode_start, - timecode_length) - ) - - return timecode_start, timecode_length - elif len(timecodes) > 1: - raise otio.exceptions.NotSupportedError( - "Error: mob has more than one timecode slot with different values." - " This is currently not supported by the AAF adapter. Found:" - " {} slots, mob name is: '{}'".format(len(timecodes), mob.name) - ) - else: - return None - - -def _add_child(parent, child, source): - if child is None: - if debug: - print(f"Adding null child? {source}") - elif isinstance(child, otio.schema.Marker): - parent.markers.append(child) - else: - parent.append(child) - - -def _transcribe(item, parents, edit_rate, indent=0): - result = None - metadata = {} - - # First lets grab some standard properties that are present on - # many types of AAF objects... - metadata["Name"] = _get_name(item) - metadata["ClassName"] = _get_class_name(item) - - # Some AAF objects (like TimelineMobSlot) have an edit rate - # which should be used for all of the object's children. - # We will pass it on to any recursive calls to _transcribe() - if hasattr(item, "edit_rate"): - edit_rate = float(item.edit_rate) - - if isinstance(item, aaf2.components.Component): - metadata["Length"] = item.length - - if isinstance(item, aaf2.core.AAFObject): - for prop in item.properties(): - if hasattr(prop, 'name') and hasattr(prop, 'value'): - key = str(prop.name) - value = prop.value - metadata[key] = _transcribe_property(value, owner=item) - - # Now we will use the item's class to determine which OTIO type - # to transcribe into. Note that the order of this if/elif/... chain - # is important, because the class hierarchy of AAF objects is more - # complex than OTIO. - - if isinstance(item, aaf2.content.ContentStorage): - msg = f"Creating SerializableCollection for {_encoded_name(item)}" - _transcribe_log(msg, indent) - result = otio.schema.SerializableCollection() - - for mob in item.compositionmobs(): - _transcribe_log("compositionmob traversal", indent) - child = _transcribe(mob, parents + [item], edit_rate, indent + 2) - _add_child(result, child, mob) - - elif isinstance(item, aaf2.mobs.Mob): - _transcribe_log(f"Creating Timeline for {_encoded_name(item)}", indent) - result = otio.schema.Timeline() - - for slot in item.slots: - track = _transcribe(slot, parents + [item], edit_rate, indent + 2) - _add_child(result.tracks, track, slot) - - # Use a heuristic to find the starting timecode from - # this track and use it for the Timeline's global_start_time - start_time = _find_timecode_track_start(track) - if start_time: - result.global_start_time = start_time - - elif isinstance(item, aaf2.components.SourceClip): - clipUsage = None - if item.mob is not None: - clipUsage = item.mob.usage - - if clipUsage: - itemMsg = "Creating SourceClip for {} ({})".format( - _encoded_name(item), clipUsage - ) - else: - itemMsg = f"Creating SourceClip for {_encoded_name(item)}" - - _transcribe_log(itemMsg, indent) - result = otio.schema.Clip() - - # store source mob usage to allow OTIO pipelines to adapt downstream - # example: pipeline code adjusting source_range and name for subclips only - metadata["SourceMobUsage"] = clipUsage or "" - - # Evidently the last mob is the one with the timecode - mobs = _find_timecode_mobs(item) - - # Get the Timecode start and length values - last_mob = mobs[-1] if mobs else None - timecode_info = _extract_timecode_info(last_mob) if last_mob else None - - source_start = int(metadata.get("StartTime", "0")) - source_length = item.length - media_start = source_start - media_length = item.length - - if timecode_info: - media_start, media_length = timecode_info - source_start += media_start - - # The goal here is to find a source range. Actual editorial opinions are - # found on SourceClips in the CompositionMobs. To figure out whether this - # clip is directly in the CompositionMob, we detect if our parent mobs - # are only CompositionMobs. If they were anything else - a MasterMob, a - # SourceMob, we would know that this is in some indirect relationship. - parent_mobs = filter(lambda parent: isinstance(parent, aaf2.mobs.Mob), parents) - is_directly_in_composition = all( - isinstance(mob, aaf2.mobs.CompositionMob) - for mob in parent_mobs - ) - if is_directly_in_composition: - result.source_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(source_start, edit_rate), - otio.opentime.RationalTime(source_length, edit_rate) - ) - - # The goal here is to find an available range. Media ranges are stored - # in the related MasterMob, and there should only be one - hence the name - # "Master" mob. Somewhere down our chain (either a child or our parents) - # is a MasterMob. - # There are some special cases where the masterMob could be: - # 1) For SourceClips in the CompositionMob, the mob the SourceClip is - # referencing can be our MasterMob. - # 2) If the source clip is referencing another CompositionMob, - # drill down to see if the composition holds the MasterMob - # 3) For everything else, it is a previously encountered parent. Find the - # MasterMob in our chain, and then extract the information from that. - - child_mastermob, composition_user_metadata = \ - _find_mastermob_for_sourceclip(item) - - if composition_user_metadata: - metadata['UserComments'] = composition_user_metadata - - parent_mastermobs = [ - parent for parent in parents - if isinstance(parent, aaf2.mobs.MasterMob) - ] - parent_mastermob = parent_mastermobs[0] if len(parent_mastermobs) > 1 else None - - if child_mastermob: - _transcribe_log("[found child_mastermob]", indent) - elif parent_mastermob: - _transcribe_log("[found parent_mastermob]", indent) - else: - _transcribe_log("[found no mastermob]", indent) - - mastermob = child_mastermob or parent_mastermob or None - - if mastermob: - # Get target path - mastermob_child = _transcribe(mastermob, list(), edit_rate, indent) - - target_path = (mastermob_child.metadata.get("AAF", {}) - .get("UserComments", {}) - .get("UNC Path")) - if not target_path: - # retrieve locator form the MasterMob's Essence - for mobslot in mastermob.slots: - if isinstance(mobslot.segment, aaf2.components.SourceClip): - sourcemob = mobslot.segment.mob - locator = None - # different essences store locators in different places - if (isinstance(sourcemob.descriptor, - aaf2.essence.DigitalImageDescriptor) - and sourcemob.descriptor.locator): - locator = sourcemob.descriptor.locator[0] - elif "Locator" in sourcemob.descriptor: - locator = sourcemob.descriptor["Locator"].value[0] - - if locator: - target_path = locator["URLString"].value - - # if we have target path, create an ExternalReference, otherwise - # create an MissingReference. - if target_path: - if not target_path.startswith("file://"): - target_path = "file://" + target_path - target_path = target_path.replace("\\", "/") - media = otio.schema.ExternalReference(target_url=target_path) - else: - media = otio.schema.MissingReference() - - media.available_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(media_start, edit_rate), - otio.opentime.RationalTime(media_length, edit_rate) - ) - - # Copy the metadata from the master into the media_reference - clip_metadata = copy.deepcopy(mastermob_child.metadata.get("AAF", {})) - - # If the composition was holding UserComments and the current masterMob has - # no UserComments, use the ones from the CompositionMob. But if the - # masterMob has any, prefer them over the compositionMob, since the - # masterMob is the ultimate authority for a source clip. - if composition_user_metadata: - if "UserComments" not in clip_metadata: - clip_metadata['UserComments'] = composition_user_metadata - - media.metadata["AAF"] = clip_metadata - - result.media_reference = media - - elif isinstance(item, aaf2.components.Transition): - _transcribe_log("Creating Transition for {}".format( - _encoded_name(item)), indent) - result = otio.schema.Transition() - - # Does AAF support anything else? - result.transition_type = otio.schema.TransitionTypes.SMPTE_Dissolve - - # Extract value and time attributes of both ControlPoints used for - # creating AAF Transition objects - varying_value = None - for param in item.getvalue('OperationGroup').parameters: - if isinstance(param, aaf2.misc.VaryingValue): - varying_value = param - break - - if varying_value is not None: - for control_point in varying_value.getvalue('PointList'): - value = control_point.value - time = control_point.time - metadata.setdefault('PointList', []).append({'Value': value, - 'Time': time}) - - in_offset = int(metadata.get("CutPoint", "0")) - out_offset = item.length - in_offset - result.in_offset = otio.opentime.RationalTime(in_offset, edit_rate) - result.out_offset = otio.opentime.RationalTime(out_offset, edit_rate) - - elif isinstance(item, aaf2.components.Filler): - _transcribe_log(f"Creating Gap for {_encoded_name(item)}", indent) - result = otio.schema.Gap() - - length = item.length - result.source_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, edit_rate), - otio.opentime.RationalTime(length, edit_rate) - ) - - elif isinstance(item, aaf2.components.NestedScope): - msg = f"Creating Stack for NestedScope for {_encoded_name(item)}" - _transcribe_log(msg, indent) - # TODO: Is this the right class? - result = otio.schema.Stack() - - for slot in item.slots: - child = _transcribe(slot, parents + [item], edit_rate, indent + 2) - _add_child(result, child, slot) - - elif isinstance(item, aaf2.components.Sequence): - msg = f"Creating Track for Sequence for {_encoded_name(item)}" - _transcribe_log(msg, indent) - result = otio.schema.Track() - - # if parent is a sequence add SlotID / PhysicalTrackNumber to attach markers - parent = parents[-1] - if isinstance(parent, (aaf2.components.Sequence, aaf2.components.NestedScope)): - timeline_slots = [ - p for p in parents if isinstance(p, aaf2.mobslots.TimelineMobSlot) - ] - timeline_slot = timeline_slots[-1] - if timeline_slot: - metadata["PhysicalTrackNumber"] = list(parent.slots).index(item) + 1 - metadata["SlotID"] = int(timeline_slot["SlotID"].value) - - for component in item.components: - child = _transcribe(component, parents + [item], edit_rate, indent + 2) - _add_child(result, child, component) - - elif isinstance(item, aaf2.components.OperationGroup): - msg = f"Creating operationGroup for {_encoded_name(item)}" - _transcribe_log(msg, indent) - result = _transcribe_operation_group(item, parents, metadata, - edit_rate, indent + 2) - - elif isinstance(item, aaf2.mobslots.TimelineMobSlot): - msg = f"Creating Track for TimelineMobSlot for {_encoded_name(item)}" - _transcribe_log(msg, indent) - result = otio.schema.Track() - - child = _transcribe(item.segment, parents + [item], edit_rate, indent + 2) - - _add_child(result, child, item.segment) - - elif isinstance(item, aaf2.mobslots.MobSlot): - msg = f"Creating Track for MobSlot for {_encoded_name(item)}" - _transcribe_log(msg, indent) - result = otio.schema.Track() - - child = _transcribe(item.segment, parents + [item], edit_rate, indent + 2) - _add_child(result, child, item.segment) - - elif isinstance(item, aaf2.components.Timecode): - pass - - elif isinstance(item, aaf2.components.Pulldown): - pass - - elif isinstance(item, aaf2.components.EdgeCode): - pass - - elif isinstance(item, aaf2.components.ScopeReference): - msg = f"Creating Gap for ScopedReference for {_encoded_name(item)}" - _transcribe_log(msg, indent) - # TODO: is this like FILLER? - - result = otio.schema.Gap() - - length = item.length - result.source_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, edit_rate), - otio.opentime.RationalTime(length, edit_rate) - ) - - elif isinstance(item, aaf2.components.DescriptiveMarker): - event_mobs = [p for p in parents if isinstance(p, aaf2.mobslots.EventMobSlot)] - if event_mobs: - _transcribe_log( - f"Create marker for '{_encoded_name(item)}'", indent - ) - - result = otio.schema.Marker() - result.name = metadata["Comment"] - - event_mob = event_mobs[-1] - - metadata["AttachedSlotID"] = int(metadata["DescribedSlots"][0]) - metadata["AttachedPhysicalTrackNumber"] = int( - event_mob["PhysicalTrackNumber"].value - ) - - # determine marker color - color = _marker_color_from_string( - metadata.get("CommentMarkerAttributeList", {}).get("_ATN_CRM_COLOR") - ) - if color is None: - color = _convert_rgb_to_marker_color( - metadata["CommentMarkerColor"] - ) - result.color = color - - position = metadata["Position"] - - # Length can be None, but the property will always exist - # so get('Length', 1) wouldn't help. - length = metadata["Length"] - if length is None: - length = 1 - - result.marked_range = otio.opentime.TimeRange( - start_time=otio.opentime.from_frames(position, edit_rate), - duration=otio.opentime.from_frames(length, edit_rate), - ) - else: - _transcribe_log( - "Cannot attach marker item '{}'. " - "Missing event mob in hierarchy.".format( - _encoded_name(item) - ) - ) - - elif isinstance(item, aaf2.components.Selector): - msg = f"Transcribe selector for {_encoded_name(item)}" - _transcribe_log(msg, indent) - - selected = item.getvalue('Selected') - alternates = item.getvalue('Alternates', None) - - # First we check to see if the Selected component is either a Filler - # or ScopeReference object, meaning we have to use the alternate instead - if isinstance(selected, aaf2.components.Filler) or \ - isinstance(selected, aaf2.components.ScopeReference): - - # Safety check of the alternates list, then transcribe first object - - # there should only ever be one alternate in this situation - if alternates is None or len(alternates) != 1: - err = "AAF Selector parsing error: object has unexpected number of " \ - "alternates - {}".format(len(alternates)) - raise AAFAdapterError(err) - result = _transcribe(alternates[0], parents + [item], edit_rate, indent + 2) - - # Filler/ScopeReference means the clip is muted/not enabled - result.enabled = False - - # Muted tracks are handled in a slightly odd way so we need to do a - # check here and pass the param back up to the track object - # if isinstance(parents[-1], aaf2.mobslots.TimelineMobSlot): - # pass # TODO: Figure out mechanism for passing this up to parent - - else: - - # This is most likely a multi-cam clip - result = _transcribe(selected, parents + [item], edit_rate, indent + 2) - - # Perform a check here to make sure no potential Gap objects - # are slipping through the cracks - if isinstance(result, otio.schema.Gap): - err = f"AAF Selector parsing error: {type(item)}" - raise AAFAdapterError(err) - - # A Selector can have a set of alternates to handle multiple options for an - # editorial decision - we do a full parse on those obects too - if alternates is not None: - alternates = [ - _transcribe(alt, parents + [item], edit_rate, indent + 2) - for alt in alternates - ] - - metadata['alternates'] = alternates - - # @TODO: There are a bunch of other AAF object types that we will - # likely need to add support for. I'm leaving this code here to help - # future efforts to extract the useful information out of these. - - # elif isinstance(item, aaf.storage.File): - # self.extendChildItems([item.header]) - - # elif isinstance(item, aaf.storage.Header): - # self.extendChildItems([item.storage()]) - # self.extendChildItems([item.dictionary()]) - - # elif isinstance(item, aaf.dictionary.Dictionary): - # l = [] - # l.append(DummyItem(list(item.class_defs()), 'ClassDefs')) - # l.append(DummyItem(list(item.codec_defs()), 'CodecDefs')) - # l.append(DummyItem(list(item.container_defs()), 'ContainerDefs')) - # l.append(DummyItem(list(item.data_defs()), 'DataDefs')) - # l.append(DummyItem(list(item.interpolation_defs()), - # 'InterpolationDefs')) - # l.append(DummyItem(list(item.klvdata_defs()), 'KLVDataDefs')) - # l.append(DummyItem(list(item.operation_defs()), 'OperationDefs')) - # l.append(DummyItem(list(item.parameter_defs()), 'ParameterDefs')) - # l.append(DummyItem(list(item.plugin_defs()), 'PluginDefs')) - # l.append(DummyItem(list(item.taggedvalue_defs()), 'TaggedValueDefs')) - # l.append(DummyItem(list(item.type_defs()), 'TypeDefs')) - # self.extendChildItems(l) - # - # elif isinstance(item, pyaaf.AxSelector): - # self.extendChildItems(list(item.EnumAlternateSegments())) - # - # elif isinstance(item, pyaaf.AxScopeReference): - # #print item, item.GetRelativeScope(),item.GetRelativeSlot() - # pass - # - # elif isinstance(item, pyaaf.AxEssenceGroup): - # segments = [] - # - # for i in xrange(item.CountChoices()): - # choice = item.GetChoiceAt(i) - # segments.append(choice) - # self.extendChildItems(segments) - # - # elif isinstance(item, pyaaf.AxProperty): - # self.properties['Value'] = str(item.GetValue()) - - elif isinstance(item, collections.abc.Iterable): - msg = "Creating SerializableCollection for Iterable for {}".format( - _encoded_name(item)) - _transcribe_log(msg, indent) - - result = otio.schema.SerializableCollection() - for child in item: - result.append(_transcribe(child, parents + [item], edit_rate, indent + 2)) - else: - # For everything else, we just ignore it. - # To see what is being ignored, turn on the debug flag - if debug: - print(f"SKIPPING: {type(item)}: {item} -- {result}") - - # Did we get anything? If not, we're done - if result is None: - return None - - # Okay, now we've turned the AAF thing into an OTIO result - # There's a bit more we can do before we're ready to return the result. - - # If we didn't get a name yet, use the one we have in metadata - if not result.name: - result.name = metadata["Name"] - - # Attach the AAF metadata - if not result.metadata: - result.metadata.clear() - result.metadata["AAF"] = metadata - - # Double check that we got the length we expected - if isinstance(result, otio.core.Item): - length = metadata.get("Length") - if ( - length - and result.source_range is not None - and result.source_range.duration.value != length - ): - raise AAFAdapterError( - "Wrong duration? {} should be {} in {}".format( - result.source_range.duration.value, - length, - result - ) - ) - - # Did we find a Track? - if isinstance(result, otio.schema.Track): - # Try to figure out the kind of Track it is - if hasattr(item, 'media_kind'): - media_kind = str(item.media_kind) - result.metadata["AAF"]["MediaKind"] = media_kind - if media_kind == "Picture": - result.kind = otio.schema.TrackKind.Video - elif media_kind in ("SoundMasterTrack", "Sound"): - result.kind = otio.schema.TrackKind.Audio - else: - # Timecode, Edgecode, others? - result.kind = "" - - # Done! - return result - - -def _find_timecode_track_start(track): - # See if we can find a starting timecode in here... - aaf_metadata = track.metadata.get("AAF", {}) - - # Is this a Timecode track? - if aaf_metadata.get("MediaKind") not in {"Timecode", "LegacyTimecode"}: - return - - # Edit Protocol section 3.6 specifies PhysicalTrackNumber of 1 as the - # Primary timecode - try: - physical_track_number = aaf_metadata["PhysicalTrackNumber"] - except KeyError: - raise AAFAdapterError("Timecode missing 'PhysicalTrackNumber'") - - if physical_track_number != 1: - return - - try: - edit_rate = fractions.Fraction(aaf_metadata["EditRate"]) - start = aaf_metadata["Segment"]["Start"] - except KeyError as e: - raise AAFAdapterError( - f"Timecode missing '{e}'" - ) - - if edit_rate.denominator == 1: - rate = edit_rate.numerator - else: - rate = float(edit_rate) - - return otio.opentime.RationalTime( - value=int(start), - rate=rate, - ) - - -def _find_mastermob_for_sourceclip(aaf_sourceclip): - """ - For a given soure clip, find the related masterMob. - Returns a tuple of (MasterMob, compositionMetadata), where - MasterMob is an AAF MOB object and compositionMetadata a - dictionary, extracted from the AAF Tagged Values of UserComments - (i.e. user metadata) - """ - - # If the mobId of the sourceclip is a mastermob, just return that, we are done. - if isinstance(aaf_sourceclip.mob, aaf2.mobs.MasterMob): - return aaf_sourceclip.mob, None - - # There are cases where a composition mob is used as an indirection - # to the mastermob. In that case the SourceClip points to a - # CompositionMob instead of a MasterMob. Drill down into the CompositionMob - # to find the MasterMob related to this SourceClip - return _get_master_mob_from_source_composition(aaf_sourceclip.mob) - - -def _get_master_mob_from_source_composition(compositionMob): - """ - This code covers two special cases: - if the passed in source-clip-mob is a composition, drill down - and try to find the master mob in that composition. - - Also, there seems to be a workflow where metadata, specifically UserComments - are shared between SourceClips via a CompositionMob, in which case there are - no UserComments on the MasterMob (as we expect in the default case) - - So if we find UserComments on the Composition but not on the MasterMob, we - return that metadata, so it can be added to the clip (instead of the - master mob UserComments) - - """ - - # If not a composition, we can't discover anything - if not isinstance(compositionMob, aaf2.mobs.CompositionMob): - return None, None - - compositionMetadata = _get_composition_user_comments(compositionMob) - - # Iterate over the TimelineMobSlots and extract any source_clips we find. - source_clips = [] - for slot in compositionMob.slots: - if isinstance(slot, aaf2.mobslots.TimelineMobSlot): - if isinstance(slot.segment, aaf2.components.SourceClip): - source_clips.append(slot.segment) - - # No source clips, no master mob. But we still want to return - # the composition metadata. If there is another mastermob found 'upstream', - # but it does not have any UserComments metadata, we still want to use - # the CompositionMob's metadata. - if not source_clips: - return None, compositionMetadata - - # Only expect one source clip for this case. - # Are there cases where we can have more than one? - if len(source_clips) > 1: - print("Found more than one Source Clip ({}) for sourceClipComposition case. " - "This is unexpected".format(len(source_clips))) - - # We only look at the first source clip right now... - source_clip = source_clips[0] - - # Not referencing a master mob? Nothing to return - if not isinstance(source_clip.mob, aaf2.mobs.MasterMob): - return None, compositionMetadata - - # Found a master mob, return this and also compositionMetadata (if we found any) - return (source_clip.mob, compositionMetadata) - - -def _get_composition_user_comments(compositionMob): - compositionMetadata = {} - - if not isinstance(compositionMob, aaf2.mobs.CompositionMob): - return compositionMetadata - - compositionMobUserComments = list(compositionMob.get("UserComments", [])) - for prop in compositionMobUserComments: - key = str(prop.name) - value = prop.value - compositionMetadata[key] = _transcribe_property(value) - - return compositionMetadata - - -def _transcribe_linear_timewarp(item, parameters): - # this is a linear time warp - effect = otio.schema.LinearTimeWarp() - - offset_map = _get_parameter(item, 'PARAM_SPEED_OFFSET_MAP_U') - - # If we have a LinearInterp with just 2 control points, then - # we can compute the time_scalar. Note that the SpeedRatio is - # NOT correct in many AAFs - we aren't sure why, but luckily we - # can compute the correct value this way. - points = offset_map.get("PointList") - if len(points) > 2: - # This is something complicated... try the fancy version - return _transcribe_fancy_timewarp(item, parameters) - elif ( - len(points) == 2 - and float(points[0].time) == 0 - and float(points[0].value) == 0 - ): - # With just two points, we can compute the slope - effect.time_scalar = float(points[1].value) / float(points[1].time) - else: - # Fall back to the SpeedRatio if we didn't understand the points - ratio = parameters.get("SpeedRatio") - if ratio == str(item.length): - # If the SpeedRatio == the length, this is a freeze frame - effect.time_scalar = 0 - elif '/' in ratio: - numerator, denominator = map(float, ratio.split('/')) - # OTIO time_scalar is 1/x from AAF's SpeedRatio - effect.time_scalar = denominator / numerator - else: - effect.time_scalar = 1.0 / float(ratio) - - # Is this is a freeze frame? - if effect.time_scalar == 0: - # Note: we might end up here if any of the code paths above - # produced a 0 time_scalar. - # Use the FreezeFrame class instead of LinearTimeWarp - effect = otio.schema.FreezeFrame() - - return effect - - -def _transcribe_fancy_timewarp(item, parameters): - - # For now, this is an unsupported time effect... - effect = otio.schema.TimeEffect() - effect.effect_name = "" - effect.name = item.get("Name", "") - - return effect - - # TODO: Here is some sample code that pulls out the full - # details of a non-linear speed map. - - # speed_map = item.parameter['PARAM_SPEED_MAP_U'] - # offset_map = item.parameter['PARAM_SPEED_OFFSET_MAP_U'] - # Also? PARAM_OFFSET_MAP_U (without the word "SPEED" in it?) - # print(speed_map['PointList'].value) - # print(speed_map.count()) - # print(speed_map.interpolation_def().name) - # - # for p in speed_map.points(): - # print(" ", float(p.time), float(p.value), p.edit_hint) - # for prop in p.point_properties(): - # print(" ", prop.name, prop.value, float(prop.value)) - # - # print(offset_map.interpolation_def().name) - # for p in offset_map.points(): - # edit_hint = p.edit_hint - # time = p.time - # value = p.value - # - # pass - # # print " ", float(p.time), float(p.value) - # - # for i in range(100): - # float(offset_map.value_at("%i/100" % i)) - # - # # Test file PARAM_SPEED_MAP_U is AvidBezierInterpolator - # # currently no implement for value_at - # try: - # speed_map.value_at(.25) - # except NotImplementedError: - # pass - # else: - # raise - - -def _transcribe_operation_group(item, parents, metadata, edit_rate, indent): - result = otio.schema.Stack() - - operation = metadata.get("Operation", {}) - parameters = metadata.get("Parameters", {}) - result.name = operation.get("Name") - - # Trust the length that is specified in the AAF - length = metadata.get("Length") - result.source_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, edit_rate), - otio.opentime.RationalTime(length, edit_rate) - ) - - # Look for speed effects... - effect = None - if operation.get("IsTimeWarp"): - if operation.get("Name") == "Motion Control": - - offset_map = _get_parameter(item, 'PARAM_SPEED_OFFSET_MAP_U') - # TODO: We should also check the PARAM_OFFSET_MAP_U which has - # an interpolation_def().name as well. - if offset_map is not None: - interpolation = offset_map.interpolation.name - else: - interpolation = None - - if interpolation == "LinearInterp": - effect = _transcribe_linear_timewarp(item, parameters) - else: - effect = _transcribe_fancy_timewarp(item, parameters) - - else: - # Unsupported time effect - effect = otio.schema.TimeEffect() - effect.effect_name = "" - effect.name = operation.get("Name") - else: - # Unsupported effect - effect = otio.schema.Effect() - effect.effect_name = "" - effect.name = operation.get("Name") - - if effect is not None: - result.effects.append(effect) - - effect.metadata.clear() - effect.metadata.update({ - "AAF": { - "Operation": operation, - "Parameters": parameters - } - }) - - for segment in item.getvalue("InputSegments"): - child = _transcribe(segment, parents + [item], edit_rate, indent) - if child: - _add_child(result, child, segment) - - return result - - -def _fix_transitions(thing): - if isinstance(thing, otio.schema.Timeline): - _fix_transitions(thing.tracks) - elif ( - isinstance(thing, otio.core.Composition) - or isinstance(thing, otio.schema.SerializableCollection) - ): - if isinstance(thing, otio.schema.Track): - for c, child in enumerate(thing): - - # Don't touch the Transitions themselves, - # only the Clips & Gaps next to them. - if not isinstance(child, otio.core.Item): - continue - - # Was the item before us a Transition? - if c > 0 and isinstance( - thing[c - 1], - otio.schema.Transition - ): - pre_trans = thing[c - 1] - - if child.source_range is None: - child.source_range = child.trimmed_range() - csr = child.source_range - child.source_range = otio.opentime.TimeRange( - start_time=csr.start_time + pre_trans.in_offset, - duration=csr.duration - pre_trans.in_offset - ) - - # Is the item after us a Transition? - if c < len(thing) - 1 and isinstance( - thing[c + 1], - otio.schema.Transition - ): - post_trans = thing[c + 1] - - if child.source_range is None: - child.source_range = child.trimmed_range() - csr = child.source_range - child.source_range = otio.opentime.TimeRange( - start_time=csr.start_time, - duration=csr.duration - post_trans.out_offset - ) - - for child in thing: - _fix_transitions(child) - - -def _attach_markers(collection): - """Search for markers on tracks and attach them to their corresponding item. - - Marked ranges will also be transformed into the new parent space. - - """ - # iterate all timeline objects - for timeline in collection.find_children(descended_from_type=otio.schema.Timeline): - tracks_map = {} - - # build track mapping - for track in timeline.find_children(descended_from_type=otio.schema.Track): - metadata = track.metadata.get("AAF", {}) - slot_id = metadata.get("SlotID") - track_number = metadata.get("PhysicalTrackNumber") - if slot_id is None or track_number is None: - continue - - tracks_map[(int(slot_id), int(track_number))] = track - - # iterate all tracks for their markers and attach them to the matching item - for current_track in timeline.find_children( - descended_from_type=otio.schema.Track): - for marker in list(current_track.markers): - metadata = marker.metadata.get("AAF", {}) - slot_id = metadata.get("AttachedSlotID") - track_number = metadata.get("AttachedPhysicalTrackNumber") - target_track = tracks_map.get((slot_id, track_number)) - if target_track is None: - raise AAFAdapterError( - "Marker '{}' cannot be attached to an item. SlotID: '{}', " - "PhysicalTrackNumber: '{}'".format( - marker.name, slot_id, track_number - ) - ) - - # remove marker from current parent track - current_track.markers.remove(marker) - - # determine new item to attach the marker to - try: - target_item = target_track.child_at_time( - marker.marked_range.start_time - ) - - if target_item is None or not hasattr(target_item, 'markers'): - # Item found cannot have markers, for example Transition. - # See also `marker-over-transition.aaf` in test data. - # - # Leave markers on the track for now. - _transcribe_log( - 'Skip target_item `{}` cannot have markers'.format( - target_item, - ), - ) - target_item = target_track - - # transform marked range into new item range - marked_start_local = current_track.transformed_time( - marker.marked_range.start_time, target_item - ) - - marker.marked_range = otio.opentime.TimeRange( - start_time=marked_start_local, - duration=marker.marked_range.duration - ) - - except otio.exceptions.CannotComputeAvailableRangeError as e: - # For audio media AAF file (marker-over-audio.aaf), - # this exception would be triggered in: - # `target_item = target_track.child_at_time()` with error - # message: - # "No available_range set on media reference on clip". - # - # Leave markers on the track for now. - _transcribe_log( - 'Cannot compute availableRange from {} to {}: {}'.format( - marker, - target_track, - e, - ), - ) - target_item = target_track - - # attach marker to target item - target_item.markers.append(marker) - - _transcribe_log( - "Marker: '{}' (time: {}), attached to item: '{}'".format( - marker.name, - marker.marked_range.start_time.value, - target_item.name, - ) - ) - - return collection - - -def _simplify(thing): - # If the passed in is an empty dictionary or None, nothing to do. - # Without this check it would still return thing, but this way we avoid - # unnecessary if-chain compares. - if not thing: - return thing - - if isinstance(thing, otio.schema.SerializableCollection): - if len(thing) == 1: - return _simplify(thing[0]) - else: - for c, child in enumerate(thing): - thing[c] = _simplify(child) - return thing - - elif isinstance(thing, otio.schema.Timeline): - result = _simplify(thing.tracks) - - # Only replace the Timeline's stack if the simplified result - # was also a Stack. Otherwise leave it (the contents will have - # been simplified in place). - if isinstance(result, otio.schema.Stack): - thing.tracks = result - - return thing - - elif isinstance(thing, otio.core.Composition): - # simplify our children - for c, child in enumerate(thing): - thing[c] = _simplify(child) - - # remove empty children of Stacks - if isinstance(thing, otio.schema.Stack): - for c in reversed(range(len(thing))): - child = thing[c] - if not _contains_something_valuable(child): - # TODO: We're discarding metadata... should we retain it? - del thing[c] - - # Look for Stacks within Stacks - c = len(thing) - 1 - while c >= 0: - child = thing[c] - # Is my child a Stack also? (with no effects) - if ( - not _has_effects(child) - and - ( - isinstance(child, otio.schema.Stack) - or ( - isinstance(child, otio.schema.Track) - and len(child) == 1 - and isinstance(child[0], otio.schema.Stack) - and child[0] - and isinstance(child[0][0], otio.schema.Track) - ) - ) - ): - if isinstance(child, otio.schema.Track): - child = child[0] - - # Pull the child's children into the parent - num = len(child) - children_of_child = child[:] - # clear out the ownership of 'child' - del child[:] - thing[c:c + 1] = children_of_child - - # TODO: We may be discarding metadata, should we merge it? - # TODO: Do we need to offset the markers in time? - thing.markers.extend(child.markers) - # Note: we don't merge effects, because we already made - # sure the child had no effects in the if statement above. - - # Preserve the enabled/disabled state as we merge these two. - thing.enabled = thing.enabled and child.enabled - - c = c + num - c = c - 1 - - # skip redundant containers - if _is_redundant_container(thing): - # TODO: We may be discarding metadata here, should we merge it? - result = thing[0].deepcopy() - - # As we are reducing the complexity of the object structure through - # this process, we need to make sure that any/all enabled statuses - # are being respected and applied in an appropriate way - if not thing.enabled: - result.enabled = False - - # TODO: Do we need to offset the markers in time? - result.markers.extend(thing.markers) - - # TODO: The order of the effects is probably important... - # should they be added to the end or the front? - # Intuitively it seems like the child's effects should come before - # the parent's effects. This will need to be solidified when we - # add more effects support. - result.effects.extend(thing.effects) - # Keep the parent's length, if it has one - if thing.source_range: - # make sure it has a source_range first - if not result.source_range: - try: - result.source_range = result.trimmed_range() - except otio.exceptions.CannotComputeAvailableRangeError: - result.source_range = copy.copy(thing.source_range) - # modify the duration, but leave the start_time as is - result.source_range = otio.opentime.TimeRange( - result.source_range.start_time, - thing.source_range.duration - ) - return result - - # if thing is the top level stack, all of its children must be in tracks - if isinstance(thing, otio.schema.Stack) and thing.parent() is None: - children_needing_tracks = [] - for child in thing: - if isinstance(child, otio.schema.Track): - continue - children_needing_tracks.append(child) - - for child in children_needing_tracks: - orig_index = thing.index(child) - del thing[orig_index] - new_track = otio.schema.Track() - new_track.append(child) - thing.insert(orig_index, new_track) - - return thing - - -def _has_effects(thing): - if isinstance(thing, otio.core.Item): - if len(thing.effects) > 0: - return True - - -def _is_redundant_container(thing): - - is_composition = isinstance(thing, otio.core.Composition) - if not is_composition: - return False - - has_one_child = len(thing) == 1 - if not has_one_child: - return False - - am_top_level_track = ( - type(thing) is otio.schema.Track - and type(thing.parent()) is otio.schema.Stack - and thing.parent().parent() is None - ) - - return ( - not am_top_level_track - # am a top level track but my only child is a track - or ( - type(thing) is otio.schema.Track - and type(thing[0]) is otio.schema.Track - ) - ) - - -def _contains_something_valuable(thing): - if isinstance(thing, otio.core.Item): - if len(thing.effects) > 0 or len(thing.markers) > 0: - return True - - if isinstance(thing, otio.core.Composition): - - if len(thing) == 0: - # NOT valuable because it is empty - return False - - for child in thing: - if _contains_something_valuable(child): - # valuable because this child is valuable - return True - - # none of the children were valuable, so thing is NOT valuable - return False - - if isinstance(thing, otio.schema.Gap): - # TODO: Are there other valuable things we should look for on a Gap? - return False - - # anything else is presumed to be valuable - return True - - -def _get_mobs_for_transcription(storage): - """ - When we describe our AAF into OTIO space, we apply the following heuristic: - - 1) First look for top level mobs and if found use that to transcribe. - - 2) If we don't have top level mobs, look for composition mobs and use them to - transcribe. - - 3) Lastly if we don't have either, try to use master mobs to transcribe. - - If we don't find any Mobs, just tell the user and do transcrption on an empty - list (to generate some 'empty-level' OTIO structure) - - This heuristic is based on 'real-world' examples. There may still be some - corner cases / open questions (like could there be metadata on both - a composition mob and master mob? And if so, who would 'win'?) - - In any way, this heuristic satisfies the current set of AAFs we are using - in our test-environment. - - """ - - top_level_mobs = list(storage.toplevel()) - - if len(top_level_mobs) > 0: - _transcribe_log("---\nTranscribing top level mobs\n---") - return top_level_mobs - - composition_mobs = list(storage.compositionmobs()) - if len(composition_mobs) > 0: - _transcribe_log("---\nTranscribing composition mobs\n---") - return composition_mobs - - master_mobs = list(storage.mastermobs()) - if len(master_mobs) > 0: - _transcribe_log("---\nTranscribing master mobs\n---") - return master_mobs - - _transcribe_log("---\nNo mobs found to transcribe\n---") - - return [] - - -def read_from_file( - filepath, - simplify=True, - transcribe_log=False, - attach_markers=True, - bake_keyframed_properties=False -): - """Reads AAF content from `filepath` and outputs an OTIO timeline object. - - Args: - filepath (str): AAF filepath - simplify (bool, optional): simplify timeline structure by stripping empty items - transcribe_log (bool, optional): log activity as items are getting transcribed - attach_markers (bool, optional): attaches markers to their appropriate items - like clip, gap. etc on the track - bake_keyframed_properties (bool, optional): bakes animated property values - for each frame in a source clip - Returns: - otio.schema.Timeline - - """ - # 'activate' transcribe logging if adapter argument is provided. - # Note that a global 'switch' is used in order to avoid - # passing another argument around in the _transcribe() method. - # - global _TRANSCRIBE_DEBUG, _BAKE_KEYFRAMED_PROPERTIES_VALUES - _TRANSCRIBE_DEBUG = transcribe_log - _BAKE_KEYFRAMED_PROPERTIES_VALUES = bake_keyframed_properties - - with aaf2.open(filepath) as aaf_file: - # Note: We're skipping: aaf_file.header - # Is there something valuable in there? - - storage = aaf_file.content - mobs_to_transcribe = _get_mobs_for_transcription(storage) - - result = _transcribe(mobs_to_transcribe, parents=list(), edit_rate=None) - - # Attach marker to the appropriate clip, gap etc. - if attach_markers: - result = _attach_markers(result) - - # AAF is typically more deeply nested than OTIO. - # Let's try to simplify the structure by collapsing or removing - # unnecessary stuff. - if simplify: - result = _simplify(result) - - # OTIO represents transitions a bit different than AAF, so - # we need to iterate over them and modify the items on either side. - # Note that we do this *after* simplifying, since the structure - # may change during simplification. - _fix_transitions(result) - - # Reset transcribe_log debugging - _TRANSCRIBE_DEBUG = False - - return result - - -def write_to_file(input_otio, filepath, **kwargs): - - with aaf2.open(filepath, "w") as f: - - timeline = aaf_writer._stackify_nested_groups(input_otio) - - aaf_writer.validate_metadata(timeline) - - otio2aaf = aaf_writer.AAFFileTranscriber(timeline, f, **kwargs) - - if not isinstance(timeline, otio.schema.Timeline): - raise otio.exceptions.NotSupportedError( - "Currently only supporting top level Timeline") - - for otio_track in timeline.tracks: - # Ensure track must have clip to get the edit_rate - if len(otio_track) == 0: - continue - - transcriber = otio2aaf.track_transcriber(otio_track) - - for otio_child in otio_track: - result = transcriber.transcribe(otio_child) - if result: - transcriber.sequence.components.append(result) diff --git a/contrib/opentimelineio_contrib/adapters/ale.py b/contrib/opentimelineio_contrib/adapters/ale.py deleted file mode 100644 index 972c989d4..000000000 --- a/contrib/opentimelineio_contrib/adapters/ale.py +++ /dev/null @@ -1,354 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -__doc__ = """OpenTimelineIO Avid Log Exchange (ALE) Adapter""" - - -import re -import opentimelineio as otio - -DEFAULT_VIDEO_FORMAT = '1080' -ASC_SOP_REGEX = re.compile(r'(-*\d+\.\d+)') - - -def AVID_VIDEO_FORMAT_FROM_WIDTH_HEIGHT(width, height): - """Utility function to map a width and height to an Avid Project Format""" - - format_map = { - '1080': "1080", - '720': "720", - '576': "PAL", - '486': "NTSC", - } - mapped = format_map.get(str(height), "CUSTOM") - # check for the 2K DCI 1080 format - if mapped == '1080' and width > 1920: - mapped = "CUSTOM" - return mapped - - -class ALEParseError(otio.exceptions.OTIOError): - pass - - -def _parse_data_line(line, columns, fps, ale_name_column_key='Name'): - row = line.split("\t") - - if len(row) < len(columns): - # Fill in blanks for any missing fields in this row - row.extend([""] * (len(columns) - len(row))) - - if len(row) > len(columns): - raise ALEParseError("Too many values on row: " + line) - - try: - - # Gather all the columns into a dictionary - # For expected columns, like Name, Start, etc. we will pop (remove) - # those from metadata, leaving the rest alone. - metadata = dict(zip(columns, row)) - - clip = otio.schema.Clip() - clip.name = metadata.get(ale_name_column_key, '') - - # When looking for Start, Duration and End, they might be missing - # or blank. Treat None and "" as the same via: get(k,"")!="" - # To have a valid source range, you need Start and either Duration - # or End. If all three are provided, we check to make sure they match. - if metadata.get("Start", "") != "": - value = metadata.pop("Start") - try: - start = otio.opentime.from_timecode(value, fps) - except (ValueError, TypeError): - raise ALEParseError(f"Invalid Start timecode: {value}") - duration = None - end = None - if metadata.get("Duration", "") != "": - value = metadata.pop("Duration") - try: - duration = otio.opentime.from_timecode(value, fps) - except (ValueError, TypeError): - raise ALEParseError("Invalid Duration timecode: {}".format( - value - )) - if metadata.get("End", "") != "": - value = metadata.pop("End") - try: - end = otio.opentime.from_timecode(value, fps) - except (ValueError, TypeError): - raise ALEParseError("Invalid End timecode: {}".format( - value - )) - if duration is None: - duration = end - start - if end is None: - end = start + duration - if end != start + duration: - raise ALEParseError( - "Inconsistent Start, End, Duration: " + line - ) - clip.source_range = otio.opentime.TimeRange( - start, - duration - ) - - if metadata.get("Source File"): - source = metadata.pop("Source File") - clip.media_reference = otio.schema.ExternalReference( - target_url=source - ) - - # If available, collect cdl values in the same way we do for CMX EDL - cdl = {} - - if metadata.get('CDL'): - cdl = _cdl_values_from_metadata(metadata['CDL']) - if cdl: - del metadata['CDL'] - - # If we have more specific metadata, let's use them - if metadata.get('ASC_SOP'): - cdl = _cdl_values_from_metadata(metadata['ASC_SOP']) - - if cdl: - del metadata['ASC_SOP'] - - if metadata.get('ASC_SAT'): - try: - asc_sat_value = float(metadata['ASC_SAT']) - cdl.update(asc_sat=asc_sat_value) - del metadata['ASC_SAT'] - except ValueError: - pass - - if cdl: - clip.metadata['cdl'] = cdl - - # We've pulled out the key/value pairs that we treat specially. - # Put the remaining key/values into clip.metadata["ALE"] - clip.metadata["ALE"] = metadata - - return clip - except Exception as ex: - raise ALEParseError("Error parsing line: {}\n{}".format( - line, repr(ex) - )) - - -def _cdl_values_from_metadata(asc_sop_string): - - if not isinstance(asc_sop_string, str): - return {} - - asc_sop_values = ASC_SOP_REGEX.findall(asc_sop_string) - - cdl_data = {} - - if len(asc_sop_values) >= 9: - - cdl_data.update( - asc_sop={ - 'slope': [float(v) for v in asc_sop_values[:3]], - 'offset': [float(v) for v in asc_sop_values[3:6]], - 'power': [float(v) for v in asc_sop_values[6:9]] - }) - - if len(asc_sop_values) == 10: - cdl_data.update(asc_sat=float(asc_sop_values[9])) - - return cdl_data - - -def _video_format_from_metadata(clips): - # Look for clips with Image Size metadata set - max_height = 0 - max_width = 0 - for clip in clips: - fields = clip.metadata.get("ALE", {}) - res = fields.get("Image Size", "") - m = re.search(r'([0-9]{1,})\s*[xX]\s*([0-9]{1,})', res) - if m and len(m.groups()) >= 2: - width = int(m.group(1)) - height = int(m.group(2)) - if height > max_height: - max_height = height - if width > max_width: - max_width = width - - # We don't have any image size information, use the defaut - if max_height == 0: - return DEFAULT_VIDEO_FORMAT - else: - return AVID_VIDEO_FORMAT_FROM_WIDTH_HEIGHT(max_width, max_height) - - -def read_from_string(input_str, fps=24, **adapter_argument_map): - ale_name_column_key = adapter_argument_map.get('ale_name_column_key', 'Name') - - collection = otio.schema.SerializableCollection() - header = {} - columns = [] - - def nextline(lines): - return lines.pop(0) - - lines = input_str.splitlines() - while len(lines): - line = nextline(lines) - - # skip blank lines - if line.strip() == "": - continue - - if line.strip() == "Heading": - while len(lines): - line = nextline(lines) - - if line.strip() == "": - break - - if "\t" not in line: - raise ALEParseError("Invalid Heading line: " + line) - - segments = line.split("\t") - while len(segments) >= 2: - key, val = segments.pop(0), segments.pop(0) - header[key] = val - if len(segments) != 0: - raise ALEParseError("Invalid Heading line: " + line) - - if "FPS" in header: - fps = float(header["FPS"]) - - if line.strip() == "Column": - if len(lines) == 0: - raise ALEParseError("Unexpected end of file after: " + line) - - line = nextline(lines) - columns = line.split("\t") - - if line.strip() == "Data": - while len(lines): - line = nextline(lines) - - if line.strip() == "": - continue - - clip = _parse_data_line(line, - columns, - fps, - ale_name_column_key=ale_name_column_key) - - collection.append(clip) - - collection.metadata["ALE"] = { - "header": header, - "columns": columns - } - - return collection - - -def write_to_string(input_otio, columns=None, fps=None, video_format=None): - - # Get all the clips we're going to export - clips = list(input_otio.find_clips()) - - result = "" - - result += "Heading\n" - header = dict(input_otio.metadata.get("ALE", {}).get("header", {})) - - # Force this, since we've hard coded tab delimiters - header["FIELD_DELIM"] = "TABS" - - if fps is None: - # If we weren't given a FPS, is there one in the header metadata? - if "FPS" in header: - fps = float(header["FPS"]) - else: - # Would it be better to infer this by inspecting the input clips? - fps = 24 - header["FPS"] = str(fps) - else: - # Put the value we were given into the header - header["FPS"] = str(fps) - - # Check if we have been supplied a VIDEO_FORMAT, if not lets set one - if video_format is None: - # Do we already have it in the header? If so, lets leave that as is - if "VIDEO_FORMAT" not in header: - header["VIDEO_FORMAT"] = _video_format_from_metadata(clips) - else: - header["VIDEO_FORMAT"] = str(video_format) - - headers = list(header.items()) - headers.sort() # make the output predictable - for key, val in headers: - result += f"{key}\t{val}\n" - - # If the caller passed in a list of columns, use that, otherwise - # we need to discover the columns that should be output. - if columns is None: - # Is there a hint about the columns we want (and column ordering) - # at the top level? - columns = input_otio.metadata.get("ALE", {}).get("columns", []) - - # Scan all the clips for any extra columns - for clip in clips: - fields = clip.metadata.get("ALE", {}) - for key in fields.keys(): - if key not in columns: - columns.append(key) - - # Always output these - for c in ["Duration", "End", "Start", "Name", "Source File"]: - if c not in columns: - columns.insert(0, c) - - result += "\nColumn\n{}\n".format("\t".join(columns)) - - result += "\nData\n" - - def val_for_column(column, clip): - if column == "Name": - return clip.name - elif column == "Source File": - if ( - clip.media_reference and - hasattr(clip.media_reference, 'target_url') and - clip.media_reference.target_url - ): - return clip.media_reference.target_url - else: - return "" - elif column == "Start": - if not clip.source_range: - return "" - return otio.opentime.to_timecode( - clip.source_range.start_time, fps - ) - elif column == "Duration": - if not clip.source_range: - return "" - return otio.opentime.to_timecode( - clip.source_range.duration, fps - ) - elif column == "End": - if not clip.source_range: - return "" - return otio.opentime.to_timecode( - clip.source_range.end_time_exclusive(), fps - ) - else: - return clip.metadata.get("ALE", {}).get(column) - - for clip in clips: - row = [] - for column in columns: - val = str(val_for_column(column, clip) or "") - val.replace("\t", " ") # don't allow tabs inside a value - row.append(val) - result += "\t".join(row) + "\n" - - return result diff --git a/contrib/opentimelineio_contrib/adapters/burnins.py b/contrib/opentimelineio_contrib/adapters/burnins.py deleted file mode 100644 index 56212753e..000000000 --- a/contrib/opentimelineio_contrib/adapters/burnins.py +++ /dev/null @@ -1,73 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""FFMPEG Burnins Adapter""" -import os -import sys - - -def build_burnins(input_otio): - """ - Generates the burnin objects for each clip within the otio container - - :param input_otio: OTIO container - :rtype: [ffmpeg_burnins.Burnins(), ...] - """ - - if os.path.dirname(__file__) not in sys.path: - sys.path.append(os.path.dirname(__file__)) - - import ffmpeg_burnins - key = 'burnins' - - burnins = [] - for clip in input_otio.find_clips(): - - # per clip burnin data - burnin_data = clip.media_reference.metadata.get(key) - if not burnin_data: - # otherwise default to global burnin - burnin_data = input_otio.metadata.get(key) - - if not burnin_data: - continue - - media = clip.media_reference.target_url - if media.startswith('file://'): - media = media[7:] - streams = burnin_data.get('streams') - burnins.append(ffmpeg_burnins.Burnins(media, - streams=streams)) - burnins[-1].otio_media = media - burnins[-1].otio_overwrite = burnin_data.get('overwrite') - burnins[-1].otio_args = burnin_data.get('args') - - for burnin in burnin_data.get('burnins', []): - align = burnin.pop('align') - function = burnin.pop('function') - if function == 'text': - text = burnin.pop('text') - options = ffmpeg_burnins.TextOptions() - options.update(burnin) - burnins[-1].add_text(text, align, options=options) - elif function == 'frame_number': - options = ffmpeg_burnins.FrameNumberOptions() - options.update(burnin) - burnins[-1].add_frame_numbers(align, options=options) - elif function == 'timecode': - options = ffmpeg_burnins.TimeCodeOptions() - options.update(burnin) - burnins[-1].add_timecode(align, options=options) - else: - raise RuntimeError("Unknown function '%s'" % function) - - return burnins - - -def write_to_file(input_otio, filepath): - """required OTIO function hook""" - - for burnin in build_burnins(input_otio): - burnin.render(os.path.join(filepath, burnin.otio_media), - args=burnin.otio_args, - overwrite=burnin.otio_overwrite) diff --git a/contrib/opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json b/contrib/opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json deleted file mode 100644 index 31fc45c9e..000000000 --- a/contrib/opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "OTIO_SCHEMA" : "PluginManifest.1", - "adapters": [ - { - "OTIO_SCHEMA": "Adapter.1", - "name": "fcpx_xml", - "filepath": "fcpx_xml.py", - "suffixes": ["fcpxml"] - }, - { - "OTIO_SCHEMA": "Adapter.1", - "name": "hls_playlist", - "filepath": "hls_playlist.py", - "suffixes": ["m3u8"] - }, - { - "OTIO_SCHEMA" : "Adapter.1", - "name" : "maya_sequencer", - "filepath" : "maya_sequencer.py", - "suffixes" : ["ma","mb"] - }, - { - "OTIO_SCHEMA" : "Adapter.1", - "name" : "ale", - "filepath" : "ale.py", - "suffixes" : ["ale"] - }, - { - "OTIO_SCHEMA" : "Adapter.1", - "name" : "burnins", - "filepath" : "burnins.py", - "suffixes" : [] - }, - { - "OTIO_SCHEMA" : "Adapter.1", - "name" : "AAF", - "filepath" : "advanced_authoring_format.py", - "suffixes" : ["aaf"] - }, - { - "OTIO_SCHEMA": "Adapter.1", - "name": "xges", - "filepath": "xges.py", - "suffixes": ["xges"] - } - ], - "schemadefs" : [ - { - "OTIO_SCHEMA" : "SchemaDef.1", - "name" : "xges", - "filepath" : "xges.py" - } - ] -} diff --git a/contrib/opentimelineio_contrib/adapters/extern_maya_sequencer.py b/contrib/opentimelineio_contrib/adapters/extern_maya_sequencer.py deleted file mode 100644 index d5419c1c4..000000000 --- a/contrib/opentimelineio_contrib/adapters/extern_maya_sequencer.py +++ /dev/null @@ -1,236 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -import os -import sys - -import urllib.parse - -# import maya and handle standalone mode -from maya import cmds - -try: - cmds.ls -except AttributeError: - from maya import standalone - standalone.initialize(name='python') - -import opentimelineio as otio - -# Mapping of Maya FPS Enum to rate. -FPS = { - 'game': 15, - 'film': 24, - 'pal': 25, - 'ntsc': 30, - 'show': 48, - 'palf': 50, - 'ntscf': 60 -} - - -def _url_to_path(url): - if url is None: - return None - - return urllib.parse.urlparse(url).path - - -def _video_url_for_shot(shot): - current_file = os.path.normpath(cmds.file(q=True, sn=True)) - return os.path.join( - os.path.dirname(current_file), - 'playblasts', - '{base_name}_{shot_name}.mov'.format( - base_name=os.path.basename(os.path.splitext(current_file)[0]), - shot_name=cmds.shot(shot, q=True, shotName=True) - ) - ) - - -def _match_existing_shot(item, existing_shots): - if existing_shots is None: - return None - - if item.media_reference.is_missing_reference: - return None - - url_path = _url_to_path(item.media_reference.target_url) - return next( - ( - shot for shot in existing_shots - if _video_url_for_shot(shot) == url_path - ), - None - ) - - -# ------------------------ -# building single track -# ------------------------ - -def _build_shot(item, track_no, track_range, existing_shot=None): - camera = None - if existing_shot is None: - camera = cmds.camera(name=item.name.split('.')[0] + '_cam')[0] - cmds.shot( - existing_shot or item.name.split('.')[0], - e=existing_shot is not None, - shotName=item.name, - track=track_no, - currentCamera=camera, - startTime=item.trimmed_range().start_time.value, - endTime=item.trimmed_range().end_time_inclusive().value, - sequenceStartTime=track_range.start_time.value, - sequenceEndTime=track_range.end_time_inclusive().value - ) - - -def _build_track(track, track_no, existing_shots=None): - for n, item in enumerate(track): - if not isinstance(item, otio.schema.Clip): - continue - - track_range = track.range_of_child_at_index(n) - if existing_shots is not None: - existing_shot = _match_existing_shot(item, existing_shots) - else: - existing_shot = None - - _build_shot(item, track_no, track_range, existing_shot) - - -def build_sequence(timeline, clean=False): - existing_shots = cmds.ls(type='shot') or [] - if clean: - cmds.delete(existing_shots) - existing_shots = [] - - tracks = [ - track for track in timeline.tracks - if track.kind == otio.schema.TrackKind.Video - ] - - for track_no, track in enumerate(reversed(tracks)): - _build_track(track, track_no, existing_shots=existing_shots) - - -def read_from_file(path, clean=True): - timeline = otio.adapters.read_from_file(path) - build_sequence(timeline, clean=clean) - - -# ----------------------- -# parsing single track -# ----------------------- - -def _get_gap(duration): - rate = FPS.get(cmds.currentUnit(q=True, time=True), 25) - gap_range = otio.opentime.TimeRange( - duration=otio.opentime.RationalTime(duration, rate) - ) - return otio.schema.Gap(source_range=gap_range) - - -def _read_shot(shot): - rate = FPS.get(cmds.currentUnit(q=True, time=True), 25) - start = int(cmds.shot(shot, q=True, startTime=True)) - end = int(cmds.shot(shot, q=True, endTime=True)) + 1 - - video_reference = otio.schema.ExternalReference( - target_url=_video_url_for_shot(shot), - available_range=otio.opentime.TimeRange( - otio.opentime.RationalTime(value=start, rate=rate), - otio.opentime.RationalTime(value=end - start, rate=rate) - ) - ) - - return otio.schema.Clip( - name=cmds.shot(shot, q=True, shotName=True), - media_reference=video_reference, - source_range=otio.opentime.TimeRange( - otio.opentime.RationalTime(value=start, rate=rate), - otio.opentime.RationalTime(value=end - start, rate=rate) - ) - ) - - -def _read_track(shots): - v = otio.schema.Track(kind=otio.schema.track.TrackKind.Video) - - last_clip_end = 0 - for shot in shots: - seq_start = int(cmds.shot(shot, q=True, sequenceStartTime=True)) - seq_end = int(cmds.shot(shot, q=True, sequenceEndTime=True)) - - # add gap if necessary - fill_time = seq_start - last_clip_end - last_clip_end = seq_end + 1 - if fill_time: - v.append(_get_gap(fill_time)) - - # add clip - v.append(_read_shot(shot)) - - return v - - -def read_sequence(): - rate = FPS.get(cmds.currentUnit(q=True, time=True), 25) - shots = cmds.ls(type='shot') or [] - per_track = {} - - for shot in shots: - track_no = cmds.shot(shot, q=True, track=True) - if track_no not in per_track: - per_track[track_no] = [] - per_track[track_no].append(shot) - - timeline = otio.schema.Timeline() - timeline.global_start_time = otio.opentime.RationalTime(0, rate) - - for track_no in reversed(sorted(per_track.keys())): - track_shots = per_track[track_no] - timeline.tracks.append(_read_track(track_shots)) - - return timeline - - -def write_to_file(path): - timeline = read_sequence() - otio.adapters.write_to_file(timeline, path) - - -def main(): - read_write_arg = sys.argv[1] - filepath = sys.argv[2] - - write = False - if read_write_arg == "write": - write = True - - if write: - # read the input OTIO off stdin - input_otio = otio.adapters.read_from_string( - sys.stdin.read(), - 'otio_json' - ) - build_sequence(input_otio, clean=True) - cmds.file(rename=filepath) - cmds.file(save=True, type="mayaAscii") - else: - cmds.file(filepath, o=True) - sys.stdout.write( - "\nOTIO_JSON_BEGIN\n" + - otio.adapters.write_to_string( - read_sequence(), - "otio_json" - ) + - "\nOTIO_JSON_END\n" - ) - - cmds.quit(force=True) - - -if __name__ == "__main__": - main() diff --git a/contrib/opentimelineio_contrib/adapters/fcpx_xml.py b/contrib/opentimelineio_contrib/adapters/fcpx_xml.py deleted file mode 100644 index 20294334c..000000000 --- a/contrib/opentimelineio_contrib/adapters/fcpx_xml.py +++ /dev/null @@ -1,1157 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""OpenTimelineIO Final Cut Pro X XML Adapter. """ -import os -import subprocess -from xml.etree import cElementTree -from xml.dom import minidom -from fractions import Fraction -from datetime import date -from urllib.parse import unquote - -import opentimelineio as otio - -META_NAMESPACE = "fcpx_xml" - -COMPOSABLE_ELEMENTS = ("video", "audio", "ref-clip", "asset-clip") - -FRAMERATE_FRAMEDURATION = {23.98: "1001/24000s", - 24: "25/600s", - 25: "1/25s", - 29.97: "1001/30000s", - 30: "100/3000s", - 50: "1/50s", - 59.94: "1001/60000s", - 60: "1/60s"} - - -def format_name(frame_rate, path): - """ - Helper to get the formatName used in FCP X XML format elements. This - uses ffprobe to get the frame size of the the clip at the provided path. - - Args: - frame_rate (int): The frame rate of the clip at the provided path - path (str): The path to the clip to probe - - Returns: - str: The format name. If empty, then ffprobe couldn't find the item - """ - - path = path.replace("file://", "") - path = unquote(path) - if not os.path.exists(path): - return "" - - try: - frame_size = subprocess.check_output( - [ - "ffprobe", - "-v", - "error", - "-select_streams", - "v:0", - "-show_entries", - "stream=height,width", - "-of", - "csv=s=x:p=0", - path - ] - ).decode("utf-8") - except (subprocess.CalledProcessError, OSError): - frame_size = "" - - if not frame_size: - return "" - - frame_size = frame_size.rstrip() - - if "1920" in frame_size: - frame_size = "1080" - - if frame_size.endswith("1280"): - frame_size = "720" - - return f"FFVideoFormat{frame_size}p{frame_rate}" - - -def to_rational_time(rational_number, fps): - """ - This converts a rational number value to an otio RationalTime object - - Args: - rational_number (str): This is a rational number from an FCP X XML - fps (int): The frame rate to use for calculating the rational time - - Returns: - RationalTime: A RationalTime object - """ - - if rational_number == "0s" or rational_number is None: - frames = 0 - else: - parts = rational_number.split("/") - if len(parts) > 1: - frames = int( - float(parts[0]) / float(parts[1].replace("s", "")) * float(fps) - ) - else: - frames = int(float(parts[0].replace("s", "")) * float(fps)) - - return otio.opentime.RationalTime(frames, int(fps)) - - -def from_rational_time(rational_time): - """ - This converts a RationalTime object to a rational number as a string - - Args: - rational_time (RationalTime): a rational time object - - Returns: - str: A rational number as a string - """ - - if int(rational_time.value) == 0: - return "0s" - result = Fraction( - float(rational_time.value) / float(rational_time.rate) - ).limit_denominator() - if str(result.denominator) == "1": - return f"{result.numerator}s" - return f"{result.numerator}/{result.denominator}s" - - -class FcpxOtio: - """ - This object is responsible for knowing how to convert an otio into an - FCP X XML - """ - - def __init__(self, otio_timeline): - self.otio_timeline = otio_timeline - self.fcpx_xml = cElementTree.Element("fcpxml", version="1.8") - self.resource_element = cElementTree.SubElement( - self.fcpx_xml, - "resources" - ) - if self.otio_timeline.schema_name() == "Timeline": - self.timelines = [self.otio_timeline] - else: - self.timelines = list( - self.otio_timeline.find_children( - descended_from_type=otio.schema.Timeline - ) - ) - - if len(self.timelines) > 1: - self.event_resource = cElementTree.SubElement( - self.fcpx_xml, - "event", - {"name": self._event_name()} - ) - else: - self.event_resource = self.fcpx_xml - - self.resource_count = 0 - - def to_xml(self): - """ - Convert an otio to an FCP X XML - - Returns: - str: FCPX XML content - """ - - for project in self.timelines: - top_sequence = self._stack_to_sequence(project.tracks) - - project_element = cElementTree.Element( - "project", - { - "name": project.name, - "uid": project.metadata.get("fcpx", {}).get("uid", "") - } - ) - project_element.append(top_sequence) - self.event_resource.append(project_element) - - if not self.timelines: - for clip in self._clips(): - if not clip.parent(): - self._add_asset(clip) - - for stack in self._stacks(): - ref_element = self._element_for_item( - stack, - None, - ref_only=True, - compound=True - ) - self.event_resource.append(ref_element) - child_parent_map = {c: p for p in self.fcpx_xml.iter() for c in p} - - for marker in [marker for marker in self.fcpx_xml.iter("marker")]: - parent = child_parent_map.get(marker) - marker_attribs = marker.attrib.copy() - parent.remove(marker) - cElementTree.SubElement( - parent, - "marker", - marker_attribs - ) - - xml = cElementTree.tostring( - self.fcpx_xml, - encoding="UTF-8", - method="xml" - ) - dom = minidom.parseString(xml) - pretty = dom.toprettyxml(indent=" ") - return pretty.replace( - '', - '\n\n' - ) - - def _stack_to_sequence(self, stack, compound_clip=False): - format_element = self._find_or_create_format_from(stack) - sequence_element = cElementTree.Element( - "sequence", - { - "duration": self._calculate_rational_number( - stack.duration().value, - stack.duration().rate - ), - "format": str(format_element.get("id")) - } - ) - spine = cElementTree.SubElement(sequence_element, "spine") - video_tracks = [ - t for t in stack - if t.kind == otio.schema.TrackKind.Video - ] - audio_tracks = [ - t for t in stack - if t.kind == otio.schema.TrackKind.Audio - ] - - for idx, track in enumerate(video_tracks): - self._track_for_spine(track, idx, spine, compound_clip) - - for idx, track in enumerate(audio_tracks): - lane_id = -(idx + 1) - self._track_for_spine(track, lane_id, spine, compound_clip) - return sequence_element - - def _track_for_spine(self, track, lane_id, spine, compound): - for child in self._lanable_items(track.find_children()): - if self._item_in_compound_clip(child) and not compound: - continue - child_element = self._element_for_item( - child, - lane_id, - compound=compound - ) - if not lane_id: - spine.append(child_element) - continue - if child.schema_name() == "Gap": - continue - - parent_element = self._find_parent_element( - spine, - track.trimmed_range_of_child(child).start_time, - self._find_or_create_format_from(track).get("id") - ) - offset = self._offset_based_on_parent( - child_element, - parent_element, - self._find_or_create_format_from(track).get("id") - ) - child_element.set( - "offset", - from_rational_time(offset) - ) - - parent_element.append(child_element) - return [] - - def _find_parent_element(self, spine, trimmed_range, format_id): - for item in spine.iter(): - if item.tag not in ("clip", "asset-clip", "gap", "ref-clip"): - continue - if item.get("lane") is not None: - continue - if item.tag == "gap" and item.find("./audio") is not None: - continue - offset = to_rational_time( - item.get("offset"), - self._frame_rate_from_element(item, format_id) - ) - duration = to_rational_time( - item.get("duration"), - self._frame_rate_from_element(item, format_id) - ) - total_time = offset + duration - if offset > trimmed_range: - continue - if total_time > trimmed_range: - return item - return None - - def _offset_based_on_parent(self, child, parent, default_format_id): - parent_offset = to_rational_time( - parent.get("offset"), - self._frame_rate_from_element(parent, default_format_id) - ) - child_offset = to_rational_time( - child.get("offset"), - self._frame_rate_from_element(child, default_format_id) - ) - - parent_start = to_rational_time( - parent.get("start"), - self._frame_rate_from_element(parent, default_format_id) - ) - return (child_offset - parent_offset) + parent_start - - def _frame_rate_from_element(self, element, default_format_id): - if element.tag == "gap": - format_id = default_format_id - - if element.tag == "ref-clip": - media_element = self._media_by_id(element.get("ref")) - asset = media_element.find("./sequence") - format_id = asset.get("format") - - if element.tag == "clip": - if element.find("./gap") is not None: - asset_id = element.find("./gap").find("./audio").get("ref") - else: - asset_id = element.find("./video").get("ref") - asset = self._asset_by_id(asset_id) - format_id = asset.get("format") - - if element.tag == "asset-clip": - asset = self._asset_by_id(element.get("ref")) - format_id = asset.get("format") - - format_element = self.resource_element.find( - f"./format[@id='{format_id}']" - ) - total, rate = format_element.get("frameDuration").split("/") - rate = rate.replace("s", "") - return int(float(rate) / float(total)) - - def _element_for_item(self, item, lane, ref_only=False, compound=False): - element = None - duration = self._calculate_rational_number( - item.duration().value, - item.duration().rate - ) - if item.schema_name() == "Clip": - asset_id = self._add_asset(item, compound_only=compound) - element = self._element_for_clip(item, asset_id, duration, lane) - - if item.schema_name() == "Gap": - element = self._element_for_gap(item, duration) - - if item.schema_name() == "Stack": - element = self._element_for_stack(item, duration, ref_only) - - if element is None: - return None - if lane: - element.set("lane", str(lane)) - for marker in item.markers: - marker_attribs = { - "start": from_rational_time(marker.marked_range.start_time), - "duration": from_rational_time(marker.marked_range.duration), - "value": marker.name - } - marker_element = cElementTree.Element( - "marker", - marker_attribs - ) - if marker.color == otio.schema.MarkerColor.RED: - marker_element.set("completed", "0") - if marker.color == otio.schema.MarkerColor.GREEN: - marker_element.set("completed", "1") - element.append(marker_element) - return element - - def _lanable_items(self, items): - return [ - item for item in items - if item.schema_name() in ["Gap", "Stack", "Clip"] - ] - - def _element_for_clip(self, item, asset_id, duration, lane): - element = cElementTree.Element( - "clip", - { - "name": item.name, - "offset": from_rational_time( - item.trimmed_range_in_parent().start_time - ), - "duration": duration - } - ) - start = from_rational_time(item.source_range.start_time) - if start != "0s": - element.set("start", str(start)) - if item.parent().kind == otio.schema.TrackKind.Video: - cElementTree.SubElement( - element, - "video", - { - "offset": "0s", - "ref": asset_id, - "duration": self._find_asset_duration(item) - } - ) - else: - gap_element = cElementTree.SubElement( - element, - "gap", - { - "name": "Gap", - "offset": "0s", - "duration": self._find_asset_duration(item) - } - ) - audio = cElementTree.SubElement( - gap_element, - "audio", - { - "offset": "0s", - "ref": asset_id, - "duration": self._find_asset_duration(item) - } - ) - if lane: - audio.set("lane", str(lane)) - return element - - def _element_for_gap(self, item, duration): - element = cElementTree.Element( - "gap", - { - "name": "Gap", - "duration": duration, - "offset": from_rational_time( - item.trimmed_range_in_parent().start_time - ), - "start": "3600s" - } - ) - return element - - def _element_for_stack(self, item, duration, ref_only): - media_element = self._add_compound_clip(item) - asset_id = media_element.get("id") - element = cElementTree.Element( - "ref-clip", - { - "name": item.name, - "duration": duration, - "ref": str(asset_id) - } - ) - if not ref_only: - element.set( - "offset", - from_rational_time( - item.trimmed_range_in_parent().start_time - ) - ) - element.set( - "start", - from_rational_time(item.source_range.start_time) - ) - if item.parent() and item.parent().kind == otio.schema.TrackKind.Audio: - element.set("srcEnable", "audio") - return element - - def _find_asset_duration(self, item): - if (item.media_reference and - not item.media_reference.is_missing_reference): - return self._calculate_rational_number( - item.media_reference.available_range.duration.value, - item.media_reference.available_range.duration.rate - ) - return self._calculate_rational_number( - item.duration().value, - item.duration().rate - ) - - def _find_asset_start(self, item): - if (item.media_reference and - not item.media_reference.is_missing_reference): - return self._calculate_rational_number( - item.media_reference.available_range.start_time.value, - item.media_reference.available_range.start_time.rate - ) - return self._calculate_rational_number( - item.source_range.start_time.value, - item.source_range.start_time.rate - ) - - def _clip_format_name(self, clip): - if clip.schema_name() in ("Stack", "Track"): - return "" - if not clip.media_reference: - return "" - - if clip.media_reference.is_missing_reference: - return "" - - return format_name( - clip.duration().rate, - clip.media_reference.target_url - ) - - def _find_or_create_format_from(self, clip): - frame_duration = self._framerate_to_frame_duration( - clip.duration().rate - ) - format_element = self._format_by_frame_rate(clip.duration().rate) - if format_element is None: - format_element = cElementTree.SubElement( - self.resource_element, - "format", - { - "id": self._resource_id_generator(), - "frameDuration": frame_duration, - "name": self._clip_format_name(clip) - } - ) - if format_element.get("name", "") == "": - format_element.set("name", self._clip_format_name(clip)) - return format_element - - def _add_asset(self, clip, compound_only=False): - format_element = self._find_or_create_format_from(clip) - asset = self._create_asset_element(clip, format_element) - - if not compound_only and self._asset_clip_by_name(clip.name) is None: - self._create_asset_clip_element( - clip, - format_element, - asset.get("id") - ) - - if not clip.parent(): - asset.set("hasAudio", "1") - asset.set("hasVideo", "1") - return asset.get("id") - if clip.parent().kind == otio.schema.TrackKind.Audio: - asset.set("hasAudio", "1") - if clip.parent().kind == otio.schema.TrackKind.Video: - asset.set("hasVideo", "1") - return asset.get("id") - - def _create_asset_clip_element(self, clip, format_element, resource_id): - duration = self._find_asset_duration(clip) - a_clip = cElementTree.SubElement( - self.event_resource, - "asset-clip", - { - "name": clip.name, - "format": format_element.get("id"), - "ref": resource_id, - "duration": duration - } - ) - if clip.media_reference and not clip.media_reference.is_missing_reference: - fcpx_metadata = clip.media_reference.metadata.get("fcpx", {}) - note_element = self._create_note_element( - fcpx_metadata.get("note", None) - ) - keyword_elements = self._create_keyword_elements( - fcpx_metadata.get("keywords", []) - ) - metadata_element = self._create_metadata_elements( - fcpx_metadata.get("metadata", None) - ) - - if note_element is not None: - a_clip.append(note_element) - if keyword_elements: - for keyword_element in keyword_elements: - a_clip.append(keyword_element) - if metadata_element is not None: - a_clip.append(metadata_element) - - def _create_asset_element(self, clip, format_element): - target_url = self._target_url_from_clip(clip) - asset = self._asset_by_path(target_url) - if asset is not None: - return asset - - asset = cElementTree.SubElement( - self.resource_element, - "asset", - { - "name": clip.name, - "src": target_url, - "format": format_element.get("id"), - "id": self._resource_id_generator(), - "duration": self._find_asset_duration(clip), - "start": self._find_asset_start(clip), - "hasAudio": "0", - "hasVideo": "0" - } - ) - return asset - - def _add_compound_clip(self, item): - media_element = self._media_by_name(item.name) - if media_element is not None: - return media_element - resource_id = self._resource_id_generator() - media_element = cElementTree.SubElement( - self.resource_element, - "media", - { - "name": self._compound_clip_name(item, resource_id), - "id": resource_id - } - ) - if item.metadata.get("fcpx", {}).get("uid", False): - media_element.set("uid", item.metadata.get("fcpx", {}).get("uid")) - media_element.append(self._stack_to_sequence(item, compound_clip=True)) - return media_element - - def _stacks(self): - return self.otio_timeline.find_children( - descended_from_type=otio.schema.Stack - ) - - def _clips(self): - return self.otio_timeline.find_children( - descended_from_type=otio.schema.Clip - ) - - def _resource_id_generator(self): - self.resource_count += 1 - return f"r{self.resource_count}" - - def _event_name(self): - if self.otio_timeline.name: - return self.otio_timeline.name - return date.strftime(date.today(), "%m-%e-%y") - - def _asset_by_path(self, path): - return self.resource_element.find(f"./asset[@src='{path}']") - - def _asset_by_id(self, asset_id): - return self.resource_element.find(f"./asset[@id='{asset_id}']") - - def _media_by_name(self, name): - return self.resource_element.find(f"./media[@name='{name}']") - - def _media_by_id(self, media_id): - return self.resource_element.find(f"./media[@id='{media_id}']") - - def _format_by_frame_rate(self, frame_rate): - frame_duration = self._framerate_to_frame_duration(frame_rate) - return self.resource_element.find( - f"./format[@frameDuration='{frame_duration}']" - ) - - def _asset_clip_by_name(self, name): - return self.event_resource.find( - f"./asset-clip[@name='{name}']" - ) - - # -------------------- - # static methods - # -------------------- - - @staticmethod - def _framerate_to_frame_duration(framerate): - frame_duration = FRAMERATE_FRAMEDURATION.get(int(framerate), "") - if not frame_duration: - frame_duration = FRAMERATE_FRAMEDURATION.get(float(framerate), "") - return frame_duration - - @staticmethod - def _target_url_from_clip(clip): - if (clip.media_reference and - not clip.media_reference.is_missing_reference): - return clip.media_reference.target_url - return f"file:///tmp/{clip.name}" - - @staticmethod - def _calculate_rational_number(duration, rate): - if int(duration) == 0: - return "0s" - result = Fraction(float(duration) / float(rate)).limit_denominator() - return f"{result.numerator}/{result.denominator}s" - - @staticmethod - def _compound_clip_name(compound_clip, resource_id): - if compound_clip.name: - return compound_clip.name - return f"compound_clip_{resource_id}" - - @staticmethod - def _item_in_compound_clip(item): - stack_count = 0 - parent = item.parent() - while parent is not None: - if parent.schema_name() == "Stack": - stack_count += 1 - parent = parent.parent() - return stack_count > 1 - - @staticmethod - def _create_metadata_elements(metadata): - if metadata is None: - return None - metadata_element = cElementTree.Element( - "metadata" - ) - for metadata_dict in metadata: - cElementTree.SubElement( - metadata_element, - "md", - { - "key": list(metadata_dict.keys())[0], - "value": list(metadata_dict.values())[0] - } - ) - return metadata_element - - @staticmethod - def _create_keyword_elements(keywords): - keyword_elements = [] - for keyword_dict in keywords: - keyword_elements.append( - cElementTree.Element( - "keyword", - dict(keyword_dict) - ) - ) - return keyword_elements - - @staticmethod - def _create_note_element(note): - if not note: - return None - note_element = cElementTree.Element( - "note" - ) - note_element.text = note - return note_element - - -class FcpxXml: - """ - This object is responsible for knowing how to convert an FCP X XML - otio into an otio timeline - """ - - def __init__(self, xml_string): - self.fcpx_xml = cElementTree.fromstring(xml_string) - self.child_parent_map = {c: p for p in self.fcpx_xml.iter() for c in p} - - def to_otio(self): - """ - Convert an FCP X XML to an otio - - Returns: - OpenTimeline: An OpenTimeline Timeline object - """ - - if self.fcpx_xml.find("./library") is not None: - return self._from_library() - if self.fcpx_xml.find("./event") is not None: - return self._from_event(self.fcpx_xml.find("./event")) - if self.fcpx_xml.find("./project") is not None: - return self._from_project(self.fcpx_xml.find("./project")) - if ((self.fcpx_xml.find("./asset-clip") is not None) or - (self.fcpx_xml.find("./ref-clip") is not None)): - return self._from_clips() - - def _from_library(self): - # We are just grabbing the first even in the project for now - return self._from_event(self.fcpx_xml.find("./library/event")) - - def _from_event(self, event_element): - container = otio.schema.SerializableCollection( - name=event_element.get("name") - ) - for project in event_element.findall("./project"): - container.append(self._from_project(project)) - return container - - def _from_project(self, project_element): - timeline = otio.schema.Timeline(name=project_element.get("name", "")) - timeline.tracks = self._squence_to_stack( - project_element.find("./sequence", {}) - ) - return timeline - - def _from_clips(self): - container = otio.schema.SerializableCollection() - if self.fcpx_xml.find("./asset-clip") is not None: - for asset_clip in self.fcpx_xml.findall("./asset-clip"): - container.append( - self._build_composable( - asset_clip, - asset_clip.get("format") - ) - ) - - if self.fcpx_xml.find("./ref-clip") is not None: - for ref_clip in self.fcpx_xml.findall("./ref-clip"): - container.append( - self._build_composable( - ref_clip, - "r1" - ) - ) - return container - - def _squence_to_stack(self, sequence_element, name="", source_range=None): - timeline_items = [] - lanes = [] - stack = otio.schema.Stack(name=name, source_range=source_range) - for element in sequence_element.iter(): - if element.tag not in COMPOSABLE_ELEMENTS: - continue - composable = self._build_composable( - element, - sequence_element.get("format") - ) - - offset, lane = self._offset_and_lane( - element, - sequence_element.get("format") - ) - - timeline_items.append( - { - "track": lane, - "offset": offset, - "composable": composable, - "audio_only": self._audio_only(element) - } - ) - - lanes.append(lane) - sorted_lanes = list(set(lanes)) - sorted_lanes.sort() - for lane in sorted_lanes: - sorted_items = self._sorted_items(lane, timeline_items) - track = otio.schema.Track( - name=lane, - kind=self._track_type(sorted_items) - ) - - for item in sorted_items: - frame_diff = ( - int(item["offset"].value) - track.duration().value - ) - if frame_diff > 0: - track.append( - self._create_gap( - 0, - frame_diff, - sequence_element.get("format") - ) - ) - track.append(item["composable"]) - stack.append(track) - return stack - - def _build_composable(self, element, default_format): - timing_clip = self._timing_clip(element) - source_range = self._time_range( - timing_clip, - self._format_id_for_clip(element, default_format) - ) - - if element.tag != "ref-clip": - otio_composable = otio.schema.Clip( - name=timing_clip.get("name"), - media_reference=self._reference_from_id( - element.get("ref"), - default_format - ), - source_range=source_range - ) - else: - media_element = self._compound_clip_by_id(element.get("ref")) - otio_composable = self._squence_to_stack( - media_element.find("./sequence"), - name=media_element.get("name"), - source_range=source_range - ) - - for marker in timing_clip.findall(".//marker"): - otio_composable.markers.append( - self._marker(marker, default_format) - ) - - return otio_composable - - def _marker(self, element, default_format): - if element.get("completed", None) and element.get("completed") == "1": - color = otio.schema.MarkerColor.GREEN - if element.get("completed", None) and element.get("completed") == "0": - color = otio.schema.MarkerColor.RED - if not element.get("completed", None): - color = otio.schema.MarkerColor.PURPLE - - otio_marker = otio.schema.Marker( - name=element.get("value", ""), - marked_range=self._time_range(element, default_format), - color=color - ) - return otio_marker - - def _audio_only(self, element): - if element.tag == "audio": - return True - if element.tag == "asset-clip": - asset = self._asset_by_id(element.get("ref", None)) - if asset is not None and asset.get("hasVideo", "0") == "0": - return True - if element.tag == "ref-clip": - if element.get("srcEnable", "video") == "audio": - return True - return False - - def _create_gap(self, start_frame, number_of_frames, defualt_format): - fps = self._format_frame_rate(defualt_format) - source_range = otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(start_frame, fps), - duration=otio.opentime.RationalTime(number_of_frames, fps) - ) - return otio.schema.Gap(source_range=source_range) - - def _timing_clip(self, clip): - while clip.tag not in ("clip", "asset-clip", "ref-clip"): - clip = self.child_parent_map.get(clip) - return clip - - def _offset_and_lane(self, clip, default_format): - clip_format_id = self._format_id_for_clip(clip, default_format) - clip = self._timing_clip(clip) - parent = self.child_parent_map.get(clip) - - parent_format_id = self._format_id_for_clip(parent, default_format) - - if parent.tag == "spine" and parent.get("lane", None): - lane = parent.get("lane") - parent = self.child_parent_map.get(parent) - spine = True - else: - lane = clip.get("lane", "0") - spine = False - - clip_offset_frames = self._number_of_frames( - clip.get("offset"), - clip_format_id - ) - - if spine: - parent_start_frames = 0 - else: - parent_start_frames = self._number_of_frames( - parent.get("start", None), - parent_format_id - ) - - parent_offset_frames = self._number_of_frames( - parent.get("offset", None), - parent_format_id - ) - - clip_offset_frames = ( - (int(clip_offset_frames) - int(parent_start_frames)) + - int(parent_offset_frames) - ) - - offset = otio.opentime.RationalTime( - clip_offset_frames, - self._format_frame_rate(clip_format_id) - ) - - return offset, lane - - def _format_id_for_clip(self, clip, default_format): - if not clip.get("ref", None) or clip.tag == "gap": - return default_format - - resource = self._asset_by_id(clip.get("ref")) - - if resource is None: - resource = self._compound_clip_by_id( - clip.get("ref") - ).find("sequence") - - return resource.get("format", default_format) - - def _reference_from_id(self, asset_id, default_format): - asset = self._asset_by_id(asset_id) - if not asset.get("src", ""): - return otio.schema.MissingReference() - - available_range = otio.opentime.TimeRange( - start_time=to_rational_time( - asset.get("start"), - self._format_frame_rate( - asset.get("format", default_format) - ) - ), - duration=to_rational_time( - asset.get("duration"), - self._format_frame_rate( - asset.get("format", default_format) - ) - ) - ) - asset_clip = self._assetclip_by_ref(asset_id) - metadata = {} - if asset_clip is not None: - metadata = self._create_metadta(asset_clip) - return otio.schema.ExternalReference( - target_url=asset.get("src"), - available_range=available_range, - metadata={"fcpx": metadata} - ) - - def _create_metadta(self, item): - metadata = {} - for element in item.iter(): - if element.tag == "md": - metadata.setdefault("metadata", []).append( - {element.attrib.get("key"): element.attrib.get("value")} - ) - # metadata.update( - # {element.attrib.get("key"): element.attrib.get("value")} - # ) - if element.tag == "note": - metadata.update({"note": element.text}) - if element.tag == "keyword": - metadata.setdefault("keywords", []).append(element.attrib) - return metadata - - # -------------------- - # time helpers - # -------------------- - def _format_frame_duration(self, format_id): - media_format = self._format_by_id(format_id) - total, rate = media_format.get("frameDuration").split("/") - rate = rate.replace("s", "") - return total, rate - - def _format_frame_rate(self, format_id): - fd_total, fd_rate = self._format_frame_duration(format_id) - return int(float(fd_rate) / float(fd_total)) - - def _number_of_frames(self, time_value, format_id): - if time_value == "0s" or time_value is None: - return 0 - fd_total, fd_rate = self._format_frame_duration(format_id) - time_value = time_value.split("/") - - if len(time_value) > 1: - time_value_a, time_value_b = time_value - return int( - (float(time_value_a) / float(time_value_b.replace("s", ""))) * - (float(fd_rate) / float(fd_total)) - ) - - return int( - int(time_value[0].replace("s", "")) * - (float(fd_rate) / float(fd_total)) - ) - - def _time_range(self, element, format_id): - return otio.opentime.TimeRange( - start_time=to_rational_time( - element.get("start", "0s"), - self._format_frame_rate(format_id) - ), - duration=to_rational_time( - element.get("duration"), - self._format_frame_rate(format_id) - ) - ) - # -------------------- - # search helpers - # -------------------- - - def _asset_by_id(self, asset_id): - return self.fcpx_xml.find( - f"./resources/asset[@id='{asset_id}']" - ) - - def _assetclip_by_ref(self, asset_id): - event = self.fcpx_xml.find("./event") - if event is None: - return self.fcpx_xml.find(f"./asset-clip[@ref='{asset_id}']") - else: - return event.find(f"./asset-clip[@ref='{asset_id}']") - - def _format_by_id(self, format_id): - return self.fcpx_xml.find( - f"./resources/format[@id='{format_id}']" - ) - - def _compound_clip_by_id(self, compound_id): - return self.fcpx_xml.find( - f"./resources/media[@id='{compound_id}']" - ) - - # -------------------- - # static methods - # -------------------- - @staticmethod - def _track_type(lane_items): - audio_only_items = [item for item in lane_items if item["audio_only"]] - if len(audio_only_items) == len(lane_items): - return otio.schema.TrackKind.Audio - return otio.schema.TrackKind.Video - - @staticmethod - def _sorted_items(lane, otio_objects): - lane_items = [item for item in otio_objects if item["track"] == lane] - return sorted(lane_items, key=lambda k: k["offset"]) - - -# -------------------- -# adapter requirements -# -------------------- -def read_from_string(input_str): - """ - Necessary read method for otio adapter - - Args: - input_str (str): An FCP X XML string - - Returns: - OpenTimeline: An OpenTimeline object - """ - - return FcpxXml(input_str).to_otio() - - -def write_to_string(input_otio): - """ - Necessary write method for otio adapter - - Args: - input_otio (OpenTimeline): An OpenTimeline object - - Returns: - str: The string contents of an FCP X XML - """ - - return FcpxOtio(input_otio).to_xml() diff --git a/contrib/opentimelineio_contrib/adapters/ffmpeg_burnins.py b/contrib/opentimelineio_contrib/adapters/ffmpeg_burnins.py deleted file mode 100644 index 198621567..000000000 --- a/contrib/opentimelineio_contrib/adapters/ffmpeg_burnins.py +++ /dev/null @@ -1,406 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -""" -This module provides an interface to allow users to easily -build out an FFMPEG command with all the correct filters -for applying text (with a background) to the rendered media. -""" -import os -import sys -import json -from subprocess import Popen, PIPE -from PIL import ImageFont - - -def _is_windows(): - """ - queries if the current operating system is Windows - - :rtype: bool - """ - return sys.platform.startswith('win') or \ - sys.platform.startswith('cygwin') - - -def _system_font(): - """ - attempts to determine a default system font - - :rtype: str - """ - if _is_windows(): - font_path = os.path.join(os.environ['WINDIR'], 'Fonts') - fonts = ('arial.ttf', 'calibri.ttf', 'times.ttf') - elif sys.platform.startswith('darwin'): - font_path = '/System/Library/Fonts' - fonts = ('Menlo.ttc',) - else: - # assuming linux - font_path = '/usr/share/fonts/msttcorefonts' - fonts = ('arial.ttf', 'times.ttf', 'couri.ttf') - - system_font = None - backup = None - for font in fonts: - font = os.path.join(font_path, font) - if os.path.exists(font): - system_font = font - break - else: - if os.path.exists(font_path): - for each in os.listdir(font_path): - ext = os.path.splitext(each)[-1] - if ext[1:].startswith('tt'): - system_font = os.path.join(font_path, each) - return system_font or backup - - -# Default valuues -FONT = _system_font() -FONT_SIZE = 16 -FONT_COLOR = 'white' -BG_COLOR = 'black' -BG_PADDING = 5 - -# FFMPEG command strings -FFMPEG = ('ffmpeg -loglevel panic -i %(input)s ' - '%(filters)s %(args)s%(output)s') -FFPROBE = ('ffprobe -v quiet -print_format json -show_format ' - '-show_streams %(source)s') -BOX = 'box=1:boxborderw=%(border)d:boxcolor=%(color)s@%(opacity).1f' -DRAWTEXT = ("drawtext=text='%(text)s':x=%(x)s:y=%(y)s:fontcolor=" - "%(color)s@%(opacity).1f:fontsize=%(size)d:fontfile='%(font)s'") -TIMECODE = ("drawtext=timecode='%(text)s':timecode_rate=%(fps).2f" - ":x=%(x)s:y=%(y)s:fontcolor=" - "%(color)s@%(opacity).1f:fontsize=%(size)d:fontfile='%(font)s'") - - -# Valid aligment parameters. -TOP_CENTERED = 'top_centered' -BOTTOM_CENTERED = 'bottom_centered' -TOP_LEFT = 'top_left' -BOTTOM_LEFT = 'bottom_left' -TOP_RIGHT = 'top_right' -BOTTOM_RIGHT = 'bottom_right' - - -class Options(dict): - """ - Base options class. - """ - _params = { - 'opacity': 1, - 'x_offset': 0, - 'y_offset': 0, - 'font': FONT, - 'font_size': FONT_SIZE, - 'bg_color': BG_COLOR, - 'bg_padding': BG_PADDING, - 'font_color': FONT_COLOR - } - - def __init__(self, **kwargs): - super().__init__() - params = self._params.copy() - params.update(kwargs) - super().update(**params) - - def __setitem__(self, key, value): - if key not in self._params: - raise KeyError("Not a valid option key '%s'" % key) - super().update({key: value}) - - -class FrameNumberOptions(Options): - """ - :key int frame_offset: offset the frame numbers - :key float opacity: opacity value (0-1) - :key str expression: expression that would be used instead of text - :key bool x_offset: X position offset - (does not apply to centered alignments) - :key bool y_offset: Y position offset - :key str font: path to the font file - :key int font_size: size to render the font in - :key str bg_color: background color of the box - :key int bg_padding: padding between the font and box - :key str font_color: color to render - """ - - def __init__(self, **kwargs): - self._params.update({ - 'frame_offset': 0, - 'expression': None - }) - super().__init__(**kwargs) - - -class TextOptions(Options): - """ - :key float opacity: opacity value (0-1) - :key str expression: expression that would be used instead of text - :key bool x_offset: X position offset - (does not apply to centered alignments) - :key bool y_offset: Y position offset - :key str font: path to the font file - :key int font_size: size to render the font in - :key str bg_color: background color of the box - :key int bg_padding: padding between the font and box - :key str font_color: color to render - """ - - -class TimeCodeOptions(Options): - """ - :key int frame_offset: offset the frame numbers - :key float fps: frame rate to calculate the timecode by - :key float opacity: opacity value (0-1) - :key bool x_offset: X position offset - (does not apply to centered alignments) - :key bool y_offset: Y position offset - :key str font: path to the font file - :key int font_size: size to render the font in - :key str bg_color: background color of the box - :key int bg_padding: padding between the font and box - :key str font_color: color to render - """ - - def __init__(self, **kwargs): - self._params.update({ - 'frame_offset': 0, - 'fps': 24 - }) - super().__init__(**kwargs) - - -class Burnins: - """ - Class that provides convenience API for building filter - flags for the FFMPEG command. - """ - - def __init__(self, source, streams=None): - """ - :param str source: source media file - :param [] streams: ffprobe stream data if parsed as a pre-process - """ - self.source = source - self.filters = { - 'drawtext': [] - } - self._streams = streams or _streams(self.source) - - def __repr__(self): - return '' % os.path.basename(self.source) - - @property - def start_frame(self): - """ - :rtype: int - """ - start_time = float(self._video_stream['start_time']) - return round(start_time * self.frame_rate) - - @property - def end_frame(self): - """ - :rtype: int - """ - end_time = float(self._video_stream['duration']) - return round(end_time * self.frame_rate) - - @property - def frame_rate(self): - """ - :rtype: int - """ - data = self._video_stream - tokens = data['r_frame_rate'].split('/') - return int(tokens[0]) / int(tokens[1]) - - @property - def _video_stream(self): - video_stream = None - for each in self._streams: - if each.get('codec_type') == 'video': - video_stream = each - break - else: - raise RuntimeError("Failed to locate video stream " - "from '%s'" % self.source) - return video_stream - - @property - def resolution(self): - """ - :rtype: (int, int) - """ - data = self._video_stream - return data['width'], data['height'] - - @property - def filter_string(self): - """ - Generates the filter string that would be applied - to the `-vf` argument - - :rtype: str - """ - return ','.join(self.filters['drawtext']) - - def add_timecode(self, align, options=None): - """ - Convenience method to create the frame number expression. - - :param enum align: alignment, must use provided enum flags - :param dict options: recommended to use TimeCodeOptions - """ - options = options or TimeCodeOptions() - timecode = _frames_to_timecode(options['frame_offset'], - self.frame_rate) - options = options.copy() - if not options.get('fps'): - options['fps'] = self.frame_rate - self._add_burnin(timecode.replace(':', r'\:'), - align, - options, - TIMECODE) - - def add_frame_numbers(self, align, options=None): - """ - Convenience method to create the frame number expression. - - :param enum align: alignment, must use provided enum flags - :param dict options: recommended to use FrameNumberOptions - """ - options = options or FrameNumberOptions() - options['expression'] = r'%%{eif\:n+%d\:d}' % options['frame_offset'] - text = str(int(self.end_frame + options['frame_offset'])) - self._add_burnin(text, align, options, DRAWTEXT) - - def add_text(self, text, align, options=None): - """ - Adding static text to a filter. - - :param str text: text to apply to the drawtext - :param enum align: alignment, must use provided enum flags - :param dict options: recommended to use TextOptions - """ - options = options or TextOptions() - self._add_burnin(text, align, options, DRAWTEXT) - - def _add_burnin(self, text, align, options, draw): - """ - Generic method for building the filter flags. - - :param str text: text to apply to the drawtext - :param enum align: alignment, must use provided enum flags - :param dict options: - """ - resolution = self.resolution - data = { - 'text': options.get('expression') or text, - 'color': options['font_color'], - 'size': options['font_size'] - } - data.update(options) - data.update(_drawtext(align, resolution, text, options)) - if 'font' in data and _is_windows(): - data['font'] = data['font'].replace(os.sep, r'\\' + os.sep) - data['font'] = data['font'].replace(':', r'\:') - self.filters['drawtext'].append(draw % data) - - if options.get('bg_color') is not None: - box = BOX % { - 'border': options['bg_padding'], - 'color': options['bg_color'], - 'opacity': options['opacity'] - } - self.filters['drawtext'][-1] += ':%s' % box - - def command(self, output=None, args=None, overwrite=False): - """ - Generate the entire FFMPEG command. - - :param str output: output file - :param str args: additional FFMPEG arguments - :param bool overwrite: overwrite the output if it exists - :returns: completed command - :rtype: str - """ - output = output or '' - if overwrite: - output = '-y %s' % output - return (FFMPEG % { - 'input': self.source, - 'output': output, - 'args': '%s ' % args if args else '', - 'filters': '-vf "%s"' % self.filter_string - }).strip() - - def render(self, output, args=None, overwrite=False): - """ - Render the media to a specified destination. - - :param str output: output file - :param str args: additional FFMPEG arguments - :param bool overwrite: overwrite the output if it exists - """ - if not overwrite and os.path.exists(output): - raise RuntimeError("Destination '%s' exists, please " - "use overwrite" % output) - command = self.command(output=output, - args=args, - overwrite=overwrite) - proc = Popen(command, shell=True) - proc.communicate() - if proc.returncode != 0: - raise RuntimeError("Failed to render '%s': %s'" - % (output, command)) - if not os.path.exists(output): - raise RuntimeError("Failed to generate '%s'" % output) - - -def _streams(source): - """ - :param str source: source media file - :rtype: [{}, ...] - """ - command = FFPROBE % {'source': source} - proc = Popen(command, shell=True, stdout=PIPE) - out = proc.communicate()[0] - if proc.returncode != 0: - raise RuntimeError("Failed to run: %s" % command) - return json.loads(out)['streams'] - - -def _drawtext(align, resolution, text, options): - """ - :rtype: {'x': int, 'y': int} - """ - x_pos = '0' - if align in (TOP_CENTERED, BOTTOM_CENTERED): - x_pos = 'w/2-tw/2' - elif align in (TOP_RIGHT, BOTTOM_RIGHT): - ifont = ImageFont.truetype(options['font'], - options['font_size']) - box_size = ifont.getsize(text) - x_pos = resolution[0] - (box_size[0] + options['x_offset']) - elif align in (TOP_LEFT, BOTTOM_LEFT): - x_pos = options['x_offset'] - - if align in (TOP_CENTERED, - TOP_RIGHT, - TOP_LEFT): - y_pos = '%d' % options['y_offset'] - else: - y_pos = 'h-text_h-%d' % (options['y_offset']) - return {'x': x_pos, 'y': y_pos} - - -def _frames_to_timecode(frames, framerate): - return '{:02d}:{:02d}:{:02d}:{:02d}'.format( - int(frames / (3600 * framerate)), - int(frames / (60 * framerate) % 60), - int(frames / framerate % 60), - int(frames % framerate)) diff --git a/contrib/opentimelineio_contrib/adapters/hls_playlist.py b/contrib/opentimelineio_contrib/adapters/hls_playlist.py deleted file mode 100644 index 6f55b1a87..000000000 --- a/contrib/opentimelineio_contrib/adapters/hls_playlist.py +++ /dev/null @@ -1,1751 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""HLS Playlist OpenTimelineIO adapter - -This adapter supports authoring of HLS playlists within OpenTimelineIO by using -clips to represent media fragments. - -Status: - - Export of Media Playlists well supported - - Export of Master Playlists supported - - Import of Media Playlists well supported - - Import of Master Playlists unsupported - - Explicit Variant Stream controls in Master Playlists unsupported - -In general, you can author otio as follows: - t = otio.schema.Timeline() - track = otio.schema.Track("v1") - track.metadata['HLS'] = { - "EXT-X-INDEPENDENT-SEGMENTS": None, - "EXT-X-PLAYLIST-TYPE": "VOD" - } - t.tracks.append(track) - - # Make a prototype media ref with the fragment's initialization metadata - fragmented_media_ref = otio.schema.ExternalReference( - target_url='video1.mp4', - metadata={ - "streaming": { - "init_byterange": { - "byte_count": 729, - "byte_offset": 0 - }, - "init_uri": "media-video-1.mp4" - } - } - ) - - # Make a copy of the media ref specifying the byte range for the fragment - media_ref1 = fragmented_media_ref.deepcopy() - media_ref1.available_range=otio.opentime.TimeRange( - otio.opentime.RationalTime(0, 1), - otio.opentime.RationalTime(2.002, 1) - ) - media_ref1.metadata['streaming'].update( - { - "byte_count": 534220, - "byte_offset": 1361 - } - ) - - # make the fragment and append it - fragment1 = otio.schema.Clip(media_reference=media_ref1) - track.append(fragment1) - - # (repeat to define each fragment) - -The code above would yield an HLS playlist like: - #EXTM3U - #EXT-X-VERSION:7 - #EXT-X-TARGETDURATION:2 - #EXT-X-PLAYLIST-TYPE:VOD - #EXT-X-INDEPENDENT-SEGMENTS - #EXT-X-MEDIA-SEQUENCE:1 - #EXT-X-MAP:BYTERANGE="729@0",URI="media-video-1.mp4" - #EXTINF:2.00200, - #EXT-X-BYTERANGE:534220@1361 - video1.mp4 - #EXT-X-ENDLIST - -If you add min_segment_duration and max_segment_duration to the timeline's -metadata dictionary as RationalTime objects, you can control the rule set -deciding how many fragments to accumulate into a single segment. When nothing -is specified for these metadata keys, the adapter will create one segment per -fragment. - -In general, any metadata added to the track metadata dict under the HLS -namespace will be included at the top level of the exported playlist (see -``EXT-X-INDEPENDENT-SEGMENTS`` and ``EXT-X-PLAYLIST-TYPE`` in the example -above). Each segment will pass through any metadata in the HLS namespace from -the media_reference. - -If you write a Timeline with more than one track specified, then the adapter -will create an HLS master playlist. - -The following track metadata keys will be used to inform exported master -playlist metadata per variant stream: - bandwidth - codec - language - mimeType - group_id (audio) - autoselect (audio) - default (audio) -These values are translated to EXT-X-STREAM-INF and EXT-X-MEDIA -attributes as defined in sections 4.3.4.2 and 4.3.4.1 of -draft-pantos-http-live-streaming, respectively. -""" - -import re -import copy - -import opentimelineio as otio - -# TODO: determine output version based on features used -OUTPUT_PLAYLIST_VERSION = "7" - -# TODO: make sure all strings get sanitized through encoding and decoding -PLAYLIST_STRING_ENCODING = "utf-8" - -""" -Matches a single key/value pair from an HLS Attribute List. -See section 4.2 of draft-pantos-http-live-streaming for more detail. -""" -ATTRIBUTE_RE = re.compile( - r'(?P[A-Z0-9-]+)' + r'\=' + - r'(?P(?:\"[^\r\n"]*\")|[^,]+)' + r',?' -) - -""" -Matches AttributeValue of the above regex into appropriate data types. -Note that these are meant to be joined using regex "or" in this order. -""" -_ATTRIBUTE_RE_VALUE_STR_LIST = [ - r'(?P(?P[0-9]+)x(?P[0-9]+))\Z', - r'(?P0[xX](?P[0-9A-F]+))\Z', - r'(?P-?[0-9]+\.[0-9]+)\Z', - r'(?P[0-9]+)\Z', - r'(?P\"(?P[^\r\n"]*)\")\Z', - r'(?P[^",\s]+)\Z' -] -ATTRIBUTE_VALUE_RE = re.compile("|".join(_ATTRIBUTE_RE_VALUE_STR_LIST)) - -""" -Matches a byterange as used in various contexts. -See section 4.3.2.2 of draft-pantos-http-live-streaming for an example use of -this byterange form. -""" -BYTERANGE_RE = re.compile(r'(?P\d+)(?:@(?P\d+))?') - -""" -Matches HLS Playlist tags or comments, respective. -See section 4.1 of draft-pantos-http-live-streaming for more detail. -""" -TAG_RE = re.compile( - r'#(?PEXT[^:\s]+)(?P:?)(?P.*)' -) -COMMENT_RE = re.compile(r'#(?!EXT)(?P.*)') - - -class AttributeListEnum(str): - """ A subclass allowing us to differentiate enums in HLS attribute lists - """ - - -def _value_from_raw_attribute_value(raw_attribute_value): - """ - Takes in a raw AttributeValue and returns an appopritate Python type. - If there is a problem decoding the value, None is returned. - """ - value_match = ATTRIBUTE_VALUE_RE.match(raw_attribute_value) - if not value_match: - return None - - group_dict = value_match.groupdict() - # suss out the match - for k, v in group_dict.items(): - # not a successful group match - if v is None: - continue - - # decode the string - if k == 'resolution': - return v - elif k == 'enumerated': - return AttributeListEnum(v) - elif k == 'hexcidecimal': - return int(group_dict['hex_value'], base=16) - elif k == 'floating_point': - return float(v) - elif k == 'decimal': - return int(v) - elif k == 'string': - # grab only the data within the quotes, excluding the quotes - string_value = group_dict['string_value'] - return string_value - - return None - - -class AttributeList(dict): - """ - Dictionary-like object representing an HLS AttributeList. - See section 4.2 of draft-pantos-http-live-streaming for more detail. - """ - - def __init__(self, other=None): - """ - contstructs an :class:`AttributeList`. - - ``Other`` can be either another dictionary-like object or a list of - key/value pairs - """ - if not other: - return - - try: - items = other.items() - except AttributeError: - items = other - - for k, v in items: - self[k] = v - - def __str__(self): - """ - Construct attribute list string as it would exist in an HLS playlist. - """ - attr_list_entries = [] - # Use a sorted version of the dictionary to ensure consistency - for k, v in sorted(self.items(), key=lambda i: i[0]): - out_value = '' - if isinstance(v, AttributeListEnum): - out_value = v - elif isinstance(v, str): - out_value = f'"{v}"' - else: - out_value = str(v) - - attr_list_entries.append(f'{k}={out_value}') - - return ','.join(attr_list_entries) - - @classmethod - def from_string(cls, attrlist_string): - """ - Accepts an attribute list string and returns an :class:`AttributeList`. - - The values will be transformed to Python types. - """ - attr_list = cls() - match = ATTRIBUTE_RE.search(attrlist_string) - while match: - # unpack the values from the match - group_dict = match.groupdict() - name = group_dict['AttributeName'] - raw_value = group_dict['AttributeValue'] - - # parse the raw value - value = _value_from_raw_attribute_value(raw_value) - attr_list[name] = value - - # search for the next attribute in the string - match_end = match.span()[1] - match = ATTRIBUTE_RE.search(attrlist_string, match_end) - - return attr_list - - -# some special top-levle keys that HLS metadata will be decoded into -FORMAT_METADATA_KEY = 'HLS' -""" -Some concepts are translatable between HLS and other streaming formats (DASH). -These metadata keys are used on OTIO objects outside the HLS namespace because -they are higher level concepts. -""" -STREAMING_METADATA_KEY = 'streaming' -INIT_BYTERANGE_KEY = 'init_byterange' -INIT_URI_KEY = 'init_uri' -SEQUENCE_NUM_KEY = 'sequence_num' -BYTE_OFFSET_KEY = 'byte_offset' -BYTE_COUNT_KEY = 'byte_count' - - -class Byterange: - """Offers interpretation of HLS byte ranges in various forms.""" - - count = None - """(:class:`int`) Number of bytes included in the range.""" - - offset = None - """(:class:`int`) Byte offset at which the range starts.""" - - def __init__(self, count=None, offset=None): - """Constructs a :class:`Byterange` object. - - :param count: (:class:`int`) Number of bytes included in the range. - :param offset: (:class:`int`) Byte offset at which the range starts. - """ - self.count = (count if count is not None else 0) - self.offset = offset - - def __eq__(self, other): - if not isinstance(other, Byterange): - # fall back on identity, this should always be False - return (self is other) - return (self.count == other.count and self.offset == other.offset) - - def __ne__(self, other): - return not self.__eq__(other) - - def __repr__(self): - return '{}(offset = {}, count = {})'.format( - type(self), - str(self.offset), - str(self.count) - ) - - def __str__(self): - """returns a string in HLS format""" - - out_str = str(self.count) - if self.offset is not None: - out_str += f'@{str(self.offset)}' - - return out_str - - def to_dict(self): - """Returns a dict suitable for storing in otio metadata. - - :return: (:class:`dict`) serializable version of byterange. - """ - range_dict = {BYTE_COUNT_KEY: self.count} - if self.offset is not None: - range_dict[BYTE_OFFSET_KEY] = self.offset - - return range_dict - - @classmethod - def from_string(cls, byterange_string): - """Construct a :class:`Byterange` given a string in HLS format. - - :param byterange_string: (:class:`str`) a byterange string. - :return: (:class:`Byterange`) The instance for the provided string. - """ - m = BYTERANGE_RE.match(byterange_string) - - return cls.from_match_dict(m.groupdict()) - - @classmethod - def from_match_dict(cls, match_dict): - """ - Construct a :class:`Byterange` given a groupdict from ``BYTERANGE_RE`` - - :param match_dict: (:class:`dict`) the ``match_dict``. - :return: (:class:`Byterange`) The instance for the provided string. - """ - byterange = cls(count=int(match_dict['n'])) - - try: - byterange.offset = int(match_dict['o']) - except KeyError: - pass - - return byterange - - @classmethod - def from_dict(cls, info_dict): - """ Creates a :class:`Byterange` given a dictionary containing keys - like generated from the :meth:`to_dict method`. - - :param info_dict: (:class:`dict`) Dictionary byterange. - :return: (:class:`Byterange`) an equivalent instance. - """ - byterange = cls( - count=info_dict.get(BYTE_COUNT_KEY), - offset=info_dict.get(BYTE_OFFSET_KEY) - ) - - return byterange - - -""" -For a given collection of media, HLS has two playlist types: - - Media Playlist - - Master Playlist - -The media playlist refers directly to the individual segments that make up an -audio or video track of a given program. The master playlist refers to a -collection of media playlists and provides ways to use them together -(rendition groups). - -See section 2 of draft-pantos-http-live-streaming for more detail. - -The constants below define which tags belong to which schema. -""" - -""" -Basic tags appear in both media and master playlists. -See section 4.3.1 of draft-pantos-http-live-streaming for more detail. -""" -BASIC_TAGS = { - "EXTM3U", - "EXT-X-VERSION" -} - -""" -Media segment tags apply to either the following media or all subsequent -segments. They MUST NOT appear in master playlists. -See section 4.3.2 of draft-pantos-http-live-streaming for more detail. -""" -MEDIA_SEGMENT_TAGS = { - 'EXTINF', - 'EXT-X-BYTERANGE', - 'EXT-X-DISCONTINUITY', - 'EXT-X-KEY', - 'EXT-X-MAP', - 'EXT-X-PROGRAM-DATE-TIME', - 'EXT-X-DATERANGE' -} - -""" The subset of above tags that apply to every segment following them """ -MEDIA_SEGMENT_SUBSEQUENT_TAGS = { - 'EXT-X-KEY', - 'EXT-X-MAP', -} - -""" -Media Playlist tags must only occur once per playlist, and must not appear in -Master Playlists. -See section 4.3.3 of draft-pantos-http-live-streaming for more detail. -""" -MEDIA_PLAYLIST_TAGS = { - 'EXT-X-TARGETDURATION', - 'EXT-X-MEDIA-SEQUENCE', - 'EXT-X-DISCONTINUITY-SEQUENCE', - 'EXT-X-ENDLIST', - 'EXT-X-PLAYLIST-TYPE', - 'EXT-X-I-FRAMES-ONLY' -} - -""" -Master playlist tags declare global parameters for the presentation. -They must not appear in media playlists. -See section 4.3.4 of draft-pantos-http-live-streaming for more detail. -""" -MASTER_PLAYLIST_TAGS = { - 'EXT-X-MEDIA', - 'EXT-X-STREAM-INF', - 'EXT-X-I-FRAME-STREAM-INF', - 'EXT-X-SESSION-DATA', - 'EXT-X-SESSION-KEY', -} - -""" -Media or Master Playlist tags can appear in either media or master playlists. -See section 4.3.5 of draft-pantos-http-live-streaming for more detail. -These tags SHOULD appear in either the media or master playlist. If they occur -in both, their values MUST agree. -These values MUST NOT appear more than once in a playlist. -""" -MEDIA_OR_MASTER_TAGS = { - "EXT-X-INDEPENDENT-SEGMENTS", - "EXT-X-START" -} - -""" -Some special tags used by the parser. -""" -PLAYLIST_START_TAG = "EXTM3U" -PLAYLIST_END_TAG = "EXT-X-ENDLIST" -PLAYLIST_VERSION_TAG = "EXT-X-VERSION" -PLAYLIST_SEGMENT_INF_TAG = "EXTINF" - -""" -attribute list entries to omit from EXT-I-FRAME-STREAM-INF tags -See section 4.3.4.3 of draft-pantos-http-live-streaming for more detail. -""" -I_FRAME_OMIT_ATTRS = { - 'FRAME-RATE', - 'AUDIO', - 'SUBTITLES', - 'CLOSED-CAPTIONS' -} - -""" enum for kinds of playlist entries """ -EntryType = type('EntryType', (), { - 'tag': 'tag', - 'comment': 'comment', - 'URI': 'URI' -}) - -""" enum for types of playlists """ -PlaylistType = type('PlaylistType', (), { - 'media': 'media', - 'master': 'master' -}) - -""" mapping from HLS track type to otio ``TrackKind`` """ -HLS_TRACK_TYPE_TO_OTIO_KIND = { - AttributeListEnum('AUDIO'): otio.schema.TrackKind.Audio, - AttributeListEnum('VIDEO'): otio.schema.TrackKind.Video, - # TODO: determine how to handle SUBTITLES and CLOSED-CAPTIONS -} - -""" mapping from otio ``TrackKind`` to HLS track type """ -OTIO_TRACK_KIND_TO_HLS_TYPE = { - v: k for k, v in HLS_TRACK_TYPE_TO_OTIO_KIND.items() -} - - -class HLSPlaylistEntry: - """An entry in an HLS playlist. - - Entries can be a tag, a comment, or a URI. All HLS playlists are parsed - into lists of :class:`HLSPlaylistEntry` instances that can then be - interpreted against the HLS schema. - """ - - # TODO: rename this to entry_type to fix builtin masking - # type = None - """ (``EntryType``) the type of entry """ - - comment_string = None - """ - (:class:`str`) value of comment (if the ``entry_type`` is - ``EntryType.comment``). - """ - - tag_name = None - """ - (:class:`str`) Name of tag (if the ``entry_type`` is ``EntryType.tag``). - """ - - tag_value = None - """ - (:class:`str`) Value of tag (if the ``entry_type`` is ``EntryType.tag``). - """ - - uri = None - """ - (:class:`str`) Value of the URI (if the ``entry_type is ``EntryType.uri``). - """ - - def __init__(self, type): - """ - Constructs an :class:`HLSPlaylistEntry`. - - :param type: (``EntryType``) Type of entry. - """ - self.type = type - - def __repr__(self): - base_str = 'otio.adapter.HLSPlaylistEntry(type={}'.format( - self.type) - if self.type == EntryType.tag: - base_str += ', tag_name={}, tag_value={}'.format( - repr(self.tag_name), - repr(self.tag_value) - ) - elif self.type == EntryType.comment: - base_str += f', comment={repr(self.comment_string)}' - elif self.type == EntryType.URI: - base_str += f', URI={repr(self.uri)}' - - return base_str + ')' - - def __str__(self): - """ - Returns a string as it would appear in an HLS playlist. - - :return: (:class:`str`) HLS playlist entry string. - """ - if self.type == EntryType.comment and self.comment_string: - return f"# {self.comment_string}" - elif self.type == EntryType.comment: - # empty comments are blank lines - return "" - elif self.type == EntryType.URI: - return self.uri - elif self.type == EntryType.tag: - out_tag_name = self.tag_name - if self.tag_value is not None: - return f'#{out_tag_name}:{self.tag_value}' - else: - return f'#{out_tag_name}' - - @classmethod - def tag_entry(cls, name, value=None): - """ - Creates an ``EntryType.tag`` :class:`HLSPlaylistEntry`. - - :param name: (:class:`str`) tag name. - :param value: (:class:`str`) tag value. - :return: (:class:`HLSPlaylistEntry`) Entry instance. - """ - entry = cls(EntryType.tag) - entry.tag_name = name - entry.tag_value = value - - return entry - - @classmethod - def comment_entry(cls, comment): - """Creates an ``EntryType.comment`` :class:`HLSPlaylistEntry`. - - :param comment: (:class:`str`) the comment. - :return: (:class:`HLSPlaylistEntry`) Entry instance. - """ - entry = cls(EntryType.comment) - entry.comment_string = comment - - return entry - - @classmethod - def uri_entry(cls, uri): - """Creates an ``EntryType.uri`` :class:`HLSPlaylistEntry`. - - :param uri: (:class:`str`) A URI string. - :return: (:class:`HLSPlaylistEntry`) Entry instance. - """ - entry = cls(EntryType.URI) - entry.uri = uri - - return entry - - @classmethod - def from_string(cls, entry_string): - """Creates an `:class:`HLSPlaylistEntry` given a string as it appears - in an HLS playlist. - - :param entry_string: (:class:`str`) String from an HLS playlist. - :return: (:class:`HLSPlaylistEntry`) Entry instance. - """ - # Empty lines are skipped - if not entry_string.strip(): - return None - - # Attempt to parse as a tag - m = TAG_RE.match(entry_string) - if m: - group_dict = m.groupdict() - tag_value = ( - group_dict['tagvalue'] - if group_dict['hasvalue'] else None - ) - entry = cls.tag_entry(group_dict['tagname'], tag_value) - return entry - - # Attempt to parse as a comment - m = COMMENT_RE.match(entry_string) - if m: - entry = cls.comment_entry(m.groupdict()['comment']) - return entry - - # If it's not the others, treat as a URI - entry = cls.uri_entry(entry_string) - - return entry - - """A dispatch dictionary for grabbing the right Regex to parse tags.""" - TAG_VALUE_RE_MAP = { - "EXTINF": re.compile(r'(?P\d+(\.\d*)?),(?P.*$)'), - "EXT-X-BYTERANGE": BYTERANGE_RE, - "EXT-X-KEY": re.compile(r'(?P<attribute_list>.*$)'), - "EXT-X-MAP": re.compile(r'(?P<attribute_list>.*$)'), - "EXT-X-MEDIA-SEQUENCE": re.compile(r'(?P<number>\d+)'), - "EXT-X-PLAYLIST-TYPE": re.compile(r'(?P<type>EVENT|VOD)'), - PLAYLIST_VERSION_TAG: re.compile(r'(?P<n>\d+)') - } - - def parsed_tag_value(self, playlist_version=None): - """Parses and returns ``self.tag_value`` based on the HLS schema. - - The value will be a dictionary where the keys are the names used in the - draft Pantos HTTP Live Streaming doc. When "attribute-list" is - specified, an entry "attribute_list" will be present containing - an :class:`AttributeList` instance. - - :param playlist_version: (:class:`int`) version number of the playlist. - If none is provided, a best guess will be made. - :return: The parsed value. - """ - if self.type != EntryType.tag: - return None - - try: - tag_re = self.TAG_VALUE_RE_MAP[self.tag_name] - except KeyError: - return None - - # parse the tag - m = tag_re.match(self.tag_value) - group_dict = m.groupdict() - - if not m: - return None - - # If the tag value has an attribute list, parse it and add it - try: - attribute_list = group_dict['attribute_list'] - attr_list = AttributeList.from_string(attribute_list) - group_dict['attributes'] = attr_list - except KeyError: - pass - - return group_dict - - -class HLSPlaylistParser: - """Bootstraps HLS parsing and hands the playlist string off to the - appropriate parser for the type - """ - - def __init__(self, edl_string): - self.timeline = otio.schema.Timeline() - self.playlist_type = None - - self._parse_playlist(edl_string) - - def _parse_playlist(self, edl_string): - """Parses the HLS Playlist string line-by-line.""" - # parse lines until we encounter one that identifies the playlist type - # then hand off - start_encountered = False - end_encountered = False - playlist_entries = [] - playlist_version = 1 - for line in edl_string.splitlines(): - # attempt to parse the entry - entry = HLSPlaylistEntry.from_string(line) - if entry is None: - continue - - entry_is_tag = (entry.type == EntryType.tag) - - # identify if the playlist start/end is encountered - if (entry_is_tag and not (start_encountered and end_encountered)): - if entry.tag_name == PLAYLIST_START_TAG: - start_encountered = True - elif entry.tag_name == PLAYLIST_END_TAG: - end_encountered = True - - # if the playlist starting tag hasn't been encountered, ignore - if not start_encountered: - continue - - # Store the parsed entry - playlist_entries.append(entry) - - # Determine if this tells us the playlist type - if not self.playlist_type and entry_is_tag: - if entry.tag_name in MASTER_PLAYLIST_TAGS: - self.playlist_type = PlaylistType.master - elif entry.tag_name in MEDIA_PLAYLIST_TAGS: - self.playlist_type = PlaylistType.media - - if end_encountered: - break - - # try to grab the version from the playlist - if entry_is_tag and entry.tag_name == PLAYLIST_VERSION_TAG: - playlist_version = int(entry.parsed_tag_value()['n']) - - # dispatch to the appropriate schema interpreter - if self.playlist_type is None: - self.timeline = None - raise otio.exceptions.ReadingNotSupportedError( - "could not determine playlist type" - ) - elif self.playlist_type == PlaylistType.master: - self.timeline = None - raise otio.exceptions.AdapterDoesntSupportFunction( - "HLS master playlists are not yet supported" - ) - elif self.playlist_type == PlaylistType.media: - parser = MediaPlaylistParser(playlist_entries, playlist_version) - if len(parser.track): - self.timeline.tracks.append(parser.track) - - -class MediaPlaylistParser: - """Parses an HLS Media playlist returning a SEQUENCE""" - - def __init__(self, playlist_entries, playlist_version=None): - self.track = otio.schema.Track( - metadata={FORMAT_METADATA_KEY: {}} - ) - - self._parse_entries(playlist_entries, playlist_version) - - def _handle_track_metadata(self, entry, playlist_version, clip): - """Stashes the tag value in the track metadata""" - value = entry.tag_value - self.track.metadata[FORMAT_METADATA_KEY][entry.tag_name] = value - - def _handle_discarded_metadata(self, entry, playlist_version, clip): - """Handler for tags that are discarded. This is done when a tag's - information is represented by the native OTIO concepts. - - For instance, the EXT-X-TARGETDURATION tag simply gives a rounded - value for the maximum segment size in the playlist. This can easily - be found in OTIO by examining the clips. - """ - # Do nothing - - def _metadata_dict_for_MAP(self, entry, playlist_version): - entry_data = entry.parsed_tag_value() - attributes = entry_data['attributes'] - map_dict = {} - for attr, value in attributes.items(): - if attr == 'BYTERANGE': - byterange = Byterange.from_string(value) - map_dict[INIT_BYTERANGE_KEY] = byterange.to_dict() - elif attr == 'URI': - map_dict[INIT_URI_KEY] = value - - return map_dict - - def _handle_INF(self, entry, playlist_version, clip): - # This specifies segment duration and optional title - info_dict = entry.parsed_tag_value(playlist_version) - segment_duration = float(info_dict['duration']) - segment_title = info_dict['title'] - available_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, 1), - otio.opentime.RationalTime(segment_duration, 1) - ) - - # Push the info to the clip - clip.media_reference.available_range = available_range - clip.source_range = available_range - clip.name = segment_title - - def _handle_BYTERANGE(self, entry, playlist_version, clip): - reference_metadata = clip.media_reference.metadata - ref_streaming_metadata = reference_metadata.setdefault( - STREAMING_METADATA_KEY, - {} - ) - - # Pull out the byte count and offset - byterange = Byterange.from_match_dict( - entry.parsed_tag_value(playlist_version) - ) - ref_streaming_metadata.update(byterange.to_dict()) - - """ - Specifies handlers for specific HLS tags. - """ - TAG_HANDLERS = { - "EXTINF": _handle_INF, - PLAYLIST_VERSION_TAG: _handle_track_metadata, - "EXT-X-TARGETDURATION": _handle_discarded_metadata, - "EXT-X-MEDIA-SEQUENCE": _handle_discarded_metadata, - "EXT-X-PLAYLIST-TYPE": _handle_track_metadata, - "EXT-X-INDEPENDENT-SEGMENTS": _handle_track_metadata, - "EXT-X-BYTERANGE": _handle_BYTERANGE - } - - def _parse_entries(self, playlist_entries, playlist_version): - """Interpret the entries through the lens of the schema""" - current_clip = otio.schema.Clip( - media_reference=otio.schema.ExternalReference( - metadata={ - FORMAT_METADATA_KEY: {}, - STREAMING_METADATA_KEY: {} - } - ) - ) - current_media_ref = current_clip.media_reference - segment_metadata = {} - current_map_data = {} - # per section 4.3.3.2 of Pantos HLS, 0 is default start track - current_track = 0 - for entry in playlist_entries: - if entry.type == EntryType.URI: - # the URI ends the segment definition - current_media_ref.target_url = entry.uri - current_media_ref.metadata[FORMAT_METADATA_KEY].update( - segment_metadata - ) - current_media_ref.metadata[STREAMING_METADATA_KEY].update( - current_map_data - ) - current_clip.metadata.setdefault( - STREAMING_METADATA_KEY, - {} - )[SEQUENCE_NUM_KEY] = current_track - self.track.append(current_clip) - current_track += 1 - - # Set up the next segment definition - current_clip = otio.schema.Clip( - media_reference=otio.schema.ExternalReference( - metadata={ - FORMAT_METADATA_KEY: {}, - STREAMING_METADATA_KEY: {} - } - ) - ) - current_media_ref = current_clip.media_reference - continue - elif entry.type != EntryType.tag: - # the rest of the code deals only with tags - continue - - # Explode the EXT-X-MAP info out - if entry.tag_name == "EXT-X-MAP": - map_data = self._metadata_dict_for_MAP(entry, playlist_version) - current_map_data.update(map_data) - continue - - # Grab the track when it comes around - if entry.tag_name == "EXT-X-MEDIA-SEQUENCE": - entry_data = entry.parsed_tag_value() - current_track = int(entry_data['number']) - - # If the segment tag is one that applies to all that follow - # store the value to be applied to each segment - if entry.tag_name in MEDIA_SEGMENT_SUBSEQUENT_TAGS: - segment_metadata[entry.tag_name] = entry.tag_value - continue - - # use a handler if available - try: - handler = self.TAG_HANDLERS[entry.tag_name] - handler(self, entry, playlist_version, current_clip) - continue - except KeyError: - pass - - # add the tag to the reference metadata at the correct level - if entry.tag_name in [PLAYLIST_START_TAG, PLAYLIST_END_TAG]: - continue - elif entry.tag_name in MEDIA_SEGMENT_TAGS: - # Media segments translate into media refs - hls_metadata = current_media_ref.metadata[FORMAT_METADATA_KEY] - hls_metadata[entry.tag_name] = entry.tag_value - elif entry.tag_name in MEDIA_PLAYLIST_TAGS: - # Media playlists translate into tracks - hls_metadata = self.track.metadata[FORMAT_METADATA_KEY] - hls_metadata[entry.tag_name] = entry.tag_value - - -""" -Compatibility version list: - EXT-X-BYTERANGE >= 4 - EXT-X-I-FRAMES-ONLY >= 4 - EXT-X-MAP in media playlist with EXT-X-I-FRAMES-ONLY >= 5 - EXT-X-MAP in media playlist without I-FRAMES-ONLY >= 6 - EXT-X-KEY constrants are by attributes specified: - - IV >= 2 - - KEYFORMAT >= 5 - - KEYFORMATVERSIONS >= 5 - EXTINF with floating point vaules >= 3 - - master playlist: - EXT-X-MEDIA with INSTREAM-ID="SERVICE" -""" - - -def entries_for_segment( - uri, - segment_duration, - segment_name=None, - segment_byterange=None, - segment_tags=None -): - """Creates a set of :class:`HLSPlaylistEntries` with the given parameters. - - :param uri: (:class:`str`) The uri for the segment media. - :param segment_duration: (:class:`opentimelineio.opentime.RationalTime`) - playback duration of the segment. - :param segment_byterange: (:class:`ByteRange`) The data range for the - segment in the media (if required) - :param segment_tags: (:class:`dict`) key/value pairs of to become - additional tags for the segment - - :return: (:class:`list`) a group of :class:`HLSPlaylistEntry` instances for - the segment - """ - # Create the tags dict to build - if segment_tags: - tags = copy.deepcopy(segment_tags) - else: - tags = {} - - # Start building the entries list - segment_entries = [] - - # add the EXTINF - name = segment_name if segment_name is not None else '' - tag_value = '{:.5f},{}'.format( - otio.opentime.to_seconds(segment_duration), - name - ) - extinf_entry = HLSPlaylistEntry.tag_entry('EXTINF', tag_value) - segment_entries.append(extinf_entry) - - # add the additional tags - tag_entries = [ - HLSPlaylistEntry.tag_entry(k, v) for k, v in - tags.items() - ] - segment_entries.extend(tag_entries) - - # Now add the byterange for the entry - if segment_byterange: - byterange_entry = HLSPlaylistEntry.tag_entry( - 'EXT-X-BYTERANGE', - str(segment_byterange) - ) - segment_entries.append(byterange_entry) - - # Add the URI - # this method expects all fragments come from the same source file - uri_entry = HLSPlaylistEntry.uri_entry(uri) - segment_entries.append(uri_entry) - - return segment_entries - - -def stream_inf_attr_list_for_track(track): - """ Builds an :class:`AttributeList` instance for use in ``STREAM-INF`` - tags for the provided track. - - :param track: (:class:`otio.schema.Track`) A track representing a - variant stream - :return: (:class:`AttributeList`) The instance from the metadata - """ - streaming_metadata = track.metadata.get(STREAMING_METADATA_KEY, {}) - - attributes = [] - bandwidth = streaming_metadata.get('bandwidth') - if bandwidth is not None: - attributes.append(('BANDWIDTH', bandwidth)) - - codec = streaming_metadata.get('codec') - if codec is not None: - attributes.append(('CODECS', codec)) - - frame_rate = streaming_metadata.get('frame_rate') - if frame_rate is not None: - attributes.append(('FRAME-RATE', frame_rate)) - - if 'width' in streaming_metadata and 'height' in streaming_metadata: - resolution = "{}x{}".format( - streaming_metadata['width'], - streaming_metadata['height'] - ) - attributes.append(('RESOLUTION', AttributeListEnum(resolution))) - - al = AttributeList(attributes) - - return al - - -def master_playlist_to_string(master_timeline): - """Writes a master playlist describing the tracks""" - - # start with a version number of 1, as features are encountered, we will - # update the version accordingly - version_requirements = {1} - - # TODO: detect rather than forcing version 6 - version_requirements.add(6) - - header_tags = copy.copy( - master_timeline.metadata.get(FORMAT_METADATA_KEY, {}) - ) - - # Filter out any values from the HLS metadata that aren't meant to become - # tags, such as the directive to force an HLS master playlist - hls_md_rejectlist = ['master_playlist'] - for key in hls_md_rejectlist: - try: - del header_tags[key] - except KeyError: - pass - - playlist_entries = [] - - # First declare the non-visual media - hls_type_count = {} - video_tracks = [] - audio_tracks = [ - t for t in master_timeline.tracks if - t.kind == otio.schema.TrackKind.Audio - ] - for track in master_timeline.tracks: - if track.kind == otio.schema.TrackKind.Video: - # video is done later, skip - video_tracks.append(track) - continue - - # Determine the HLS type - hls_type = OTIO_TRACK_KIND_TO_HLS_TYPE[track.kind] - - streaming_metadata = track.metadata.get(STREAMING_METADATA_KEY, {}) - - # Find the group name - try: - group_id = streaming_metadata['group_id'] - except KeyError: - sub_id = hls_type_count.setdefault(hls_type, 1) - group_id = f'{hls_type}{sub_id}' - hls_type_count[hls_type] += 1 - - media_playlist_default_uri = f"{track.name}.m3u8" - try: - track_uri = track.metadata[FORMAT_METADATA_KEY].get( - 'uri', - media_playlist_default_uri - ) - except KeyError: - track_uri = media_playlist_default_uri - - # Build the attribute list - attributes = AttributeList( - [ - ('TYPE', hls_type), - ('GROUP-ID', group_id), - ('URI', track_uri), - ('NAME', track.name), - ] - ) - - if streaming_metadata.get('autoselect'): - attributes['AUTOSELECT'] = AttributeListEnum('YES') - - if streaming_metadata.get('default'): - attributes['DEFAULT'] = AttributeListEnum('YES') - - # Finally, create the tag - entry = HLSPlaylistEntry.tag_entry( - 'EXT-X-MEDIA', - str(attributes) - ) - - playlist_entries.append(entry) - - # Add a blank line in the playlist to separate sections - if playlist_entries: - playlist_entries.append(HLSPlaylistEntry.comment_entry('')) - - # First write any i-frame playlist entires - iframe_list_entries = [] - for track in video_tracks: - try: - iframe_uri = track.metadata[FORMAT_METADATA_KEY]['iframe_uri'] - except KeyError: - # don't include iframe playlist - continue - - # Create the attribute list - attribute_list = stream_inf_attr_list_for_track(track) - - # Remove entries to not be included for I-Frame streams - for attr in I_FRAME_OMIT_ATTRS: - try: - del attribute_list[attr] - except KeyError: - pass - - # Add the URI - attribute_list['URI'] = iframe_uri - - iframe_list_entries.append( - HLSPlaylistEntry.tag_entry( - 'EXT-X-I-FRAME-STREAM-INF', - str(attribute_list) - ) - ) - - if iframe_list_entries: - iframe_list_entries.append(HLSPlaylistEntry.comment_entry('')) - - playlist_entries.extend(iframe_list_entries) - - # Write an EXT-STREAM-INF for each rendition set - for track in video_tracks: - # create the base attribute list for the video track - al = stream_inf_attr_list_for_track(track) - - # Create the uri - media_playlist_default_uri = f"{track.name}.m3u8" - try: - track_uri = track.metadata[FORMAT_METADATA_KEY].get( - 'uri', media_playlist_default_uri - ) - except KeyError: - track_uri = media_playlist_default_uri - uri_entry = HLSPlaylistEntry.uri_entry(track_uri) - - # TODO: this will break when we have subtitle and CC tracks - added_entry = False - for audio_track in audio_tracks: - if track.name not in audio_track.metadata['linked_tracks']: - continue - - # Write an entry for using these together - try: - audio_track_streaming_metadata = audio_track.metadata[ - STREAMING_METADATA_KEY - ] - aud_group = audio_track_streaming_metadata['group_id'] - aud_codec = audio_track_streaming_metadata['codec'] - aud_bandwidth = audio_track_streaming_metadata['bandwidth'] - except KeyError: - raise TypeError( - "HLS audio tracks must have 'codec', 'group_id', and" - " 'bandwidth' specified in metadata" - ) - - combo_al = copy.copy(al) - combo_al['CODECS'] += f',{aud_codec}' - combo_al['AUDIO'] = aud_group - combo_al['BANDWIDTH'] += aud_bandwidth - - entry = HLSPlaylistEntry.tag_entry( - 'EXT-X-STREAM-INF', - str(combo_al) - ) - playlist_entries.append(entry) - playlist_entries.append(uri_entry) - - added_entry = True - - if not added_entry: - # write out one simple entry - entry = HLSPlaylistEntry.tag_entry( - 'EXT-X-STREAM-INF', - str(al) - ) - playlist_entries.append(entry) - playlist_entries.append(uri_entry) - - # add a break before the next grouping of entries - playlist_entries.append(HLSPlaylistEntry.comment_entry('')) - - out_entries = [HLSPlaylistEntry.tag_entry(PLAYLIST_START_TAG, None)] - - playlist_version = max(version_requirements) - playlist_version_entry = HLSPlaylistEntry.tag_entry( - PLAYLIST_VERSION_TAG, - str(playlist_version) - ) - - out_entries.append(playlist_version_entry) - - out_entries += ( - HLSPlaylistEntry.tag_entry(k, v) for k, v in header_tags.items() - ) - - # separate the header entries from the rest of the entries - out_entries.append(HLSPlaylistEntry.comment_entry('')) - - out_entries += playlist_entries - - playlist_string = '\n'.join( - str(entry) for entry in out_entries - ) - - return playlist_string - - -class MediaPlaylistWriter(): - - def __init__( - self, - media_track, - min_seg_duration=None, - max_seg_duration=None - ): - # Default to one segment per fragment - if min_seg_duration is None: - min_seg_duration = otio.opentime.RationalTime(0, 1) - if max_seg_duration is None: - max_seg_duration = otio.opentime.RationalTime(0, 1) - - self._min_seg_duration = min_seg_duration - self._max_seg_duration = max_seg_duration - - self._playlist_entries = [] - self._playlist_tags = {} - - # Whenever an entry is added that has a minimum version requirement, - # we add that version to this set. The max value from this set is the - # playlist's version requirement - self._versions_used = {1} - - # TODO: detect rather than forcing version 7 - self._versions_used.add(7) - - # Start the build - self._build_playlist_with_track(media_track) - - def _build_playlist_with_track(self, media_track): - """ - Executes methods to result in a fully populated _playlist_entries list - """ - self._copy_HLS_metadata(media_track) - self._setup_track_info(media_track) - self._add_segment_entries(media_track) - self._finalize_entries(media_track) - - def _copy_HLS_metadata(self, media_track): - """ - Copies any metadata in the "HLS" namespace from the track to the - playlist-global tags - """ - # Grab any metadata provided on the otio - try: - track_metadata = media_track.metadata[FORMAT_METADATA_KEY] - self._playlist_tags.update(track_metadata) - - # Remove the version tag from the track metadata, we'll compute - # based on what we write out - del self._playlist_tags[PLAYLIST_VERSION_TAG] - - except KeyError: - pass - - # additionally remove metadata keys added for providing master - # playlist URIs - for key in ('uri', 'iframe_uri'): - try: - del self._playlist_tags[key] - except KeyError: - pass - - def _setup_track_info(self, media_track): - """sets up playlist global metadata""" - - # Setup the track start - if 'EXT-X-I-FRAMES-ONLY' in media_track.metadata.get( - FORMAT_METADATA_KEY, - {} - ): - # I-Frame playlists start at zero no matter what - track_start = 0 - else: - # Pull the track num from the first clip, if provided - first_segment_streaming_metadata = media_track[0].metadata.get( - STREAMING_METADATA_KEY, - {} - ) - track_start = first_segment_streaming_metadata.get( - SEQUENCE_NUM_KEY - ) - - # If we found a track start or one isn't already set in the - # metadata, create the tag for it. - if ( - track_start is not None or - 'EXT-X-MEDIA-SEQUENCE' not in self._playlist_tags - ): - # Choose a reasonable track start default - if track_start is None: - track_start = 1 - self._playlist_tags['EXT-X-MEDIA-SEQUENCE'] = str(track_start) - - def _add_map_entry(self, fragment): - """adds an EXT-X-MAP entry from the given fragment - - returns the added entry - """ - - media_ref = fragment.media_reference - - # Extract useful tag data - media_ref_streaming_metadata = media_ref.metadata[ - STREAMING_METADATA_KEY - ] - uri = media_ref_streaming_metadata[INIT_URI_KEY] - seg_map_byterange_dict = media_ref_streaming_metadata.get( - INIT_BYTERANGE_KEY - ) - - # Create the attrlist - map_attr_list = AttributeList([ - ('URI', uri), - ]) - - # Add the byterange if provided - if seg_map_byterange_dict is not None: - seg_map_byterange = Byterange.from_dict(seg_map_byterange_dict) - map_attr_list['BYTERANGE'] = str(seg_map_byterange) - - # Construct the entry with the attrlist as the value - map_tag_str = str(map_attr_list) - entry = HLSPlaylistEntry.tag_entry("EXT-X-MAP", map_tag_str) - - self._playlist_entries.append(entry) - - return entry - - def _add_entries_for_segment_from_fragments( - self, - fragments, - omit_hls_keys=None, - is_iframe_playlist=False - ): - """ - For the given list of otio clips representing fragments in the mp4, - add playlist entries for single HLS segment. - - :param fragments: (:clas:`list`) :class:`opentimelineio.schema.Clip` - objects to write as a contiguous segment. - :param omit_hls_keys: (:class:`list`) metadata keys from the original - "HLS" metadata namespeaces will not be passed through. - :param is_iframe_playlist: (:class:`bool`) If true, writes one segment - per fragment, otherwise writes all fragments as a single segment - - :return: (:class:`list` the :class:`HLSPlaylistEntry` instances added - to the playlist - """ - if is_iframe_playlist: - entries = [] - for fragment in fragments: - name = '' - fragment_range = Byterange.from_dict( - fragment.media_reference.metadata[STREAMING_METADATA_KEY] - ) - - segment_tags = {} - frag_tags = fragment.media_reference.metadata.get( - FORMAT_METADATA_KEY, - {} - ) - segment_tags.update(copy.deepcopy(frag_tags)) - - # scrub any metadata marked for omission - omit_hls_keys = omit_hls_keys or [] - for key in omit_hls_keys: - try: - del segment_tags[key] - except KeyError: - pass - - segment_entries = entries_for_segment( - fragment.media_reference.target_url, - fragment.duration(), - name, - fragment_range, - segment_tags - ) - entries.extend(segment_entries) - - self._playlist_entries.extend(entries) - return entries - - segment_tags = {} - for fragment in fragments: - frag_tags = fragment.media_reference.metadata.get( - FORMAT_METADATA_KEY, - {} - ) - segment_tags.update(copy.deepcopy(frag_tags)) - - # scrub any metadata marked for omission - omit_hls_keys = omit_hls_keys or [] - for key in omit_hls_keys: - try: - del segment_tags[key] - except KeyError: - pass - - # Calculate the byterange for the segment (if byteranges are specified) - first_ref = fragments[0].media_reference - first_ref_streaming_md = first_ref.metadata[STREAMING_METADATA_KEY] - if 'byte_offset' in first_ref_streaming_md and len(fragments) == 1: - segment_range = Byterange.from_dict(first_ref_streaming_md) - elif 'byte_offset' in first_ref_streaming_md: - # Find the byterange encapsulating everything - last_ref = fragments[-1].media_reference - last_ref_streaming_md = last_ref.metadata[STREAMING_METADATA_KEY] - first_range = Byterange.from_dict(first_ref_streaming_md) - last_range = Byterange.from_dict(last_ref_streaming_md) - - segment_offset = first_range.offset - segment_end = (last_range.offset + last_range.count) - segment_count = segment_end - segment_offset - segment_range = Byterange(segment_count, segment_offset) - else: - segment_range = None - - uri = fragments[0].media_reference.target_url - - # calculate the combined duration - segment_duration = fragments[0].duration() - for frag in fragments[1:]: - segment_duration += frag.duration() - - # TODO: Determine how to pass a segment name in - segment_name = '' - segment_entries = entries_for_segment( - uri, - segment_duration, - segment_name, - segment_range, - segment_tags - ) - - self._playlist_entries.extend(segment_entries) - return segment_entries - - def _fragments_have_same_map(self, fragment, following_fragment): - """ - Given fragment and following_fragment, returns whether or not their - initialization data is the same (what becomes EXT-X-MAP) - """ - media_ref = fragment.media_reference - media_ref_streaming_md = media_ref.metadata.get( - STREAMING_METADATA_KEY, - {} - ) - following_ref = following_fragment.media_reference - following_ref_streaming_md = following_ref.metadata.get( - STREAMING_METADATA_KEY, - {} - ) - # Check the init file - init_uri = media_ref_streaming_md.get(INIT_URI_KEY) - following_init_uri = media_ref_streaming_md.get(INIT_URI_KEY) - if init_uri != following_init_uri: - return False - - # Check the init byterange - init_dict = media_ref_streaming_md.get(INIT_BYTERANGE_KEY) - following_init_dict = following_ref_streaming_md.get( - INIT_BYTERANGE_KEY - ) - - dummy_range = Byterange(0, 0) - init_range = ( - Byterange.from_dict(init_dict) if init_dict else dummy_range - ) - following_range = ( - Byterange.from_dict(following_init_dict) - if following_init_dict else dummy_range - ) - - if init_range != following_range: - return False - - return True - - def _fragments_are_contiguous(self, fragment, following_fragment): - """ Given fragment and following_fragment (otio clips) returns whether - or not they are contiguous. - - To be contiguous the fragments must: - 1. have the same file URL - 2. have the same initialization data (what becomes EXT-X-MAP) - 3. be adjacent in the file (follwoing_fragment's first byte directly - follows fragment's last byte) - - Returns True if following_fragment is contiguous from fragment - """ - # Fragments are contiguous if: - # 1. They have the file url - # 2. They have the same map info - # 3. Their byte ranges are contiguous - media_ref = fragment.media_reference - media_ref_streaming_md = media_ref.metadata.get( - STREAMING_METADATA_KEY, - {} - ) - following_ref = following_fragment.media_reference - following_ref_streaming_md = following_ref.metadata.get( - STREAMING_METADATA_KEY, - {} - ) - if media_ref.target_url != following_ref.target_url: - return False - - if ( - media_ref_streaming_md.get(INIT_URI_KEY) != - following_ref_streaming_md.get(INIT_URI_KEY) - ): - return False - - if not self._fragments_have_same_map(fragment, following_fragment): - return False - - # Check if fragments are contiguous in file - try: - frag_end = ( - media_ref_streaming_md['byte_offset'] + - media_ref_streaming_md['byte_count'] - ) - if frag_end != following_ref_streaming_md['byte_offset']: - return False - except KeyError: - return False - - # since we haven't returned yet, all checks must have passed! - return True - - def _add_segment_entries(self, media_track): - """given a media track, generates the segment entries""" - - # Determine whether or not this is an I-Frame playlist - track_hls_metadata = media_track.metadata.get('HLS') - is_iframe_playlist = 'EXT-X-I-FRAMES-ONLY' in track_hls_metadata - - # Make a list copy of the fragments - fragments = [clip for clip in media_track] - - segment_durations = [] - previous_fragment = None - map_changed = True - while fragments: - # There should be at least one fragment per segment - frag_it = iter(fragments) - first_frag = next(frag_it) - gathered_fragments = [first_frag] - gathered_duration = first_frag.duration() - - # Determine this segment will need a new EXT-X-MAP entry - map_changed = ( - True if previous_fragment is None else - not self._fragments_have_same_map( - previous_fragment, - first_frag - ) - ) - - # Iterate through the remaining fragments until a discontinuity - # is found, our time limit is met, or we add all the fragments to - # the segment - for fragment in frag_it: - # Determine whther or not the fragments are contiguous - previous_fragment = gathered_fragments[-1] - contiguous = self._fragments_are_contiguous( - previous_fragment, - fragment - ) - - # Determine if we've hit our segment time conditions - new_duration = gathered_duration + fragment.duration() - segment_full = ( - gathered_duration >= self._min_seg_duration or - new_duration > self._max_seg_duration - ) - - # End condition met, cut the segment - if not contiguous or segment_full: - break - - # Include the fragment - gathered_duration = new_duration - gathered_fragments.append(fragment) - - # Write out the segment and start the next - start_fragment = gathered_fragments[0] - - # If the map for this segment was a change, write it - if map_changed: - self._add_map_entry(start_fragment) - - # add the entries for the segment. Omit any EXT-X-MAP metadata - # that may have come in from reading a file (we're updating) - self._add_entries_for_segment_from_fragments( - gathered_fragments, - omit_hls_keys=('EXT-X-MAP'), - is_iframe_playlist=is_iframe_playlist - ) - - duration_seconds = otio.opentime.to_seconds(gathered_duration) - segment_durations.append(duration_seconds) - - # in the next iteration, start where we left off - fragments = fragments[len(gathered_fragments):] - - # Set the max segment duration - max_duration = round(max(segment_durations)) - self._playlist_tags['EXT-X-TARGETDURATION'] = str(int(max_duration)) - - def _finalize_entries(self, media_track): - """Does final wrap-up of playlist entries""" - - self._playlist_tags['EXT-X-PLAYLIST-TYPE'] = 'VOD' - - # add the end - end_entry = HLSPlaylistEntry.tag_entry(PLAYLIST_END_TAG) - self._playlist_entries.append(end_entry) - - # find the maximum HLS feature version we've used - playlist_version = max(self._versions_used) - playlist_version_entry = HLSPlaylistEntry.tag_entry( - PLAYLIST_VERSION_TAG, - str(playlist_version) - ) - - # now that we know what was used, let's prepend the header - playlist_header_entries = [ - HLSPlaylistEntry.tag_entry(PLAYLIST_START_TAG), - playlist_version_entry - ] - - # add in the rest of the header entries in a deterministic order - playlist_header_entries += ( - HLSPlaylistEntry.tag_entry(k, v) - for k, v in sorted(self._playlist_tags.items(), key=lambda i: i[0]) - ) - - # Prepend the entries with the header entries - self._playlist_entries = ( - playlist_header_entries + self._playlist_entries - ) - - def playlist_string(self): - """Returns the string representation of the playlist entries""" - - return '\n'.join( - str(entry) for entry in self._playlist_entries - ) - -# Public interface - - -def read_from_string(input_str): - """Adapter entry point for reading.""" - - parser = HLSPlaylistParser(input_str) - return parser.timeline - - -def write_to_string(input_otio): - """Adapter entry point for writing.""" - - if len(input_otio.tracks) == 0: - return None - - # Determine whether we should write a media or master playlist - try: - write_master = input_otio.metadata['HLS']['master_playlist'] - except KeyError: - # If no explicit directive, infer - write_master = (len(input_otio.tracks) > 1) - - if write_master: - return master_playlist_to_string(input_otio) - else: - media_track = input_otio.tracks[0] - track_streaming_md = input_otio.metadata.get( - STREAMING_METADATA_KEY, - {} - ) - min_seg_duration = track_streaming_md.get('min_segment_duration') - max_seg_duration = track_streaming_md.get('max_segment_duration') - - writer = MediaPlaylistWriter( - media_track, - min_seg_duration, - max_seg_duration - ) - return writer.playlist_string() diff --git a/contrib/opentimelineio_contrib/adapters/maya_sequencer.py b/contrib/opentimelineio_contrib/adapters/maya_sequencer.py deleted file mode 100644 index 6ea9bd6dd..000000000 --- a/contrib/opentimelineio_contrib/adapters/maya_sequencer.py +++ /dev/null @@ -1,111 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Maya Sequencer Adapter Harness""" - -import os -import subprocess - -from .. import adapters - - -def write_to_file(input_otio, filepath): - if "OTIO_MAYA_PYTHON_BIN" not in os.environ: - raise RuntimeError( - "'OTIO_MAYA_PYTHON_BIN' not set, please set this to path to " - "mayapy within the Maya installation." - ) - maya_python_path = os.environ["OTIO_MAYA_PYTHON_BIN"] - if not os.path.exists(maya_python_path): - raise RuntimeError( - 'Cannot access file at OTIO_MAYA_PYTHON_BIN: "{}"'.format( - maya_python_path - ) - ) - if os.path.isdir(maya_python_path): - raise RuntimeError( - "OTIO_MAYA_PYTHON_BIN contains a path to a directory, not to an " - "executable file: {}".format(maya_python_path) - ) - - input_data = adapters.write_to_string(input_otio, "otio_json") - - os.environ['PYTHONPATH'] = ( - os.pathsep.join( - [ - os.environ.setdefault('PYTHONPATH', ''), - os.path.dirname(__file__) - ] - ) - ) - - proc = subprocess.Popen( - [ - os.environ["OTIO_MAYA_PYTHON_BIN"], - '-m', - 'extern_maya_sequencer', - 'write', - filepath - ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - stdin=subprocess.PIPE, - env=os.environ - ) - proc.stdin.write(input_data) - out, err = proc.communicate() - - if proc.returncode: - raise RuntimeError( - "ERROR: extern_maya_sequencer (called through the maya sequencer " - "file adapter) failed. stderr output: " + err - ) - - -def read_from_file(filepath): - if "OTIO_MAYA_PYTHON_BIN" not in os.environ: - raise RuntimeError( - "'OTIO_MAYA_PYTHON_BIN' not set, please set this to path to " - "mayapy within the Maya installation." - ) - - os.environ['PYTHONPATH'] = ( - os.pathsep.join( - [ - os.environ.setdefault('PYTHONPATH', ''), - os.path.dirname(__file__) - ] - ) - ) - - proc = subprocess.Popen( - [ - os.environ["OTIO_MAYA_PYTHON_BIN"], - '-m', - 'extern_maya_sequencer', - 'read', - filepath - ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - stdin=subprocess.PIPE, - env=os.environ - ) - out, err = proc.communicate() - - # maya probably puts a bunch of crap on the stdout - sentinel_str = "OTIO_JSON_BEGIN\n" - end_sentinel_str = "\nOTIO_JSON_END\n" - start = out.find(sentinel_str) - end = out.find(end_sentinel_str) - result = adapters.read_from_string( - out[start + len(sentinel_str):end], - "otio_json" - ) - - if proc.returncode: - raise RuntimeError( - "ERROR: extern_maya_sequencer (called through the maya sequencer " - "file adapter) failed. stderr output: " + err - ) - return result diff --git a/contrib/opentimelineio_contrib/adapters/tests/__init__.py b/contrib/opentimelineio_contrib/adapters/tests/__init__.py deleted file mode 100644 index 686a8cb5f..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/2997fps-DFTC.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/2997fps-DFTC.aaf deleted file mode 100644 index f0c206cf3..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/2997fps-DFTC.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/2997fps.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/2997fps.aaf deleted file mode 100644 index 9add76b0c..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/2997fps.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/30fps.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/30fps.aaf deleted file mode 100644 index 10d06dfbc..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/30fps.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/composite.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/composite.aaf deleted file mode 100755 index c24f00b3a..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/composite.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/duplicates.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/duplicates.aaf deleted file mode 100644 index 2f7561540..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/duplicates.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/essence_group.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/essence_group.aaf deleted file mode 100644 index 7802e2201..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/essence_group.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_clips.fcpxml b/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_clips.fcpxml deleted file mode 100644 index a893cedf5..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_clips.fcpxml +++ /dev/null @@ -1,96 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE fcpxml> - -<fcpxml version="1.8"> - <resources> - <media id="r1" name="compound_clip_1" uid="JQCJMjHxQRKdo3UOjQKiNQ" modDate="2019-03-29 08:25:02 -0400"> - <sequence duration="80s" format="r2" tcStart="0s" tcFormat="NDF"> - <spine> - <clip name="IMG_0233" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0268" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r4" duration="22120/600s"/> - </clip> - <clip name="IMG_0268" lane="-1" offset="518405621/144000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="22120/600s"> - <audio lane="-1" offset="0s" ref="r4" duration="26566800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0857" offset="40s" ref="r5" duration="10s" start="15700/3000s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="50s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0858" offset="60s" ref="r6" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - </spine> - </sequence> - </media> - <format id="r2" name="FFVideoFormat1080p30" frameDuration="100/3000s" width="1920" height="1080" colorSpace="1-1-1 (Rec. 709)"/> - <asset id="r3" name="IMG_0233" uid="ADC4EA0142E5E6ACE007A68DB862A9AF" src="file:///Volumes/Media/otio/IMG_0233.MOV" start="0s" duration="27129/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - </metadata> - </asset> - <asset id="r4" name="IMG_0268" uid="DE75B4D17E963D0E83CFF64B4AE712BE" src="file:///Volumes/Media/otio/IMG_0268.MOV" start="0s" duration="22139/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - </metadata> - </asset> - <asset id="r5" name="IMG_0857" uid="96D00EC92B431A8ECDDE741DF63CF602" src="file:///Volumes/Media/otio/IMG_0857.MOV" start="0s" duration="40880/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - </metadata> - </asset> - <asset id="r6" name="IMG_0858" uid="41558C6C85370A79187F8E7A51DD04DB" src="file:///Volumes/Media/otio/IMG_0858.MOV" start="0s" duration="12681/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - </metadata> - </asset> - </resources> - <ref-clip name="compound_clip_1" ref="r1" duration="80s" useAudioSubroles="1"/> - <asset-clip name="IMG_0857" ref="r5" duration="40880/600s" audioRole="dialogue" format="r2" tcFormat="NDF"> - <note>Truck in snow</note> - <keyword start="0s" duration="204400/3000s" value="snow"/> - <keyword start="43/3s" duration="69400/3000s" value="truck"/> - <metadata> - <md key="com.apple.proapps.studio.angle" value="B"/> - </metadata> - </asset-clip> - <asset-clip name="IMG_0858" ref="r6" duration="15217200/720000s" audioRole="dialogue" format="r2" tcFormat="NDF"/> -</fcpxml> \ No newline at end of file diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_event.fcpxml b/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_event.fcpxml deleted file mode 100644 index 746933860..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_event.fcpxml +++ /dev/null @@ -1,379 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE fcpxml> - -<fcpxml version="1.8"> - <resources> - <media id="r1" name="compound_clip_1" uid="JQCJMjHxQRKdo3UOjQKiNQ" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="80s" format="r2" tcStart="0s" tcFormat="NDF"> - <spine> - <clip name="IMG_0233" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0268" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r4" duration="22120/600s"/> - </clip> - <clip name="IMG_0268" lane="-1" offset="518405621/144000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="22120/600s"> - <audio lane="-1" offset="0s" ref="r4" duration="26566800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0857" offset="40s" ref="r5" duration="10s" start="15700/3000s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="50s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0858" offset="60s" ref="r6" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - </spine> - </sequence> - </media> - <format id="r2" name="FFVideoFormat1080p30" frameDuration="100/3000s" width="1920" height="1080" colorSpace="1-1-1 (Rec. 709)"/> - <asset id="r3" name="IMG_0233" uid="ADC4EA0142E5E6ACE007A68DB862A9AF" src="file:///Volumes/Media/otio/IMG_0233.MOV" start="0s" duration="27129/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2018-07-24 18:01:05 -0400"/> - </metadata> - </asset> - <asset id="r4" name="IMG_0268" uid="DE75B4D17E963D0E83CFF64B4AE712BE" src="file:///Volumes/Media/otio/IMG_0268.MOV" start="0s" duration="22139/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2018-07-24 17:56:32 -0400"/> - </metadata> - </asset> - <asset id="r5" name="IMG_0857" uid="96D00EC92B431A8ECDDE741DF63CF602" src="file:///Volumes/Media/otio/IMG_0857.MOV" start="0s" duration="40880/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> - </metadata> - </asset> - <asset id="r6" name="IMG_0858" uid="41558C6C85370A79187F8E7A51DD04DB" src="file:///Volumes/Media/otio/IMG_0858.MOV" start="0s" duration="12681/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> - </metadata> - </asset> - <media id="r7" name="compound_clip_2" uid="QUr8IBhIRVauQiNWSolvCA" modDate="2019-02-16 07:51:12 -0500"> - <sequence duration="267800/3000s" format="r2" tcStart="0s" tcFormat="NDF"> - <spine> - <asset-clip name="IMG_0857" offset="0s" ref="r5" duration="40880/600s" audioRole="dialogue" tcFormat="NDF"/> - <asset-clip name="IMG_0858" offset="40880/600s" ref="r6" duration="12680/600s" audioRole="dialogue" tcFormat="NDF"/> - </spine> - </sequence> - </media> - <asset id="r8" name="IMG_0513" uid="635EB126C1838B458DB4BF90E78A2D84" src="file:///Volumes/Media/otio/IMG_0513.MOV" start="0s" duration="6240/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2018-07-24 18:01:05 -0400"/> - </metadata> - </asset> - <asset id="r9" name="IMG_0687" uid="C121367F3C16EFF4C1DD8294367992D2" src="file:///Volumes/Media/otio/IMG_0687.MOV" start="0s" duration="13889/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> - </metadata> - </asset> - <asset id="r10" name="IMG_0715" uid="7C9F5DBDAC5BE9B9455CB3F1BE824D2B" src="file:///Volumes/Media/otio/IMG_0715.MOV" start="0s" duration="6491/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2018-07-25 11:56:52 -0400"/> - </metadata> - </asset> - <asset id="r11" name="IMG_0740" uid="9FDE0E6190281E0AB4CC3E1DB8730C94" src="file:///Volumes/Media/otio/IMG_0740.MOV" start="0s" duration="26668/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - <metadata> - <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> - <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> - <md key="com.apple.proapps.spotlight.kMDItemCodecs"> - <array> - <string>AAC</string> - <string>H.264</string> - </array> - </md> - <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> - </metadata> - </asset> - <effect id="r12" name="Cross Dissolve" uid="FxPlug:4731E73A-8DAC-4113-9A30-AE85B1761265"/> - <effect id="r13" name="Audio Crossfade" uid="FFAudioTransition"/> - </resources> - <event name="OpenTimeline_Event" uid="F018723C-0C54-4166-96F8-C6BB9698D667"> - <ref-clip name="compound_clip_1" ref="r1" duration="80s" useAudioSubroles="1" modDate="2019-02-16 07:51:04 -0500"/> - <ref-clip name="compound_clip_2" ref="r7" duration="53560/600s" useAudioSubroles="1" modDate="2019-02-16 07:51:12 -0500"/> - <asset-clip name="IMG_0233" ref="r3" duration="32554800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:11:28 -0500"/> - <asset-clip name="IMG_0268" ref="r4" duration="26566800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:11:28 -0500"/> - <asset-clip name="IMG_0513" ref="r8" duration="31200/3000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-12 08:19:16 -0500"> - <note>A simple note</note> - <keyword duration="6240/600s" start="0s" value="snow, truck"/> - <keyword duration="19300/3000s" start="1s" value="tree"/> - <metadata> - <md key="com.apple.proapps.studio.reel" value="5"/> - <md key="com.apple.proapps.studio.scene" value="17"/> - <md key="com.apple.proapps.studio.shot" value="3"/> - </metadata> - </asset-clip> - <asset-clip name="IMG_0687" ref="r9" duration="16666800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:07:08 -0500"/> - <asset-clip name="IMG_0715" ref="r10" duration="7789200/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-12 08:18:21 -0500"/> - <asset-clip name="IMG_0740" ref="r11" duration="32001600/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:08:38 -0500"/> - <asset-clip name="IMG_0857" ref="r5" duration="40880/600s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:19:30 -0500"/> - <asset-clip name="IMG_0858" ref="r6" duration="15217200/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:19:30 -0500"/> - <project name="OpenTimeline_Project" uid="DCC354F6-422B-4009-8246-A152BD012283" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="21602243/144000s" format="r2" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k"> - <spine> - <clip name="IMG_0715" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r10" duration="6480/600s"/> - <clip name="IMG_0715" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6480/600s"> - <audio lane="-1" offset="0s" ref="r10" duration="7789200/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - <marker start="6s" duration="100/3000s" value="Marker 1"/> - </clip> - <transition name="Cross Dissolve" offset="28500/3000s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0513" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r8" duration="6240/600s"/> - <marker start="2s" duration="100/3000s" value="Marker 5" completed="0"/> - </clip> - <clip name="IMG_0513" lane="-1" offset="648176909/180000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6240/600s"> - <audio lane="-1" offset="0s" ref="r8" duration="7488000/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="105589/15000s" duration="1/48000s" value="Marker 2"/> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"> - <marker start="2596698013/720000s" duration="1/48000s" value="Marker 9"/> - </gap> - <gap name="Gap" offset="40s" duration="10s" start="3600s"> - <clip name="IMG_0687" lane="-1" offset="3600s" duration="10s" start="2571768/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="116831/60000s" duration="1/48000s" value="Marker 3"/> - </clip> - </gap> - <gap name="Gap" offset="50s" duration="10s" start="3600s"> - <spine lane="1" offset="3600s"> - <transition name="Cross Dissolve" offset="0s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <asset-clip name="IMG_0268" offset="0s" ref="r4" duration="28500/3000s" audioRole="dialogue" tcFormat="NDF"/> - <transition name="Cross Dissolve" offset="9s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <clip name="IMG_0740" offset="28500/3000s" duration="28500/3000s" start="1500/3000s" tcFormat="NDF"> - <video offset="0s" ref="r11" duration="26660/600s"/> - <marker start="167/30s" duration="100/3000s" value="Marker 4"/> - </clip> - </spine> - </gap> - <gap name="Gap" offset="60s" duration="10s" start="3600s"> - <asset-clip name="IMG_0857" lane="2" offset="108137/30s" ref="r5" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - </gap> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - <ref-clip name="compound_clip_1" offset="80s" ref="r1" duration="30s" start="10900/3000s" useAudioSubroles="1"> - <marker start="109/30s" duration="100/3000s" value="Marker 7" completed="1"/> - <marker start="141/10s" duration="100/3000s" value="Marker 8"/> - </ref-clip> - <clip name="IMG_0233" offset="110s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="5s" duration="5s" start="4146583/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <clip name="IMG_0687" offset="120s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <video offset="0s" ref="r9" duration="13880/600s"/> - <clip name="IMG_0687" lane="-1" offset="37600/3000s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <asset-clip name="IMG_0268" offset="130s" ref="r4" duration="10s" start="23200/3000s" audioRole="dialogue" tcFormat="NDF"/> - <ref-clip name="compound_clip_1" offset="140s" ref="r1" srcEnable="video" duration="10s" start="5700/3000s"> - <ref-clip name="compound_clip_1" lane="-1" offset="275843/144000s" ref="r1" srcEnable="audio" duration="10s" useAudioSubroles="1"/> - </ref-clip> - </spine> - </sequence> - </project> - <project name="OpenTimeline_Project 1" uid="739FEE8B-390F-48F7-9F1E-F64B770A1125" modDate="2019-03-26 10:17:07 -0400"> - <sequence duration="21602243/144000s" format="r2" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k"> - <spine> - <clip name="IMG_0715" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r10" duration="6480/600s"/> - <clip name="IMG_0715" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6480/600s"> - <audio lane="-1" offset="0s" ref="r10" duration="7789200/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - <marker start="6s" duration="100/3000s" value="Marker 1"/> - </clip> - <transition name="Cross Dissolve" offset="28500/3000s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0513" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r8" duration="6240/600s"/> - <marker start="2s" duration="100/3000s" value="Marker 5" completed="0"/> - </clip> - <clip name="IMG_0513" lane="-1" offset="648176909/180000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6240/600s"> - <audio lane="-1" offset="0s" ref="r8" duration="7488000/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="105589/15000s" duration="1/48000s" value="Marker 2"/> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"> - <marker start="2596698013/720000s" duration="1/48000s" value="Marker 9"/> - </gap> - <gap name="Gap" offset="40s" duration="10s" start="3600s"> - <clip name="IMG_0687" lane="-1" offset="3600s" duration="10s" start="2571768/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="116831/60000s" duration="1/48000s" value="Marker 3"/> - </clip> - </gap> - <gap name="Gap" offset="50s" duration="10s" start="3600s"> - <spine lane="1" offset="3600s"> - <transition name="Cross Dissolve" offset="0s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <asset-clip name="IMG_0268" offset="0s" ref="r4" duration="28500/3000s" audioRole="dialogue" tcFormat="NDF"/> - <transition name="Cross Dissolve" offset="9s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <clip name="IMG_0740" offset="28500/3000s" duration="28500/3000s" start="1500/3000s" tcFormat="NDF"> - <video offset="0s" ref="r11" duration="26660/600s"/> - <marker start="167/30s" duration="100/3000s" value="Marker 4"/> - </clip> - </spine> - </gap> - <gap name="Gap" offset="60s" duration="10s" start="3600s"> - <asset-clip name="IMG_0857" lane="2" offset="108137/30s" ref="r5" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - </gap> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - <ref-clip name="compound_clip_1" offset="80s" ref="r1" duration="30s" start="10900/3000s" useAudioSubroles="1"> - <marker start="109/30s" duration="100/3000s" value="Marker 7" completed="1"/> - <marker start="141/10s" duration="100/3000s" value="Marker 8"/> - </ref-clip> - <clip name="IMG_0233" offset="110s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="5s" duration="5s" start="4146583/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <clip name="IMG_0687" offset="120s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <video offset="0s" ref="r9" duration="13880/600s"/> - <clip name="IMG_0687" lane="-1" offset="37600/3000s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <asset-clip name="IMG_0268" offset="130s" ref="r4" duration="10s" start="23200/3000s" audioRole="dialogue" tcFormat="NDF"/> - <ref-clip name="compound_clip_1" offset="140s" ref="r1" srcEnable="video" duration="10s" start="5700/3000s"> - <ref-clip name="compound_clip_1" lane="-1" offset="275843/144000s" ref="r1" srcEnable="audio" duration="10s" useAudioSubroles="1"/> - </ref-clip> - </spine> - </sequence> - </project> - </event> -</fcpxml> \ No newline at end of file diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_example.fcpxml b/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_example.fcpxml deleted file mode 100644 index 8efbd6752..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_example.fcpxml +++ /dev/null @@ -1,309 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE fcpxml> - -<fcpxml version="1.8"> - <resources> - <media id="r1" name="compound_clip_1" uid="JQCJMjHxQRKdo3UOjQKiNQ" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="80s" format="r2" tcStart="0s" tcFormat="NDF"> - <spine> - <clip name="IMG_0233" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0268" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r4" duration="22120/600s"/> - </clip> - <clip name="IMG_0268" lane="-1" offset="518405621/144000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="22120/600s"> - <audio lane="-1" offset="0s" ref="r4" duration="26566800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0857" offset="40s" ref="r5" duration="10s" start="15700/3000s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="50s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0858" offset="60s" ref="r6" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - </spine> - </sequence> - </media> - <format id="r2" name="FFVideoFormat1080p30" frameDuration="100/3000s" width="1920" height="1080" colorSpace="1-1-1 (Rec. 709)"/> - <asset id="r3" name="IMG_0233" uid="ADC4EA0142E5E6ACE007A68DB862A9AF" src="file:///Volumes/Media/otio/IMG_0233.MOV" start="0s" duration="27129/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r4" name="IMG_0268" uid="DE75B4D17E963D0E83CFF64B4AE712BE" src="file:///Volumes/Media/otio/IMG_0268.MOV" start="0s" duration="22139/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r5" name="IMG_0857" uid="96D00EC92B431A8ECDDE741DF63CF602" src="file:///Volumes/Media/otio/IMG_0857.MOV" start="0s" duration="40880/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r6" name="IMG_0858" uid="41558C6C85370A79187F8E7A51DD04DB" src="file:///Volumes/Media/otio/IMG_0858.MOV" start="0s" duration="12681/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <media id="r7" name="compound_clip_2" uid="QUr8IBhIRVauQiNWSolvCA" modDate="2019-02-16 07:51:12 -0500"> - <sequence duration="267800/3000s" format="r2" tcStart="0s" tcFormat="NDF"> - <spine> - <asset-clip name="IMG_0857" offset="0s" ref="r5" duration="40880/600s" audioRole="dialogue" tcFormat="NDF"/> - <asset-clip name="IMG_0858" offset="40880/600s" ref="r6" duration="12680/600s" audioRole="dialogue" tcFormat="NDF"/> - </spine> - </sequence> - </media> - <asset id="r8" name="IMG_0513" uid="635EB126C1838B458DB4BF90E78A2D84" src="file:///Volumes/Media/otio/IMG_0513.MOV" start="0s" duration="6240/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r9" name="IMG_0687" uid="C121367F3C16EFF4C1DD8294367992D2" src="file:///Volumes/Media/otio/IMG_0687.MOV" start="0s" duration="13889/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r10" name="IMG_0715" uid="7C9F5DBDAC5BE9B9455CB3F1BE824D2B" src="file:///Volumes/Media/otio/IMG_0715.MOV" start="0s" duration="6491/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r11" name="IMG_0740" uid="9FDE0E6190281E0AB4CC3E1DB8730C94" src="file:///Volumes/Media/otio/IMG_0740.MOV" start="0s" duration="26668/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <effect id="r12" name="Cross Dissolve" uid="FxPlug:4731E73A-8DAC-4113-9A30-AE85B1761265"/> - <effect id="r13" name="Audio Crossfade" uid="FFAudioTransition"/> - </resources> - <library location="file:///Volumes/Media/otio/OpenTimelineIO.fcpbundle/"> - <event name="OpenTimeline_Event" uid="F018723C-0C54-4166-96F8-C6BB9698D667"> - <ref-clip name="compound_clip_1" ref="r1" duration="80s" useAudioSubroles="1" modDate="2019-02-16 07:51:04 -0500"/> - <ref-clip name="compound_clip_2" ref="r7" duration="53560/600s" useAudioSubroles="1" modDate="2019-02-16 07:51:12 -0500"/> - <asset-clip name="IMG_0233" ref="r3" duration="32554800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:11:28 -0500"/> - <asset-clip name="IMG_0268" ref="r4" duration="26566800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:11:28 -0500"/> - <asset-clip name="IMG_0513" ref="r8" duration="31200/3000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-12 08:19:16 -0500"> - <note>A simple note</note> - <keyword duration="6240/600s" start="0s" value="snow, truck"/> - <keyword duration="19300/3000s" start="1s" value="tree"/> - <metadata> - <md key="com.apple.proapps.studio.reel" value="5"/> - <md key="com.apple.proapps.studio.scene" value="17"/> - <md key="com.apple.proapps.studio.shot" value="3"/> - </metadata> - </asset-clip> - <asset-clip name="IMG_0687" ref="r9" duration="16666800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:07:08 -0500"/> - <asset-clip name="IMG_0715" ref="r10" duration="7789200/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-12 08:18:21 -0500"/> - <asset-clip name="IMG_0740" ref="r11" duration="32001600/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:08:38 -0500"/> - <asset-clip name="IMG_0857" ref="r5" duration="40880/600s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:19:30 -0500"/> - <asset-clip name="IMG_0858" ref="r6" duration="15217200/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:19:30 -0500"/> - <project name="OpenTimeline_Project" uid="DCC354F6-422B-4009-8246-A152BD012283" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="21602243/144000s" format="r2" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k"> - <spine> - <clip name="IMG_0715" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r10" duration="6480/600s"/> - <clip name="IMG_0715" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6480/600s"> - <audio lane="-1" offset="0s" ref="r10" duration="7789200/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - <marker start="6s" duration="100/3000s" value="Marker 1"/> - </clip> - <transition name="Cross Dissolve" offset="28500/3000s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0513" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r8" duration="6240/600s"/> - <marker start="2s" duration="100/3000s" value="Marker 5" completed="0"/> - </clip> - <clip name="IMG_0513" lane="-1" offset="648176909/180000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6240/600s"> - <audio lane="-1" offset="0s" ref="r8" duration="7488000/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="105589/15000s" duration="1/48000s" value="Marker 2"/> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"> - <marker start="2596698013/720000s" duration="1/48000s" value="Marker 9"/> - </gap> - <gap name="Gap" offset="40s" duration="10s" start="3600s"> - <clip name="IMG_0687" lane="-1" offset="3600s" duration="10s" start="2571768/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="116831/60000s" duration="1/48000s" value="Marker 3"/> - </clip> - </gap> - <gap name="Gap" offset="50s" duration="10s" start="3600s"> - <spine lane="1" offset="3600s"> - <transition name="Cross Dissolve" offset="0s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <asset-clip name="IMG_0268" offset="0s" ref="r4" duration="28500/3000s" audioRole="dialogue" tcFormat="NDF"/> - <transition name="Cross Dissolve" offset="9s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <clip name="IMG_0740" offset="28500/3000s" duration="28500/3000s" start="1500/3000s" tcFormat="NDF"> - <video offset="0s" ref="r11" duration="26660/600s"/> - <marker start="167/30s" duration="100/3000s" value="Marker 4"/> - </clip> - </spine> - </gap> - <gap name="Gap" offset="60s" duration="10s" start="3600s"> - <asset-clip name="IMG_0857" lane="2" offset="108137/30s" ref="r5" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - </gap> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - <ref-clip name="compound_clip_1" offset="80s" ref="r1" duration="30s" start="10900/3000s" useAudioSubroles="1"> - <marker start="109/30s" duration="100/3000s" value="Marker 7" completed="1"/> - <marker start="141/10s" duration="100/3000s" value="Marker 8"/> - </ref-clip> - <clip name="IMG_0233" offset="110s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="5s" duration="5s" start="4146583/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <clip name="IMG_0687" offset="120s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <video offset="0s" ref="r9" duration="13880/600s"/> - <clip name="IMG_0687" lane="-1" offset="37600/3000s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <asset-clip name="IMG_0268" offset="130s" ref="r4" duration="10s" start="23200/3000s" audioRole="dialogue" tcFormat="NDF"/> - <ref-clip name="compound_clip_1" offset="140s" ref="r1" srcEnable="video" duration="10s" start="5700/3000s"> - <ref-clip name="compound_clip_1" lane="-1" offset="275843/144000s" ref="r1" srcEnable="audio" duration="10s" useAudioSubroles="1"/> - </ref-clip> - </spine> - </sequence> - </project> - <project name="OpenTimeline_Project 1" uid="739FEE8B-390F-48F7-9F1E-F64B770A1125" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="21602243/144000s" format="r2" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k"> - <spine> - <clip name="IMG_0715" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r10" duration="6480/600s"/> - <clip name="IMG_0715" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6480/600s"> - <audio lane="-1" offset="0s" ref="r10" duration="7789200/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - <marker start="6s" duration="100/3000s" value="Marker 1"/> - </clip> - <transition name="Cross Dissolve" offset="28500/3000s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0513" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r8" duration="6240/600s"/> - <marker start="2s" duration="100/3000s" value="Marker 5" completed="0"/> - </clip> - <clip name="IMG_0513" lane="-1" offset="648176909/180000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6240/600s"> - <audio lane="-1" offset="0s" ref="r8" duration="7488000/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="105589/15000s" duration="1/48000s" value="Marker 2"/> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"> - <marker start="2596698013/720000s" duration="1/48000s" value="Marker 9"/> - </gap> - <gap name="Gap" offset="40s" duration="10s" start="3600s"> - <clip name="IMG_0687" lane="-1" offset="3600s" duration="10s" start="2571768/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="116831/60000s" duration="1/48000s" value="Marker 3"/> - </clip> - </gap> - <gap name="Gap" offset="50s" duration="10s" start="3600s"> - <spine lane="1" offset="3600s"> - <transition name="Cross Dissolve" offset="0s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <asset-clip name="IMG_0268" offset="0s" ref="r4" duration="28500/3000s" audioRole="dialogue" tcFormat="NDF"/> - <transition name="Cross Dissolve" offset="9s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <clip name="IMG_0740" offset="28500/3000s" duration="28500/3000s" start="1500/3000s" tcFormat="NDF"> - <video offset="0s" ref="r11" duration="26660/600s"/> - <marker start="167/30s" duration="100/3000s" value="Marker 4"/> - </clip> - </spine> - </gap> - <gap name="Gap" offset="60s" duration="10s" start="3600s"> - <asset-clip name="IMG_0857" lane="2" offset="108137/30s" ref="r5" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - </gap> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - <ref-clip name="compound_clip_1" offset="80s" ref="r1" duration="30s" start="10900/3000s" useAudioSubroles="1"> - <marker start="109/30s" duration="100/3000s" value="Marker 7" completed="1"/> - <marker start="141/10s" duration="100/3000s" value="Marker 8"/> - </ref-clip> - <clip name="IMG_0233" offset="110s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="5s" duration="5s" start="4146583/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <clip name="IMG_0687" offset="120s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <video offset="0s" ref="r9" duration="13880/600s"/> - <clip name="IMG_0687" lane="-1" offset="37600/3000s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <asset-clip name="IMG_0268" offset="130s" ref="r4" duration="10s" start="23200/3000s" audioRole="dialogue" tcFormat="NDF"/> - <ref-clip name="compound_clip_1" offset="140s" ref="r1" srcEnable="video" duration="10s" start="5700/3000s"> - <ref-clip name="compound_clip_1" lane="-1" offset="275843/144000s" ref="r1" srcEnable="audio" duration="10s" useAudioSubroles="1"/> - </ref-clip> - </spine> - </sequence> - </project> - </event> - <smart-collection name="Projects" match="all"> - <match-clip rule="is" type="project"/> - </smart-collection> - <smart-collection name="All Video" match="any"> - <match-media rule="is" type="videoOnly"/> - <match-media rule="is" type="videoWithAudio"/> - </smart-collection> - <smart-collection name="Audio Only" match="all"> - <match-media rule="is" type="audioOnly"/> - </smart-collection> - <smart-collection name="Stills" match="all"> - <match-media rule="is" type="stills"/> - </smart-collection> - <smart-collection name="Favorites" match="all"> - <match-ratings value="favorites"/> - </smart-collection> - </library> -</fcpxml> \ No newline at end of file diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_library.fcpxml b/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_library.fcpxml deleted file mode 100644 index 8efbd6752..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_library.fcpxml +++ /dev/null @@ -1,309 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE fcpxml> - -<fcpxml version="1.8"> - <resources> - <media id="r1" name="compound_clip_1" uid="JQCJMjHxQRKdo3UOjQKiNQ" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="80s" format="r2" tcStart="0s" tcFormat="NDF"> - <spine> - <clip name="IMG_0233" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0268" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r4" duration="22120/600s"/> - </clip> - <clip name="IMG_0268" lane="-1" offset="518405621/144000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="22120/600s"> - <audio lane="-1" offset="0s" ref="r4" duration="26566800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0857" offset="40s" ref="r5" duration="10s" start="15700/3000s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="50s" duration="10s" start="3600s"/> - <asset-clip name="IMG_0858" offset="60s" ref="r6" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - </spine> - </sequence> - </media> - <format id="r2" name="FFVideoFormat1080p30" frameDuration="100/3000s" width="1920" height="1080" colorSpace="1-1-1 (Rec. 709)"/> - <asset id="r3" name="IMG_0233" uid="ADC4EA0142E5E6ACE007A68DB862A9AF" src="file:///Volumes/Media/otio/IMG_0233.MOV" start="0s" duration="27129/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r4" name="IMG_0268" uid="DE75B4D17E963D0E83CFF64B4AE712BE" src="file:///Volumes/Media/otio/IMG_0268.MOV" start="0s" duration="22139/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r5" name="IMG_0857" uid="96D00EC92B431A8ECDDE741DF63CF602" src="file:///Volumes/Media/otio/IMG_0857.MOV" start="0s" duration="40880/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r6" name="IMG_0858" uid="41558C6C85370A79187F8E7A51DD04DB" src="file:///Volumes/Media/otio/IMG_0858.MOV" start="0s" duration="12681/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <media id="r7" name="compound_clip_2" uid="QUr8IBhIRVauQiNWSolvCA" modDate="2019-02-16 07:51:12 -0500"> - <sequence duration="267800/3000s" format="r2" tcStart="0s" tcFormat="NDF"> - <spine> - <asset-clip name="IMG_0857" offset="0s" ref="r5" duration="40880/600s" audioRole="dialogue" tcFormat="NDF"/> - <asset-clip name="IMG_0858" offset="40880/600s" ref="r6" duration="12680/600s" audioRole="dialogue" tcFormat="NDF"/> - </spine> - </sequence> - </media> - <asset id="r8" name="IMG_0513" uid="635EB126C1838B458DB4BF90E78A2D84" src="file:///Volumes/Media/otio/IMG_0513.MOV" start="0s" duration="6240/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r9" name="IMG_0687" uid="C121367F3C16EFF4C1DD8294367992D2" src="file:///Volumes/Media/otio/IMG_0687.MOV" start="0s" duration="13889/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r10" name="IMG_0715" uid="7C9F5DBDAC5BE9B9455CB3F1BE824D2B" src="file:///Volumes/Media/otio/IMG_0715.MOV" start="0s" duration="6491/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <asset id="r11" name="IMG_0740" uid="9FDE0E6190281E0AB4CC3E1DB8730C94" src="file:///Volumes/Media/otio/IMG_0740.MOV" start="0s" duration="26668/600s" hasVideo="1" format="r2" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> - </asset> - <effect id="r12" name="Cross Dissolve" uid="FxPlug:4731E73A-8DAC-4113-9A30-AE85B1761265"/> - <effect id="r13" name="Audio Crossfade" uid="FFAudioTransition"/> - </resources> - <library location="file:///Volumes/Media/otio/OpenTimelineIO.fcpbundle/"> - <event name="OpenTimeline_Event" uid="F018723C-0C54-4166-96F8-C6BB9698D667"> - <ref-clip name="compound_clip_1" ref="r1" duration="80s" useAudioSubroles="1" modDate="2019-02-16 07:51:04 -0500"/> - <ref-clip name="compound_clip_2" ref="r7" duration="53560/600s" useAudioSubroles="1" modDate="2019-02-16 07:51:12 -0500"/> - <asset-clip name="IMG_0233" ref="r3" duration="32554800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:11:28 -0500"/> - <asset-clip name="IMG_0268" ref="r4" duration="26566800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:11:28 -0500"/> - <asset-clip name="IMG_0513" ref="r8" duration="31200/3000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-12 08:19:16 -0500"> - <note>A simple note</note> - <keyword duration="6240/600s" start="0s" value="snow, truck"/> - <keyword duration="19300/3000s" start="1s" value="tree"/> - <metadata> - <md key="com.apple.proapps.studio.reel" value="5"/> - <md key="com.apple.proapps.studio.scene" value="17"/> - <md key="com.apple.proapps.studio.shot" value="3"/> - </metadata> - </asset-clip> - <asset-clip name="IMG_0687" ref="r9" duration="16666800/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:07:08 -0500"/> - <asset-clip name="IMG_0715" ref="r10" duration="7789200/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-12 08:18:21 -0500"/> - <asset-clip name="IMG_0740" ref="r11" duration="32001600/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:08:38 -0500"/> - <asset-clip name="IMG_0857" ref="r5" duration="40880/600s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:19:30 -0500"/> - <asset-clip name="IMG_0858" ref="r6" duration="15217200/720000s" audioRole="dialogue" format="r2" tcFormat="NDF" modDate="2019-01-13 08:19:30 -0500"/> - <project name="OpenTimeline_Project" uid="DCC354F6-422B-4009-8246-A152BD012283" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="21602243/144000s" format="r2" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k"> - <spine> - <clip name="IMG_0715" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r10" duration="6480/600s"/> - <clip name="IMG_0715" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6480/600s"> - <audio lane="-1" offset="0s" ref="r10" duration="7789200/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - <marker start="6s" duration="100/3000s" value="Marker 1"/> - </clip> - <transition name="Cross Dissolve" offset="28500/3000s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0513" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r8" duration="6240/600s"/> - <marker start="2s" duration="100/3000s" value="Marker 5" completed="0"/> - </clip> - <clip name="IMG_0513" lane="-1" offset="648176909/180000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6240/600s"> - <audio lane="-1" offset="0s" ref="r8" duration="7488000/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="105589/15000s" duration="1/48000s" value="Marker 2"/> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"> - <marker start="2596698013/720000s" duration="1/48000s" value="Marker 9"/> - </gap> - <gap name="Gap" offset="40s" duration="10s" start="3600s"> - <clip name="IMG_0687" lane="-1" offset="3600s" duration="10s" start="2571768/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="116831/60000s" duration="1/48000s" value="Marker 3"/> - </clip> - </gap> - <gap name="Gap" offset="50s" duration="10s" start="3600s"> - <spine lane="1" offset="3600s"> - <transition name="Cross Dissolve" offset="0s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <asset-clip name="IMG_0268" offset="0s" ref="r4" duration="28500/3000s" audioRole="dialogue" tcFormat="NDF"/> - <transition name="Cross Dissolve" offset="9s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <clip name="IMG_0740" offset="28500/3000s" duration="28500/3000s" start="1500/3000s" tcFormat="NDF"> - <video offset="0s" ref="r11" duration="26660/600s"/> - <marker start="167/30s" duration="100/3000s" value="Marker 4"/> - </clip> - </spine> - </gap> - <gap name="Gap" offset="60s" duration="10s" start="3600s"> - <asset-clip name="IMG_0857" lane="2" offset="108137/30s" ref="r5" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - </gap> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - <ref-clip name="compound_clip_1" offset="80s" ref="r1" duration="30s" start="10900/3000s" useAudioSubroles="1"> - <marker start="109/30s" duration="100/3000s" value="Marker 7" completed="1"/> - <marker start="141/10s" duration="100/3000s" value="Marker 8"/> - </ref-clip> - <clip name="IMG_0233" offset="110s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="5s" duration="5s" start="4146583/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <clip name="IMG_0687" offset="120s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <video offset="0s" ref="r9" duration="13880/600s"/> - <clip name="IMG_0687" lane="-1" offset="37600/3000s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <asset-clip name="IMG_0268" offset="130s" ref="r4" duration="10s" start="23200/3000s" audioRole="dialogue" tcFormat="NDF"/> - <ref-clip name="compound_clip_1" offset="140s" ref="r1" srcEnable="video" duration="10s" start="5700/3000s"> - <ref-clip name="compound_clip_1" lane="-1" offset="275843/144000s" ref="r1" srcEnable="audio" duration="10s" useAudioSubroles="1"/> - </ref-clip> - </spine> - </sequence> - </project> - <project name="OpenTimeline_Project 1" uid="739FEE8B-390F-48F7-9F1E-F64B770A1125" modDate="2019-02-16 07:51:04 -0500"> - <sequence duration="21602243/144000s" format="r2" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k"> - <spine> - <clip name="IMG_0715" offset="0s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r10" duration="6480/600s"/> - <clip name="IMG_0715" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6480/600s"> - <audio lane="-1" offset="0s" ref="r10" duration="7789200/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - <marker start="6s" duration="100/3000s" value="Marker 1"/> - </clip> - <transition name="Cross Dissolve" offset="28500/3000s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <gap name="Gap" offset="10s" duration="10s" start="3600s"/> - <gap name="Gap" offset="20s" duration="10s" start="3600s"> - <clip name="IMG_0513" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r8" duration="6240/600s"/> - <marker start="2s" duration="100/3000s" value="Marker 5" completed="0"/> - </clip> - <clip name="IMG_0513" lane="-1" offset="648176909/180000s" duration="10s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="6240/600s"> - <audio lane="-1" offset="0s" ref="r8" duration="7488000/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="105589/15000s" duration="1/48000s" value="Marker 2"/> - </clip> - </gap> - <gap name="Gap" offset="30s" duration="10s" start="3600s"> - <marker start="2596698013/720000s" duration="1/48000s" value="Marker 9"/> - </gap> - <gap name="Gap" offset="40s" duration="10s" start="3600s"> - <clip name="IMG_0687" lane="-1" offset="3600s" duration="10s" start="2571768/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - <marker start="116831/60000s" duration="1/48000s" value="Marker 3"/> - </clip> - </gap> - <gap name="Gap" offset="50s" duration="10s" start="3600s"> - <spine lane="1" offset="3600s"> - <transition name="Cross Dissolve" offset="0s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <asset-clip name="IMG_0268" offset="0s" ref="r4" duration="28500/3000s" audioRole="dialogue" tcFormat="NDF"/> - <transition name="Cross Dissolve" offset="9s" duration="1s"> - <filter-video ref="r12" name="Cross Dissolve"> - <param name="Look" key="1" value="11 (Video)"/> - <param name="Amount" key="2" value="50"/> - <param name="Ease" key="50" value="2 (In & Out)"/> - <param name="Ease Amount" key="51" value="0"/> - </filter-video> - <filter-audio ref="r13" name="Audio Crossfade"/> - </transition> - <clip name="IMG_0740" offset="28500/3000s" duration="28500/3000s" start="1500/3000s" tcFormat="NDF"> - <video offset="0s" ref="r11" duration="26660/600s"/> - <marker start="167/30s" duration="100/3000s" value="Marker 4"/> - </clip> - </spine> - </gap> - <gap name="Gap" offset="60s" duration="10s" start="3600s"> - <asset-clip name="IMG_0857" lane="2" offset="108137/30s" ref="r5" duration="10s" audioRole="dialogue" tcFormat="NDF"/> - </gap> - <gap name="Gap" offset="70s" duration="10s" start="3600s"/> - <ref-clip name="compound_clip_1" offset="80s" ref="r1" duration="30s" start="10900/3000s" useAudioSubroles="1"> - <marker start="109/30s" duration="100/3000s" value="Marker 7" completed="1"/> - <marker start="141/10s" duration="100/3000s" value="Marker 8"/> - </ref-clip> - <clip name="IMG_0233" offset="110s" duration="10s" tcFormat="NDF"> - <video offset="0s" ref="r3" duration="27120/600s"/> - <clip name="IMG_0233" lane="-1" offset="5s" duration="5s" start="4146583/720000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="27120/600s"> - <audio lane="-1" offset="0s" ref="r3" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <clip name="IMG_0687" offset="120s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <video offset="0s" ref="r9" duration="13880/600s"/> - <clip name="IMG_0687" lane="-1" offset="37600/3000s" duration="10s" start="37600/3000s" tcFormat="NDF"> - <gap name="Gap" offset="0s" duration="13880/600s"> - <audio lane="-1" offset="0s" ref="r9" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> - </gap> - </clip> - </clip> - <asset-clip name="IMG_0268" offset="130s" ref="r4" duration="10s" start="23200/3000s" audioRole="dialogue" tcFormat="NDF"/> - <ref-clip name="compound_clip_1" offset="140s" ref="r1" srcEnable="video" duration="10s" start="5700/3000s"> - <ref-clip name="compound_clip_1" lane="-1" offset="275843/144000s" ref="r1" srcEnable="audio" duration="10s" useAudioSubroles="1"/> - </ref-clip> - </spine> - </sequence> - </project> - </event> - <smart-collection name="Projects" match="all"> - <match-clip rule="is" type="project"/> - </smart-collection> - <smart-collection name="All Video" match="any"> - <match-media rule="is" type="videoOnly"/> - <match-media rule="is" type="videoWithAudio"/> - </smart-collection> - <smart-collection name="Audio Only" match="all"> - <match-media rule="is" type="audioOnly"/> - </smart-collection> - <smart-collection name="Stills" match="all"> - <match-media rule="is" type="stills"/> - </smart-collection> - <smart-collection name="Favorites" match="all"> - <match-ratings value="favorites"/> - </smart-collection> - </library> -</fcpxml> \ No newline at end of file diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_project.fcpxml b/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_project.fcpxml deleted file mode 100644 index 4a4389783..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/fcpx_project.fcpxml +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE fcpxml> <fcpxml version="1.8"> <resources> <format id="r1" name="FFVideoFormat1080p30" frameDuration="100/3000s" width="1920" height="1080" colorSpace="1-1-1 (Rec. 709)"/> <asset id="r2" name="IMG_0715" uid="7C9F5DBDAC5BE9B9455CB3F1BE824D2B" src="file:///Volumes/Media/otio/IMG_0715.MOV" start="0s" duration="6491/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2018-07-25 11:56:52 -0400"/> </metadata> </asset> <effect id="r3" name="Cross Dissolve" uid="FxPlug:4731E73A-8DAC-4113-9A30-AE85B1761265"/> <effect id="r4" name="Audio Crossfade" uid="FFAudioTransition"/> <asset id="r5" name="IMG_0513" uid="635EB126C1838B458DB4BF90E78A2D84" src="file:///Volumes/Media/otio/IMG_0513.MOV" start="0s" duration="6240/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2018-07-24 18:01:05 -0400"/> </metadata> </asset> <asset id="r6" name="IMG_0687" uid="C121367F3C16EFF4C1DD8294367992D2" src="file:///Volumes/Media/otio/IMG_0687.MOV" start="0s" duration="13889/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> </metadata> </asset> <asset id="r7" name="IMG_0268" uid="DE75B4D17E963D0E83CFF64B4AE712BE" src="file:///Volumes/Media/otio/IMG_0268.MOV" start="0s" duration="22139/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2018-07-24 17:56:32 -0400"/> </metadata> </asset> <asset id="r8" name="IMG_0740" uid="9FDE0E6190281E0AB4CC3E1DB8730C94" src="file:///Volumes/Media/otio/IMG_0740.MOV" start="0s" duration="26668/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> </metadata> </asset> <asset id="r9" name="IMG_0857" uid="96D00EC92B431A8ECDDE741DF63CF602" src="file:///Volumes/Media/otio/IMG_0857.MOV" start="0s" duration="40880/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> </metadata> </asset> <media id="r10" name="compound_clip_1" uid="JQCJMjHxQRKdo3UOjQKiNQ" modDate="2019-02-16 07:51:04 -0500"> <sequence duration="80s" format="r1" tcStart="0s" tcFormat="NDF"> <spine> <clip name="IMG_0233" offset="0s" duration="10s" tcFormat="NDF"> <video offset="0s" ref="r11" duration="27120/600s"/> <clip name="IMG_0233" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> <gap name="Gap" offset="0s" duration="27120/600s"> <audio lane="-1" offset="0s" ref="r11" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> </gap> </clip> </clip> <gap name="Gap" offset="10s" duration="10s" start="3600s"/> <gap name="Gap" offset="20s" duration="10s" start="3600s"> <clip name="IMG_0268" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> <video offset="0s" ref="r7" duration="22120/600s"/> </clip> <clip name="IMG_0268" lane="-1" offset="518405621/144000s" duration="10s" tcFormat="NDF"> <gap name="Gap" offset="0s" duration="22120/600s"> <audio lane="-1" offset="0s" ref="r7" duration="26566800/720000s" role="dialogue.dialogue-1" srcCh="1"/> </gap> </clip> </gap> <gap name="Gap" offset="30s" duration="10s" start="3600s"/> <asset-clip name="IMG_0857" offset="40s" ref="r9" duration="10s" start="15700/3000s" audioRole="dialogue" tcFormat="NDF"/> <gap name="Gap" offset="50s" duration="10s" start="3600s"/> <asset-clip name="IMG_0858" offset="60s" ref="r12" duration="10s" audioRole="dialogue" tcFormat="NDF"/> <gap name="Gap" offset="70s" duration="10s" start="3600s"/> </spine> </sequence> </media> <asset id="r11" name="IMG_0233" uid="ADC4EA0142E5E6ACE007A68DB862A9AF" src="file:///Volumes/Media/otio/IMG_0233.MOV" start="0s" duration="27129/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2018-07-24 18:01:05 -0400"/> </metadata> </asset> <asset id="r12" name="IMG_0858" uid="41558C6C85370A79187F8E7A51DD04DB" src="file:///Volumes/Media/otio/IMG_0858.MOV" start="0s" duration="12681/600s" hasVideo="1" format="r1" hasAudio="1" audioSources="1" audioChannels="1" audioRate="44100"> <metadata> <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/> <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/> <md key="com.apple.proapps.spotlight.kMDItemCodecs"> <array> <string>AAC</string> <string>H.264</string> </array> </md> <md key="com.apple.proapps.mio.ingestDate" value="2019-02-16 07:46:06 -0500"/> </metadata> </asset> </resources> <project name="OpenTimeline_Project" uid="DCC354F6-422B-4009-8246-A152BD012283" modDate="2019-02-16 07:51:04 -0500"> <sequence duration="21602243/144000s" format="r1" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k"> <spine> <clip name="IMG_0715" offset="0s" duration="10s" tcFormat="NDF"> <video offset="0s" ref="r2" duration="6480/600s"/> <clip name="IMG_0715" lane="-1" offset="0s" duration="10s" tcFormat="NDF"> <gap name="Gap" offset="0s" duration="6480/600s"> <audio lane="-1" offset="0s" ref="r2" duration="7789200/720000s" role="dialogue.dialogue-1" srcCh="1"/> </gap> </clip> <marker start="6s" duration="100/3000s" value="Marker 1"/> </clip> <transition name="Cross Dissolve" offset="28500/3000s" duration="1s"> <filter-video ref="r3" name="Cross Dissolve"> <param name="Look" key="1" value="11 (Video)"/> <param name="Amount" key="2" value="50"/> <param name="Ease" key="50" value="2 (In & Out)"/> <param name="Ease Amount" key="51" value="0"/> </filter-video> <filter-audio ref="r4" name="Audio Crossfade"/> </transition> <gap name="Gap" offset="10s" duration="10s" start="3600s"/> <gap name="Gap" offset="20s" duration="10s" start="3600s"> <clip name="IMG_0513" lane="1" offset="3600s" duration="10s" tcFormat="NDF"> <video offset="0s" ref="r5" duration="6240/600s"/> <marker start="2s" duration="100/3000s" value="Marker 5" completed="0"/> </clip> <clip name="IMG_0513" lane="-1" offset="648176909/180000s" duration="10s" tcFormat="NDF"> <gap name="Gap" offset="0s" duration="6240/600s"> <audio lane="-1" offset="0s" ref="r5" duration="7488000/720000s" role="dialogue.dialogue-1" srcCh="1"/> </gap> <marker start="105589/15000s" duration="1/48000s" value="Marker 2"/> </clip> </gap> <gap name="Gap" offset="30s" duration="10s" start="3600s"> <marker start="2596698013/720000s" duration="1/48000s" value="Marker 9"/> </gap> <gap name="Gap" offset="40s" duration="10s" start="3600s"> <clip name="IMG_0687" lane="-1" offset="3600s" duration="10s" start="2571768/720000s" tcFormat="NDF"> <gap name="Gap" offset="0s" duration="13880/600s"> <audio lane="-1" offset="0s" ref="r6" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> </gap> <marker start="116831/60000s" duration="1/48000s" value="Marker 3"/> </clip> </gap> <gap name="Gap" offset="50s" duration="10s" start="3600s"> <spine lane="1" offset="3600s"> <transition name="Cross Dissolve" offset="0s" duration="1s"> <filter-video ref="r3" name="Cross Dissolve"> <param name="Look" key="1" value="11 (Video)"/> <param name="Amount" key="2" value="50"/> <param name="Ease" key="50" value="2 (In & Out)"/> <param name="Ease Amount" key="51" value="0"/> </filter-video> <filter-audio ref="r4" name="Audio Crossfade"/> </transition> <asset-clip name="IMG_0268" offset="0s" ref="r7" duration="28500/3000s" audioRole="dialogue" tcFormat="NDF"/> <transition name="Cross Dissolve" offset="9s" duration="1s"> <filter-video ref="r3" name="Cross Dissolve"> <param name="Look" key="1" value="11 (Video)"/> <param name="Amount" key="2" value="50"/> <param name="Ease" key="50" value="2 (In & Out)"/> <param name="Ease Amount" key="51" value="0"/> </filter-video> <filter-audio ref="r4" name="Audio Crossfade"/> </transition> <clip name="IMG_0740" offset="28500/3000s" duration="28500/3000s" start="1500/3000s" tcFormat="NDF"> <video offset="0s" ref="r8" duration="26660/600s"/> <marker start="167/30s" duration="100/3000s" value="Marker 4"/> </clip> </spine> </gap> <gap name="Gap" offset="60s" duration="10s" start="3600s"> <asset-clip name="IMG_0857" lane="2" offset="108137/30s" ref="r9" duration="10s" audioRole="dialogue" tcFormat="NDF"/> </gap> <gap name="Gap" offset="70s" duration="10s" start="3600s"/> <ref-clip name="compound_clip_1" offset="80s" ref="r10" duration="30s" start="10900/3000s" useAudioSubroles="1"> <marker start="109/30s" duration="100/3000s" value="Marker 7" completed="1"/> <marker start="141/10s" duration="100/3000s" value="Marker 8"/> </ref-clip> <clip name="IMG_0233" offset="110s" duration="10s" tcFormat="NDF"> <video offset="0s" ref="r11" duration="27120/600s"/> <clip name="IMG_0233" lane="-1" offset="5s" duration="5s" start="4146583/720000s" tcFormat="NDF"> <gap name="Gap" offset="0s" duration="27120/600s"> <audio lane="-1" offset="0s" ref="r11" duration="32554800/720000s" role="dialogue.dialogue-1" srcCh="1"/> </gap> </clip> </clip> <clip name="IMG_0687" offset="120s" duration="10s" start="37600/3000s" tcFormat="NDF"> <video offset="0s" ref="r6" duration="13880/600s"/> <clip name="IMG_0687" lane="-1" offset="37600/3000s" duration="10s" start="37600/3000s" tcFormat="NDF"> <gap name="Gap" offset="0s" duration="13880/600s"> <audio lane="-1" offset="0s" ref="r6" duration="16666800/720000s" role="dialogue.dialogue-1" srcCh="1"/> </gap> </clip> </clip> <asset-clip name="IMG_0268" offset="130s" ref="r7" duration="10s" start="23200/3000s" audioRole="dialogue" tcFormat="NDF"/> <ref-clip name="compound_clip_1" offset="140s" ref="r10" srcEnable="video" duration="10s" start="5700/3000s"> <ref-clip name="compound_clip_1" lane="-1" offset="275843/144000s" ref="r10" srcEnable="audio" duration="10s" useAudioSubroles="1"/> </ref-clip> </spine> </sequence> </project> </fcpxml> \ No newline at end of file diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/gaps.otio b/contrib/opentimelineio_contrib/adapters/tests/sample_data/gaps.otio deleted file mode 100644 index caa977616..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/gaps.otio +++ /dev/null @@ -1,118 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "global_start_time": null, - "metadata": {}, - "name": "gaps", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Gap.1", - "effects": [], - "markers": [], - "metadata": {}, - "name": "gap", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 60 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 0 - } - } - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "metadata": {}, - "name": null, - "source_range": null - }, - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Gap.1", - "effects": [], - "markers": [], - "metadata": {}, - "name": "gap", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 600 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 0 - } - } - }, - { - "OTIO_SCHEMA": "Gap.1", - "effects": [], - "markers": [], - "metadata": {}, - "name": "gap", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 480 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 0 - } - } - }, - { - "OTIO_SCHEMA": "Gap.1", - "effects": [], - "markers": [], - "metadata": {}, - "name": "gap", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 300 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 0 - } - } - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "metadata": {}, - "name": null, - "source_range": null - } - ], - "effects": [], - "markers": [], - "metadata": {}, - "name": "tracks", - "source_range": null - } -} \ No newline at end of file diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/generator_reference_test.otio b/contrib/opentimelineio_contrib/adapters/tests/sample_data/generator_reference_test.otio deleted file mode 100644 index 0d8d4e5f6..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/generator_reference_test.otio +++ /dev/null @@ -1,70 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "metadata": {}, - "name": "transition_test", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Sequence.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "enabled": true, - "media_reference": { - "OTIO_SCHEMA" : "GeneratorReference.1", - "available_range" : { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 50 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0.0 - } - }, - "generator_kind" : "SMPTEBars", - "metadata" : {}, - "parameters" : {}, - "name" : "bars" - }, - "metadata": {}, - "name": "C", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 50 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0.0 - } - } - - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "enabled": true, - "metadata": {}, - "name": "Sequence1", - "source_range": null - } - ], - "effects": [], - "markers": [], - "enabled": true, - "metadata": {}, - "name": "tracks", - "source_range": null - } -} diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/image_sequence_example.otio b/contrib/opentimelineio_contrib/adapters/tests/sample_data/image_sequence_example.otio deleted file mode 100644 index ad2e18a30..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/image_sequence_example.otio +++ /dev/null @@ -1,77 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "metadata": {}, - "name": "", - "global_start_time": null, - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "metadata": {}, - "name": "tracks", - "source_range": null, - "effects": [], - "markers": [], - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "metadata": {}, - "name": "V", - "source_range": null, - "effects": [], - "markers": [], - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "metadata": { - "cmx_3600": { - "reel": "sample_sequence" - } - }, - "name": "sample_sequence", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 30.0 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 86410.0 - } - }, - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "ImageSequenceReference.1", - "metadata": {}, - "name": "", - "available_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": 86400.0 - } - }, - "target_url_base": "./sample_sequence/", - "name_prefix": "sample_sequence.", - "name_suffix": ".exr", - "start_frame": 1001, - "frame_step": 1, - "rate": 24.0, - "frame_zero_padding": 4, - "missing_frame_policy": "error" - } - } - ], - "kind": "Video" - } - ] - } -} diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/kdenlive_example_v221170.kdenlive b/contrib/opentimelineio_contrib/adapters/tests/sample_data/kdenlive_example_v221170.kdenlive deleted file mode 100644 index c09cb0f2e..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/kdenlive_example_v221170.kdenlive +++ /dev/null @@ -1,1065 +0,0 @@ -<?xml version='1.0' encoding='utf-8'?> -<mlt LC_NUMERIC="C" producer="main_bin" version="7.9.0" root="/opt/kdenlive"> - <profile frame_rate_num="25" sample_aspect_num="16" display_aspect_den="3" colorspace="601" progressive="0" description="DV/DVD PAL" display_aspect_num="4" frame_rate_den="1" width="720" height="576" sample_aspect_den="15"/> - <producer title="Anonymous Submission" id="producer2" in="00:00:00.000" out="00:05:48.000"> - <property name="length">8701</property> - <property name="eof">pause</property> - <property name="resource">AUD0001.OGG</property> - <property name="aspect_ratio">1.06667</property> - <property name="text">INVALID</property> - <property name="fgcolour">0xffffffff</property> - <property name="bgcolour">0x00000000</property> - <property name="olcolour">0x00000000</property> - <property name="outline">0</property> - <property name="align">left</property> - <property name="pad">0</property> - <property name="family">Sans</property> - <property name="size">48</property> - <property name="style">normal</property> - <property name="weight">400</property> - <property name="encoding">UTF-8</property> - <property name="mlt_service">avformat</property> - <property name="meta.media.nb_streams">1</property> - <property name="meta.media.0.stream.type">audio</property> - <property name="meta.media.0.codec.sample_fmt">fltp</property> - <property name="meta.media.0.codec.sample_rate">44100</property> - <property name="meta.media.0.codec.channels">2</property> - <property name="meta.media.0.codec.name">vorbis</property> - <property name="meta.media.0.codec.long_name">Vorbis</property> - <property name="meta.media.0.codec.bit_rate">112000</property> - <property name="seekable">1</property> - <property name="audio_index">0</property> - <property name="video_index">-1</property> - <property name="mute_on_pause">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">4746320</property> - <property name="kdenlive:file_hash">2581967857de47ee2adee0965a84fd70</property> - <property name="global_feed">1</property> - <property name="kdenlive:orig_service">avformat</property> - </producer> - <producer title="Anonymous Submission" id="producer4" in="00:00:00.000" out="00:02:03.360"> - <property name="length">3085</property> - <property name="eof">pause</property> - <property name="resource">AUD0002.OGG</property> - <property name="aspect_ratio">1.06667</property> - <property name="text">INVALID</property> - <property name="fgcolour">0xffffffff</property> - <property name="bgcolour">0x00000000</property> - <property name="olcolour">0x00000000</property> - <property name="outline">0</property> - <property name="align">left</property> - <property name="pad">0</property> - <property name="family">Sans</property> - <property name="size">48</property> - <property name="style">normal</property> - <property name="weight">400</property> - <property name="encoding">UTF-8</property> - <property name="mlt_service">avformat</property> - <property name="meta.media.nb_streams">1</property> - <property name="meta.media.0.stream.type">audio</property> - <property name="meta.media.0.codec.sample_fmt">fltp</property> - <property name="meta.media.0.codec.sample_rate">44100</property> - <property name="meta.media.0.codec.channels">2</property> - <property name="meta.media.0.codec.name">vorbis</property> - <property name="meta.media.0.codec.long_name">Vorbis</property> - <property name="meta.media.0.codec.bit_rate">112000</property> - <property name="seekable">1</property> - <property name="audio_index">0</property> - <property name="video_index">-1</property> - <property name="mute_on_pause">1</property> - <property name="kdenlive:clipname">Music</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">3</property> - <property name="kdenlive:file_size">1686721</property> - <property name="kdenlive:file_hash">f5fc0d494799f2cbaabc85c758b7d6d6</property> - <property name="global_feed">1</property> - <property name="kdenlive:orig_service">avformat</property> - </producer> - <producer title="Anonymous Submission" id="producer5" in="00:00:00.000" out="00:00:39.120"> - <property name="length">979</property> - <property name="eof">pause</property> - <property name="resource">VID0001.MKV</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">2.4</property> - <property name="kdenlive:clipname">Wide</property> - <property name="kdenlive:folderid">8</property> - <property name="kdenlive:id">4</property> - <property name="kdenlive:file_size">3590506</property> - <property name="kdenlive:file_hash">162662aad64e84bb9dea3270ffa9dfa7</property> - <property name="global_feed">1</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">29.97</property> - <property name="meta.media.0.stream.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.width">720</property> - <property name="meta.media.0.codec.height">576</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.frame_rate">29.97</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.colorspace">601</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">0</property> - <property name="meta.attr.0.stream.HANDLER_NAME.markup">VideoHandler</property> - <property name="meta.attr.0.stream.ENCODER.markup">Lavc58.54.100 libx264</property> - <property name="meta.attr.0.stream.DURATION.markup">00:00:37.203000000</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">vorbis</property> - <property name="meta.media.1.codec.long_name">Vorbis</property> - <property name="meta.media.1.codec.bit_rate">0</property> - <property name="meta.attr.1.stream.HANDLER_NAME.markup">SoundHandler</property> - <property name="meta.attr.1.stream.ENCODER.markup">Lavc58.54.100 libvorbis</property> - <property name="meta.attr.1.stream.DURATION.markup">00:00:39.159000000</property> - <property name="meta.attr.MINOR_VERSION.markup">512</property> - <property name="meta.attr.COMPATIBLE_BRANDS.markup">iso6mp41</property> - <property name="meta.attr.MAJOR_BRAND.markup">iso5</property> - <property name="meta.attr.ENCODER.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">12</property> - <property name="meta.media.sample_aspect_den">5</property> - <property name="meta.media.frame_rate_num">30000</property> - <property name="meta.media.frame_rate_den">1001</property> - <property name="meta.media.colorspace">601</property> - <property name="meta.media.color_trc">2</property> - <property name="meta.media.width">720</property> - <property name="meta.media.height">576</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="kdenlive:zone_in">508</property> - <property name="kdenlive:zone_out">639</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <producer title="Anonymous Submission" id="producer1" in="00:00:00.000" out="00:00:12.280"> - <property name="length">308</property> - <property name="eof">pause</property> - <property name="resource">VID0002.MKV</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">2.4</property> - <property name="kdenlive:clipname">Close 1</property> - <property name="kdenlive:folderid">8</property> - <property name="kdenlive:id">5</property> - <property name="kdenlive:file_size">1259453</property> - <property name="kdenlive:file_hash">82c8b101a4a401e973f9f127dda3743a</property> - <property name="global_feed">1</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">29.97</property> - <property name="meta.media.0.stream.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.width">720</property> - <property name="meta.media.0.codec.height">576</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.frame_rate">29.97</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.colorspace">601</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">0</property> - <property name="meta.attr.0.stream.HANDLER_NAME.markup">VideoHandler</property> - <property name="meta.attr.0.stream.ENCODER.markup">Lavc58.54.100 libx264</property> - <property name="meta.attr.0.stream.DURATION.markup">00:00:12.315000000</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">vorbis</property> - <property name="meta.media.1.codec.long_name">Vorbis</property> - <property name="meta.media.1.codec.bit_rate">0</property> - <property name="meta.attr.1.stream.HANDLER_NAME.markup">SoundHandler</property> - <property name="meta.attr.1.stream.ENCODER.markup">Lavc58.54.100 libvorbis</property> - <property name="meta.attr.1.stream.DURATION.markup">00:00:12.303000000</property> - <property name="meta.attr.MAJOR_BRAND.markup">iso5</property> - <property name="meta.attr.MINOR_VERSION.markup">512</property> - <property name="meta.attr.COMPATIBLE_BRANDS.markup">iso6mp41</property> - <property name="meta.attr.ENCODER.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">12</property> - <property name="meta.media.sample_aspect_den">5</property> - <property name="meta.media.frame_rate_num">30000</property> - <property name="meta.media.frame_rate_den">1001</property> - <property name="meta.media.colorspace">601</property> - <property name="meta.media.color_trc">2</property> - <property name="meta.media.width">720</property> - <property name="meta.media.height">576</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <producer title="Anonymous Submission" id="producer3" in="00:00:00.000" out="00:00:26.840"> - <property name="length">672</property> - <property name="eof">pause</property> - <property name="resource">VID0003.MKV</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">2.4</property> - <property name="kdenlive:clipname">Close 2</property> - <property name="kdenlive:folderid">9</property> - <property name="kdenlive:id">6</property> - <property name="kdenlive:file_size">2203343</property> - <property name="kdenlive:file_hash">da3511cd5b12be5acb6a88fb3f789dff</property> - <property name="global_feed">1</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">29.97</property> - <property name="meta.media.0.stream.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.width">720</property> - <property name="meta.media.0.codec.height">576</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.frame_rate">29.97</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.colorspace">601</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">0</property> - <property name="meta.attr.0.stream.HANDLER_NAME.markup">VideoHandler</property> - <property name="meta.attr.0.stream.ENCODER.markup">Lavc58.54.100 libx264</property> - <property name="meta.attr.0.stream.DURATION.markup">00:00:24.894000000</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">vorbis</property> - <property name="meta.media.1.codec.long_name">Vorbis</property> - <property name="meta.media.1.codec.bit_rate">0</property> - <property name="meta.attr.1.stream.HANDLER_NAME.markup">SoundHandler</property> - <property name="meta.attr.1.stream.ENCODER.markup">Lavc58.54.100 libvorbis</property> - <property name="meta.attr.1.stream.DURATION.markup">00:00:26.862000000</property> - <property name="meta.attr.MAJOR_BRAND.markup">iso5</property> - <property name="meta.attr.MINOR_VERSION.markup">512</property> - <property name="meta.attr.COMPATIBLE_BRANDS.markup">iso6mp41</property> - <property name="meta.attr.ENCODER.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">12</property> - <property name="meta.media.sample_aspect_den">5</property> - <property name="meta.media.frame_rate_num">30000</property> - <property name="meta.media.frame_rate_den">1001</property> - <property name="meta.media.colorspace">601</property> - <property name="meta.media.color_trc">2</property> - <property name="meta.media.width">720</property> - <property name="meta.media.height">576</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <producer id="producer0" in="00:00:00.000" out="00:00:04.960"> - <property name="length">00:00:05.000</property> - <property name="eof">pause</property> - <property name="resource">0x2a3158ff</property> - <property name="aspect_ratio">1.06667</property> - <property name="mlt_service">color</property> - <property name="kdenlive:clipname">Dark Blue</property> - <property name="kdenlive:duration">00:00:05.000</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">7</property> - <property name="kdenlive:file_hash">466ccb917e30c2d39bcd72068d75e4df</property> - <property name="mlt_image_format">rgb</property> - <property name="kdenlive:clip_type">2</property> - </producer> - <producer id="producer6" in="00:00:00.000" out="00:00:04.960"> - <property name="length">125</property> - <property name="eof">pause</property> - <property name="resource"/> - <property name="progressive">1</property> - <property name="aspect_ratio">1</property> - <property name="seekable">1</property> - <property name="mlt_service">kdenlivetitle</property> - <property name="kdenlive:duration">125</property> - <property name="xmldata"><kdenlivetitle duration="125" LC_NUMERIC="English_United States.1252" width="768" height="576" out="124"> - <item type="QGraphicsTextItem" z-index="0"> - <position x="110" y="230"> - <transform>1,0,0,0,1,0,0,0,1</transform> - </position> - <content line-spacing="0" shadow="0;#64000000;3;3;3" font-underline="0" box-height="70" font-outline-color="0,0,0,255" font="Noto Sans" letter-spacing="0" font-pixel-size="60" font-italic="0" alignment="4" font-weight="50" font-outline="0" box-width="545" font-color="255,253,184,255">Testing Kdenlive...</content> - </item> - <startviewport rect="0,0,768,576"/> - <endviewport rect="0,0,768,576"/> - <background color="0,0,0,0"/> -</kdenlivetitle> -</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">10</property> - <property name="kdenlive:file_hash">de362639624a26f69e4278e90d059408</property> - <property name="kdenlive:clipname">Placeholder: Unsupported clip type</property> - <property name="force_reload">0</property> - <property name="meta.media.width">768</property> - <property name="meta.media.height">576</property> - <property name="kdenlive:clip_type">2</property> - </producer> - <playlist id="main_bin"> - <property name="kdenlive:folder.-1.8">day 1</property> - <property name="kdenlive:folder.-1.9">day 2</property> - <property name="kdenlive:docproperties.activeTrack">4</property> - <property name="kdenlive:docproperties.audioTarget">-1</property> - <property name="kdenlive:docproperties.compositing">1</property> - <property name="kdenlive:docproperties.disablepreview">0</property> - <property name="kdenlive:docproperties.documentid">1573548516836</property> - <property name="kdenlive:docproperties.enableTimelineZone">0</property> - <property name="kdenlive:docproperties.enableexternalproxy">0</property> - <property name="kdenlive:docproperties.enableproxy">0</property> - <property name="kdenlive:docproperties.externalproxyparams"/> - <property name="kdenlive:docproperties.generateimageproxy">0</property> - <property name="kdenlive:docproperties.generateproxy">0</property> - <property name="kdenlive:docproperties.groups">[ - { - "children": [ - { - "data": "2:74", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:74", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "3:458", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:458", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - } -] -</property> - <property name="kdenlive:docproperties.kdenliveversion">22.11.70 (rev. e629e8bf1)</property> - <property name="kdenlive:docproperties.position">363</property> - <property name="kdenlive:docproperties.previewextension"/> - <property name="kdenlive:docproperties.previewparameters"/> - <property name="kdenlive:docproperties.profile">dv_pal</property> - <property name="kdenlive:docproperties.proxyextension"/> - <property name="kdenlive:docproperties.proxyimageminsize">2000</property> - <property name="kdenlive:docproperties.proxyimagesize">800</property> - <property name="kdenlive:docproperties.proxyminsize">1000</property> - <property name="kdenlive:docproperties.proxyparams"/> - <property name="kdenlive:docproperties.proxyresize">640</property> - <property name="kdenlive:docproperties.renderaudioquality">6</property> - <property name="kdenlive:docproperties.rendercategory">Generic (HD for web, mobile devices...)</property> - <property name="kdenlive:docproperties.renderendguide">-1</property> - <property name="kdenlive:docproperties.renderexportaudio">0</property> - <property name="kdenlive:docproperties.renderfield">0</property> - <property name="kdenlive:docproperties.renderguide">0</property> - <property name="kdenlive:docproperties.renderplay">0</property> - <property name="kdenlive:docproperties.renderprofile">WebM - the widespread free format (VP8/Vorbis)</property> - <property name="kdenlive:docproperties.renderquality">23</property> - <property name="kdenlive:docproperties.renderratio">1</property> - <property name="kdenlive:docproperties.renderrescale">0</property> - <property name="kdenlive:docproperties.renderrescaleheight">288</property> - <property name="kdenlive:docproperties.renderrescalewidth">360</property> - <property name="kdenlive:docproperties.renderscanning">0</property> - <property name="kdenlive:docproperties.renderspeed">2</property> - <property name="kdenlive:docproperties.renderstartguide">-1</property> - <property name="kdenlive:docproperties.rendertcoverlay">0</property> - <property name="kdenlive:docproperties.rendertctype">0</property> - <property name="kdenlive:docproperties.rendertwopass">0</property> - <property name="kdenlive:docproperties.renderzone">0</property> - <property name="kdenlive:docproperties.scrollPos">0</property> - <property name="kdenlive:docproperties.seekOffset">30000</property> - <property name="kdenlive:docproperties.storagefolder">1573548516836</property> - <property name="kdenlive:docproperties.version">1.04</property> - <property name="kdenlive:docproperties.verticalzoom">1</property> - <property name="kdenlive:docproperties.videoTarget">-1</property> - <property name="kdenlive:docproperties.zonein">0</property> - <property name="kdenlive:docproperties.zoneout">867</property> - <property name="kdenlive:docproperties.zoom">6</property> - <property name="kdenlive:expandedFolders">9</property> - <property name="kdenlive:documentnotes"/> - <property name="kdenlive:docproperties.guides">[ - { - "comment": "Purple Marker", - "pos": 230, - "type": 0 - }, - { - "comment": "Green", - "pos": 466, - "type": 3 - } -] -</property> - <property name="xml_retain">1</property> - <entry producer="producer2" in="00:00:00.000" out="00:05:48.000"/> - <entry producer="producer4" in="00:00:00.000" out="00:02:03.360"/> - <entry producer="producer5" in="00:00:00.000" out="00:00:39.120"/> - <entry producer="producer1" in="00:00:00.000" out="00:00:12.280"/> - <entry producer="producer3" in="00:00:00.000" out="00:00:26.840"/> - <entry producer="producer0" in="00:00:00.000" out="00:00:04.960"/> - <entry producer="producer6" in="00:00:00.000" out="00:00:04.960"/> - </playlist> - <producer id="black_track" in="00:00:00.000" out="00:20:34.480"> - <property name="length">2147483647</property> - <property name="eof">continue</property> - <property name="resource">black</property> - <property name="aspect_ratio">1</property> - <property name="mlt_service">color</property> - <property name="mlt_image_format">rgba</property> - <property name="set.test_audio">0</property> - </producer> - <producer title="Anonymous Submission" id="producer7" in="00:00:00.000" out="00:02:03.360"> - <property name="length">3085</property> - <property name="eof">pause</property> - <property name="resource">AUD0002.OGG</property> - <property name="audio_index">0</property> - <property name="video_index">-1</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="meta.media.nb_streams">1</property> - <property name="meta.media.0.stream.type">audio</property> - <property name="meta.media.0.codec.sample_fmt">fltp</property> - <property name="meta.media.0.codec.sample_rate">44100</property> - <property name="meta.media.0.codec.channels">2</property> - <property name="meta.media.0.codec.name">vorbis</property> - <property name="meta.media.0.codec.long_name">Vorbis</property> - <property name="meta.media.0.codec.bit_rate">112000</property> - <property name="seekable">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">3</property> - <property name="kdenlive:file_size">1686721</property> - <property name="kdenlive:file_hash">f5fc0d494799f2cbaabc85c758b7d6d6</property> - <property name="global_feed">1</property> - <property name="xml">was here</property> - <property name="set.test_audio">0</property> - <property name="set.test_image">1</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <playlist id="playlist0"> - <property name="kdenlive:audio_track">1</property> - <entry producer="producer7" in="00:00:27.920" out="00:01:02.360"> - <property name="kdenlive:id">3</property> - <filter id="filter0" in="00:01:01.240" out="00:01:02.360"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="kdenlive_id">fadeout</property> - <property name="gain">1</property> - <property name="end">0</property> - </filter> - </entry> - </playlist> - <playlist id="playlist1"> - <property name="kdenlive:audio_track">1</property> - </playlist> - <tractor id="tractor0" in="00:00:00.000" out="00:00:34.440"> - <property name="kdenlive:audio_track">1</property> - <property name="kdenlive:trackheight">69</property> - <property name="kdenlive:timeline_active"/> - <property name="kdenlive:collapsed">0</property> - <property name="kdenlive:track_name">Ambience</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="video" producer="playlist0"/> - <track hide="video" producer="playlist1"/> - <filter id="filter1"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="internal_added">237</property> - <property name="disable">1</property> - </filter> - <filter id="filter2"> - <property name="channel">-1</property> - <property name="mlt_service">panner</property> - <property name="internal_added">237</property> - <property name="start">0.5</property> - <property name="disable">1</property> - </filter> - <filter id="filter3"> - <property name="iec_scale">0</property> - <property name="mlt_service">audiolevel</property> - <property name="peak">1</property> - <property name="disable">1</property> - </filter> - </tractor> - <producer title="Anonymous Submission" id="producer8" in="00:00:00.000" out="00:05:48.000"> - <property name="length">8701</property> - <property name="eof">pause</property> - <property name="resource">AUD0001.OGG</property> - <property name="audio_index">0</property> - <property name="video_index">-1</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="meta.media.nb_streams">1</property> - <property name="meta.media.0.stream.type">audio</property> - <property name="meta.media.0.codec.sample_fmt">fltp</property> - <property name="meta.media.0.codec.sample_rate">44100</property> - <property name="meta.media.0.codec.channels">2</property> - <property name="meta.media.0.codec.name">vorbis</property> - <property name="meta.media.0.codec.long_name">Vorbis</property> - <property name="meta.media.0.codec.bit_rate">112000</property> - <property name="seekable">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">4746320</property> - <property name="kdenlive:file_hash">2581967857de47ee2adee0965a84fd70</property> - <property name="global_feed">1</property> - <property name="xml">was here</property> - <property name="set.test_audio">0</property> - <property name="set.test_image">1</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <playlist id="playlist2"> - <property name="kdenlive:audio_track">1</property> - <blank length="00:00:08.520"/> - <entry producer="producer8" in="00:03:52.800" out="00:04:02.560"> - <property name="kdenlive:id">2</property> - <filter id="filter4" in="00:04:01.560" out="00:04:02.560"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="kdenlive_id">fadeout</property> - <property name="gain">1</property> - <property name="end">0</property> - <property name="kdenlive:collapsed">0</property> - </filter> - <filter id="filter5" in="00:03:52.800" out="00:03:53.680"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="kdenlive_id">fadein</property> - <property name="gain">0</property> - <property name="end">1</property> - <property name="kdenlive:collapsed">0</property> - </filter> - </entry> - <blank length="00:00:02.280"/> - <entry producer="producer8" in="00:04:02.600" out="00:04:13.320"> - <property name="kdenlive:id">2</property> - <filter id="filter6" in="00:04:11.800" out="00:04:13.320"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="kdenlive_id">fadeout</property> - <property name="gain">1</property> - <property name="end">0</property> - <property name="kdenlive:collapsed">0</property> - </filter> - <filter id="filter7" in="00:04:02.600" out="00:04:03.720"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="kdenlive_id">fadein</property> - <property name="gain">0</property> - <property name="end">1</property> - <property name="kdenlive:collapsed">0</property> - </filter> - </entry> - </playlist> - <playlist id="playlist3"> - <property name="kdenlive:audio_track">1</property> - </playlist> - <tractor id="tractor1" in="00:00:00.000" out="00:00:31.320"> - <property name="kdenlive:audio_track">1</property> - <property name="kdenlive:trackheight">69</property> - <property name="kdenlive:timeline_active"/> - <property name="kdenlive:collapsed">27</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="video" producer="playlist2"/> - <track hide="video" producer="playlist3"/> - <filter id="filter8"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="internal_added">237</property> - <property name="disable">1</property> - </filter> - <filter id="filter9"> - <property name="channel">-1</property> - <property name="mlt_service">panner</property> - <property name="internal_added">237</property> - <property name="start">0.5</property> - <property name="disable">1</property> - </filter> - <filter id="filter10"> - <property name="iec_scale">0</property> - <property name="mlt_service">audiolevel</property> - <property name="peak">1</property> - <property name="disable">1</property> - </filter> - </tractor> - <producer title="Anonymous Submission" id="producer9" in="00:00:00.000" out="00:00:39.120"> - <property name="length">979</property> - <property name="eof">pause</property> - <property name="resource">VID0001.MKV</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">2.4</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:folderid">8</property> - <property name="kdenlive:id">4</property> - <property name="kdenlive:file_size">3590506</property> - <property name="kdenlive:file_hash">162662aad64e84bb9dea3270ffa9dfa7</property> - <property name="global_feed">1</property> - <property name="kdenlive:zone_in">508</property> - <property name="kdenlive:zone_out">639</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">29.97</property> - <property name="meta.media.0.stream.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.width">720</property> - <property name="meta.media.0.codec.height">576</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.frame_rate">29.97</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.colorspace">601</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">0</property> - <property name="meta.attr.0.stream.HANDLER_NAME.markup">VideoHandler</property> - <property name="meta.attr.0.stream.ENCODER.markup">Lavc58.54.100 libx264</property> - <property name="meta.attr.0.stream.DURATION.markup">00:00:37.203000000</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">vorbis</property> - <property name="meta.media.1.codec.long_name">Vorbis</property> - <property name="meta.media.1.codec.bit_rate">0</property> - <property name="meta.attr.1.stream.HANDLER_NAME.markup">SoundHandler</property> - <property name="meta.attr.1.stream.ENCODER.markup">Lavc58.54.100 libvorbis</property> - <property name="meta.attr.1.stream.DURATION.markup">00:00:39.159000000</property> - <property name="meta.attr.MINOR_VERSION.markup">512</property> - <property name="meta.attr.COMPATIBLE_BRANDS.markup">iso6mp41</property> - <property name="meta.attr.MAJOR_BRAND.markup">iso5</property> - <property name="meta.attr.ENCODER.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">12</property> - <property name="meta.media.sample_aspect_den">5</property> - <property name="meta.media.frame_rate_num">30000</property> - <property name="meta.media.frame_rate_den">1001</property> - <property name="meta.media.colorspace">601</property> - <property name="meta.media.color_trc">2</property> - <property name="meta.media.width">720</property> - <property name="meta.media.height">576</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">0</property> - <property name="set.test_image">1</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <playlist id="playlist4"> - <property name="kdenlive:audio_track">1</property> - <blank length="00:00:02.960"/> - <entry producer="producer9" in="00:00:06.640" out="00:00:15.320"> - <property name="kdenlive:id">4</property> - <filter id="filter11"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="level">00:00:06.640=0;00:00:08.480=15.5556;00:00:12.000=-29.5778</property> - <property name="mlt_service">volume</property> - <property name="kdenlive_id">volume</property> - <property name="kdenlive:collapsed">0</property> - </filter> - </entry> - <blank length="00:00:06.640"/> - <entry producer="producer9" in="00:00:20.320" out="00:00:35.200"> - <property name="kdenlive:id">4</property> - </entry> - </playlist> - <playlist id="playlist5"> - <property name="kdenlive:audio_track">1</property> - </playlist> - <tractor id="tractor2" in="00:00:00.000" out="00:00:33.200"> - <property name="kdenlive:audio_track">1</property> - <property name="kdenlive:trackheight">69</property> - <property name="kdenlive:timeline_active"/> - <property name="kdenlive:collapsed">27</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="video" producer="playlist4"/> - <track hide="video" producer="playlist5"/> - <filter id="filter12"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="internal_added">237</property> - <property name="disable">1</property> - </filter> - <filter id="filter13"> - <property name="channel">-1</property> - <property name="mlt_service">panner</property> - <property name="internal_added">237</property> - <property name="start">0.5</property> - <property name="disable">1</property> - </filter> - <filter id="filter14"> - <property name="iec_scale">0</property> - <property name="mlt_service">audiolevel</property> - <property name="peak">1</property> - <property name="disable">1</property> - </filter> - </tractor> - <producer title="Anonymous Submission" id="producer10" in="00:00:00.000" out="00:00:39.120"> - <property name="length">979</property> - <property name="eof">pause</property> - <property name="resource">VID0001.MKV</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">2.4</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:folderid">8</property> - <property name="kdenlive:id">4</property> - <property name="kdenlive:file_size">3590506</property> - <property name="kdenlive:file_hash">162662aad64e84bb9dea3270ffa9dfa7</property> - <property name="global_feed">1</property> - <property name="kdenlive:zone_in">508</property> - <property name="kdenlive:zone_out">639</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">29.97</property> - <property name="meta.media.0.stream.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.width">720</property> - <property name="meta.media.0.codec.height">576</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.frame_rate">29.97</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.colorspace">601</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">0</property> - <property name="meta.attr.0.stream.HANDLER_NAME.markup">VideoHandler</property> - <property name="meta.attr.0.stream.ENCODER.markup">Lavc58.54.100 libx264</property> - <property name="meta.attr.0.stream.DURATION.markup">00:00:37.203000000</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">vorbis</property> - <property name="meta.media.1.codec.long_name">Vorbis</property> - <property name="meta.media.1.codec.bit_rate">0</property> - <property name="meta.attr.1.stream.HANDLER_NAME.markup">SoundHandler</property> - <property name="meta.attr.1.stream.ENCODER.markup">Lavc58.54.100 libvorbis</property> - <property name="meta.attr.1.stream.DURATION.markup">00:00:39.159000000</property> - <property name="meta.attr.MINOR_VERSION.markup">512</property> - <property name="meta.attr.COMPATIBLE_BRANDS.markup">iso6mp41</property> - <property name="meta.attr.MAJOR_BRAND.markup">iso5</property> - <property name="meta.attr.ENCODER.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">12</property> - <property name="meta.media.sample_aspect_den">5</property> - <property name="meta.media.frame_rate_num">30000</property> - <property name="meta.media.frame_rate_den">1001</property> - <property name="meta.media.colorspace">601</property> - <property name="meta.media.color_trc">2</property> - <property name="meta.media.width">720</property> - <property name="meta.media.height">576</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">1</property> - <property name="set.test_image">0</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <playlist id="playlist6"> - <entry producer="producer0" in="00:00:00.000" out="00:00:02.920"> - <property name="kdenlive:id">7</property> - <filter id="filter15" out="00:00:00.360"> - <property name="start">1</property> - <property name="level">1</property> - <property name="mlt_service">brightness</property> - <property name="kdenlive_id">fade_from_black</property> - <property name="alpha">00:00:00.000=0;00:00:00.360=1</property> - </filter> - </entry> - <entry producer="producer10" in="00:00:06.640" out="00:00:15.320"> - <property name="kdenlive:id">4</property> - <filter id="filter16"> - <property name="start">1</property> - <property name="level">00:00:06.640=1;00:00:08.440=2.02899;00:00:11.960=0.57971</property> - <property name="mlt_service">brightness</property> - <property name="kdenlive_id">brightness</property> - <property name="kdenlive:collapsed">0</property> - </filter> - </entry> - <blank length="00:00:06.640"/> - <entry producer="producer10" in="00:00:20.320" out="00:00:35.200"> - <property name="kdenlive:id">4</property> - </entry> - </playlist> - <playlist id="playlist7"/> - <tractor id="tractor3" in="00:00:00.000" out="00:00:33.200"> - <property name="kdenlive:trackheight">69</property> - <property name="kdenlive:timeline_active"/> - <property name="kdenlive:collapsed">0</property> - <property name="kdenlive:track_name">Wide</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="audio" producer="playlist6"/> - <track hide="audio" producer="playlist7"/> - </tractor> - <producer title="Anonymous Submission" id="producer11" in="00:00:00.000" out="00:00:12.280"> - <property name="length">308</property> - <property name="eof">pause</property> - <property name="resource">VID0002.MKV</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">2.4</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:folderid">8</property> - <property name="kdenlive:id">5</property> - <property name="kdenlive:file_size">1259453</property> - <property name="kdenlive:file_hash">82c8b101a4a401e973f9f127dda3743a</property> - <property name="global_feed">1</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">29.97</property> - <property name="meta.media.0.stream.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.width">720</property> - <property name="meta.media.0.codec.height">576</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.frame_rate">29.97</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.colorspace">601</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">0</property> - <property name="meta.attr.0.stream.HANDLER_NAME.markup">VideoHandler</property> - <property name="meta.attr.0.stream.ENCODER.markup">Lavc58.54.100 libx264</property> - <property name="meta.attr.0.stream.DURATION.markup">00:00:12.315000000</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">vorbis</property> - <property name="meta.media.1.codec.long_name">Vorbis</property> - <property name="meta.media.1.codec.bit_rate">0</property> - <property name="meta.attr.1.stream.HANDLER_NAME.markup">SoundHandler</property> - <property name="meta.attr.1.stream.ENCODER.markup">Lavc58.54.100 libvorbis</property> - <property name="meta.attr.1.stream.DURATION.markup">00:00:12.303000000</property> - <property name="meta.attr.MAJOR_BRAND.markup">iso5</property> - <property name="meta.attr.MINOR_VERSION.markup">512</property> - <property name="meta.attr.COMPATIBLE_BRANDS.markup">iso6mp41</property> - <property name="meta.attr.ENCODER.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">12</property> - <property name="meta.media.sample_aspect_den">5</property> - <property name="meta.media.frame_rate_num">30000</property> - <property name="meta.media.frame_rate_den">1001</property> - <property name="meta.media.colorspace">601</property> - <property name="meta.media.color_trc">2</property> - <property name="meta.media.width">720</property> - <property name="meta.media.height">576</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">1</property> - <property name="set.test_image">0</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <producer title="Anonymous Submission" id="producer12" in="00:00:00.000" out="00:00:26.840"> - <property name="length">672</property> - <property name="eof">pause</property> - <property name="resource">VID0003.MKV</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">1</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">2.4</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:folderid">9</property> - <property name="kdenlive:id">6</property> - <property name="kdenlive:file_size">2203343</property> - <property name="kdenlive:file_hash">da3511cd5b12be5acb6a88fb3f789dff</property> - <property name="global_feed">1</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">29.97</property> - <property name="meta.media.0.stream.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.width">720</property> - <property name="meta.media.0.codec.height">576</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.frame_rate">29.97</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">2.4</property> - <property name="meta.media.0.codec.colorspace">601</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">0</property> - <property name="meta.attr.0.stream.HANDLER_NAME.markup">VideoHandler</property> - <property name="meta.attr.0.stream.ENCODER.markup">Lavc58.54.100 libx264</property> - <property name="meta.attr.0.stream.DURATION.markup">00:00:24.894000000</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">vorbis</property> - <property name="meta.media.1.codec.long_name">Vorbis</property> - <property name="meta.media.1.codec.bit_rate">0</property> - <property name="meta.attr.1.stream.HANDLER_NAME.markup">SoundHandler</property> - <property name="meta.attr.1.stream.ENCODER.markup">Lavc58.54.100 libvorbis</property> - <property name="meta.attr.1.stream.DURATION.markup">00:00:26.862000000</property> - <property name="meta.attr.MAJOR_BRAND.markup">iso5</property> - <property name="meta.attr.MINOR_VERSION.markup">512</property> - <property name="meta.attr.COMPATIBLE_BRANDS.markup">iso6mp41</property> - <property name="meta.attr.ENCODER.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">12</property> - <property name="meta.media.sample_aspect_den">5</property> - <property name="meta.media.frame_rate_num">30000</property> - <property name="meta.media.frame_rate_den">1001</property> - <property name="meta.media.colorspace">601</property> - <property name="meta.media.color_trc">2</property> - <property name="meta.media.width">720</property> - <property name="meta.media.height">576</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">1</property> - <property name="set.test_image">0</property> - <property name="kdenlive:orig_service">avformat-novalidate</property> - </producer> - <playlist id="playlist8"> - <entry producer="producer6" in="00:00:00.000" out="00:00:02.920"> - <property name="kdenlive:id">10</property> - <filter id="filter17" out="00:00:01.280"> - <property name="start">1</property> - <property name="level">1</property> - <property name="mlt_service">brightness</property> - <property name="kdenlive_id">fade_from_black</property> - <property name="alpha">00:00:00.000=0;00:00:01.280=1</property> - </filter> - </entry> - <blank length="00:00:08.720"/> - <entry producer="producer11" in="00:00:03.800" out="00:00:10.400"> - <property name="kdenlive:id">5</property> - </entry> - <blank length="00:00:03.720"/> - <entry producer="producer12" in="00:00:00.000" out="00:00:08.080"> - <property name="kdenlive:id">6</property> - </entry> - </playlist> - <playlist id="playlist9"/> - <tractor id="tractor4" in="00:00:00.000" out="00:00:30.120"> - <property name="kdenlive:trackheight">69</property> - <property name="kdenlive:timeline_active"/> - <property name="kdenlive:collapsed">0</property> - <property name="kdenlive:track_name">Close</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="audio" producer="playlist8"/> - <track hide="audio" producer="playlist9"/> - </tractor> - <tractor id="tractor5" in="00:00:00.000" out="00:20:34.480"> - <track producer="black_track"/> - <track producer="tractor0"/> - <track producer="tractor1"/> - <track producer="tractor2"/> - <track producer="tractor3"/> - <track producer="tractor4"/> - <transition id="transition0"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="internal_added">237</property> - <property name="always_active">1</property> - <property name="accepts_blanks">1</property> - <property name="sum">1</property> - </transition> - <transition id="transition1"> - <property name="a_track">0</property> - <property name="b_track">2</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="internal_added">237</property> - <property name="always_active">1</property> - <property name="accepts_blanks">1</property> - <property name="sum">1</property> - </transition> - <transition id="transition2"> - <property name="a_track">0</property> - <property name="b_track">3</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="internal_added">237</property> - <property name="always_active">1</property> - <property name="accepts_blanks">1</property> - <property name="sum">1</property> - </transition> - <transition id="transition3"> - <property name="a_track">0</property> - <property name="b_track">4</property> - <property name="version">0.1</property> - <property name="mlt_service">frei0r.cairoblend</property> - <property name="always_active">1</property> - <property name="internal_added">237</property> - </transition> - <transition id="transition4"> - <property name="a_track">0</property> - <property name="b_track">5</property> - <property name="version">0.1</property> - <property name="mlt_service">frei0r.cairoblend</property> - <property name="always_active">1</property> - <property name="internal_added">237</property> - </transition> - <filter id="filter18"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="internal_added">237</property> - <property name="disable">1</property> - </filter> - <filter id="filter19"> - <property name="channel">-1</property> - <property name="mlt_service">panner</property> - <property name="internal_added">237</property> - <property name="start">0.5</property> - <property name="disable">1</property> - </filter> - <filter id="filter20"> - <property name="iec_scale">0</property> - <property name="mlt_service">audiolevel</property> - <property name="peak">1</property> - <property name="disable">1</property> - </filter> - <filter id="filter21"> - <property name="mlt_service">avfilter.fieldorder</property> - <property name="internal_added">237</property> - <property name="av.order">tff</property> - </filter> - </tractor> -</mlt> diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/kdenlive_mixes_markers.kdenlive b/contrib/opentimelineio_contrib/adapters/tests/sample_data/kdenlive_mixes_markers.kdenlive deleted file mode 100644 index fd0d72d65..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/kdenlive_mixes_markers.kdenlive +++ /dev/null @@ -1,1165 +0,0 @@ -<?xml version='1.0' encoding='utf-8'?> -<mlt LC_NUMERIC="C" producer="main_bin" version="7.9.0" root="/opt/kdenlive"> - <profile frame_rate_num="25" sample_aspect_num="1" display_aspect_den="9" colorspace="709" progressive="1" description="HD 1080p 25 fps" display_aspect_num="16" frame_rate_den="1" width="1920" height="1080" sample_aspect_den="1"/> - <producer id="producer2" in="00:00:00.000" out="00:02:07.120"> - <property name="length">3179</property> - <property name="eof">continue</property> - <property name="resource">myClip.mp4</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">0</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">25</property> - <property name="meta.media.0.stream.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.width">1920</property> - <property name="meta.media.0.codec.height">1080</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.colorspace">709</property> - <property name="meta.media.0.codec.color_trc">1</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">4604188</property> - <property name="meta.attr.0.stream.handler_name.markup">VideoHandler</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">aac</property> - <property name="meta.media.1.codec.long_name">AAC (Advanced Audio Coding)</property> - <property name="meta.media.1.codec.bit_rate">161378</property> - <property name="meta.attr.1.stream.handler_name.markup">SoundHandler</property> - <property name="meta.attr.major_brand.markup">isom</property> - <property name="meta.attr.minor_version.markup">512</property> - <property name="meta.attr.compatible_brands.markup">isomiso2avc1mp41</property> - <property name="meta.attr.encoder.markup">Lavf58.29.100</property> - <property name="seekable">1</property> - <property name="meta.media.sample_aspect_num">1</property> - <property name="meta.media.sample_aspect_den">1</property> - <property name="aspect_ratio">1</property> - <property name="kdenlive:clipname">SomeNiceContent</property> - <property name="meta.media.frame_rate_num">25</property> - <property name="meta.media.frame_rate_den">1</property> - <property name="meta.media.colorspace">709</property> - <property name="meta.media.color_trc">1</property> - <property name="meta.media.has_b_frames">2</property> - <property name="meta.media.width">1920</property> - <property name="meta.media.height">1080</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="kdenlive:clip_type">0</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">75823059</property> - <property name="kdenlive:file_hash">79625350d3beea1e8d15e38f4c323aab</property> - <property name="kdenlive:audio_max1">249</property> - <property name="kdenlive:activeeffect">-1</property> - <property name="kdenlive:markers">[ - { - "comment": "Lila", - "pos": 1782, - "type": 0 - }, - { - "comment": "Orange", - "pos": 2899, - "type": 5 - } -] -</property> - </producer> - <playlist id="main_bin"> - <property name="kdenlive:docproperties.activeTrack">3</property> - <property name="kdenlive:docproperties.audioChannels">2</property> - <property name="kdenlive:docproperties.audioTarget">-1</property> - <property name="kdenlive:docproperties.compositing">1</property> - <property name="kdenlive:docproperties.disablepreview">0</property> - <property name="kdenlive:docproperties.documentid">1661003132558</property> - <property name="kdenlive:docproperties.enableTimelineZone">0</property> - <property name="kdenlive:docproperties.enableexternalproxy">0</property> - <property name="kdenlive:docproperties.enableproxy">0</property> - <property name="kdenlive:docproperties.externalproxyparams">./;GL;.LRV;./;GX;.MP4;./;GP;.LRV;./;GP;.MP4</property> - <property name="kdenlive:docproperties.generateimageproxy">0</property> - <property name="kdenlive:docproperties.generateproxy">0</property> - <property name="kdenlive:docproperties.groups">[ - { - "children": [ - { - "data": "1:2664", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:2664", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:1309", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:1297", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:928", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:928", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "1:1322", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:1322", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:2286", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:2184", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:0", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:0", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "1:351", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:351", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "1:928", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:928", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:1851", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:1970", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "1:1970", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:1970", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:338", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:338", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:2997", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:2997", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "1:2299", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:2299", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "1:3041", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:3041", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "1:0", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "2:0", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - }, - { - "children": [ - { - "data": "0:2664", - "leaf": "clip", - "type": "Leaf" - }, - { - "data": "3:2664", - "leaf": "clip", - "type": "Leaf" - } - ], - "type": "AVSplit" - } -] -</property> - <property name="kdenlive:docproperties.guides">[ -] -</property> - <property name="kdenlive:docproperties.kdenliveversion">22.11.70 (rev. e629e8bf1)</property> - <property name="kdenlive:docproperties.position">1974</property> - <property name="kdenlive:docproperties.previewextension"/> - <property name="kdenlive:docproperties.previewparameters"/> - <property name="kdenlive:docproperties.profile">atsc_1080p_25</property> - <property name="kdenlive:docproperties.proxyextension"/> - <property name="kdenlive:docproperties.proxyimageminsize">2000</property> - <property name="kdenlive:docproperties.proxyimagesize">800</property> - <property name="kdenlive:docproperties.proxyminsize">1000</property> - <property name="kdenlive:docproperties.proxyparams"/> - <property name="kdenlive:docproperties.proxyresize">640</property> - <property name="kdenlive:docproperties.scrollPos">3064</property> - <property name="kdenlive:docproperties.seekOffset">30000</property> - <property name="kdenlive:docproperties.version">1.04</property> - <property name="kdenlive:docproperties.verticalzoom">1</property> - <property name="kdenlive:docproperties.videoTarget">-1</property> - <property name="kdenlive:docproperties.zonein">0</property> - <property name="kdenlive:docproperties.zoneout">75</property> - <property name="kdenlive:docproperties.zoom">5</property> - <property name="kdenlive:expandedFolders"/> - <property name="kdenlive:documentnotes"/> - <property name="xml_retain">1</property> - <entry producer="producer2" in="00:00:00.000" out="00:02:07.120"/> - </playlist> - <producer id="black_track" in="00:00:00.000" out="00:22:19.320"> - <property name="length">2147483647</property> - <property name="eof">continue</property> - <property name="resource">black</property> - <property name="aspect_ratio">1</property> - <property name="mlt_service">color</property> - <property name="mlt_image_format">rgba</property> - <property name="set.test_audio">0</property> - </producer> - <producer id="producer0" in="00:00:00.000" out="00:02:07.120"> - <property name="length">3179</property> - <property name="eof">continue</property> - <property name="resource">myClip.mp4</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">0</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:clip_type">0</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">75823059</property> - <property name="kdenlive:file_hash">79625350d3beea1e8d15e38f4c323aab</property> - <property name="kdenlive:audio_max1">249</property> - <property name="kdenlive:activeeffect">0</property> - <property name="kdenlive:markers">[ - { - "comment": "Lila", - "pos": 1782, - "type": 0 - }, - { - "comment": "Orange", - "pos": 2899, - "type": 5 - } -] -</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">25</property> - <property name="meta.media.0.stream.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.width">1920</property> - <property name="meta.media.0.codec.height">1080</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.colorspace">709</property> - <property name="meta.media.0.codec.color_trc">1</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">4604188</property> - <property name="meta.attr.0.stream.handler_name.markup">VideoHandler</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">aac</property> - <property name="meta.media.1.codec.long_name">AAC (Advanced Audio Coding)</property> - <property name="meta.media.1.codec.bit_rate">161378</property> - <property name="meta.attr.1.stream.handler_name.markup">SoundHandler</property> - <property name="meta.attr.major_brand.markup">isom</property> - <property name="meta.attr.minor_version.markup">512</property> - <property name="meta.attr.compatible_brands.markup">isomiso2avc1mp41</property> - <property name="meta.attr.encoder.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">1</property> - <property name="meta.media.sample_aspect_den">1</property> - <property name="meta.media.frame_rate_num">25</property> - <property name="meta.media.frame_rate_den">1</property> - <property name="meta.media.colorspace">709</property> - <property name="meta.media.color_trc">1</property> - <property name="meta.media.has_b_frames">2</property> - <property name="meta.media.width">1920</property> - <property name="meta.media.height">1080</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">0</property> - <property name="set.test_image">1</property> - </producer> - <playlist id="playlist0"> - <property name="kdenlive:audio_track">1</property> - <entry producer="producer0" in="00:00:00.000" out="00:00:14.480"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:22.600"/> - <entry producer="producer0" in="00:00:37.640" out="00:00:53.840"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:20.680"/> - <entry producer="producer0" in="00:00:48.640" out="00:01:07.000"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:14.120"/> - <entry producer="producer0" in="00:00:22.560" out="00:00:40.400"> - <property name="kdenlive:id">2</property> - </entry> - </playlist> - <producer id="producer1" in="00:00:00.000" out="00:02:07.120"> - <property name="length">3179</property> - <property name="eof">continue</property> - <property name="resource">myClip.mp4</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">0</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:clip_type">0</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">75823059</property> - <property name="kdenlive:file_hash">79625350d3beea1e8d15e38f4c323aab</property> - <property name="kdenlive:audio_max1">249</property> - <property name="kdenlive:activeeffect">0</property> - <property name="kdenlive:markers">[ - { - "comment": "Lila", - "pos": 1782, - "type": 0 - }, - { - "comment": "Orange", - "pos": 2899, - "type": 5 - } -] -</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">25</property> - <property name="meta.media.0.stream.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.width">1920</property> - <property name="meta.media.0.codec.height">1080</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.colorspace">709</property> - <property name="meta.media.0.codec.color_trc">1</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">4604188</property> - <property name="meta.attr.0.stream.handler_name.markup">VideoHandler</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">aac</property> - <property name="meta.media.1.codec.long_name">AAC (Advanced Audio Coding)</property> - <property name="meta.media.1.codec.bit_rate">161378</property> - <property name="meta.attr.1.stream.handler_name.markup">SoundHandler</property> - <property name="meta.attr.major_brand.markup">isom</property> - <property name="meta.attr.minor_version.markup">512</property> - <property name="meta.attr.compatible_brands.markup">isomiso2avc1mp41</property> - <property name="meta.attr.encoder.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">1</property> - <property name="meta.media.sample_aspect_den">1</property> - <property name="meta.media.frame_rate_num">25</property> - <property name="meta.media.frame_rate_den">1</property> - <property name="meta.media.colorspace">709</property> - <property name="meta.media.color_trc">1</property> - <property name="meta.media.has_b_frames">2</property> - <property name="meta.media.width">1920</property> - <property name="meta.media.height">1080</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">0</property> - <property name="set.test_image">1</property> - </producer> - <playlist id="playlist1"> - <property name="kdenlive:audio_track">1</property> - <blank length="00:00:13.520"/> - <entry producer="producer1" in="00:01:49.640" out="00:02:07.120"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:21.320"/> - <entry producer="producer1" in="00:01:06.040" out="00:01:32.920"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:12.160"/> - <entry producer="producer1" in="00:00:13.520" out="00:00:22.520"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:19.400"/> - <entry producer="producer1" in="00:01:30.720" out="00:01:50.120"> - <property name="kdenlive:id">2</property> - </entry> - </playlist> - <tractor id="tractor0" in="00:00:00.000" out="00:02:19.280"> - <property name="kdenlive:audio_track">1</property> - <property name="kdenlive:trackheight">67</property> - <property name="kdenlive:timeline_active">1</property> - <property name="kdenlive:collapsed">0</property> - <property name="kdenlive:track_name">A3</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="video" producer="playlist0"/> - <track hide="video" producer="playlist1"/> - <transition id="transition0" in="00:00:13.520" out="00:00:14.520"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="kdenlive:mixcut">12</property> - <property name="start">-1</property> - <property name="accepts_blanks">1</property> - <property name="reverse">0</property> - </transition> - <transition id="transition1" in="00:00:52.360" out="00:00:53.360"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="kdenlive:mixcut">12</property> - <property name="start">-1</property> - <property name="accepts_blanks">1</property> - <property name="reverse">0</property> - </transition> - <transition id="transition2" in="00:01:14.040" out="00:01:19.280"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="kdenlive:mixcut">12</property> - <property name="start">-1</property> - <property name="accepts_blanks">1</property> - <property name="reverse">1</property> - </transition> - <transition id="transition3" in="00:01:31.440" out="00:01:32.440"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="kdenlive:mixcut">12</property> - <property name="start">-1</property> - <property name="accepts_blanks">1</property> - <property name="reverse">0</property> - </transition> - <transition id="transition4" in="00:01:59.880" out="00:02:04.440"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="kdenlive:mixcut">70</property> - <property name="start">-1</property> - <property name="accepts_blanks">1</property> - <property name="reverse">0</property> - </transition> - <filter id="filter3"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="internal_added">237</property> - <property name="disable">1</property> - </filter> - <filter id="filter4"> - <property name="channel">-1</property> - <property name="mlt_service">panner</property> - <property name="internal_added">237</property> - <property name="start">0.5</property> - <property name="disable">1</property> - </filter> - <filter id="filter0"> - <property name="iec_scale">0</property> - <property name="mlt_service">audiolevel</property> - <property name="peak">1</property> - <property name="disable">1</property> - </filter> - </tractor> - <producer id="producer3" in="00:00:00.000" out="00:02:07.120"> - <property name="length">3179</property> - <property name="eof">continue</property> - <property name="resource">myClip.mp4</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">0</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:clip_type">0</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">75823059</property> - <property name="kdenlive:file_hash">79625350d3beea1e8d15e38f4c323aab</property> - <property name="kdenlive:audio_max1">249</property> - <property name="kdenlive:activeeffect">0</property> - <property name="kdenlive:markers">[ - { - "comment": "Lila", - "pos": 1782, - "type": 0 - }, - { - "comment": "Orange", - "pos": 2899, - "type": 5 - } -] -</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">25</property> - <property name="meta.media.0.stream.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.width">1920</property> - <property name="meta.media.0.codec.height">1080</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.colorspace">709</property> - <property name="meta.media.0.codec.color_trc">1</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">4604188</property> - <property name="meta.attr.0.stream.handler_name.markup">VideoHandler</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">aac</property> - <property name="meta.media.1.codec.long_name">AAC (Advanced Audio Coding)</property> - <property name="meta.media.1.codec.bit_rate">161378</property> - <property name="meta.attr.1.stream.handler_name.markup">SoundHandler</property> - <property name="meta.attr.major_brand.markup">isom</property> - <property name="meta.attr.minor_version.markup">512</property> - <property name="meta.attr.compatible_brands.markup">isomiso2avc1mp41</property> - <property name="meta.attr.encoder.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">1</property> - <property name="meta.media.sample_aspect_den">1</property> - <property name="meta.media.frame_rate_num">25</property> - <property name="meta.media.frame_rate_den">1</property> - <property name="meta.media.colorspace">709</property> - <property name="meta.media.color_trc">1</property> - <property name="meta.media.has_b_frames">2</property> - <property name="meta.media.width">1920</property> - <property name="meta.media.height">1080</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">0</property> - <property name="set.test_image">1</property> - </producer> - <playlist id="playlist2"> - <property name="kdenlive:audio_track">1</property> - <entry producer="producer3" in="00:00:00.000" out="00:00:14.000"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer3" in="00:01:50.160" out="00:02:07.120"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:06.080"/> - <entry producer="producer3" in="00:00:37.640" out="00:00:53.360"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer3" in="00:01:06.560" out="00:01:32.440"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer3" in="00:00:53.400" out="00:01:06.520"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer3" in="00:00:14.040" out="00:00:22.520"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:06.080"/> - <entry producer="producer3" in="00:00:22.560" out="00:00:37.600"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer3" in="00:01:32.480" out="00:01:50.120"> - <property name="kdenlive:id">2</property> - </entry> - </playlist> - <playlist id="playlist3"> - <property name="kdenlive:audio_track">1</property> - </playlist> - <tractor id="tractor1" in="00:00:00.000" out="00:02:19.280"> - <property name="kdenlive:audio_track">1</property> - <property name="kdenlive:trackheight">67</property> - <property name="kdenlive:timeline_active">1</property> - <property name="kdenlive:collapsed">0</property> - <property name="kdenlive:track_name">A2</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="video" producer="playlist2"/> - <track hide="video" producer="playlist3"/> - <filter id="filter7"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="internal_added">237</property> - <property name="disable">1</property> - </filter> - <filter id="filter8"> - <property name="channel">-1</property> - <property name="mlt_service">panner</property> - <property name="internal_added">237</property> - <property name="start">0.5</property> - <property name="disable">1</property> - </filter> - <filter id="filter1"> - <property name="iec_scale">0</property> - <property name="mlt_service">audiolevel</property> - <property name="peak">1</property> - <property name="disable">1</property> - </filter> - </tractor> - <producer id="producer4" in="00:00:00.000" out="00:02:07.120"> - <property name="length">3179</property> - <property name="eof">continue</property> - <property name="resource">myClip.mp4</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">0</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:clip_type">0</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">75823059</property> - <property name="kdenlive:file_hash">79625350d3beea1e8d15e38f4c323aab</property> - <property name="kdenlive:audio_max1">249</property> - <property name="kdenlive:activeeffect">0</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">25</property> - <property name="meta.media.0.stream.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.width">1920</property> - <property name="meta.media.0.codec.height">1080</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.colorspace">709</property> - <property name="meta.media.0.codec.color_trc">1</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">4604188</property> - <property name="meta.attr.0.stream.handler_name.markup">VideoHandler</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">aac</property> - <property name="meta.media.1.codec.long_name">AAC (Advanced Audio Coding)</property> - <property name="meta.media.1.codec.bit_rate">161378</property> - <property name="meta.attr.1.stream.handler_name.markup">SoundHandler</property> - <property name="meta.attr.major_brand.markup">isom</property> - <property name="meta.attr.minor_version.markup">512</property> - <property name="meta.attr.compatible_brands.markup">isomiso2avc1mp41</property> - <property name="meta.attr.encoder.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">1</property> - <property name="meta.media.sample_aspect_den">1</property> - <property name="meta.media.frame_rate_num">25</property> - <property name="meta.media.frame_rate_den">1</property> - <property name="meta.media.colorspace">709</property> - <property name="meta.media.color_trc">1</property> - <property name="meta.media.has_b_frames">2</property> - <property name="meta.media.width">1920</property> - <property name="meta.media.height">1080</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">1</property> - <property name="set.test_image">0</property> - </producer> - <playlist id="playlist4"> - <entry producer="producer4" in="00:00:00.000" out="00:00:14.000"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer4" in="00:01:50.160" out="00:02:07.120"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:06.080"/> - <entry producer="producer4" in="00:00:37.640" out="00:00:53.360"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer4" in="00:01:06.560" out="00:01:32.440"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer4" in="00:00:53.400" out="00:01:06.520"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer4" in="00:00:14.040" out="00:00:22.520"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:06.080"/> - <entry producer="producer4" in="00:00:22.560" out="00:00:37.600"> - <property name="kdenlive:id">2</property> - </entry> - <entry producer="producer4" in="00:01:32.480" out="00:01:50.120"> - <property name="kdenlive:id">2</property> - </entry> - </playlist> - <playlist id="playlist5"/> - <tractor id="tractor2" in="00:00:00.000" out="00:02:19.280"> - <property name="kdenlive:trackheight">67</property> - <property name="kdenlive:timeline_active">1</property> - <property name="kdenlive:collapsed">0</property> - <property name="kdenlive:track_name">Nothing</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="audio" producer="playlist4"/> - <track hide="audio" producer="playlist5"/> - </tractor> - <producer id="producer5" in="00:00:00.000" out="00:02:07.120"> - <property name="length">3179</property> - <property name="eof">continue</property> - <property name="resource">myClip.mp4</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">0</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:clip_type">0</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">75823059</property> - <property name="kdenlive:file_hash">79625350d3beea1e8d15e38f4c323aab</property> - <property name="kdenlive:audio_max1">249</property> - <property name="kdenlive:activeeffect">0</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">25</property> - <property name="meta.media.0.stream.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.width">1920</property> - <property name="meta.media.0.codec.height">1080</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.colorspace">709</property> - <property name="meta.media.0.codec.color_trc">1</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">4604188</property> - <property name="meta.attr.0.stream.handler_name.markup">VideoHandler</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">aac</property> - <property name="meta.media.1.codec.long_name">AAC (Advanced Audio Coding)</property> - <property name="meta.media.1.codec.bit_rate">161378</property> - <property name="meta.attr.1.stream.handler_name.markup">SoundHandler</property> - <property name="meta.attr.major_brand.markup">isom</property> - <property name="meta.attr.minor_version.markup">512</property> - <property name="meta.attr.compatible_brands.markup">isomiso2avc1mp41</property> - <property name="meta.attr.encoder.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">1</property> - <property name="meta.media.sample_aspect_den">1</property> - <property name="meta.media.frame_rate_num">25</property> - <property name="meta.media.frame_rate_den">1</property> - <property name="meta.media.colorspace">709</property> - <property name="meta.media.color_trc">1</property> - <property name="meta.media.has_b_frames">2</property> - <property name="meta.media.width">1920</property> - <property name="meta.media.height">1080</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">1</property> - <property name="set.test_image">0</property> - </producer> - <playlist id="playlist6"> - <entry producer="producer5" in="00:00:00.000" out="00:00:14.480"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:22.600"/> - <entry producer="producer5" in="00:00:37.640" out="00:00:53.360"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:25.920"/> - <entry producer="producer5" in="00:00:53.400" out="00:01:10.480"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:10.640"/> - <entry producer="producer5" in="00:00:22.560" out="00:00:40.400"> - <property name="kdenlive:id">2</property> - </entry> - </playlist> - <producer id="producer6" in="00:00:00.000" out="00:02:07.120"> - <property name="length">3179</property> - <property name="eof">continue</property> - <property name="resource">myClip.mp4</property> - <property name="audio_index">1</property> - <property name="video_index">0</property> - <property name="mute_on_pause">0</property> - <property name="mlt_service">avformat-novalidate</property> - <property name="seekable">1</property> - <property name="aspect_ratio">1</property> - <property name="kdenlive:clipname"/> - <property name="kdenlive:clip_type">0</property> - <property name="kdenlive:folderid">-1</property> - <property name="kdenlive:id">2</property> - <property name="kdenlive:file_size">75823059</property> - <property name="kdenlive:file_hash">79625350d3beea1e8d15e38f4c323aab</property> - <property name="kdenlive:audio_max1">249</property> - <property name="kdenlive:activeeffect">0</property> - <property name="xml">was here</property> - <property name="meta.media.nb_streams">2</property> - <property name="meta.media.0.stream.type">video</property> - <property name="meta.media.0.stream.frame_rate">25</property> - <property name="meta.media.0.stream.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.width">1920</property> - <property name="meta.media.0.codec.height">1080</property> - <property name="meta.media.0.codec.rotate">0</property> - <property name="meta.media.0.codec.pix_fmt">yuv420p</property> - <property name="meta.media.0.codec.sample_aspect_ratio">1</property> - <property name="meta.media.0.codec.colorspace">709</property> - <property name="meta.media.0.codec.color_trc">1</property> - <property name="meta.media.0.codec.name">h264</property> - <property name="meta.media.0.codec.long_name">H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10</property> - <property name="meta.media.0.codec.bit_rate">4604188</property> - <property name="meta.attr.0.stream.handler_name.markup">VideoHandler</property> - <property name="meta.media.1.stream.type">audio</property> - <property name="meta.media.1.codec.sample_fmt">fltp</property> - <property name="meta.media.1.codec.sample_rate">48000</property> - <property name="meta.media.1.codec.channels">2</property> - <property name="meta.media.1.codec.name">aac</property> - <property name="meta.media.1.codec.long_name">AAC (Advanced Audio Coding)</property> - <property name="meta.media.1.codec.bit_rate">161378</property> - <property name="meta.attr.1.stream.handler_name.markup">SoundHandler</property> - <property name="meta.attr.major_brand.markup">isom</property> - <property name="meta.attr.minor_version.markup">512</property> - <property name="meta.attr.compatible_brands.markup">isomiso2avc1mp41</property> - <property name="meta.attr.encoder.markup">Lavf58.29.100</property> - <property name="meta.media.sample_aspect_num">1</property> - <property name="meta.media.sample_aspect_den">1</property> - <property name="meta.media.frame_rate_num">25</property> - <property name="meta.media.frame_rate_den">1</property> - <property name="meta.media.colorspace">709</property> - <property name="meta.media.color_trc">1</property> - <property name="meta.media.has_b_frames">2</property> - <property name="meta.media.width">1920</property> - <property name="meta.media.height">1080</property> - <property name="meta.media.color_range">mpeg</property> - <property name="meta.media.top_field_first">0</property> - <property name="meta.media.progressive">1</property> - <property name="set.test_audio">1</property> - <property name="set.test_image">0</property> - </producer> - <playlist id="playlist7"> - <blank length="00:00:13.520"/> - <entry producer="producer6" in="00:01:49.640" out="00:02:07.120"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:20.840"/> - <entry producer="producer6" in="00:01:05.560" out="00:01:33.440"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:07.560"/> - <entry producer="producer6" in="00:00:09.440" out="00:00:22.520"> - <property name="kdenlive:id">2</property> - </entry> - <blank length="00:00:19.400"/> - <entry producer="producer6" in="00:01:30.720" out="00:01:50.120"> - <property name="kdenlive:id">2</property> - </entry> - </playlist> - <tractor id="tractor3" in="00:00:00.000" out="00:02:19.280"> - <property name="kdenlive:trackheight">67</property> - <property name="kdenlive:timeline_active">1</property> - <property name="kdenlive:collapsed">0</property> - <property name="kdenlive:track_name">With Mix</property> - <property name="kdenlive:thumbs_format"/> - <property name="kdenlive:audio_rec"/> - <track hide="audio" producer="playlist6"/> - <track hide="audio" producer="playlist7"/> - <transition id="transition5" in="00:00:13.520" out="00:00:14.520"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="factory">loader</property> - <property name="resource"/> - <property name="mlt_service">luma</property> - <property name="kdenlive_id">luma</property> - <property name="kdenlive:mixcut">12</property> - <property name="softness">0</property> - <property name="alpha_over">1</property> - <property name="invert">0</property> - <property name="reverse">0</property> - </transition> - <transition id="transition6" in="00:00:51.880" out="00:00:52.880"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="factory">loader</property> - <property name="resource"/> - <property name="mlt_service">luma</property> - <property name="kdenlive_id">luma</property> - <property name="kdenlive:mixcut">0</property> - <property name="softness">0</property> - <property name="alpha_over">1</property> - <property name="invert">0</property> - <property name="reverse">0</property> - </transition> - <transition id="transition7" in="00:01:18.800" out="00:01:19.800"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="factory">loader</property> - <property name="resource"/> - <property name="mlt_service">luma</property> - <property name="kdenlive_id">luma</property> - <property name="kdenlive:mixcut">25</property> - <property name="reverse">1</property> - <property name="softness">0</property> - <property name="alpha_over">1</property> - <property name="invert">0</property> - </transition> - <transition id="transition8" in="00:01:27.360" out="00:01:35.920"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="factory">loader</property> - <property name="resource"/> - <property name="mlt_service">luma</property> - <property name="kdenlive_id">luma</property> - <property name="kdenlive:mixcut">99</property> - <property name="softness">0</property> - <property name="alpha_over">1</property> - <property name="invert">0</property> - <property name="reverse">0</property> - </transition> - <transition id="transition9" in="00:01:59.880" out="00:02:04.440"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="factory">loader</property> - <property name="resource"/> - <property name="mlt_service">luma</property> - <property name="kdenlive_id">luma</property> - <property name="kdenlive:mixcut">70</property> - <property name="softness">0</property> - <property name="alpha_over">1</property> - <property name="invert">0</property> - <property name="reverse">0</property> - </transition> - </tractor> - <tractor id="tractor4" in="00:00:00.000" out="00:22:19.320"> - <track producer="black_track"/> - <track producer="tractor0"/> - <track producer="tractor1"/> - <track producer="tractor2"/> - <track producer="tractor3"/> - <transition id="transition10"> - <property name="a_track">0</property> - <property name="b_track">1</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="internal_added">237</property> - <property name="always_active">1</property> - <property name="accepts_blanks">1</property> - <property name="sum">1</property> - </transition> - <transition id="transition11"> - <property name="a_track">0</property> - <property name="b_track">2</property> - <property name="mlt_service">mix</property> - <property name="kdenlive_id">mix</property> - <property name="internal_added">237</property> - <property name="always_active">1</property> - <property name="accepts_blanks">1</property> - <property name="sum">1</property> - </transition> - <transition id="transition12"> - <property name="a_track">0</property> - <property name="b_track">3</property> - <property name="version">0.1</property> - <property name="mlt_service">frei0r.cairoblend</property> - <property name="always_active">1</property> - <property name="internal_added">237</property> - </transition> - <transition id="transition13"> - <property name="a_track">0</property> - <property name="b_track">4</property> - <property name="version">0.1</property> - <property name="mlt_service">frei0r.cairoblend</property> - <property name="always_active">1</property> - <property name="internal_added">237</property> - </transition> - <filter id="filter13"> - <property name="window">75</property> - <property name="max_gain">20dB</property> - <property name="mlt_service">volume</property> - <property name="internal_added">237</property> - <property name="disable">1</property> - </filter> - <filter id="filter14"> - <property name="channel">-1</property> - <property name="mlt_service">panner</property> - <property name="internal_added">237</property> - <property name="start">0.5</property> - <property name="disable">1</property> - </filter> - <filter id="filter2"> - <property name="iec_scale">0</property> - <property name="mlt_service">audiolevel</property> - <property name="peak">1</property> - <property name="disable">1</property> - </filter> - </tractor> -</mlt> diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/keyframed_properties.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/keyframed_properties.aaf deleted file mode 100755 index ca7551bbb..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/keyframed_properties.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/linear_speed_effects.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/linear_speed_effects.aaf deleted file mode 100644 index 2e9b4affd..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/linear_speed_effects.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/linear_speed_effects_aaf.mov b/contrib/opentimelineio_contrib/adapters/tests/sample_data/linear_speed_effects_aaf.mov deleted file mode 100644 index ad1c5c7a1..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/linear_speed_effects_aaf.mov and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/marker-over-audio.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/marker-over-audio.aaf deleted file mode 100644 index d0d335344..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/marker-over-audio.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/marker-over-transition.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/marker-over-transition.aaf deleted file mode 100644 index bf9174d4e..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/marker-over-transition.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/misc_speed_effects.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/misc_speed_effects.aaf deleted file mode 100644 index a39847d3a..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/misc_speed_effects.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/misc_speed_effects_aaf.mov b/contrib/opentimelineio_contrib/adapters/tests/sample_data/misc_speed_effects_aaf.mov deleted file mode 100644 index 27a16e060..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/misc_speed_effects_aaf.mov and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_markers.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_markers.aaf deleted file mode 100755 index 3855ed7f5..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_markers.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_timecode_objects.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_timecode_objects.aaf deleted file mode 100644 index f614c016b..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_timecode_objects.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_top_level_mobs.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_top_level_mobs.aaf deleted file mode 100644 index a2cf2b94f..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multiple_top_level_mobs.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multitrack.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/multitrack.aaf deleted file mode 100644 index 4903865d6..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/multitrack.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/nested_stack.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/nested_stack.aaf deleted file mode 100755 index 76f317d48..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/nested_stack.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/nesting_test.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/nesting_test.aaf deleted file mode 100644 index 2dfe2d009..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/nesting_test.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/nesting_test_preflattened.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/nesting_test_preflattened.aaf deleted file mode 100644 index 1ff9b5704..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/nesting_test_preflattened.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/no_metadata.otio b/contrib/opentimelineio_contrib/adapters/tests/sample_data/no_metadata.otio deleted file mode 100644 index 279d97da4..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/no_metadata.otio +++ /dev/null @@ -1,151 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "metadata": {}, - "name": "OTIO_Test_ppjoshm1.Exported.01", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "ExternalReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 192 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 1 - } - }, - "metadata": {}, - "name": null, - "target_url": "sample_data/one_clip.aaf" - }, - "metadata": { - "example_studio": { - "OTIO_SCHEMA": "ExampleStudioMetadata.1", - "cache": { - "hitech": { - "OTIO_SCHEMA": "ExampleDatabase.1", - "shot": null, - "take": null - } - }, - "take": { - "OTIO_SCHEMA": "ExampleStudioTake.1", - "globaltake": 1, - "prod": "ppjoshm", - "shot": "ppjoshm_1", - "unit": "none" - } - } - }, - "name": "ppjoshm_1 (SIM1)", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 10 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 101 - } - } - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "metadata": {}, - "name": "TimelineMobSlot", - "source_range": null - }, - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "ExternalReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 192 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 1 - } - }, - "metadata": {}, - "name": null, - "target_url": "sample_data/one_clip.aaf" - }, - "metadata": { - "example_studio": { - "OTIO_SCHEMA": "ExampleStudioMetadata.1", - "cache": { - "hitech": { - "OTIO_SCHEMA": "ExampleDatabase.1", - "shot": null, - "take": null - } - }, - "take": { - "OTIO_SCHEMA": "ExampleStudioTake.1", - "globaltake": 1, - "prod": "ppjoshm", - "shot": "ppjoshm_1", - "unit": "none" - } - } - }, - "name": "ppjoshm_1 (SIM1)", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 10 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 0 - } - } - } - ], - "effects": [], - "kind": "Audio", - "markers": [], - "metadata": {}, - "name": "TimelineMobSlot", - "source_range": null - } - ], - "effects": [], - "markers": [], - "metadata": {}, - "name": "tracks", - "source_range": null - } -} diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/normalclip_sourceclip_references_compositionmob_has_also_mastermob_usercomments.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/normalclip_sourceclip_references_compositionmob_has_also_mastermob_usercomments.aaf deleted file mode 100644 index 18271a7dc..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/normalclip_sourceclip_references_compositionmob_has_also_mastermob_usercomments.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/normalclip_sourceclip_references_compositionmob_with_usercomments_no_mastermob_usercomments.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/normalclip_sourceclip_references_compositionmob_with_usercomments_no_mastermob_usercomments.aaf deleted file mode 100644 index 0f03ce889..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/normalclip_sourceclip_references_compositionmob_with_usercomments_no_mastermob_usercomments.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/not_aaf.otio b/contrib/opentimelineio_contrib/adapters/tests/sample_data/not_aaf.otio deleted file mode 100644 index 36664d20e..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/not_aaf.otio +++ /dev/null @@ -1,151 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "metadata": {}, - "name": "OTIO_Test_ppjoshm1.Exported.01", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "ExternalReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 192 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 1 - } - }, - "metadata": {}, - "name": null, - "target_url": "sample_data/one_clip.mov" - }, - "metadata": { - "example_studio": { - "OTIO_SCHEMA": "ExampleStudioMetadata.1", - "cache": { - "hitech": { - "OTIO_SCHEMA": "ExampleDatabase.1", - "shot": null, - "take": null - } - }, - "take": { - "OTIO_SCHEMA": "ExampleStudioTake.1", - "globaltake": 1, - "prod": "ppjoshm", - "shot": "ppjoshm_1", - "unit": "none" - } - } - }, - "name": "ppjoshm_1 (SIM1)", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 10 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 101 - } - } - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "metadata": {}, - "name": "TimelineMobSlot", - "source_range": null - }, - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "ExternalReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 192 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 1 - } - }, - "metadata": {}, - "name": null, - "target_url": "sample_data/one_clip.mov" - }, - "metadata": { - "example_studio": { - "OTIO_SCHEMA": "ExampleStudioMetadata.1", - "cache": { - "hitech": { - "OTIO_SCHEMA": "ExampleDatabase.1", - "shot": null, - "take": null - } - }, - "take": { - "OTIO_SCHEMA": "ExampleStudioTake.1", - "globaltake": 1, - "prod": "ppjoshm", - "shot": "ppjoshm_1", - "unit": "none" - } - } - }, - "name": "ppjoshm_1 (SIM1)", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 10 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 0 - } - } - } - ], - "effects": [], - "kind": "Audio", - "markers": [], - "metadata": {}, - "name": "TimelineMobSlot", - "source_range": null - } - ], - "effects": [], - "markers": [], - "metadata": {}, - "name": "tracks", - "source_range": null - } -} diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/one_audio_clip.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/one_audio_clip.aaf deleted file mode 100755 index 35de33892..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/one_audio_clip.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/one_clip.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/one_clip.aaf deleted file mode 100644 index edcbf4d65..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/one_clip.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/precheckfail.otio b/contrib/opentimelineio_contrib/adapters/tests/sample_data/precheckfail.otio deleted file mode 100644 index 1f895f30c..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/precheckfail.otio +++ /dev/null @@ -1,234 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "global_start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 86400 - }, - "metadata": { - "AAF": { - "ClassName": "CompositionMob", - "CreationTime": "2019-03-29 18:55:55", - "LastModified": "2019-03-29 18:55:14", - "MobAttributeList": { - "AudioPluginWindowTrack": 1, - "PRJ_BOUNDARY_FRAMES": 1, - "SEQUERNCE_FORMAT_STRING": "HD 1080p/24", - "SEQUERNCE_FORMAT_TYPE": 10, - "_IMAGE_BOUNDS_OVERRIDE": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?><Bounds> <Source>-800/1 -450/1 1600/1 900/1</Source></Bounds>", - "_USER_POS": 10, - "_VERSION": 2 - }, - "MobID": "urn:smpte:umid:060a2b34.01010101.01010f00.13000000.060e2b34.7f7f2a80.5c9e6a3b.ace913a2", - "Name": "OTIO_Test_ppjoshm1.Exported.01", - "Slots": {}, - "UsageCode": "Usage_TopLevel" - } - }, - "name": "OTIO_Test_ppjoshm1.Exported.01", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "MissingReference.1", - "available_range": null, - "metadata": { - "AAF": { - "ClassName": "MasterMob", - "ConvertFrameRate": false, - "CreationTime": "2019-03-29 18:52:18", - "LastModified": "2019-03-29 18:54:01", - "MobAttributeList": { - "_GEN": 1553885640, - "_IMPORTSETTING": "__AttributeList", - "_SAVED_AAF_AUDIO_LENGTH": 0, - "_SAVED_AAF_AUDIO_RATE_DEN": 1, - "_SAVED_AAF_AUDIO_RATE_NUM": 24, - "_USER_POS": 0, - "_VERSION": 2 - }, - "MobID": "urn:smpte:umid:060a2b34.01010101.01010f00.13000000.060e2b34.7f7f2a80.5c9e6962.cd005cc5", - "Name": "ppjoshm_1 (SIM1)", - "Slots": {} - } - }, - "name": null - }, - "metadata": { - "AAF": { - "ClassName": "SourceClip", - "ComponentAttributeList": { - "_IMAGE_BOUNDS_OVERRIDE": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?><Bounds> <Framing>-800/1 -450/1 1600/1 900/1</Framing> <Valid>-800/1 -450/1 1600/1 900/1</Valid> <Essence>-800/1 -450/1 1600/1 900/1</Essence> <Source>-800/1 -450/1 1600/1 900/1</Source></Bounds>" - }, - "DataDefinition": { - "Description": "Picture Essence", - "Identification": "01030202-0100-0000-060e-2b3404010101", - "Name": "Picture" - }, - "Length": 10, - "Name": "ppjoshm_1 (SIM1)", - "SourceID": "urn:smpte:umid:060a2b34.01010101.01010f00.13000000.060e2b34.7f7f2a80.5c9e6962.cd005cc5", - "SourceMobSlotID": 1, - "StartTime": 0 - } - }, - "name": "ppjoshm_1 (SIM1)", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 10 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 86501 - } - } - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "metadata": { - "AAF": { - "ClassName": "TimelineMobSlot", - "EditRate": "24", - "MediaKind": "Picture", - "Name": "TimelineMobSlot", - "Origin": 0, - "PhysicalTrackNumber": 1, - "Segment": { - "Components": {}, - "DataDefinition": { - "Description": "Picture Essence", - "Identification": "01030202-0100-0000-060e-2b3404010101", - "Name": "Picture" - }, - "Length": 10 - }, - "SlotID": 9, - "SlotName": "" - } - }, - "name": "TimelineMobSlot", - "source_range": null - }, - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "MissingReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 48.0, - "value": 10 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 48.0, - "value": 0 - } - }, - "metadata": { - "AAF": { - "ClassName": "MasterMob", - "ConvertFrameRate": false, - "CreationTime": "2019-03-29 18:52:18", - "LastModified": "2019-03-29 18:54:01", - "MobAttributeList": { - "_GEN": 1553885640, - "_IMPORTSETTING": "__AttributeList", - "_SAVED_AAF_AUDIO_LENGTH": 0, - "_SAVED_AAF_AUDIO_RATE_DEN": 1, - "_SAVED_AAF_AUDIO_RATE_NUM": 24, - "_USER_POS": 0, - "_VERSION": 2 - }, - "MobID": "urn:smpte:umid:060a2b34.01010101.01010f00.13000000.060e2b34.7f7f2a80.5c9e6962.cd005cc5", - "Name": "ppjoshm_1 (SIM1)", - "Slots": {} - } - }, - "name": null - }, - "metadata": { - "AAF": { - "ClassName": "SourceClip", - "DataDefinition": { - "Description": "Sound Essence", - "Identification": "01030202-0200-0000-060e-2b3404010101", - "Name": "Sound" - }, - "Length": 10, - "Name": "ppjoshm_1 (SIM1)", - "SourceID": "urn:smpte:umid:060a2b34.01010101.01010f00.13000000.060e2b34.7f7f2a80.5c9e6962.cd005cc5", - "SourceMobSlotID": 2, - "StartTime": 0 - } - }, - "name": "ppjoshm_1 (SIM1)", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 10 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24.0, - "value": 0 - } - } - } - ], - "effects": [], - "kind": "Audio", - "markers": [], - "metadata": { - "AAF": { - "ClassName": "TimelineMobSlot", - "EditRate": "24", - "MediaKind": "Sound", - "Name": "TimelineMobSlot", - "Origin": 0, - "PhysicalTrackNumber": 1, - "Segment": { - "Components": {}, - "DataDefinition": { - "Description": "Sound Essence", - "Identification": "01030202-0200-0000-060e-2b3404010101", - "Name": "Sound" - }, - "Length": 10 - }, - "SlotID": 10, - "SlotName": "" - } - }, - "name": "TimelineMobSlot", - "source_range": null - } - ], - "effects": [], - "markers": [], - "metadata": {}, - "name": "tracks", - "source_range": null - } -} diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/preflattened.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/preflattened.aaf deleted file mode 100644 index 618cf8aa0..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/preflattened.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample.ale b/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample.ale deleted file mode 100644 index e1e1829ce..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample.ale +++ /dev/null @@ -1,14 +0,0 @@ -Heading -AUDIO_FORMAT 48khz -FIELD_DELIM TABS -FPS 24 -VIDEO_FORMAT 1080 - -Column -Color Name Creation Date Duration Drive IN-OUT Mark IN Mark OUT Tracks Frame Auxiliary TC2 Auxiliary TC5 Auxiliary TC3 Film TC FPS Perf KN End KN Start Ink Number KN IN-OUT KN Dur KN Mark OUT End KN Mark IN Auxiliary Ink Offline Pullin Auxiliary TC4 Pullout Project Sound TC VITC Scene Lock CFPS Soundroll Take Camroll Reel Slip Shoot Date Camera Reel # Labroll KN Film Vendor Invoice ID Vendor Original Master VFX Reel TC 25 S3D Alignment Audio Bit Depth TC 24 Start Ink Film AuxInk Edge AuxInk End Frame Count End Format Ink Dur VFX Ink End Vendor Asset ID S3D Eye Order Cadence Aux TC 24 DPX Vendor Asset Name AuxInk Film Vendor Asset Description Frame Count Start Video File Format Ink Edge Frame Count Duration Image Size TC 30 AuxInk Dur Raster Dimension S3D InversionR LUT Master Dur Master Edge Master End Master Film TC 25PD Master Start S3D Inversion Vendor URL UNC Path Transfer TC 30NP Vendor Asset Status Disk Label S3D Clip Name Journalist Production Vendor Asset Price IDataLink ASC_SOP Image Framing ASC_SAT S3D Group Name Auxiliary TC1 Vendor Name AFD Field Motion Track Formats S3D Channel Color Space Image Aspect Ratio Pixel Aspect Ratio S3D Leading Eye Reformat Vendor Asset Keywords Source File Vendor Asset Rights S3D Contributors Marker Ancillary Data Color Transformation Source Path Modified Date Audio Format Vendor Download Master Tape Video Plug-in TapeID Audio SR Comments - -Data - test_017056 7/28/17 10:49:11 AM 00:00:04:03 Tools_Media [VSD] V 24.00 6+03 01:00:04:03 zzz 24.00 NONE 01:00:00:00 98 1080p/24 NORM 0 MXF 99 1920 x 1080 1920x1080p /Users/zzz/Desktop/test_017056.aaf Progressive MONO YCbCr REC709 [video levels] 16:9 1.000 Stretch test_017056.aaf /Users/zzz/Desktop/ 7/28/17 10:49:43 AM DNxHD 36 (HD1080p) - test_017057 7/25/17 5:39:38 PM 00:00:04:04 Tools_Media [VSD] V 24.00 6+03 01:00:04:04 zzz 24.00 NONE 01:00:00:00 98 1080p/24 NORM 0 MXF 99 1920 x 1080 1920x1080p /Users/zzz/Desktop/test_017057.aaf Progressive MONO YCbCr REC709 [full range] 16:9 1.000 Stretch test_017057.aaf /Users/zzz/Desktop/ 7/25/17 5:39:59 PM DNxHD 36 (HD1080p) - test_017058 7/25/17 5:28:44 PM 00:00:04:05 Tools_Media [VSD] V 24.00 6+03 01:00:04:05 zzz 24.00 NONE 01:00:00:00 98 1080p/24 NORM 0 MXF 99 1920 x 1080 1920x1080p /Users/zzz/Desktop/test_017058.aaf Progressive MONO YCbCr REC709 [full range] 16:9 1.000 Stretch test_017058.aaf /Users/zzz/Desktop/ 7/25/17 5:29:24 PM DNxHD 36 (HD1080p) - Something 7/25/17 4:34:21 PM 00:00:04:06 Tools_Media [VSD] V 24.00 6+03 01:00:04:06 zzz 24.00 NONE 01:00:00:00 98 1080p/24 NORM 0 MXF 99 1920 x 1080 1920x1080p /Users/zzz/Desktop/output.aaf Progressive MONO YCbCr REC709 [video levels] 16:9 1.000 Stretch output.aaf /Users/zzz/Desktop/ 7/25/17 4:35:02 PM DNxHD 36 (HD1080p) diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample2.ale b/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample2.ale deleted file mode 100644 index c370cfeb4..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample2.ale +++ /dev/null @@ -1,9 +0,0 @@ -Heading -FIELD_DELIM TABS VIDEO_FORMAT 1080 AUDIO_FORMAT 48Khz FPS 23.98 - -Column -Name Tape Camera Tracks Scene Take Start End Duration Original_Start Original_End Camroll Shoot Date KN Start KN End DPX Filename TC 24 ColorCorr id ASC_SOP ASC_SAT TC 30 Aux TC 24 Cam TC 24 Film TC Clip Clipname Labroll Orig_Camera Origin DESCRIPT COMMENTS - -Data -19A-1xa 3NY004 A VA1 19A 1xa 04:00:00:00 04:00:46:16 04:00:00:00 04:00:46:16 XA007 07/21/14 KX654321-0000+00 KX654321-0070+00 A007C001_140720_R2E4-1149734 A007C001_140720_R2E4 04:00:00:00 X2 13:18:25:19 13:18:25:15 13:18:25:14 13:18:25:14 13:18:25:14 C001 A007C001 A007C001_140720_R2E4 A007C001 3NY004M33840001 -19A-2xa 3NY004 A VA1 19A 2xa 04:00:46:16 04:01:37:08 04:00:46:16 04:01:37:08 XA007 07/21/14 KX654321-0070+00 KX654321-0146+00 A007C002_140720_R2E4-1154727 A007C002_140720_R2E4 04:00:46:16 X2 13:21:53:19 13:21:53:15 13:21:53:15 13:21:53:15 13:21:53:15 C002 A007C002 A007C002_140720_R2E4 A007C002 3NY004M33840002 diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sampleUHD.ale b/contrib/opentimelineio_contrib/adapters/tests/sample_data/sampleUHD.ale deleted file mode 100644 index a4932980a..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sampleUHD.ale +++ /dev/null @@ -1,11 +0,0 @@ -Heading -FIELD_DELIM TABS -VIDEO_FORMAT CUSTOM -AUDIO_FORMAT 48khz -FPS 23.976 - -Column -Name Tape Start End Source File Image Size FPS - -Data -A118_C029_1102JR 14:40:02:11 14:42:22:23 A118_C029_1102JR_001.R3D 4096 x 2304 23.98 diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample_cdl.ale b/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample_cdl.ale deleted file mode 100755 index dfe4dfef7..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/sample_cdl.ale +++ /dev/null @@ -1,14 +0,0 @@ -Heading -FIELD_DELIM TABS -VIDEO_FORMAT PAL -FPS 23.976 -FILM_FORMAT 35mm,4perf - -Column -Name Tape Tracks Start End Duration ASC_SOP ASC_SAT Shoot Date Camera UNC UNC First Frame UNC Last Frame Length CDL R3D.ToneMap R3D.HighlightRollOff - -Data -A005_C010_0501J0 A005_C010_0501J0 V 17:49:33:01 17:49:35:10 00:00:02:09 (0.8714 0.9334 0.9947)(-0.087 -0.0922 -0.0808)(0.9988 1.0218 1.0101) 0.9 20190501 A some/path/A005_C010_0501J0_001.R3D 1111 1168 57 (0.8714 0.9334 0.9947) (-0.0870 -0.0922 -0.0808) (0.9988 1.0218 1.0101) (0.9000) Low None -A005_C010_0501J0 A005_C010_0501J0 V 17:49:55:19 17:50:02:04 00:00:06:09 (0.8714 0.9334 0.9947)(-0.087 -0.0922 -0.0808)(0.9988 1.0218 1.0101) 0.9 20190501 A some/path/A005_C010_0501J0_001.R3D 1657 1810 153 (0.8714 0.9334 0.9947) (-0.0870 -0.0922 -0.0808) (0.9988 1.0218 1.0101) (0.9000) Low None -A005_C009_0501A0 A005_C009_0501A0 V 17:40:25:06 17:40:28:02 00:00:02:20 (0.8604 0.9252 0.9755)(-0.0735 -0.0813 -0.0737)(0.9988 1.0218 1.0101) 0.9 20190501 A some/path/A005_C009_0501A0_001.R3D 1296 1364 68 (0.8604 0.9252 0.9755) (-0.0735 -0.0813 -0.0737) (0.9988 1.0218 1.0101) (0.9000) Low None -A005_C010_0501J0 A005_C010_0501J0 V 17:50:21:23 17:50:25:13 00:00:03:14 (0.8714 0.9334 0.9947)(-0.087 -0.0922 -0.0808)(0.9988 1.0218 1.0101) 0.9 20190501 A some/path/A005_C010_0501J0_001.R3D 2285 2371 86 (0.8714 0.9334 0.9947) (-0.0870 -0.0922 -0.0808) (0.9988 1.0218 1.0101) (0.9000) Low None diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/screening_example.edl b/contrib/opentimelineio_contrib/adapters/tests/sample_data/screening_example.edl deleted file mode 100644 index e5c11b581..000000000 --- a/contrib/opentimelineio_contrib/adapters/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/contrib/opentimelineio_contrib/adapters/tests/sample_data/screening_example.ma b/contrib/opentimelineio_contrib/adapters/tests/sample_data/screening_example.ma deleted file mode 100644 index 31a2691a8..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/screening_example.ma +++ /dev/null @@ -1,298 +0,0 @@ -//Maya ASCII 2016 scene -//Name: test.ma -//Last modified: Tue, Mar 21, 2017 03:42:59 PM -//Codeset: UTF-8 -requires maya "2016"; -currentUnit -l centimeter -a degree -t film; -fileInfo "application" "maya"; -fileInfo "product" "Maya batch mode"; -fileInfo "version" "2016"; -fileInfo "cutIdentifier" "201610262200-1005964"; -fileInfo "osv" "Linux 3.10.0-327.4.4.el7.x86_64 #1 SMP Thu Dec 17 15:51:24 EST 2015 x86_64"; -createNode transform -s -n "persp"; - rename -uid "5154D740-0000-4C43-58D1-AC7300000028"; - setAttr ".v" no; - setAttr ".t" -type "double3" 28 21 28 ; - setAttr ".r" -type "double3" -27.938352729602379 44.999999999999972 -5.172681101354183e-14 ; -createNode camera -s -n "perspShape" -p "persp"; - rename -uid "5154D740-0000-4C43-58D1-AC7300000029"; - setAttr -k off ".v" no; - setAttr ".fl" 34.999999999999993; - setAttr ".coi" 44.82186966202994; - setAttr ".imn" -type "string" "persp"; - setAttr ".den" -type "string" "persp_depth"; - setAttr ".man" -type "string" "persp_mask"; - setAttr ".hc" -type "string" "viewSet -p %camera"; -createNode transform -s -n "top"; - rename -uid "5154D740-0000-4C43-58D1-AC730000002A"; - setAttr ".v" no; - setAttr ".t" -type "double3" 0 100.1 0 ; - setAttr ".r" -type "double3" -89.999999999999986 0 0 ; -createNode camera -s -n "topShape" -p "top"; - rename -uid "5154D740-0000-4C43-58D1-AC730000002B"; - setAttr -k off ".v" no; - setAttr ".rnd" no; - setAttr ".coi" 100.1; - setAttr ".ow" 30; - setAttr ".imn" -type "string" "top"; - setAttr ".den" -type "string" "top_depth"; - setAttr ".man" -type "string" "top_mask"; - setAttr ".hc" -type "string" "viewSet -t %camera"; - setAttr ".o" yes; -createNode transform -s -n "front"; - rename -uid "5154D740-0000-4C43-58D1-AC730000002C"; - setAttr ".v" no; - setAttr ".t" -type "double3" 0 0 100.1 ; -createNode camera -s -n "frontShape" -p "front"; - rename -uid "5154D740-0000-4C43-58D1-AC730000002D"; - setAttr -k off ".v" no; - setAttr ".rnd" no; - setAttr ".coi" 100.1; - setAttr ".ow" 30; - setAttr ".imn" -type "string" "front"; - setAttr ".den" -type "string" "front_depth"; - setAttr ".man" -type "string" "front_mask"; - setAttr ".hc" -type "string" "viewSet -f %camera"; - setAttr ".o" yes; -createNode transform -s -n "side"; - rename -uid "5154D740-0000-4C43-58D1-AC730000002E"; - setAttr ".v" no; - setAttr ".t" -type "double3" 100.1 0 0 ; - setAttr ".r" -type "double3" 0 89.999999999999986 0 ; -createNode camera -s -n "sideShape" -p "side"; - rename -uid "5154D740-0000-4C43-58D1-AC730000002F"; - setAttr -k off ".v" no; - setAttr ".rnd" no; - setAttr ".coi" 100.1; - setAttr ".ow" 30; - setAttr ".imn" -type "string" "side"; - setAttr ".den" -type "string" "side_depth"; - setAttr ".man" -type "string" "side_mask"; - setAttr ".hc" -type "string" "viewSet -s %camera"; - setAttr ".o" yes; -createNode transform -n "ZZ100_501__LAY3__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001B7"; -createNode camera -n "ZZ100_501__LAY3__camShape2" -p "ZZ100_501__LAY3__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001B8"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_501__LAY3__cam1"; - setAttr ".den" -type "string" "ZZ100_501__LAY3__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_501__LAY3__cam1_mask"; -createNode transform -n "ZZ100_502A__LAY3__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001BB"; -createNode camera -n "ZZ100_502A__LAY3__camShape2" -p "ZZ100_502A__LAY3__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001BC"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_502A__LAY3__cam1"; - setAttr ".den" -type "string" "ZZ100_502A__LAY3__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_502A__LAY3__cam1_mask"; -createNode transform -n "ZZ100_503A__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001BE"; -createNode camera -n "ZZ100_503A__LAY1__camShape2" -p "ZZ100_503A__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001BF"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_503A__LAY1__cam1"; - setAttr ".den" -type "string" "ZZ100_503A__LAY1__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_503A__LAY1__cam1_mask"; -createNode transform -n "ZZ100_504C__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C1"; -createNode camera -n "ZZ100_504C__LAY1__camShape2" -p "ZZ100_504C__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C2"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_504C__LAY1__cam1"; - setAttr ".den" -type "string" "ZZ100_504C__LAY1__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_504C__LAY1__cam1_mask"; -createNode transform -n "ZZ100_504B__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C4"; -createNode camera -n "ZZ100_504B__LAY1__camShape2" -p "ZZ100_504B__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C5"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_504B__LAY1__cam1"; - setAttr ".den" -type "string" "ZZ100_504B__LAY1__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_504B__LAY1__cam1_mask"; -createNode transform -n "ZZ100_507C__LAY2__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C7"; -createNode camera -n "ZZ100_507C__LAY2__camShape2" -p "ZZ100_507C__LAY2__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C8"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_507C__LAY2__cam1"; - setAttr ".den" -type "string" "ZZ100_507C__LAY2__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_507C__LAY2__cam1_mask"; -createNode transform -n "ZZ100_508__LAY2__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001CA"; -createNode camera -n "ZZ100_508__LAY2__camShape2" -p "ZZ100_508__LAY2__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001CB"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_508__LAY2__cam1"; - setAttr ".den" -type "string" "ZZ100_508__LAY2__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_508__LAY2__cam1_mask"; -createNode transform -n "ZZ100_510__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001CD"; -createNode camera -n "ZZ100_510__LAY1__camShape2" -p "ZZ100_510__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001CE"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_510__LAY1__cam1"; - setAttr ".den" -type "string" "ZZ100_510__LAY1__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_510__LAY1__cam1_mask"; -createNode transform -n "ZZ100_510B__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001D0"; -createNode camera -n "ZZ100_510B__LAY1__camShape2" -p "ZZ100_510B__LAY1__cam1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001D1"; - setAttr -k off ".v"; - setAttr ".rnd" no; - setAttr ".imn" -type "string" "ZZ100_510B__LAY1__cam1"; - setAttr ".den" -type "string" "ZZ100_510B__LAY1__cam1_depth"; - setAttr ".man" -type "string" "ZZ100_510B__LAY1__cam1_mask"; -createNode lightLinker -s -n "lightLinker1"; - rename -uid "5154D740-0000-4C43-58D1-AC7300000033"; - setAttr -s 2 ".lnk"; - setAttr -s 2 ".slnk"; -createNode displayLayerManager -n "layerManager"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001B3"; -createNode displayLayer -n "defaultLayer"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001B4"; -createNode renderLayerManager -n "renderLayerManager"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001B5"; -createNode renderLayer -n "defaultRenderLayer"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001B6"; - setAttr ".g" yes; -createNode sequencer -n "sequencer1"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001BA"; - setAttr ".mnf" 0; - setAttr ".mxf" 1048; - setAttr -s 9 ".shts"; -createNode shot -n "ZZ100_501__LAY3_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001B9"; - setAttr ".sf" 86501; - setAttr ".ef" 86531; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_501 (LAY3)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_502A__LAY3_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001BD"; - setAttr ".sf" 86557; - setAttr ".ef" 86606; - setAttr ".ssf" 31; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_502A (LAY3)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_503A__LAY1_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C0"; - setAttr ".sf" 86601; - setAttr ".ef" 86628; - setAttr ".ssf" 81; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_503A (LAY1)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_504C__LAY1_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C3"; - setAttr ".sf" 86641; - setAttr ".ef" 86755; - setAttr ".ssf" 109; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_504C (LAY1)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_504B__LAY1_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C6"; - setAttr ".sf" 86753; - setAttr ".ef" 86853; - setAttr ".ssf" 224; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_504B (LAY1)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_507C__LAY2_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001C9"; - setAttr ".sf" 86501; - setAttr ".ef" 86661; - setAttr ".ssf" 325; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_507C (LAY2)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_508__LAY2_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001CC"; - setAttr ".sf" 86628; - setAttr ".ef" 86797; - setAttr ".ssf" 486; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_508 (LAY2)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_510__LAY1_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001CF"; - setAttr ".sf" 86722; - setAttr ".ef" 86857; - setAttr ".ssf" 656; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_510 (LAY1)"; - setAttr ".wres" 1024; -createNode shot -n "ZZ100_510B__LAY1_"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001D2"; - setAttr ".sf" 86501; - setAttr ".ef" 86757; - setAttr ".ssf" 792; - setAttr ".tk" 0; - setAttr ".sn" -type "string" "ZZ100_510B (LAY1)"; - setAttr ".wres" 1024; -createNode script -n "uiConfigurationScriptNode"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001D3"; - setAttr ".b" -type "string" "// Maya Mel UI Configuration File.\n// No UI generated in batch mode.\n"; - setAttr ".st" 3; -createNode script -n "sceneConfigurationScriptNode"; - rename -uid "5154D740-0000-4C43-58D1-AC73000001D4"; - setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 "; - setAttr ".st" 6; -select -ne :time1; - setAttr ".o" 86502; - setAttr ".unw" 86502; -select -ne :sequenceManager1; -select -ne :hardwareRenderingGlobals; - setAttr ".fprt" yes; -select -ne :renderPartition; - setAttr -s 2 ".st"; -select -ne :renderGlobalsList1; -select -ne :defaultShaderList1; - setAttr -s 4 ".s"; -select -ne :postProcessList1; - setAttr -s 2 ".p"; -select -ne :defaultRenderingList1; -select -ne :initialShadingGroup; - setAttr ".ro" yes; -select -ne :initialParticleSE; - setAttr ".ro" yes; -select -ne :hardwareRenderGlobals; - setAttr ".ctrs" 256; - setAttr ".btrs" 512; -relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; -relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; -relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; -relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; -connectAttr "layerManager.dli[0]" "defaultLayer.id"; -connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; -connectAttr "ZZ100_501__LAY3_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_502A__LAY3_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_503A__LAY1_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_504C__LAY1_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_504B__LAY1_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_507C__LAY2_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_508__LAY2_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_510__LAY1_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_510B__LAY1_.msg" "sequencer1.shts" -na; -connectAttr "ZZ100_501__LAY3__camShape2.msg" "ZZ100_501__LAY3_.ccm"; -connectAttr "ZZ100_502A__LAY3__camShape2.msg" "ZZ100_502A__LAY3_.ccm"; -connectAttr "ZZ100_503A__LAY1__camShape2.msg" "ZZ100_503A__LAY1_.ccm"; -connectAttr "ZZ100_504C__LAY1__camShape2.msg" "ZZ100_504C__LAY1_.ccm"; -connectAttr "ZZ100_504B__LAY1__camShape2.msg" "ZZ100_504B__LAY1_.ccm"; -connectAttr "ZZ100_507C__LAY2__camShape2.msg" "ZZ100_507C__LAY2_.ccm"; -connectAttr "ZZ100_508__LAY2__camShape2.msg" "ZZ100_508__LAY2_.ccm"; -connectAttr "ZZ100_510__LAY1__camShape2.msg" "ZZ100_510__LAY1_.ccm"; -connectAttr "ZZ100_510B__LAY1__camShape2.msg" "ZZ100_510B__LAY1_.ccm"; -connectAttr "sequencer1.msg" ":sequenceManager1.seqts[0]"; -connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; -// End of test.ma diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/simple.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/simple.aaf deleted file mode 100644 index 81a09225c..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/simple.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/subclip_sourceclip_references_compositionmob_with_mastermob.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/subclip_sourceclip_references_compositionmob_with_mastermob.aaf deleted file mode 100644 index 03178e812..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/subclip_sourceclip_references_compositionmob_with_mastermob.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/test_muted_clip.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/test_muted_clip.aaf deleted file mode 100644 index fa8efebf1..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/test_muted_clip.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/timecode_test.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/timecode_test.aaf deleted file mode 100644 index 3defe9a12..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/timecode_test.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/transition_test.otio b/contrib/opentimelineio_contrib/adapters/tests/sample_data/transition_test.otio deleted file mode 100644 index 3b6e95c2b..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/transition_test.otio +++ /dev/null @@ -1,149 +0,0 @@ -{ - "OTIO_SCHEMA": "Timeline.1", - "metadata": {}, - "name": "transition_test", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Transition.1", - "metadata": {}, - "name": "t0", - "transition_type": "SMPTE_Dissolve", - "parameters": {}, - "in_offset": { - "OTIO_SCHEMA" : "RationalTime.1", - "rate" : 24, - "value" : 10 - }, - "out_offset": { - "OTIO_SCHEMA" : "RationalTime.1", - "rate" : 24, - "value" : 10 - } - }, - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "enabled": true, - "media_reference": null, - "metadata": {}, - "name": "A", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 50 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0.0 - } - } - - }, - { - "OTIO_SCHEMA": "Transition.1", - "metadata": {}, - "name": "t1", - "transition_type": "SMPTE_Dissolve", - "parameters": {}, - "in_offset": { - "OTIO_SCHEMA" : "RationalTime.1", - "rate" : 24, - "value" : 10 - }, - "out_offset": { - "OTIO_SCHEMA" : "RationalTime.1", - "rate" : 24, - "value" : 10 - } - }, - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "enabled": true, - "media_reference": null, - "metadata": {}, - "name": "B", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 50 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0.0 - } - } - - }, - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "enabled": true, - "media_reference": null, - "metadata": {}, - "name": "C", - "source_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 50 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 24, - "value": 0.0 - } - } - - }, - { - "OTIO_SCHEMA": "Transition.1", - "metadata": {}, - "name": "t3", - "transition_type": "SMPTE_Dissolve", - "parameters": {}, - "in_offset": { - "OTIO_SCHEMA" : "RationalTime.1", - "rate" : 24, - "value" : 10 - }, - "out_offset": { - "OTIO_SCHEMA" : "RationalTime.1", - "rate" : 24, - "value" : 10 - } - } - - ], - "effects": [], - "kind": "Video", - "markers": [], - "enabled": true, - "metadata": {}, - "name": "Sequence1", - "source_range": null - } - ], - "effects": [], - "markers": [], - "enabled": true, - "metadata": {}, - "name": "tracks", - "source_range": null - } -} diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/transitions.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/transitions.aaf deleted file mode 100644 index 0b56704f0..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/transitions.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/trims.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/trims.aaf deleted file mode 100644 index e4953dafd..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/trims.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/utf8.aaf b/contrib/opentimelineio_contrib/adapters/tests/sample_data/utf8.aaf deleted file mode 100644 index ab36e7f61..000000000 Binary files a/contrib/opentimelineio_contrib/adapters/tests/sample_data/utf8.aaf and /dev/null differ diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/v1_prog_index.m3u8 b/contrib/opentimelineio_contrib/adapters/tests/sample_data/v1_prog_index.m3u8 deleted file mode 100644 index 40fa14a4c..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/v1_prog_index.m3u8 +++ /dev/null @@ -1,158 +0,0 @@ -#EXTM3U -#EXT-X-VERSION:7 -#EXT-X-INDEPENDENT-SEGMENTS -#EXT-X-MEDIA-SEQUENCE:1 -#EXT-X-PLAYLIST-TYPE:VOD -#EXT-X-TARGETDURATION:1 -#EXT-X-MAP:BYTERANGE="729@0",URI="media-video-1.mp4" -#EXTINF:1.00100, -#EXT-X-BYTERANGE:534220@1361 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:778907@535581 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:537741@1314488 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:578439@1852229 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:593718@2430668 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:630613@3024386 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:634728@3654999 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:714824@4289727 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:959505@5004551 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:901951@5964056 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:618831@6866007 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:505733@7484838 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:593480@7990571 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:617335@8584051 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:578236@9201386 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:421794@9779622 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:390440@10201416 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:477096@10591856 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:562407@11068952 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:565052@11631359 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:600160@12196411 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:552664@12796571 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:550040@13349235 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:512679@13899275 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:541998@14411954 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:654961@14953952 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:652785@15608913 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:598097@16261698 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:538081@16859795 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:471646@17397876 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:503387@17869522 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:588415@18372909 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:577750@18961324 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:616575@19539074 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:587505@20155649 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:587032@20743154 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:531455@21330186 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:559421@21861641 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:565333@22421062 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:593998@22986395 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:541919@23580393 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:596496@24122312 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:658420@24718808 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:658304@25377228 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:593870@26035532 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:606370@26629402 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:720134@27235772 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:605085@27955906 -media-video-1.mp4 -#EXTINF:1.00100, -#EXT-X-BYTERANGE:622832@28560991 -media-video-1.mp4 -#EXTINF:0.83417, -#EXT-X-BYTERANGE:489061@29183823 -media-video-1.mp4 -#EXT-X-ENDLIST diff --git a/contrib/opentimelineio_contrib/adapters/tests/sample_data/xges_example.xges b/contrib/opentimelineio_contrib/adapters/tests/sample_data/xges_example.xges deleted file mode 100644 index 4c6af0d68..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/sample_data/xges_example.xges +++ /dev/null @@ -1,44 +0,0 @@ -<ges version='0.3'> - <project properties='properties;' metadatas='metadatas, author=(string)"Thibault\ saunier", render-scale=(double)100, format-version=(string)0.3;'> - <encoding-profiles> - <encoding-profile name='pitivi-profile' description='Pitivi encoding profile' type='container' preset-name='oggmux' format='application/ogg' > - <stream-profile parent='pitivi-profile' id='0' type='video' presence='0' format='video/x-theora, framerate=(fraction)[ 1/2147483647, 2147483647/1 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]' preset-name='theoraenc' restriction='video/x-raw, framerate=(fraction)25/1, width=(int)384, height=(int)288, pixel-aspect-ratio=(fraction)1/1' pass='0' variableframerate='0' /> - <stream-profile parent='pitivi-profile' id='1' type='audio' presence='0' format='audio/x-vorbis, rate=(int)[ 1, 200000 ], channels=(int)[ 1, 255 ]' preset-name='vorbisenc' restriction='audio/x-raw, rate=(int)11025, channels=(int)1' /> - </encoding-profile> - </encoding-profiles> - <ressources> - <asset id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/flac/samples.multimedia.cx_flac_Yesterday.flac' extractable-type-name='GESUriClip' properties='properties, supported-formats=(int)2, duration=(guint64)126615510204;' metadatas='metadatas, audio-codec=(string)"Free\ Lossless\ Audio\ Codec\ \(FLAC\)", file-size=(guint64)11218495;' /> - <asset id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/raw_video.avi' extractable-type-name='GESUriClip' properties='properties, supported-formats=(int)4, duration=(guint64)3333333333;' metadatas='metadatas, video-codec=(string)"Uncompressed\ planar\ YUV\ 4:2:0", bitrate=(uint)27648000, container-format=(string)AVI, file-size=(guint64)11523200;' proxy-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/raw_video.avi.11523200.proxy.mkv' /> - <asset id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/raw_video.avi.11523200.proxy.mkv' extractable-type-name='GESUriClip' properties='properties, supported-formats=(int)4, duration=(guint64)3333333333;' metadatas='metadatas, container-format=(string)Matroska, video-codec=(string)"Motion\ JPEG", file-size=(guint64)1260426;' /> - <asset id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/bowlerhatdancer.sleepytom.SGP.mjpeg.avi.11469256.proxy.mkv' extractable-type-name='GESUriClip' properties='properties, supported-formats=(int)4, duration=(guint64)19400000000;' metadatas='metadatas, container-format=(string)Matroska, video-codec=(string)"Motion\ JPEG", file-size=(guint64)21464554;' /> - <asset id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/samples.multimedia.cx_testsuite_iv31.avi' extractable-type-name='GESUriClip' properties='properties, supported-formats=(int)6, duration=(guint64)47416477000;' metadatas='metadatas, audio-codec=(string)"Uncompressed\ 8-bit\ PCM\ audio", bitrate=(uint)88200, container-format=(string)AVI, video-codec=(string)"Intel\ Video\ 3", file-size=(guint64)3820040;' /> - <asset id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/bowlerhatdancer.sleepytom.SGP.mjpeg.avi' extractable-type-name='GESUriClip' properties='properties, supported-formats=(int)4, duration=(guint64)19400000000;' metadatas='metadatas, video-codec=(string)"Motion\ JPEG", bitrate=(uint)4721297, container-format=(string)AVI, file-size=(guint64)11469256;' proxy-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/bowlerhatdancer.sleepytom.SGP.mjpeg.avi.11469256.proxy.mkv' /> - <asset id='crossfade' extractable-type-name='GESTransitionClip' properties='properties;' metadatas='metadatas, description=(string)GES_VIDEO_STANDARD_TRANSITION_TYPE_CROSSFADE;' /> - </ressources> - <timeline properties='properties, auto-transition=(boolean)true, snapping-distance=(guint64)83957176;' metadatas='metadatas, duration=(guint64)36215932868, framerate=(fraction)25/1;'> - <track caps='video/x-raw(ANY)' track-type='4' track-id='0' properties='properties, async-handling=(boolean)false, message-forward=(boolean)true, caps=(string)"video/x-raw\(ANY\)", restriction-caps=(string)"video/x-raw\,\ width\=\(int\)384\,\ height\=\(int\)288\,\ framerate\=\(fraction\)25/1\,\ pixel-aspect-ratio\=\(fraction\)1/1", mixing=(boolean)true;' metadatas='metadatas;'/> - <track caps='audio/x-raw(ANY)' track-type='2' track-id='1' properties='properties, async-handling=(boolean)false, message-forward=(boolean)true, caps=(string)"audio/x-raw\(ANY\)", restriction-caps=(string)"audio/x-raw\,\ rate\=\(int\)11025\,\ channels\=\(int\)1", mixing=(boolean)true;' metadatas='metadatas;'/> - <layer priority='0' properties='properties, auto-transition=(boolean)true;' metadatas='metadatas, volume=(float)1;'> - <clip id='0' asset-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/samples.multimedia.cx_testsuite_iv31.avi' type-name='GESUriClip' layer-priority='0' track-types='6' start='1894092578' duration='5284314119' inpoint='0' rate='0' properties='properties, name=(string)uriclip43, mute=(boolean)false, is-image=(boolean)false;' /> - </layer> - <layer priority='1' properties='properties, auto-transition=(boolean)true;' metadatas='metadatas, volume=(float)1;'> - <clip id='1' asset-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/raw_video.avi.11523200.proxy.mkv' type-name='GESUriClip' layer-priority='1' track-types='4' start='11095856186' duration='3333333333' inpoint='0' rate='0' properties='properties, name=(string)uriclip45, mute=(boolean)false, is-image=(boolean)false;' /> - <clip id='2' asset-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/samples.multimedia.cx_testsuite_iv31.avi' type-name='GESUriClip' layer-priority='1' track-types='6' start='25678779157' duration='10537153711' inpoint='5284314119' rate='0' properties='properties, name=(string)uriclip47, mute=(boolean)false, is-image=(boolean)false;' /> - </layer> - <layer priority='2' properties='properties, auto-transition=(boolean)true;' metadatas='metadatas, volume=(float)1;'> - <clip id='3' asset-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/bowlerhatdancer.sleepytom.SGP.mjpeg.avi.11469256.proxy.mkv' type-name='GESUriClip' layer-priority='2' track-types='4' start='6821836273' duration='10187887743' inpoint='0' rate='0' properties='properties, name=(string)uriclip49, mute=(boolean)false, is-image=(boolean)false;' /> - <clip id='4' asset-id='crossfade' type-name='GESTransitionClip' layer-priority='2' track-types='4' start='15170742086' duration='1838981930' inpoint='0' rate='0' properties='properties, name=(string)transitionclip2;' children-properties='properties, GESVideoTransition::border=(uint)0, GESVideoTransition::invert=(boolean)false;' /> - <clip id='5' asset-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/avi/bowlerhatdancer.sleepytom.SGP.mjpeg.avi.11469256.proxy.mkv' type-name='GESUriClip' layer-priority='2' track-types='4' start='15170742086' duration='9212112257' inpoint='10187887743' rate='0' properties='properties, name=(string)uriclip51, mute=(boolean)false, is-image=(boolean)false;' /> - </layer> - <layer priority='3' properties='properties, auto-transition=(boolean)true;' metadatas='metadatas, volume=(float)1;'> - <clip id='6' asset-id='file:///home/thiblahute/gst-validate/gst-integration-testsuites/medias/defaults/flac/samples.multimedia.cx_flac_Yesterday.flac' type-name='GESUriClip' layer-priority='3' track-types='2' start='0' duration='36215932868' inpoint='0' rate='0' properties='properties, name=(string)uriclip53, mute=(boolean)false, is-image=(boolean)false;' /> - </layer> - <groups> - <group id='7' properties='properties, name=(string)group5;'> - <child id='0' name='uriclip43'/> - <child id='1' name='uriclip45'/> - </group> - </groups> - </timeline> -</project> -</ges> \ No newline at end of file diff --git a/contrib/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py b/contrib/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py deleted file mode 100644 index 88ec22c52..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py +++ /dev/null @@ -1,1942 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Test the AAF adapter.""" - -# python -import os -import sys -import unittest -import tempfile - -import opentimelineio as otio -from opentimelineio_contrib.adapters.aaf_adapter.aaf_writer import ( - AAFAdapterError, - AAFValidationError -) - -import io - - -TRANSCRIPTION_RESULT = """--- -Transcribing top level mobs ---- -Creating SerializableCollection for Iterable for list - Creating Timeline for SubclipTSVNoData_NoVideo.Exported.02 - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for TimelineMobSlot for DX - Creating Track for Sequence for Sequence - Creating operationGroup for OperationGroup - Creating SourceClip for Subclip.BREATH (Usage_SubClip) - [found child_mastermob] - Creating Timeline for subclip - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating SourceClip for x000-0000_01_Xxxxx_Xxx.aaf - [found no mastermob] - Creating Track for MobSlot for EventMobSlot - Creating Track for Sequence for Sequence - Create marker for DescriptiveMarker - Creating Track for MobSlot for EventMobSlot - Creating Track for Sequence for Sequence - Create marker for DescriptiveMarker - Creating Track for TimelineMobSlot for TimelineMobSlot - Creating Track for Sequence for Sequence - Creating Gap for Filler - Creating Track for TimelineMobSlot for TimelineMobSlot -Marker: NEED PDX (time: 360567.0), attached to item: Subclip.BREATH -""" - - -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SIMPLE_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "simple.aaf" -) -TRANSITIONS_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "transitions.aaf" -) -TRIMS_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "trims.aaf" -) -MULTITRACK_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "multitrack.aaf" -) -PREFLATTENED_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "preflattened.aaf" -) -NESTING_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "nesting_test.aaf" -) -NESTED_STACK_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "nested_stack.aaf" -) -NESTING_PREFLATTENED_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "nesting_test_preflattened.aaf" -) -MISC_SPEED_EFFECTS_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "misc_speed_effects.aaf" -) -PRECHECK_FAIL_OTIO = os.path.join( - SAMPLE_DATA_DIR, - "precheckfail.otio" -) -LINEAR_SPEED_EFFECTS_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "linear_speed_effects.aaf" -) -TIMCODE_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "timecode_test.aaf" -) -MUTED_CLIP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "test_muted_clip.aaf" -) -ESSENCE_GROUP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "essence_group.aaf" -) -ONE_AUDIO_CLIP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "one_audio_clip.aaf" -) -FPS30_CLIP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "30fps.aaf" -) -FPS2997_CLIP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "2997fps.aaf" -) -FPS2997_DFTC_PATH = os.path.join( - SAMPLE_DATA_DIR, - "2997fps-DFTC.aaf" -) -DUPLICATES_PATH = os.path.join( - SAMPLE_DATA_DIR, - "duplicates.aaf" -) -NO_METADATA_OTIO_PATH = os.path.join( - SAMPLE_DATA_DIR, - "no_metadata.otio" -) -NOT_AAF_OTIO_PATH = os.path.join( - SAMPLE_DATA_DIR, - "not_aaf.otio" -) -UTF8_CLIP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "utf8.aaf" -) -MULTIPLE_TOP_LEVEL_MOBS_CLIP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "multiple_top_level_mobs.aaf" -) -GAPS_OTIO_PATH = os.path.join( - SAMPLE_DATA_DIR, - "gaps.otio" -) -COMPOSITE_PATH = os.path.join( - SAMPLE_DATA_DIR, - "composite.aaf" -) - -SUBCLIP_PATH = os.path.join( - SAMPLE_DATA_DIR, - "subclip_sourceclip_references_compositionmob_with_mastermob.aaf" -) - -COMPOSITION_METADATA_MASTERMOB_METADATA_PATH = os.path.join( - SAMPLE_DATA_DIR, - "normalclip_sourceclip_references_compositionmob_" - "has_also_mastermob_usercomments.aaf" -) - -COMPOSITION_METADATA_PATH = os.path.join( - SAMPLE_DATA_DIR, - "normalclip_sourceclip_references_compositionmob_" - "with_usercomments_no_mastermob_usercomments.aaf" -) - -MULTIPLE_TIMECODE_OBJECTS_PATH = os.path.join( - SAMPLE_DATA_DIR, - "multiple_timecode_objects.aaf" -) - -MULTIPLE_MARKERS_PATH = os.path.join( - SAMPLE_DATA_DIR, - "multiple_markers.aaf" -) - -KEYFRAMED_PROPERTIES_PATH = os.path.join( - SAMPLE_DATA_DIR, - "keyframed_properties.aaf" -) - -MARKER_OVER_TRANSITION_PATH = os.path.join( - SAMPLE_DATA_DIR, - "marker-over-transition.aaf", -) - -MARKER_OVER_AUDIO_PATH = os.path.join( - SAMPLE_DATA_DIR, - "marker-over-audio.aaf" -) - - -try: - lib_path = os.environ.get("OTIO_AAF_PYTHON_LIB") - if lib_path and lib_path not in sys.path: - sys.path.insert(0, lib_path) - import aaf2 # noqa - from aaf2.components import (SourceClip, - Filler, - Transition, - Timecode, - OperationGroup, - Sequence) - from aaf2.mobs import MasterMob, SourceMob - from aaf2.misc import VaryingValue - could_import_aaf = True -except (ImportError): - could_import_aaf = False - - -@unittest.skipIf( - not could_import_aaf, - "AAF module not found. You might need to set OTIO_AAF_PYTHON_LIB" -) -class AAFReaderTests(unittest.TestCase): - - def test_aaf_read(self): - aaf_path = SIMPLE_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(aaf_path) - self.assertEqual(timeline.name, "OTIO TEST 1.Exported.01") - fps = timeline.duration().rate - self.assertEqual(fps, 24.0) - self.assertEqual( - timeline.duration(), - otio.opentime.from_timecode("00:02:16:18", fps) - ) - - self.assertEqual(len(timeline.tracks), 3) - - self.assertEqual(len(timeline.video_tracks()), 1) - video_track = timeline.video_tracks()[0] - self.assertEqual(len(video_track), 5) - - self.assertEqual(len(timeline.audio_tracks()), 2) - - clips = video_track.find_clips() - - self.assertEqual( - [ - "tech.fux (loop)-HD.mp4", - "t-hawk (loop)-HD.mp4", - "out-b (loop)-HD.mp4", - "KOLL-HD.mp4", - "brokchrd (loop)-HD.mp4" - ], - [clip.name for clip in clips] - ) - self.maxDiff = None - self.assertEqual( - [clip.source_range for clip in clips], - [ - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:30:00", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:20:00", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:30:02", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:26:16", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:30:00", fps) - ) - ] - ) - - def test_aaf_global_start_time(self): - timeline = otio.adapters.read_from_file(SIMPLE_EXAMPLE_PATH) - self.assertEqual( - otio.opentime.from_timecode("01:00:00:00", 24), - timeline.global_start_time - ) - - def test_aaf_global_start_time_NTSC_DFTC(self): - timeline = otio.adapters.read_from_file(FPS2997_DFTC_PATH) - self.assertEqual( - otio.opentime.from_timecode("05:00:00;00", rate=(30000.0 / 1001)), - timeline.global_start_time - ) - - def test_aaf_read_trims(self): - aaf_path = TRIMS_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(aaf_path) - self.assertEqual( - timeline.name, - "OTIO TEST 1.Exported.01 - trims.Exported.02" - ) - fps = timeline.duration().rate - self.assertEqual(fps, 24.0) - - video_tracks = timeline.video_tracks() - self.assertEqual(len(video_tracks), 1) - video_track = video_tracks[0] - self.assertEqual(len(video_track), 6) - - self.assertEqual( - [type(item) for item in video_track], - [ - otio.schema.Clip, - otio.schema.Clip, - otio.schema.Clip, - otio.schema.Clip, - otio.schema.Gap, - otio.schema.Clip, - ] - ) - - clips = video_track.find_clips() - - self.assertEqual( - [item.name for item in video_track], - [ - "tech.fux (loop)-HD.mp4", - "t-hawk (loop)-HD.mp4", - "out-b (loop)-HD.mp4", - "KOLL-HD.mp4", - "Filler", # Gap - "brokchrd (loop)-HD.mp4" - ] - ) - - self.maxDiff = None - desired_ranges = [ - otio.opentime.TimeRange( - otio.opentime.from_frames(86400, fps), - otio.opentime.from_frames(720 - 0, fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(86400 + 121, fps), - otio.opentime.from_frames(480 - 121, fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(86400 + 123, fps), - otio.opentime.from_frames(523 - 123, fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(0, fps), - otio.opentime.from_frames(559 - 0, fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(86400 + 69, fps), - otio.opentime.from_frames(720 - 69, fps) - ) - ] - for clip, desired in zip(clips, desired_ranges): - actual = clip.source_range - self.assertEqual( - actual, - desired, - "clip '{}' source_range should be {} not {}".format( - clip.name, - desired, - actual - ) - ) - - desired_ranges = [ - otio.opentime.TimeRange( - otio.opentime.from_timecode("00:00:00:00", fps), - otio.opentime.from_timecode("00:00:30:00", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("00:00:30:00", fps), - otio.opentime.from_timecode("00:00:14:23", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("00:00:44:23", fps), - otio.opentime.from_timecode("00:00:16:16", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("00:01:01:15", fps), - otio.opentime.from_timecode("00:00:23:07", fps) - ), - otio.opentime.TimeRange( # Gap - otio.opentime.from_timecode("00:01:24:22", fps), - otio.opentime.from_timecode("00:00:04:12", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("00:01:29:10", fps), - otio.opentime.from_timecode("00:00:27:03", fps) - ) - ] - for item, desired in zip(video_track, desired_ranges): - actual = item.trimmed_range_in_parent() - self.assertEqual( - actual, - desired, - "item '{}' trimmed_range_in_parent should be {} not {}".format( - clip.name, - desired, - actual - ) - ) - - self.assertEqual( - timeline.duration(), - otio.opentime.from_timecode("00:01:56:13", fps) - ) - - def test_aaf_read_transitions(self): - aaf_path = TRANSITIONS_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(aaf_path) - self.assertEqual(timeline.name, "OTIO TEST - transitions.Exported.01") - fps = timeline.duration().rate - self.assertEqual(fps, 24.0) - - video_tracks = timeline.video_tracks() - self.assertEqual(len(video_tracks), 1) - video_track = video_tracks[0] - self.assertEqual(len(video_track), 12) - - clips = video_track.find_clips() - self.assertEqual(len(clips), 4) - - self.assertEqual( - [type(item) for item in video_track], - [ - otio.schema.Gap, - otio.schema.Transition, - otio.schema.Clip, - otio.schema.Transition, - otio.schema.Clip, - otio.schema.Transition, - otio.schema.Gap, - otio.schema.Transition, - otio.schema.Clip, - otio.schema.Clip, - otio.schema.Transition, - otio.schema.Gap, - ] - ) - - self.assertEqual( - [item.name for item in video_track], - [ - "Filler", - "Transition", - "tech.fux (loop)-HD.mp4", - "Transition", - "t-hawk (loop)-HD.mp4", - "Transition", - "Filler", - "Transition", - "KOLL-HD.mp4", - "brokchrd (loop)-HD.mp4", - "Transition", - "Filler" - ] - ) - - self.maxDiff = None - desired_ranges = [ - otio.opentime.TimeRange( - otio.opentime.from_frames(86400 + 0, fps), - otio.opentime.from_frames(117, fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(86400 + 123, fps), - otio.opentime.from_frames(200 - 123, fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(55, fps), - otio.opentime.from_frames(199 - 55, fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_frames(86400 + 0, fps), - otio.opentime.from_frames(130, fps) - ) - ] - for clip, desired in zip(clips, desired_ranges): - actual = clip.source_range - self.assertEqual( - actual, - desired, - "clip '{}' source_range should be {} not {}".format( - clip.name, - desired, - actual - ) - ) - - desired_ranges = [ - otio.opentime.TimeRange( # Gap - otio.opentime.from_timecode("00:00:00:00", fps), - otio.opentime.from_timecode("00:00:00:00", fps) - ), - otio.opentime.TimeRange( # Transition - otio.opentime.from_timecode("00:00:00:00", fps), - otio.opentime.from_timecode("00:00:00:12", fps) - ), - otio.opentime.TimeRange( # tech.fux - otio.opentime.from_timecode("00:00:00:00", fps), - otio.opentime.from_timecode("00:00:04:21", fps) - ), - otio.opentime.TimeRange( # Transition - otio.opentime.from_timecode("00:00:02:21", fps), - otio.opentime.from_timecode("00:00:02:00", fps) - ), - otio.opentime.TimeRange( # t-hawk - otio.opentime.from_timecode("00:00:04:21", fps), - otio.opentime.from_timecode("00:00:03:05", fps) - ), - otio.opentime.TimeRange( # Transition - otio.opentime.from_timecode("00:00:07:14", fps), - otio.opentime.from_timecode("00:00:01:00", fps) - ), - otio.opentime.TimeRange( # Gap - otio.opentime.from_timecode("00:00:08:02", fps), - otio.opentime.from_timecode("00:00:02:05", fps) - ), - otio.opentime.TimeRange( # Transition - otio.opentime.from_timecode("00:00:09:07", fps), - otio.opentime.from_timecode("00:00:02:00", fps) - ), - otio.opentime.TimeRange( # KOLL-HD - otio.opentime.from_timecode("00:00:10:07", fps), - otio.opentime.from_timecode("00:00:06:00", fps) - ), - otio.opentime.TimeRange( # brokchrd - otio.opentime.from_timecode("00:00:16:07", fps), - otio.opentime.from_timecode("00:00:05:10", fps) - ), - otio.opentime.TimeRange( # Transition - otio.opentime.from_timecode("00:00:19:17", fps), - otio.opentime.from_timecode("00:00:02:00", fps) - ), - otio.opentime.TimeRange( # Gap - otio.opentime.from_timecode("00:00:21:17", fps), - otio.opentime.from_timecode("00:00:00:00", fps) - ) - ] - for item, desired in zip(video_track, desired_ranges): - actual = item.trimmed_range_in_parent() - self.assertEqual( - desired, - actual, - "item '{}' trimmed_range_in_parent should be {} not {}".format( - clip.name, - desired, - actual - ) - ) - - self.assertEqual( - timeline.duration(), - otio.opentime.from_timecode("00:00:21:17", fps) - ) - - def test_timecode(self): - aaf_path = TIMCODE_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(aaf_path) - self.assertNotEqual( - timeline.tracks[0][0].source_range.start_time, - timeline.tracks[0][1].source_range.start_time - ) - self.assertEqual( - timeline.tracks[0][1].source_range.start_time, - otio.opentime.RationalTime(86424, 24), - ) - - def test_aaf_user_comments(self): - aaf_path = TRIMS_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(aaf_path) - self.assertIsNotNone(timeline) - self.assertEqual(type(timeline), otio.schema.Timeline) - self.assertIsNotNone(timeline.metadata.get("AAF")) - correctWords = [ - "test1", - "testing 1 2 3", - "Eyjafjallaj\xf6kull", - "'s' \"d\" `b`", - None, # Gap - None - ] - for clip, correctWord in zip(timeline.tracks[0], correctWords): - if isinstance(clip, otio.schema.Gap): - continue - AAFmetadata = clip.media_reference.metadata.get("AAF") - self.assertIsNotNone(AAFmetadata) - self.assertIsNotNone(AAFmetadata.get("UserComments")) - self.assertEqual( - AAFmetadata.get("UserComments").get("CustomTest"), - correctWord - ) - - def test_aaf_flatten_tracks(self): - multitrack_timeline = otio.adapters.read_from_file( - MULTITRACK_EXAMPLE_PATH, attach_markers=False - ) - preflattened_timeline = otio.adapters.read_from_file( - PREFLATTENED_EXAMPLE_PATH, attach_markers=False - ) - - # first make sure we got the structure we expected - self.assertEqual(3, len(preflattened_timeline.tracks)) - self.assertEqual(1, len(preflattened_timeline.video_tracks())) - self.assertEqual(2, len(preflattened_timeline.audio_tracks())) - - self.assertEqual(3, len(multitrack_timeline.video_tracks())) - self.assertEqual(2, len(multitrack_timeline.audio_tracks())) - self.assertEqual(8, len(multitrack_timeline.tracks)) - - preflattened = preflattened_timeline.video_tracks()[0] - self.assertEqual(7, len(preflattened)) - flattened = otio.algorithms.flatten_stack( - multitrack_timeline.video_tracks() - ) - self.assertEqual(7, len(flattened)) - - # Lets remove some AAF metadata that will always be different - # so we can compare everything else. - for t in (preflattened, flattened): - - t.name = "" - t.metadata.pop("AAF", None) - - for c in t.find_children(): - if hasattr(c, "media_reference") and c.media_reference: - mr = c.media_reference - mr.metadata.get("AAF", {}).pop('LastModified', None) - meta = c.metadata.get("AAF", {}) - meta.pop('ComponentAttributeList', None) - meta.pop('DataDefinition', None) - meta.pop('Length', None) - meta.pop('StartTime', None) - - # We don't care about Gap start times, only their duration matters - for g in t.find_children(descended_from_type=otio.schema.Gap): - dur = g.source_range.duration - rate = g.source_range.start_time.rate - g.source_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, rate), - dur - ) - - self.maxDiff = None - self.assertMultiLineEqual( - otio.adapters.write_to_string(preflattened, "otio_json"), - otio.adapters.write_to_string(flattened, "otio_json") - ) - - def test_aaf_nesting(self): - timeline = otio.adapters.read_from_file(NESTING_EXAMPLE_PATH) - self.assertEqual(1, len(timeline.tracks)) - track = timeline.tracks[0] - self.assertEqual(3, len(track)) - - clipA, nested, clipB = track - self.assertEqual(otio.schema.Clip, type(clipA)) - self.assertEqual(otio.schema.Track, type(nested)) - self.assertEqual(otio.schema.Clip, type(clipB)) - - self.assertEqual(2, len(nested)) - nestedClipA, nestedClipB = nested - self.assertEqual(otio.schema.Clip, type(nestedClipA)) - self.assertEqual(otio.schema.Clip, type(nestedClipB)) - - self.assertEqual( - otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(24, 24), - duration=otio.opentime.RationalTime(16, 24) - ), - clipA.trimmed_range() - ) - self.assertEqual( - otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(86400 + 32, 24), - duration=otio.opentime.RationalTime(16, 24) - ), - clipB.trimmed_range() - ) - - self.assertEqual( - otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(40, 24), - duration=otio.opentime.RationalTime(8, 24) - ), - nestedClipA.trimmed_range() - ) - self.assertEqual( - otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(86400 + 24, 24), - duration=otio.opentime.RationalTime(8, 24) - ), - nestedClipB.trimmed_range() - ) - - # TODO: This belongs in the algorithms tests, not the AAF tests. - def SKIP_test_nesting_flatten(self): - nested_timeline = otio.adapters.read_from_file( - NESTING_EXAMPLE_PATH - ) - preflattened_timeline = otio.adapters.read_from_file( - NESTING_PREFLATTENED_EXAMPLE_PATH - ) - flattened_track = otio.algorithms.flatten_stack(nested_timeline.tracks) - self.assertEqual( - preflattened_timeline.tracks[0], - flattened_track - ) - - def test_read_linear_speed_effects(self): - timeline = otio.adapters.read_from_file( - LINEAR_SPEED_EFFECTS_EXAMPLE_PATH - ) - self.assertEqual(1, len(timeline.tracks)) - track = timeline.tracks[0] - self.assertEqual(20, len(track)) - - clip = track[0] - self.assertEqual(0, len(clip.effects)) - - for clip in track[1:]: - self.assertIsInstance(clip, otio.schema.Clip) - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - - expected = [ - 50.00, # 2/1 - 33.33, # 3/1 - 25.00, # 4/1 - 200.00, # 1/2 - 100.00, # 2/2 - 66.67, # 3/2 - 50.00, # 4/2 - 300.00, # 1/3 - 150.00, # 2/3 - 100.00, # 3/3 - 75.00, # 4/3 - 400.00, # 1/4 - 200.00, # 2/4 - 133.33, # 3/4 - 100.00, # 4/4 - 500.00, # 1/5 - 250.00, # 2/5 - 166.67, # 3/5 - 125.00 # 4/5 - ] - actual = [ - round(clip.effects[0].time_scalar * 100.0, 2) for clip in track[1:] - ] - self.assertEqual(expected, actual) - - def test_read_misc_speed_effects(self): - timeline = otio.adapters.read_from_file( - MISC_SPEED_EFFECTS_EXAMPLE_PATH - ) - self.assertEqual(1, len(timeline.tracks)) - track = timeline.tracks[0] - self.assertEqual(10, len(track)) - - clip = track[0] - self.assertEqual(0, len(clip.effects)) - self.assertEqual(8, clip.duration().value) - - clip = track[1] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.FreezeFrame, type(effect)) - self.assertEqual(0, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[2] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - self.assertEqual(2.0, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[3] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - self.assertEqual(0.5, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[4] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - self.assertEqual(3.0, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[5] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - self.assertEqual(0.3750, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[6] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - self.assertEqual(14.3750, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[7] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - self.assertEqual(0.3750, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[8] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertEqual(otio.schema.LinearTimeWarp, type(effect)) - self.assertEqual(-1.0, effect.time_scalar) - self.assertEqual(8, clip.duration().value) - - clip = track[9] - self.assertEqual(1, len(clip.effects)) - effect = clip.effects[0] - self.assertTrue(isinstance(effect, otio.schema.TimeEffect)) - self.assertEqual(16, clip.duration().value) - # TODO: We don't yet support non-linear time warps, but when we - # do then this effect is a "Speed Bump" from 166% to 44% to 166% - - def test_muted_clip(self): - timeline = otio.adapters.read_from_file(MUTED_CLIP_PATH) - self.assertIsInstance(timeline, otio.schema.Timeline) - self.assertEqual(len(timeline.tracks), 1) - track = timeline.tracks[0] - self.assertEqual(len(track), 1) - clip = track[0] - self.assertIsInstance(clip, otio.schema.Clip) - self.assertEqual(clip.name, 'Frame Debugger 0h.mov') - self.assertEqual(clip.enabled, False) - - def test_essence_group(self): - timeline = otio.adapters.read_from_file(ESSENCE_GROUP_PATH) - - self.assertIsNotNone(timeline) - self.assertEqual( - otio.opentime.RationalTime(12, 24), - timeline.duration() - ) - - def test_30fps(self): - tl = otio.adapters.read_from_file(FPS30_CLIP_PATH) - self.assertEqual(tl.duration().rate, 30) - - def test_2997fps(self): - tl = otio.adapters.read_from_file(FPS2997_CLIP_PATH) - self.assertEqual(tl.duration().rate, 30000 / 1001.0) - - def test_utf8_names(self): - timeline = otio.adapters.read_from_file(UTF8_CLIP_PATH) - self.assertEqual( - ("Sequence_ABCXYZñç꜕∑´®†¥¨ˆøπ“‘åß∂ƒ©˙∆˚¬…æΩ≈ç√∫˜µ≤≥÷.Exported.01"), - timeline.name - ) - video_track = timeline.video_tracks()[0] - first_clip = video_track[0] - self.assertEqual( - first_clip.name, - ("Clip_ABCXYZñç꜕∑´®†¥¨ˆøπ“‘åß∂ƒ©˙∆˚¬…æΩ≈ç√∫˜µ≤≥÷") - ) - self.assertEqual( - ( - first_clip.media_reference.metadata["AAF"]["UserComments"]["Comments"] - ).encode('utf-8'), - ("Comments_ABCXYZñç꜕∑´®†¥¨ˆøπ“‘åß∂ƒ©˙∆˚¬…æΩ≈ç√∫˜µ≤≥÷").encode() - ) - - def test_multiple_top_level_mobs(self): - result = otio.adapters.read_from_file(MULTIPLE_TOP_LEVEL_MOBS_CLIP_PATH) - self.assertIsInstance(result, otio.schema.SerializableCollection) - self.assertEqual(2, len(result)) - - def test_external_reference_from_unc_path(self): - timeline = otio.adapters.read_from_file(SIMPLE_EXAMPLE_PATH) - video_track = timeline.video_tracks()[0] - first_clip = video_track[0] - self.assertIsInstance(first_clip.media_reference, - otio.schema.ExternalReference) - - unc_path = first_clip.media_reference.metadata.get("AAF", {}) \ - .get("UserComments", {}) \ - .get("UNC Path") - unc_path = "file://" + unc_path - self.assertEqual( - first_clip.media_reference.target_url, - unc_path - ) - - def test_external_reference_paths(self): - timeline = otio.adapters.read_from_file(COMPOSITE_PATH) - video_target_urls = [ - [ - "file:////animation/root/work/editorial/jburnell/700/1.aaf", - "file:////animation/root/work/editorial/jburnell/700/2.aaf", - "file:////animation/root/work/editorial/jburnell/700/3.aaf" - ], - [ - "file:///C%3A/Avid%20MediaFiles/MXF/1/700.Exported.03_Vi48896FA0V.mxf" - ] - ] - audio_target_urls = [ - [ - "file:///C%3A/OMFI%20MediaFiles/700.ExportA01.5D8A14612890A.aif" - ] - ] - - for track_index, video_track in enumerate(timeline.video_tracks()): - for clip_index, clip in enumerate(video_track): - self.assertIsInstance(clip.media_reference, - otio.schema.ExternalReference) - self.assertEqual(clip.media_reference.target_url, - video_target_urls[track_index][clip_index]) - - for track_index, audio_track in enumerate(timeline.audio_tracks()): - for clip_index, clip in enumerate(audio_track): - self.assertIsInstance(clip.media_reference, - otio.schema.ExternalReference) - self.assertEqual(clip.media_reference.target_url, - audio_target_urls[track_index][clip_index]) - - def test_aaf_subclip_metadata(self): - """ - For subclips, the AAF SourceClip can actually reference a CompositionMob - (instead of a MasterMob) - In which case we need to drill down into the CompositionMob - to find the MasterMob with the UserComments. - """ - - timeline = otio.adapters.read_from_file(SUBCLIP_PATH) - audio_track = timeline.audio_tracks()[0] - first_clip = audio_track[0] - - aaf_metadata = first_clip.media_reference.metadata.get("AAF") - - expected_md = {"Director": "director_name", - "Line": "script_line", - "Talent": "Speaker", - "Logger": "logger", - "Character": "character_name"} - - self._verify_user_comments(aaf_metadata, expected_md) - - def test_aaf_sourcemob_usage(self): - """ - Each clip stores it's source mob usage AAF value as metadata in`SourceMobUsage`. - For sub-clips this value should be `Usage_SubClip`. - """ - # `Usage_SubClip` value - subclip_timeline = otio.adapters.read_from_file(SUBCLIP_PATH) - subclip_usages = {"Subclip.BREATH": "Usage_SubClip"} - for clip in subclip_timeline.find_clips(): - self.assertEqual( - clip.metadata.get("AAF", {}).get("SourceMobUsage"), - subclip_usages[clip.name] - ) - - # no usage value - simple_timeline = otio.adapters.read_from_file(SIMPLE_EXAMPLE_PATH) - simple_usages = { - "KOLL-HD.mp4": "", - "brokchrd (loop)-HD.mp4": "", - "out-b (loop)-HD.mp4": "", - "t-hawk (loop)-HD.mp4": "", - "tech.fux (loop)-HD.mp4": "" - } - for clip in simple_timeline.find_clips(): - self.assertEqual( - clip.metadata.get("AAF", {}).get("SourceMobUsage", ""), - simple_usages[clip.name] - ) - - def test_aaf_composition_metadata(self): - """ - For standard clips the AAF SourceClip can actually reference a - CompositionMob (instead of a MasterMob) and the composition mob is holding the - UserComments instead of the MasterMob. - My guess is that the CompositionMob is used to share the same metadata - between different SourceClips - """ - - timeline = otio.adapters.read_from_file(COMPOSITION_METADATA_PATH) - - audio_track = timeline.audio_tracks()[0] - first_clip = audio_track[0] - - aaf_metadata = first_clip.media_reference.metadata.get("AAF") - - expected_md = {"Director": "director", - "Line": "scriptline", - "Talent": "talent", - "Logger": "", - "Character": "character"} - - self._verify_user_comments(aaf_metadata, expected_md) - - def test_aaf_composition_metadata_mastermob(self): - """ - For standard clips the AAF SourceClip can actually reference a - CompositionMob (instead of a masterMob), the CompositionMob is holding - UserComments AND the MasterMob is holding UserComments. - In this case the masterMob has the valid UserComments (empirically determined) - """ - - timeline = otio.adapters.read_from_file( - COMPOSITION_METADATA_MASTERMOB_METADATA_PATH) - - audio_track = timeline.audio_tracks()[0] - first_clip = audio_track[0] - - aaf_metadata = first_clip.metadata.get("AAF") - - expected_md = {"Director": "director", - "Line": "scriptline", - "Talent": "talent", - "Logger": "logger", - "Character": "character"} - - self._verify_user_comments(aaf_metadata, expected_md) - - def test_aaf_multiple_timecode_objects(self): - """ - Make sure we can read SourceClips with multiple timecode objects of the - same start value and length. - """ - - timeline = otio.adapters.read_from_file( - MULTIPLE_TIMECODE_OBJECTS_PATH) - - self.assertIsNotNone(timeline) - - video_track = timeline.video_tracks()[0] - only_clip = video_track[0] - - available_range = only_clip.media_reference.available_range - - self.assertEqual(available_range.start_time.value, 86501.0) - self.assertEqual(available_range.duration.value, 1981.0) - - def test_aaf_transcribe_log(self): - """Excercise an aaf-adapter read with transcribe_logging enabled.""" - - # capture output of debugging statements - old_stdout = sys.stdout - old_stderr = sys.stderr - - sys.stdout = io.StringIO() - sys.stderr = io.StringIO() - otio.adapters.read_from_file(SUBCLIP_PATH, transcribe_log=True) - result_stdout = sys.stdout.getvalue() - result_stderr = sys.stderr.getvalue() - - sys.stdout = old_stdout - sys.stderr = old_stderr - - # conform python 2 and 3 behavior - result_stdout = result_stdout.replace("b'", "").replace("'", "") - - self.assertEqual(result_stdout, TRANSCRIPTION_RESULT) - self.assertEqual(result_stderr, '') - - def test_aaf_marker_over_transition(self): - """ - Make sure we can transcibe this composition with markers over transition. - """ - - timeline = None - - try: - timeline = otio.adapters.read_from_file( - MARKER_OVER_TRANSITION_PATH - ) - - except Exception as e: - print('[ERROR] Transcribing test sample data `{}` caused an exception: {}'.format( # noqa - os.path.basename(MARKER_OVER_TRANSITION_PATH), - e) - ) - - self.assertIsNotNone(timeline) - - def test_aaf_marker_over_audio_file(self): - """ - Make sure we can transcibe markers over an audio AAF file. - """ - - timeline = None - - try: - timeline = otio.adapters.read_from_file( - MARKER_OVER_AUDIO_PATH - ) - - except Exception as e: - print('[ERROR] Transcribing test sample data `{}` caused an exception: {}'.format( # noqa - os.path.basename(MARKER_OVER_AUDIO_PATH), - e) - ) - - self.assertIsNotNone(timeline) - - # Verify markers - # We expect 1 track with 3 markers on it from the test data. - self.assertTrue(1 == len(timeline.tracks)) - - track = timeline.tracks[0] - self.assertEqual(3, len(track.markers)) - - fps = 24.0 - expected_markers = [ - { - 'color': 'RED', - 'label': 'm1', - 'start_time': otio.opentime.from_frames(50.0, fps) - }, - { - 'color': 'GREEN', - 'label': 'm2', - 'start_time': otio.opentime.from_frames(103.0, fps) - }, - { - 'color': 'BLUE', - 'label': 'm3', - 'start_time': otio.opentime.from_frames(166.0, fps) - } - ] - - for index, marker in enumerate(track.markers): - expected_marker = expected_markers[index] - - color = marker.color - label = marker.metadata.get('AAF', {}).get('CommentMarkerUSer') - start_time = marker.marked_range.start_time - - self.assertEqual(color, expected_marker.get('color')) - self.assertEqual(label, expected_marker.get('label')) - self.assertEqual(start_time, expected_marker.get('start_time')) - - def _verify_user_comments(self, aaf_metadata, expected_md): - - self.assertTrue(aaf_metadata is not None) - self.assertTrue("UserComments" in aaf_metadata.keys()) - - user_comments = aaf_metadata['UserComments'] - - user_comment_keys = user_comments.keys() - for k, v in expected_md.items(): - self.assertTrue(k in user_comment_keys) - self.assertEqual(user_comments[k], v) - - def test_attach_markers(self): - """Check if markers are correctly translated and attached to the right items. - """ - timeline = otio.adapters.read_from_file(MULTIPLE_MARKERS_PATH, - attach_markers=True) - - expected_markers = { - (1, 'Filler'): [('PUBLISH', 0.0, 1.0, 24.0, 'RED')], - (1, 'zts02_1010'): [ - ('GREEN: V1: zts02_1010: f1104: seq.f1104', - 1103.0, 1.0, 24.0, 'GREEN') - ], - (2, 'ScopeReference'): [ - ('FX', 0.0, 1.0, 24.0, 'YELLOW'), - ('BLUE: V2 (no FX): zts02_1020: f1134: seq.f1327', - 518.0, 1.0, 24.0, 'BLUE') - ], - (3, 'ScopeReference'): [ - ('INSERT', 0.0, 1.0, 24.0, 'CYAN'), - ('CYAN: V3: zts02_1030: f1212: seq.f1665', - 856.0, - 1.0, - 24.0, - 'CYAN') - ], - (4, 'Drop_24.mov'): [ - ('MAGENTA: V4: zts02_1040: f1001: seq.f1666', - 86400.0, 1.0, 24.0, 'MAGENTA') - ], - (5, 'ScopeReference'): [ - ('RED: V5: zts02_1050: f1061: seq.f1885', - 884.0, 1.0, 24.0, 'RED') - ] - } - - all_markers = {} - for i, track in enumerate( - timeline.find_children(descended_from_type=otio.schema.Track) - ): - for item in track.find_children(): - markers = [ - ( - m.name, - m.marked_range.start_time.value, - m.marked_range.duration.value, - m.marked_range.start_time.rate, - m.color - ) for m in item.markers - ] - if markers: - all_markers[(i, item.name)] = markers - self.assertEqual(all_markers, expected_markers) - - def test_keyframed_properties(self): - def get_expected_dict(timeline): - expected = [] - for clip in timeline.find_children(descended_from_type=otio.schema.Clip): - for effect in clip.effects: - props = {} - parameters = effect.metadata.get("AAF", {}).get("Parameters", {}) - for paramName, paramValue in parameters.items(): - try: - is_animated = "_aaf_keyframed_property" in paramValue - except (TypeError, KeyError): - is_animated = False - try: - baked_count = len(paramValue["keyframe_baked_values"]) - except (TypeError, KeyError): - baked_count = None - props[paramName] = {"keyframed": is_animated, - "baked_sample_count": baked_count} - expected.append(props) - return expected - - tl_unbaked = otio.adapters.read_from_file(KEYFRAMED_PROPERTIES_PATH, - bake_keyframed_properties=False) - - tl_baked = otio.adapters.read_from_file(KEYFRAMED_PROPERTIES_PATH, - bake_keyframed_properties=True) - - expected_unbaked = [ - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_SCALE_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_SCALE_X_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_SCALE_Y_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_ROT_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_ROT_X_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_ROT_Y_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_ROT_Z_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - "Vergence": {"baked_sample_count": None, "keyframed": True}, - }, - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_POS_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_POS_X_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_POS_Y_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_POS_Z_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - "Vergence": {"baked_sample_count": None, "keyframed": True}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": None, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": None, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": None, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": None, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": None, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": None, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": None, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": None, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": None, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": None, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_PRSP_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_PRSP_X_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_PRSP_Y_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_PRSP_Z_U": {"baked_sample_count": None, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - "Vergence": {"baked_sample_count": None, "keyframed": True}, - }, - ] - - expected_baked = [ - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_SCALE_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_SCALE_X_U": {"baked_sample_count": 212, "keyframed": True}, - "DVE_SCALE_Y_U": {"baked_sample_count": 212, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_ROT_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_ROT_X_U": {"baked_sample_count": 159, "keyframed": True}, - "DVE_ROT_Y_U": {"baked_sample_count": 159, "keyframed": True}, - "DVE_ROT_Z_U": {"baked_sample_count": 159, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - "Vergence": {"baked_sample_count": 159, "keyframed": True}, - }, - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_POS_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_POS_X_U": {"baked_sample_count": 116, "keyframed": True}, - "DVE_POS_Y_U": {"baked_sample_count": 116, "keyframed": True}, - "DVE_POS_Z_U": {"baked_sample_count": 116, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - "Vergence": {"baked_sample_count": 116, "keyframed": True}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": 276, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": 276, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": 182, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": 182, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": 219, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": 219, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": 193, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": 193, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AvidMotionInputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionOutputFormat": {"baked_sample_count": None, - "keyframed": False}, - "AvidMotionPulldown": {"baked_sample_count": None, "keyframed": False}, - "AvidPhase": {"baked_sample_count": None, "keyframed": False}, - "PARAM_SPEED_MAP_U": {"baked_sample_count": 241, "keyframed": True}, - "PARAM_SPEED_OFFSET_MAP_U": {"baked_sample_count": 241, - "keyframed": True}, - "SpeedRatio": {"baked_sample_count": None, "keyframed": False}, - }, - { - "AFX_FIXED_ASPECT_U": {"baked_sample_count": None, "keyframed": False}, - "AvidEffectID": {"baked_sample_count": None, "keyframed": False}, - "AvidParameterByteOrder": {"baked_sample_count": None, - "keyframed": False}, - "DVE_BORDER_ENABLED_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_DEFOCUS_MODE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_FG_KEY_HIGH_SAT_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_MT_WARP_FOREGROUND_U": {"baked_sample_count": None, - "keyframed": False}, - "DVE_PRSP_ENABLED_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_PRSP_X_U": {"baked_sample_count": 241, "keyframed": True}, - "DVE_PRSP_Y_U": {"baked_sample_count": 241, "keyframed": True}, - "DVE_PRSP_Z_U": {"baked_sample_count": 241, "keyframed": True}, - "DVE_TRACKING_POS_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_AMPLT_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_CURVE_U": {"baked_sample_count": None, "keyframed": False}, - "DVE_WARP_FREQ_U": {"baked_sample_count": None, "keyframed": False}, - "Vergence": {"baked_sample_count": 241, "keyframed": True}, - }, - ] - - self.assertEqual(get_expected_dict(tl_unbaked), expected_unbaked) - self.assertEqual(get_expected_dict(tl_baked), expected_baked) - - -class AAFWriterTests(unittest.TestCase): - def test_aaf_writer_gaps(self): - otio_timeline = otio.adapters.read_from_file(GAPS_OTIO_PATH) - fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - otio.adapters.write_to_file(otio_timeline, tmp_aaf_path) - self._verify_aaf(tmp_aaf_path) - - def test_aaf_writer_simple(self): - self._verify_aaf(SIMPLE_EXAMPLE_PATH) - - def test_aaf_writer_transitions(self): - self._verify_aaf(TRANSITIONS_EXAMPLE_PATH) - - def test_aaf_writer_duplicates(self): - self._verify_aaf(DUPLICATES_PATH) - - def test_aaf_writer_nometadata(self): - def _target_url_fixup(timeline): - # fixes up relative paths to be absolute to this test file - test_dir = os.path.dirname(os.path.abspath(__file__)) - for clip in timeline.find_clips(): - target_url_str = clip.media_reference.target_url - clip.media_reference.target_url = os.path.join(test_dir, target_url_str) - - # Exercise getting Mob IDs from AAF files - otio_timeline = otio.adapters.read_from_file(NO_METADATA_OTIO_PATH) - _target_url_fixup(otio_timeline) - fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - otio.adapters.write_to_file(otio_timeline, tmp_aaf_path) - self._verify_aaf(tmp_aaf_path) - - # Expect exception to raise on non AAF files with no metadata - otio_timeline = otio.adapters.read_from_file(NOT_AAF_OTIO_PATH) - _target_url_fixup(otio_timeline) - fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - with self.assertRaises(AAFAdapterError): - otio.adapters.write_to_file(otio_timeline, tmp_aaf_path) - - # Generate empty Mob IDs fallback for not crashing - otio_timeline = otio.adapters.read_from_file(NOT_AAF_OTIO_PATH) - _target_url_fixup(otio_timeline) - fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - otio.adapters.write_to_file(otio_timeline, tmp_aaf_path, use_empty_mob_ids=True) - self._verify_aaf(tmp_aaf_path) - - def test_fail_on_precheck(self): - # Expect exception to raise on null available_range and rate mismatch - otio_timeline = otio.adapters.read_from_file(PRECHECK_FAIL_OTIO) - fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - try: - otio.adapters.write_to_file(otio_timeline, tmp_aaf_path) - except AAFValidationError as e: - # Four error messages are raised - self.assertEqual(4, len(list(filter(bool, str(e).split("\n"))))) - with self.assertRaises(AAFValidationError): - raise e - - def test_aaf_roundtrip_first_clip(self): - def _target_url_fixup(timeline): - # fixes up relative paths to be absolute to this test file - test_dir = os.path.dirname(os.path.abspath(__file__)) - for clip in timeline.find_clips(): - target_url_str = clip.media_reference.target_url - clip.media_reference.target_url = os.path.join(test_dir, target_url_str) - - # Exercise getting Mob IDs from AAF files - otio_timeline = otio.adapters.read_from_file(NO_METADATA_OTIO_PATH) - _target_url_fixup(otio_timeline) - fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - otio.adapters.write_to_file(otio_timeline, tmp_aaf_path) - self._verify_first_clip(otio_timeline, tmp_aaf_path) - - def _verify_first_clip(self, original_timeline, aaf_path): - timeline_from_aaf = otio.adapters.read_from_file(aaf_path) - - original_clips = original_timeline.find_clips() - aaf_clips = timeline_from_aaf.find_clips() - - self.assertTrue(len(original_clips) > 0) - self.assertEqual(len(aaf_clips), len(original_clips)) - - first_clip_in_original_timeline = original_clips[0] - first_clip_in_aaf_timeline = aaf_clips[0] - - # Comparing stuff - for prop in ['source_range']: - self.assertEqual(getattr(first_clip_in_original_timeline, prop), - getattr(first_clip_in_aaf_timeline, prop), - f"`{prop}` did not match") - - for method in ['visible_range', 'trimmed_range']: - self.assertEqual(getattr(first_clip_in_original_timeline, method)(), - getattr(first_clip_in_aaf_timeline, method)(), - f"`{method}` did not match") - - def test_aaf_writer_nesting(self): - self._verify_aaf(NESTING_EXAMPLE_PATH) - - def test_aaf_writer_nested_stack(self): - self._verify_aaf(NESTED_STACK_EXAMPLE_PATH) - - def test_generator_reference(self): - tl = otio.schema.Timeline() - cl = otio.schema.Clip() - cl.source_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, 24), - otio.opentime.RationalTime(100, 24), - ) - tl.tracks.append(otio.schema.Track()) - tl.tracks[0].append(cl) - cl.media_reference = otio.schema.GeneratorReference() - cl.media_reference.generator_kind = "Slug" - cl.media_reference.available_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, 24), - otio.opentime.RationalTime(100, 24), - ) - _, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - - mod = otio.adapters.from_name('AAF').module() - - self.assertTrue( - mod.aaf_writer._is_considered_gap(cl) - ) - - otio.adapters.write_to_file(tl, tmp_aaf_path) - self._verify_aaf(tmp_aaf_path) - - with self.assertRaises(otio.exceptions.NotSupportedError): - cl.media_reference.generator_kind = "not slug" - otio.adapters.write_to_file(tl, tmp_aaf_path) - - def _verify_aaf(self, aaf_path): - otio_timeline = otio.adapters.read_from_file(aaf_path, simplify=True) - fd, tmp_aaf_path = tempfile.mkstemp(suffix='.aaf') - otio.adapters.write_to_file(otio_timeline, tmp_aaf_path) - - with aaf2.open(tmp_aaf_path) as dest, aaf2.open(aaf_path) as orig: - # Basic number of mobs should be equal - self.assertEqual(len(list(orig.content.compositionmobs())), - len(list(dest.content.compositionmobs()))) - self.assertEqual(len(list(orig.content.mastermobs())), - len(list(dest.content.mastermobs()))) - - compositionmobs = list(dest.content.compositionmobs()) - self.assertEqual(1, len(compositionmobs)) - compositionmob = compositionmobs[0] - self.assertEqual(len(otio_timeline.tracks), len(compositionmob.slots)) - - for otio_track, aaf_timeline_mobslot in zip(otio_timeline.tracks, - compositionmob.slots): - - media_kind = aaf_timeline_mobslot.media_kind.lower() - self.assertTrue(media_kind in ["picture", "sound"]) - kind_mapping = { - "picture": otio.schema.TrackKind.Video, - "sound": otio.schema.TrackKind.Audio - } - self.assertEqual(otio_track.kind, kind_mapping[media_kind]) - - sequence = None - if media_kind == "picture": - sequence = aaf_timeline_mobslot.segment - elif media_kind == "sound": - opgroup = aaf_timeline_mobslot.segment - self.assertTrue(isinstance(opgroup, OperationGroup)) - input_segments = opgroup.segments - self.assertTrue(hasattr(input_segments, "__iter__")) - self.assertTrue(len(input_segments) >= 1) - sequence = opgroup.segments[0] - self.assertTrue(isinstance(sequence, Sequence)) - - self.assertEqual( - len(otio_track.find_children(shallow_search=True)), - len(sequence.components)) - for otio_child, aaf_component in zip( - otio_track.find_children(shallow_search=True), - sequence.components): - type_mapping = { - otio.schema.Clip: aaf2.components.SourceClip, - otio.schema.Transition: aaf2.components.Transition, - otio.schema.Gap: aaf2.components.Filler, - otio.schema.Stack: aaf2.components.OperationGroup, - otio.schema.Track: aaf2.components.OperationGroup - } - self.assertEqual(type(aaf_component), - type_mapping[type(otio_child)]) - - if isinstance(aaf_component, SourceClip): - self._verify_compositionmob_sourceclip_structure(aaf_component) - - if isinstance(aaf_component, aaf2.components.OperationGroup): - nested_aaf_segments = aaf_component.segments - for nested_otio_child, nested_aaf_segment in zip( - otio_child.find_children(), nested_aaf_segments): - self._is_otio_aaf_same(nested_otio_child, - nested_aaf_segment) - else: - self._is_otio_aaf_same(otio_child, aaf_component) - - # Inspect the OTIO -> AAF -> OTIO file - roundtripped_otio = otio.adapters.read_from_file(tmp_aaf_path, simplify=True) - - self.assertIsNotNone(roundtripped_otio) - self.assertTrue(isinstance(roundtripped_otio, otio.schema.Timeline)) - self.assertEqual(otio_timeline.name, roundtripped_otio.name) - self.assertEqual(otio_timeline.duration().rate, - roundtripped_otio.duration().rate) - - def _verify_compositionmob_sourceclip_structure(self, compmob_clip): - self.assertTrue(isinstance(compmob_clip, SourceClip)) - self.assertTrue(isinstance(compmob_clip.mob, MasterMob)) - mastermob = compmob_clip.mob - for mastermob_slot in mastermob.slots: - mastermob_clip = mastermob_slot.segment - self.assertTrue(isinstance(mastermob_clip, SourceClip)) - self.assertTrue(isinstance(mastermob_clip.mob, SourceMob)) - filemob = mastermob_clip.mob - - self.assertEqual(1, len(filemob.slots)) - filemob_clip = filemob.slots[0].segment - - self.assertTrue(isinstance(filemob_clip, SourceClip)) - self.assertTrue(isinstance(filemob_clip.mob, SourceMob)) - tapemob = filemob_clip.mob - self.assertTrue(len(tapemob.slots) >= 2) - - timecode_slots = [tape_slot for tape_slot in tapemob.slots - if isinstance(tape_slot.segment, - Timecode)] - - self.assertEqual(1, len(timecode_slots)) - - for tape_slot in tapemob.slots: - tapemob_component = tape_slot.segment - if not isinstance(tapemob_component, Timecode): - self.assertTrue(isinstance(tapemob_component, SourceClip)) - tapemob_clip = tapemob_component - self.assertEqual(None, tapemob_clip.mob) - self.assertEqual(None, tapemob_clip.slot) - self.assertEqual(0, tapemob_clip.slot_id) - - def _is_otio_aaf_same(self, otio_child, aaf_component): - if isinstance(aaf_component, SourceClip): - orig_mob_id = str(otio_child.metadata["AAF"]["SourceID"]) - dest_mob_id = str(aaf_component.mob.mob_id) - self.assertEqual(orig_mob_id, dest_mob_id) - - if isinstance(aaf_component, (SourceClip, Filler)): - orig_duration = otio_child.visible_range().duration.value - dest_duration = aaf_component.length - self.assertEqual(orig_duration, dest_duration) - - if isinstance(aaf_component, Transition): - orig_pointlist = otio_child.metadata["AAF"]["PointList"] - params = aaf_component["OperationGroup"].value.parameters - varying_value = [param for param in params if isinstance(param, - VaryingValue)][0] - dest_pointlist = varying_value.getvalue("PointList") - for orig_point, dest_point in zip(orig_pointlist, dest_pointlist): - self.assertEqual(orig_point["Value"], dest_point.value) - self.assertEqual(orig_point["Time"], dest_point.time) - - -class SimplifyTests(unittest.TestCase): - def test_aaf_simplify(self): - aaf_path = SIMPLE_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(aaf_path, simplify=True) - self.assertIsNotNone(timeline) - self.assertEqual(type(timeline), otio.schema.Timeline) - self.assertEqual(timeline.name, "OTIO TEST 1.Exported.01") - fps = timeline.duration().rate - self.assertEqual(fps, 24.0) - self.assertEqual( - timeline.duration(), - otio.opentime.from_timecode("00:02:16:18", fps) - ) - self.assertEqual(len(timeline.tracks), 3) - self.assertEqual(otio.schema.TrackKind.Video, timeline.tracks[0].kind) - self.assertEqual(otio.schema.TrackKind.Audio, timeline.tracks[1].kind) - self.assertEqual(otio.schema.TrackKind.Audio, timeline.tracks[2].kind) - for track in timeline.tracks: - self.assertNotEqual(type(track[0]), otio.schema.Track) - self.assertEqual(len(track), 5) - - def test_aaf_no_simplify(self): - aaf_path = SIMPLE_EXAMPLE_PATH - collection = otio.adapters.read_from_file(aaf_path, simplify=False) - self.assertIsNotNone(collection) - self.assertEqual(type(collection), otio.schema.SerializableCollection) - self.assertEqual(len(collection), 1) - - timeline = collection[0] - self.assertEqual(timeline.name, "OTIO TEST 1.Exported.01") - fps = timeline.duration().rate - self.assertEqual(fps, 24.0) - self.assertEqual( - timeline.duration(), - otio.opentime.from_timecode("00:02:16:18", fps) - ) - - self.assertEqual(len(timeline.tracks), 12) - - video_track = timeline.tracks[8][0] - self.assertEqual(otio.schema.TrackKind.Video, video_track.kind) - self.assertEqual(len(video_track), 5) - - def test_simplify_top_level_track(self): - """Test for cases where a track has a single item but should not be - collapsed because it is the the last track in the stack ie: - - TL - tracks Stack - track1 - clip - - in this case, track1 should not be pruned. - """ - - # get the simplified form of the clip - tl = otio.adapters.read_from_file(ONE_AUDIO_CLIP_PATH, simplify=True) - - # ensure that we end up with a track that contains a clip - self.assertEqual(type(tl.tracks[0]), otio.schema.Track) - self.assertEqual(tl.tracks[0].kind, otio.schema.TrackKind.Audio) - self.assertEqual(type(tl.tracks[0][0]), otio.schema.Clip) - - def test_simplify_track_stack_track(self): - tl = otio.schema.Timeline() - tl.tracks.append(otio.schema.Track()) - tl.tracks[0].append(otio.schema.Stack()) - tl.tracks[0][0].append(otio.schema.Track()) - tl.tracks[0][0][0].append(otio.schema.Clip()) - - from opentimelineio_contrib.adapters import advanced_authoring_format - simple_tl = advanced_authoring_format._simplify(tl) - - self.assertEqual( - type(simple_tl.tracks[0][0]), otio.schema.Clip - ) - - tl = otio.schema.Timeline() - tl.tracks.append(otio.schema.Track()) - tl.tracks[0].append(otio.schema.Stack()) - tl.tracks[0][0].append(otio.schema.Track()) - tl.tracks[0][0][0].append(otio.schema.Track()) - tl.tracks[0][0][0][0].append(otio.schema.Clip()) - - from opentimelineio_contrib.adapters import advanced_authoring_format - simple_tl = advanced_authoring_format._simplify(tl) - - # top level thing should not be a clip - self.assertEqual( - type(simple_tl.tracks[0]), otio.schema.Track - ) - self.assertEqual( - type(simple_tl.tracks[0][0]), otio.schema.Clip - ) - - def test_simplify_stack_clip_clip(self): - tl = otio.schema.Timeline() - tl.tracks.append(otio.schema.Track()) - tl.tracks[0].append(otio.schema.Stack()) - tl.tracks[0][0].append(otio.schema.Clip()) - tl.tracks[0][0].append(otio.schema.Clip()) - - from opentimelineio_contrib.adapters import advanced_authoring_format - simple_tl = advanced_authoring_format._simplify(tl) - - self.assertNotEqual( - type(simple_tl.tracks[0]), otio.schema.Clip - ) - self.assertEqual( - type(simple_tl.tracks[0][0]), otio.schema.Stack - ) - - def test_simplify_stack_track_clip(self): - tl = otio.schema.Timeline() - tl.tracks.append(otio.schema.Track()) - tl.tracks[0].append(otio.schema.Stack()) - tl.tracks[0][0].append(otio.schema.Track()) - tl.tracks[0][0][0].append(otio.schema.Clip()) - tl.tracks[0][0].append(otio.schema.Track()) - tl.tracks[0][0][1].append(otio.schema.Clip()) - - from opentimelineio_contrib.adapters import advanced_authoring_format - simple_tl = advanced_authoring_format._simplify(tl) - - # None of the things in the top level stack should be a clip - for i in simple_tl.tracks: - self.assertNotEqual(type(i), otio.schema.Clip) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/opentimelineio_contrib/adapters/tests/test_ale_adapter.py b/contrib/opentimelineio_contrib/adapters/tests/test_ale_adapter.py deleted file mode 100644 index 089ad1635..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/test_ale_adapter.py +++ /dev/null @@ -1,220 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Test the ALE adapter.""" - -# python -import os -import unittest - -import opentimelineio as otio - -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "sample.ale") -EXAMPLE2_PATH = os.path.join(SAMPLE_DATA_DIR, "sample2.ale") -EXAMPLE_CDL_PATH = os.path.join(SAMPLE_DATA_DIR, "sample_cdl.ale") -EXAMPLEUHD_PATH = os.path.join(SAMPLE_DATA_DIR, "sampleUHD.ale") - - -class ALEAdapterTest(unittest.TestCase): - - def test_ale_read(self): - ale_path = EXAMPLE_PATH - collection = otio.adapters.read_from_file(ale_path) - self.assertTrue(collection is not None) - self.assertEqual(type(collection), otio.schema.SerializableCollection) - self.assertEqual(len(collection), 4) - fps = float(collection.metadata.get("ALE").get("header").get("FPS")) - self.assertEqual(fps, 24) - self.assertEqual( - [c.name for c in collection], - ["test_017056", "test_017057", "test_017058", "Something"] - ) - self.assertEqual( - [c.source_range for c in collection], - [ - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:04:03", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:04:04", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:04:05", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("01:00:00:00", fps), - otio.opentime.from_timecode("00:00:04:06", fps) - ) - ] - ) - - def test_ale_read2(self): - ale_path = EXAMPLE2_PATH - collection = otio.adapters.read_from_file(ale_path) - self.assertTrue(collection is not None) - self.assertEqual(type(collection), otio.schema.SerializableCollection) - self.assertEqual(len(collection), 2) - fps = float(collection.metadata.get("ALE").get("header").get("FPS")) - self.assertEqual(fps, 23.98) - self.assertEqual( - [c.name for c in collection], - ["19A-1xa", "19A-2xa"] - ) - self.assertEqual( - [c.source_range for c in collection], - [ - otio.opentime.TimeRange( - otio.opentime.from_timecode("04:00:00:00", fps), - otio.opentime.from_timecode("00:00:46:16", fps) - ), - otio.opentime.TimeRange( - otio.opentime.from_timecode("04:00:46:16", fps), - otio.opentime.from_timecode("00:00:50:16", fps) - ) - ] - ) - - def test_ale_read_cdl(self): - ale_path = EXAMPLE_CDL_PATH - collection = otio.adapters.read_from_file(ale_path) - self.assertTrue(collection is not None) - self.assertEqual(type(collection), otio.schema.SerializableCollection) - self.assertEqual(len(collection), 4) - fps = float(collection.metadata.get("ALE").get("header").get("FPS")) - self.assertEqual(fps, 23.976) - self.assertEqual([c.name for c in collection], [ - "A005_C010_0501J0", "A005_C010_0501J0", "A005_C009_0501A0", - "A005_C010_0501J0" - ]) - self.assertEqual([c.source_range for c in collection], [ - - otio.opentime.TimeRange( - otio.opentime.from_timecode("17:49:33:01", fps), - otio.opentime.from_timecode("00:00:02:09", fps)), - - otio.opentime.TimeRange( - otio.opentime.from_timecode("17:49:55:19", fps), - otio.opentime.from_timecode("00:00:06:09", fps)), - - otio.opentime.TimeRange( - otio.opentime.from_timecode("17:40:25:06", fps), - otio.opentime.from_timecode("00:00:02:20", fps)), - - otio.opentime.TimeRange( - otio.opentime.from_timecode("17:50:21:23", fps), - otio.opentime.from_timecode("00:00:03:14", fps)) - ]) - - # Slope, offset, and power values are of type _otio.AnyVector - # So we have to convert them to lists otherwise - # the comparison between those two types would fail - - # FIRST CLIP - self.assertEqual( - list(collection[0].metadata['cdl']['asc_sop']['slope']), - [0.8714, 0.9334, 0.9947]) - self.assertEqual( - list(collection[0].metadata['cdl']['asc_sop']['offset']), - [-0.087, -0.0922, -0.0808]) - self.assertEqual( - list(collection[0].metadata['cdl']['asc_sop']['power']), - [0.9988, 1.0218, 1.0101]) - self.assertEqual(collection[0].metadata['cdl']['asc_sat'], 0.9) - - # SECOND CLIP - self.assertEqual( - list(collection[1].metadata['cdl']['asc_sop']['slope']), - [0.8714, 0.9334, 0.9947]) - self.assertEqual( - list(collection[1].metadata['cdl']['asc_sop']['offset']), - [-0.087, -0.0922, -0.0808]) - self.assertEqual( - list(collection[1].metadata['cdl']['asc_sop']['power']), - [0.9988, 1.0218, 1.0101]) - self.assertEqual(collection[1].metadata['cdl']['asc_sat'], 0.9) - - # THIRD CLIP - self.assertEqual( - list(collection[2].metadata['cdl']['asc_sop']['slope']), - [0.8604, 0.9252, 0.9755]) - self.assertEqual( - list(collection[2].metadata['cdl']['asc_sop']['offset']), - [-0.0735, -0.0813, -0.0737]) - self.assertEqual( - list(collection[2].metadata['cdl']['asc_sop']['power']), - [0.9988, 1.0218, 1.0101]) - self.assertEqual(collection[2].metadata['cdl']['asc_sat'], 0.9) - - # FOURTH CLIP - self.assertEqual( - list(collection[3].metadata['cdl']['asc_sop']['slope']), - [0.8714, 0.9334, 0.9947]) - self.assertEqual( - list(collection[3].metadata['cdl']['asc_sop']['offset']), - [-0.087, -0.0922, -0.0808]) - self.assertEqual( - list(collection[3].metadata['cdl']['asc_sop']['power']), - [0.9988, 1.0218, 1.0101]) - self.assertEqual(collection[3].metadata['cdl']['asc_sat'], 0.9) - - def test_ale_uhd(self): - ale_path = EXAMPLEUHD_PATH - collection = otio.adapters.read_from_file(ale_path) - frmt = str(collection.metadata.get("ALE").get("header").get("VIDEO_FORMAT")) - self.assertEqual(frmt, "CUSTOM") - - def test_ale_add_format(self): - - # adds a clip to the supplied timeline, sets the clips "Image Size" - # metadata and then rountrips the ALE verifying the supplied format is detected - def add_then_check(timeline, size, expected_format): - cl = otio.schema.Clip( - metadata={'ALE': {'Image Size': size}}, - source_range=otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(0, 23.976), - duration=otio.opentime.RationalTime(48, 23.976) - ) - ) - timeline.tracks[0].extend([cl]) - collection = otio.adapters.read_from_string( - otio.adapters.write_to_string( - timeline, - adapter_name='ale' - ), - adapter_name="ale" - ) - ale_meta = collection.metadata.get('ALE') - vid_format = str(ale_meta.get('header').get('VIDEO_FORMAT')) - self.assertEqual(vid_format, expected_format) - - track = otio.schema.Track() - tl = otio.schema.Timeline("Add Format", tracks=[track]) - - # add multiple clips with various resolutions, - # we want the ALE to return a project format - # that is compatible with the largest resolution - - add_then_check(tl, '720 x 486', 'NTSC') - add_then_check(tl, '720 x 576', 'PAL') - add_then_check(tl, '1280x 720', '720') - add_then_check(tl, '1920x1080', '1080') - add_then_check(tl, '2048x1080', 'CUSTOM') - add_then_check(tl, '4096x2304', 'CUSTOM') - - def test_ale_roundtrip(self): - ale_path = EXAMPLE_PATH - - with open(ale_path) as fi: - original = fi.read() - collection = otio.adapters.read_from_string(original, "ale") - output = otio.adapters.write_to_string(collection, "ale") - self.maxDiff = None - self.assertMultiLineEqual(original, output) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/opentimelineio_contrib/adapters/tests/test_burnins.py b/contrib/opentimelineio_contrib/adapters/tests/test_burnins.py deleted file mode 100644 index 622ec5a11..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/test_burnins.py +++ /dev/null @@ -1,175 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Unit tests for the rv session file adapter""" - -import unittest - -import opentimelineio as otio - -MODULE = otio.adapters.from_name('burnins').module() -SAMPLE_DATA = """{ - "OTIO_SCHEMA": "Timeline.1", - "metadata": { - "burnins": { - "overwrite": true, - "burnins": [ - { - "text": "Top Center", - "align": "top_centered", - "font": "/System/Library/Fonts/Menlo.ttc", - "font_size": 48, - "function": "text" - }, - { - "align": "top_left", - "x_offset": 75, - "font": "/System/Library/Fonts/Menlo.ttc", - "frame_offset": 101, - "font_size": 48, - "function": "frame_number" - } - ], - "streams": [ - { - "codec_type": "video", - "codec_name": "h264", - "width": 1920, - "height": 1080, - "r_frame_rate": "30/1", - "start_time": "0.000000", - "duration": "20.000000" - } - ] - } - }, - "name": "TEST.MOV", - "tracks": { - "OTIO_SCHEMA": "Stack.1", - "children": [ - { - "OTIO_SCHEMA": "Track.1", - "children": [ - { - "OTIO_SCHEMA": "Clip.1", - "effects": [], - "markers": [], - "media_reference": { - "OTIO_SCHEMA": "ExternalReference.1", - "available_range": { - "OTIO_SCHEMA": "TimeRange.1", - "duration": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 30.0, - "value": 600.0 - }, - "start_time": { - "OTIO_SCHEMA": "RationalTime.1", - "rate": 30.0, - "value": 0.0 - } - }, - "metadata": {}, - "name": null, - "target_url": "file://TEST.MOV" - }, - "metadata": {}, - "name": "TEST.MOV", - "source_range": null - } - ], - "effects": [], - "kind": "Video", - "markers": [], - "metadata": {}, - "name": "TEST.MOV", - "source_range": null - } - ], - "effects": [], - "markers": [], - "metadata": {}, - "name": "tracks", - "source_range": null - } -}""" -WITH_BG = ('ffmpeg -loglevel panic -i TEST.MOV -vf "drawtext=text=' - '\'Top Center\':x=w/2-tw/2:y=0:fontcolor=white@1.0:fontsize' - '=48:fontfile=\'/System/Library/Fonts/Menlo.ttc\':box=1:boxbord' - 'erw=5:boxcolor=black@1.0,drawtext=text=\'' - r'%{eif\:n+101\:d}' - '\':x=75:y=0:fontcolor=white@1.0:fontsize=48:fontfile=\'/Syst' - 'em/Library/Fonts/Menlo.ttc\':box=1:boxborderw=5:boxcolor=bla' - 'ck@1.0" TEST.MOV') - -WITHOUT_BG = ('ffmpeg -loglevel panic -i TEST.MOV -vf "drawtext=text=' - '\'Top Center\':x=w/2-tw/2:y=0:fontcolor=white@1.0:fontsize' - '=48:fontfile=\'/System/Library/Fonts/Menlo.ttc\',' - 'drawtext=text=\'' - r'%{eif\:n+101\:d}' - '\':x=75:y=0:fontcolor=white@1.0:fontsize=48:fontfile=\'/System' - '/Library/Fonts/Menlo.ttc\'" TEST.MOV') -TIMECODE = ('ffmpeg -loglevel panic -i TEST.MOV -vf "drawtext=timecode=' - '\'Top Center\':timecode_rate=24.00:x=w/2-tw/2:y=0:fontcolor=' - 'white@1.0:fontsize=48:fontfile=\'/System/Library/Fonts/Menlo.' - 'ttc\':box=1:boxborderw=5:boxcolor=black@1.0,drawtext=timecode=' - r"'00\:00\:00\:00':timecode_rate=24.00:x=75:y=0:fontcolor=" - 'white@1.0:fontsize=48:fontfile=\'/System/Library/Fonts/Menlo.' - 'ttc\':box=1:boxborderw=5:boxcolor=black@1.0" TEST.MOV') - - -try: - import PIL # noqa - from PIL.Image import core as imaging # noqa - could_import_pillow = True -except (ImportError, SyntaxError): - could_import_pillow = False - - -@unittest.skipIf( - not could_import_pillow, - "Pillow Required for burnin unit tests. see:" - " https://python-pillow.org/" -) -class FFMPEGBurninsTest(unittest.TestCase): - """Test Cases for FFMPEG Burnins""" - - def test_burnins_with_background(self): - """ - Tests creating burnins with a background (box) - """ - timeline = otio.adapters.read_from_string(SAMPLE_DATA, "otio_json") - burnins = MODULE.build_burnins(timeline) - self.assertEqual(len(burnins), 1) - command = burnins[-1].command(burnins[-1].otio_media) - self.assertEqual(command, WITH_BG) - - def test_burnins_without_background(self): - """ - Tests creating burnins without a background (box) - """ - timeline = otio.adapters.read_from_string(SAMPLE_DATA, "otio_json") - for each in timeline.metadata['burnins']['burnins']: - each['bg_color'] = None - burnins = MODULE.build_burnins(timeline) - self.assertEqual(len(burnins), 1) - command = burnins[-1].command(burnins[-1].otio_media) - self.assertEqual(command, WITHOUT_BG) - - def test_burnins_with_timecode(self): - """ - Tests creating burnins with an animated timecode - """ - timeline = otio.adapters.read_from_string(SAMPLE_DATA, "otio_json") - for each in timeline.metadata['burnins']['burnins']: - each['function'] = 'timecode' - each['frame_offset'] = 0 - each['fps'] = 24 - burnins = MODULE.build_burnins(timeline) - self.assertEqual(len(burnins), 1) - command = burnins[-1].command(burnins[-1].otio_media) - self.assertEqual(command, TIMECODE) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/opentimelineio_contrib/adapters/tests/test_fcpx_adapter.py b/contrib/opentimelineio_contrib/adapters/tests/test_fcpx_adapter.py deleted file mode 100644 index 8eafbb58e..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/test_fcpx_adapter.py +++ /dev/null @@ -1,175 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -import os -import subprocess -import sys -import unittest -import unittest.mock -import opentimelineio as otio -import opentimelineio.test_utils as otio_test_utils -from opentimelineio_contrib.adapters.fcpx_xml import format_name - -SAMPLE_LIBRARY_XML = os.path.join( - os.path.dirname(__file__), - "sample_data", - "fcpx_library.fcpxml" -) -SAMPLE_PROJECT_XML = os.path.join( - os.path.dirname(__file__), - "sample_data", - "fcpx_project.fcpxml" -) -SAMPLE_EVENT_XML = os.path.join( - os.path.dirname(__file__), - "sample_data", - "fcpx_event.fcpxml" -) -SAMPLE_CLIPS_XML = os.path.join( - os.path.dirname(__file__), - "sample_data", - "fcpx_clips.fcpxml" -) - - -class AdaptersFcpXXmlTest(unittest.TestCase, otio_test_utils.OTIOAssertions): - """ - The test class for the FCP X XML adapter - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.maxDiff = None - - def test_library_roundtrip(self): - container = otio.adapters.read_from_file(SAMPLE_LIBRARY_XML) - timeline = container.find_children( - descended_from_type=otio.schema.Timeline)[0] - - self.assertIsNotNone(timeline) - self.assertEqual(len(timeline.tracks), 4) - - self.assertEqual(len(timeline.video_tracks()), 3) - self.assertEqual(len(timeline.audio_tracks()), 1) - - video_clip_names = ( - ( - 'IMG_0715', - "", - 'compound_clip_1', - 'IMG_0233', - 'IMG_0687', - 'IMG_0268', - 'compound_clip_1' - ), - ("", 'IMG_0513', "", 'IMG_0268', 'IMG_0740'), - ("", 'IMG_0857') - ) - - for n, track in enumerate(timeline.video_tracks()): - self.assertTupleEqual( - tuple(c.name for c in track), - video_clip_names[n] - ) - - fcpx_xml = otio.adapters.write_to_string(container, "fcpx_xml") - self.assertIsNotNone(fcpx_xml) - - new_timeline = otio.adapters.read_from_string(fcpx_xml, "fcpx_xml") - self.assertJsonEqual(container, new_timeline) - - def test_event_roundtrip(self): - container = otio.adapters.read_from_file(SAMPLE_EVENT_XML) - timeline = container.find_children( - descended_from_type=otio.schema.Timeline)[0] - - self.assertIsNotNone(timeline) - self.assertEqual(len(timeline.tracks), 4) - - self.assertEqual(len(timeline.video_tracks()), 3) - self.assertEqual(len(timeline.audio_tracks()), 1) - - video_clip_names = ( - ( - 'IMG_0715', - "", - 'compound_clip_1', - 'IMG_0233', - 'IMG_0687', - 'IMG_0268', - 'compound_clip_1' - ), - ("", 'IMG_0513', "", 'IMG_0268', 'IMG_0740'), - ("", 'IMG_0857') - ) - - for n, track in enumerate(timeline.video_tracks()): - self.assertTupleEqual( - tuple(c.name for c in track), - video_clip_names[n] - ) - - fcpx_xml = otio.adapters.write_to_string(container, "fcpx_xml") - self.assertIsNotNone(fcpx_xml) - - new_timeline = otio.adapters.read_from_string(fcpx_xml, "fcpx_xml") - self.assertJsonEqual(container, new_timeline) - - def test_project_roundtrip(self): - timeline = otio.adapters.read_from_file(SAMPLE_PROJECT_XML) - - self.assertIsNotNone(timeline) - self.assertEqual(len(timeline.tracks), 4) - - self.assertEqual(len(timeline.video_tracks()), 3) - self.assertEqual(len(timeline.audio_tracks()), 1) - - video_clip_names = ( - ( - 'IMG_0715', - "", - 'compound_clip_1', - 'IMG_0233', - 'IMG_0687', - 'IMG_0268', - 'compound_clip_1' - ), - ("", 'IMG_0513', "", 'IMG_0268', 'IMG_0740'), - ("", 'IMG_0857') - ) - - for n, track in enumerate(timeline.video_tracks()): - self.assertTupleEqual( - tuple(c.name for c in track), - video_clip_names[n] - ) - - fcpx_xml = otio.adapters.write_to_string(timeline, "fcpx_xml") - self.assertIsNotNone(fcpx_xml) - - new_timeline = otio.adapters.read_from_string(fcpx_xml, "fcpx_xml") - self.assertJsonEqual(timeline, new_timeline) - - def test_clips_roundtrip(self): - container = otio.adapters.read_from_file(SAMPLE_CLIPS_XML) - fcpx_xml = otio.adapters.write_to_string(container, "fcpx_xml") - self.assertIsNotNone(fcpx_xml) - - new_timeline = otio.adapters.read_from_string(fcpx_xml, "fcpx_xml") - self.assertJsonEqual(container, new_timeline) - - def test_format_name(self): - rvalue = subprocess.check_output( - [sys.executable, '-c', 'print("640x360")'] - ) - mock_patch = unittest.mock.patch.object - with mock_patch(subprocess, 'check_output', return_value=rvalue): - with mock_patch(os.path, 'exists', return_value=True): - self.assertEqual( - format_name(25, "file:///dummy.me"), - 'FFVideoFormat640x360p25' - ) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/opentimelineio_contrib/adapters/tests/test_hls_playlist_adapter.py b/contrib/opentimelineio_contrib/adapters/tests/test_hls_playlist_adapter.py deleted file mode 100644 index cac54afb0..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/test_hls_playlist_adapter.py +++ /dev/null @@ -1,701 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -import os -import unittest - -import opentimelineio as otio - -import tempfile - -# Reference data -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -HLS_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "v1_prog_index.m3u8") - -# Load the adapter module using otio -hls_playlist = otio.adapters.from_name("hls_playlist").module() - -MEM_PLAYLIST_REF_VALUE = """#EXTM3U -#EXT-X-VERSION:7 -#EXT-X-INDEPENDENT-SEGMENTS -#EXT-X-MEDIA-SEQUENCE:1 -#EXT-X-PLAYLIST-TYPE:VOD -#EXT-X-TARGETDURATION:2 -#EXT-X-MAP:BYTERANGE="729@0",URI="media-video-1.mp4" -#EXTINF:2.00200, -#EXT-X-BYTERANGE:534220@1361 -video1.mp4 -#EXT-X-ENDLIST""" - -MEM_MASTER_PLAYLIST_REF_VALUE = """#EXTM3U -#EXT-X-VERSION:6 -#EXT-X-MEDIA:GROUP-ID="aud1",NAME="a1",TYPE=AUDIO,URI="a1/prog_index.m3u8" -#EXT-X-STREAM-INF:AUDIO="aud1",BANDWIDTH=135801,CODECS="avc.test,aac.test",FRAME-RATE=23.976,RESOLUTION=1920x1080 -v1/prog_index.m3u8""" - -MEM_IFRAME_MASTER_PLAYLIST_REF_VALUE = """#EXTM3U -#EXT-X-VERSION:6 -#EXT-X-MEDIA:GROUP-ID="aud1",NAME="a1",TYPE=AUDIO,URI="a1/prog_index.m3u8" -#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=123456,CODECS="avc.test",RESOLUTION=1920x1080,URI="v1/iframe_index.m3u8" -#EXT-X-STREAM-INF:AUDIO="aud1",BANDWIDTH=135801,CODECS="avc.test,aac.test",FRAME-RATE=23.976,RESOLUTION=1920x1080 -v1/prog_index.m3u8""" - -MEM_COMPLEX_MASTER_PLAYLIST_REF_VALUE = """#EXTM3U -#EXT-X-VERSION:6 -#EXT-X-MEDIA:GROUP-ID="aud1",NAME="a1",TYPE=AUDIO,URI="a1/prog_index.m3u8" -#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=123456,CODECS="avc.test",RESOLUTION=1920x1080,URI="v1/iframe_index.m3u8" -#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=12345,CODECS="avc.test",RESOLUTION=720x480,URI="v2/iframe_index.m3u8" -#EXT-X-STREAM-INF:AUDIO="aud1",BANDWIDTH=135801,CODECS="avc.test,aac.test",FRAME-RATE=23.976,RESOLUTION=1920x1080 -v1/prog_index.m3u8 -#EXT-X-STREAM-INF:AUDIO="aud1",BANDWIDTH=24690,CODECS="avc.test,aac.test",FRAME-RATE=23.976,RESOLUTION=720x480 -v2/prog_index.m3u8""" - -MEM_SINGLE_TRACK_MASTER_PLAYLIST_REF_VALUE = """#EXTM3U -#EXT-X-VERSION:6 -#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=123456,CODECS="avc.test",RESOLUTION=1920x1080,URI="v1/iframe_index.m3u8" -#EXT-X-STREAM-INF:BANDWIDTH=123456,CODECS="avc.test",FRAME-RATE=23.976,RESOLUTION=1920x1080 -v1/prog_index.m3u8""" - - -class HLSPlaylistDataStructuresTest(unittest.TestCase): - """ Test the lower-level HLS Data structures """ - - def test_hls_attribute_list(self): - """ Test the HLS adapter's attribute list parser """ - attribute_list_string = 'HEXTHING=0xFAF,FIRST-NEGFLOAT=-1.25,'\ - 'STRTHING="foo, bar",DECIMALTHING=123456,FLOATTHING=1.233,'\ - 'ENUMTHING=0xeS1,NEGFLOAT=-3.14' - attribute_list_dictionary = { - "HEXTHING": 0xFAF, - "FIRST-NEGFLOAT": -1.25, - "STRTHING": "foo, bar", - "DECIMALTHING": 123456, - "FLOATTHING": 1.233, - "ENUMTHING": "0xeS1", - "NEGFLOAT": -3.14 - } - attr_list = hls_playlist.AttributeList.from_string( - attribute_list_string - ) - - self.assertEqual(len(attr_list), len(attribute_list_dictionary)) - for attrName, attrValue in attr_list.items(): - self.assertEqual(attrValue, attribute_list_dictionary[attrName]) - - def test_playlist_tag_exclusivity(self): - """ Test that mutually-exclusive tag types don't overlap """ - # see sections 4.3.2, 4.3.3, and 4.3.4 of - # draft-pantos-http-live-streaming for more information about these - # constraints - - non_master_tags = hls_playlist.MEDIA_SEGMENT_TAGS.union( - hls_playlist.MEDIA_PLAYLIST_TAGS) - - common_tags = non_master_tags.intersection( - hls_playlist.MASTER_PLAYLIST_TAGS) - self.assertEqual(len(common_tags), 0) - - -class HLSPMedialaylistAdapterTest(unittest.TestCase): - """ Test the HLS Playlist adapter media playlist functionality """ - - def test_media_pl_from_mem(self): - t = otio.schema.Timeline() - track = otio.schema.Track("v1") - track.metadata['HLS'] = { - "EXT-X-INDEPENDENT-SEGMENTS": None, - "EXT-X-PLAYLIST-TYPE": "VOD" - } - t.tracks.append(track) - - # Make a prototype media ref with the segment's initialization metadata - segmented_media_ref = otio.schema.ExternalReference( - target_url='video1.mp4', - metadata={ - "streaming": { - "init_byterange": { - "byte_count": 729, - "byte_offset": 0 - }, - "init_uri": "media-video-1.mp4" - } - } - ) - - # Make a copy of the media ref specifying the byte range for the - # segment - media_ref1 = segmented_media_ref.deepcopy() - media_ref1.available_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, 1), - otio.opentime.RationalTime(2.002, 1) - ) - media_ref1.metadata['streaming'].update( - { - "byte_count": 534220, - "byte_offset": 1361 - } - ) - - # make the segment and append it - segment1 = otio.schema.Clip(media_reference=media_ref1) - track.append(segment1) - - # Write out and validate the playlist - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "test_media_pl_from_mem.m3u8" - ) - otio.adapters.write_to_file(t, media_pl_tmp_path) - - with open(media_pl_tmp_path) as f: - pl_string = f.read() - - # Compare against the reference value - self.assertEqual(pl_string, MEM_PLAYLIST_REF_VALUE) - - def _validate_sample_playlist(self, timeline): - # Validate the track count - self.assertEqual(len(timeline.tracks), 1) - track = timeline.tracks[0] - - # Validate the track global metadata - self.assertNotEqual(track.metadata['HLS'], {}) - track_metadata = track.metadata['HLS'] - self.assertEqual(track_metadata, { - 'EXT-X-INDEPENDENT-SEGMENTS': None, - 'EXT-X-VERSION': '7', - 'EXT-X-PLAYLIST-TYPE': 'VOD'} - ) - - # There are 50 segments (clips) - # Validate the count, "sequence_num", and durations - self.assertEqual(len(track), 50) - start_seq_num = int(track[0].metadata['streaming']['sequence_num']) - segment_durations = otio.opentime.RationalTime(1.001, 1) - for seq_num, clip in enumerate(track, start_seq_num): - self.assertEqual( - clip.metadata['streaming']['sequence_num'], - seq_num - ) - if seq_num < 50: - self.assertEqual(clip.duration(), segment_durations) - else: - # The last segment has a shorter duration - self.assertEqual( - clip.duration(), - otio.opentime.RationalTime(0.83417, 1) - ) - - # Spot-check a segment - segment_5 = track[4] - seg_5_media_ref = segment_5.media_reference - seg_5_ref_streaming_metadata = seg_5_media_ref.metadata['streaming'] - self.assertEqual( - seg_5_ref_streaming_metadata['byte_count'], - 593718 - ) - self.assertEqual( - seg_5_ref_streaming_metadata['byte_offset'], - 2430668 - ) - self.assertEqual( - seg_5_ref_streaming_metadata['init_byterange']['byte_count'], - 729 - ) - self.assertEqual( - seg_5_ref_streaming_metadata['init_byterange']['byte_offset'], - 0 - ) - self.assertEqual( - seg_5_ref_streaming_metadata['init_uri'], - "media-video-1.mp4" - ) - self.assertEqual( - seg_5_media_ref.target_url, - "media-video-1.mp4" - ) - - def test_media_roundtrip(self): - hls_path = HLS_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(hls_path) - - # validate the read-in playlist matches reference data - self._validate_sample_playlist(timeline) - - # Write out and validate both playlists have the same lines - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "test_media_roundtrip.m3u8" - ) - otio.adapters.write_to_file(timeline, media_pl_tmp_path) - - # Read in both playlists - with open(hls_path) as f: - reference_lines = f.readlines() - - with open(media_pl_tmp_path) as f: - adapter_out_lines = f.readlines() - - # Using otio as well - in_timeline = otio.adapters.read_from_file(media_pl_tmp_path) - - # Strip newline chars - reference_lines = [line.strip('\n') for line in reference_lines] - adapter_out_lines = [line.strip('\n') for line in adapter_out_lines] - - # Compare the lines - self.assertEqual(reference_lines, adapter_out_lines) - - # validate the otio of the playlist we wrote - self._validate_sample_playlist(in_timeline) - - def test_media_segment_size(self): - hls_path = HLS_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(hls_path) - - # validate the read-in playlist matches reference data - self._validate_sample_playlist(timeline) - - # Set the sement size to ~six seconds - timeline_streaming_md = timeline.metadata.setdefault('streaming', {}) - seg_min_duration = otio.opentime.RationalTime(6, 1) - timeline_streaming_md['min_segment_duration'] = seg_min_duration - seg_max_duration = otio.opentime.RationalTime( - (60 * 60 * 24), - 1 - ) - timeline_streaming_md['max_segment_duration'] = seg_max_duration - - # Write out the playlist - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "test_media_segment_size.m3u8" - ) - otio.adapters.write_to_file(timeline, media_pl_tmp_path) - - # Read in the playlist - in_timeline = otio.adapters.read_from_file(media_pl_tmp_path) - - # Pick a duration that segments won't exceed but is less than max - seg_upper_duration = otio.opentime.RationalTime(7, 1) - - # When reading an HLS playlist, segments become clips. Check clip - # durations (except the last one since it's the leftover) - for clip in in_timeline.tracks[0][:-1]: - self.assertTrue(clip.duration() >= seg_min_duration) - self.assertTrue(clip.duration() < seg_upper_duration) - - # Check the last segment duration - last_clip = in_timeline.tracks[0][-1] - self.assertTrue(last_clip.duration() < seg_min_duration) - self.assertTrue( - last_clip.duration() > otio.opentime.RationalTime( - 0, 1 - ) - ) - - def test_iframe_segment_size(self): - hls_path = HLS_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(hls_path) - - # the reference playlist is one segment per keyframe, pluck the first - # segment duration as reference for keyframe duration - keyframe_duration = timeline.tracks[0][0].duration() - - # validate the read-in playlist matches reference data - self._validate_sample_playlist(timeline) - - # Set the sement size to ~six seconds - timeline_streaming_md = timeline.metadata.setdefault('streaming', {}) - seg_min_duration = otio.opentime.RationalTime(6, 1) - timeline_streaming_md['min_segment_duration'] = seg_min_duration - seg_max_duration = otio.opentime.RationalTime( - (60 * 60 * 24), - 1 - ) - timeline_streaming_md['max_segment_duration'] = seg_max_duration - - # Configure the playlist to be an iframe list - track_hls_metadata = timeline.tracks[0].metadata['HLS'] - del track_hls_metadata['EXT-X-INDEPENDENT-SEGMENTS'] - track_hls_metadata['EXT-X-I-FRAMES-ONLY'] = None - - # Write out the playlist - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "test_iframe_segment_size.m3u8" - ) - otio.adapters.write_to_file(timeline, media_pl_tmp_path) - - # Read in the playlist - in_timeline = otio.adapters.read_from_file(media_pl_tmp_path) - with open(media_pl_tmp_path) as f: - pl_lines = f.readlines() - pl_lines = [line.strip('\n') for line in pl_lines] - - # validate the TARGETDURATION value is correct - self.assertTrue('#EXT-X-TARGETDURATION:6' in pl_lines) - self.assertTrue('#EXT-X-MEDIA-SEQUENCE:0' in pl_lines) - self.assertEqual(len(timeline.tracks), len(in_timeline.tracks)) - self.assertEqual(len(timeline.tracks[0]), len(in_timeline.tracks[0])) - - # The segments should all be 1.001 seconds like the original input - seg_upper_duration = otio.opentime.RationalTime(1.1, 1) - - # When reading an HLS playlist, segments become clips. Check clip - # durations (except the last one since it's the leftover) - for clip in in_timeline.tracks[0][:-1]: - self.assertTrue(clip.duration() == keyframe_duration) - self.assertTrue(clip.duration() < seg_upper_duration) - - # Check the last segment duration - last_clip = in_timeline.tracks[0][-1] - self.assertTrue(last_clip.duration() < seg_min_duration) - self.assertTrue( - last_clip.duration() > otio.opentime.RationalTime(0, 1) - ) - - -class HLSPMasterPlaylistAdapterTest(unittest.TestCase): - """ Test the HLS Playlist adapter master playlist functionality """ - - def test_simple_master_pl_from_mem(self): - t = otio.schema.Timeline() - - # add a video track - vtrack = otio.schema.Track( - "v1", - kind=otio.schema.TrackKind.Video - ) - vtrack.metadata.update( - { - 'streaming': { - 'bandwidth': 123456, - 'codec': 'avc.test', - 'width': 1920, - 'height': 1080, - 'frame_rate': 23.976, - }, - 'HLS': { - 'uri': 'v1/prog_index.m3u8' - } - } - ) - t.tracks.append(vtrack) - - # add an audio track - atrack = otio.schema.Track( - "a1", - kind=otio.schema.TrackKind.Audio - ) - atrack.metadata.update( - { - 'linked_tracks': [vtrack.name], - 'streaming': { - 'bandwidth': 12345, - 'codec': 'aac.test', - 'group_id': 'aud1', - }, - 'HLS': { - 'uri': 'a1/prog_index.m3u8' - } - } - ) - t.tracks.append(atrack) - - # Write out and validate the playlist - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "master.m3u8" - ) - otio.adapters.write_to_file(t, media_pl_tmp_path) - - with open(media_pl_tmp_path) as f: - pl_string = f.read() - - # Drop blank lines before comparing - pl_string = '\n'.join(line for line in pl_string.split('\n') if line) - - # Compare against the reference value - self.assertEqual(pl_string, MEM_MASTER_PLAYLIST_REF_VALUE) - - def test_master_pl_with_iframe_pl_from_mem(self): - t = otio.schema.Timeline() - - # add a video track - vtrack = otio.schema.Track( - "v1", - kind=otio.schema.TrackKind.Video - ) - vtrack.metadata.update( - { - 'streaming': { - 'bandwidth': 123456, - 'codec': 'avc.test', - 'width': 1920, - 'height': 1080, - 'frame_rate': 23.976, - }, - 'HLS': { - 'uri': 'v1/prog_index.m3u8', - 'iframe_uri': 'v1/iframe_index.m3u8' - } - } - ) - t.tracks.append(vtrack) - - # add an audio track - atrack = otio.schema.Track( - "a1", - kind=otio.schema.TrackKind.Audio - ) - atrack.metadata.update( - { - 'linked_tracks': [vtrack.name], - 'streaming': { - 'bandwidth': 12345, - 'codec': 'aac.test', - 'group_id': 'aud1', - }, - 'HLS': { - 'uri': 'a1/prog_index.m3u8' - } - } - ) - t.tracks.append(atrack) - - # Write out and validate the playlist - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "master.m3u8" - ) - otio.adapters.write_to_file(t, media_pl_tmp_path) - - with open(media_pl_tmp_path) as f: - pl_string = f.read() - - # Drop blank lines before comparing - pl_string = '\n'.join(line for line in pl_string.split('\n') if line) - - # Compare against the reference value - self.assertEqual(pl_string, MEM_IFRAME_MASTER_PLAYLIST_REF_VALUE) - - def test_master_pl_complex_from_mem(self): - t = otio.schema.Timeline() - - # add a video track - vtrack = otio.schema.Track( - "v1", - kind=otio.schema.TrackKind.Video - ) - vtrack.metadata.update( - { - 'streaming': { - 'bandwidth': 123456, - 'codec': 'avc.test', - 'width': 1920, - 'height': 1080, - 'frame_rate': 23.976, - }, - 'HLS': { - 'uri': 'v1/prog_index.m3u8', - 'iframe_uri': 'v1/iframe_index.m3u8' - } - } - ) - t.tracks.append(vtrack) - - # add an alternate video track rep - v2track = otio.schema.Track( - "v2", - kind=otio.schema.TrackKind.Video - ) - v2track.metadata.update( - { - 'streaming': { - 'bandwidth': 12345, - 'codec': 'avc.test', - 'width': 720, - 'height': 480, - 'frame_rate': 23.976, - }, - 'HLS': { - 'uri': 'v2/prog_index.m3u8', - 'iframe_uri': 'v2/iframe_index.m3u8' - } - } - ) - t.tracks.append(v2track) - - # add an audio track - atrack = otio.schema.Track( - "a1", - kind=otio.schema.TrackKind.Audio - ) - atrack.metadata.update( - { - 'linked_tracks': [vtrack.name, v2track.name], - 'streaming': { - 'bandwidth': 12345, - 'codec': 'aac.test', - 'group_id': 'aud1', - }, - 'HLS': { - 'uri': 'a1/prog_index.m3u8' - } - } - ) - t.tracks.append(atrack) - - # Write out and validate the playlist - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "master.m3u8" - ) - otio.adapters.write_to_file(t, media_pl_tmp_path) - - with open(media_pl_tmp_path) as f: - pl_string = f.read() - - # Drop blank lines before comparing - pl_string = '\n'.join(line for line in pl_string.split('\n') if line) - - # Compare against the reference value - self.assertEqual(pl_string, MEM_COMPLEX_MASTER_PLAYLIST_REF_VALUE) - - def test_master_playlist_hint_metadata(self): - """ - Test that URL hints for master playlists don't leak out to media - playlsits. - """ - # Start with the reference playlist - hls_path = HLS_EXAMPLE_PATH - timeline = otio.adapters.read_from_file(hls_path) - - # add master playlist metadata to the track - timeline.tracks[0].metadata.update( - { - 'bandwidth': 123456, - 'codec': 'avc.test', - 'width': 1920, - 'height': 1080, - 'frame_rate': 23.976, - 'HLS': { - 'uri': 'v1/prog_index.m3u8', - 'iframe_uri': 'v1/iframe_index.m3u8' - } - } - ) - - # Write out and validate the playlist - with tempfile.TemporaryDirectory() as temp_dir: - media_pl_tmp_path = os.path.join( - temp_dir, - "test_media_pl_from_mem.m3u8" - ) - otio.adapters.write_to_file(timeline, media_pl_tmp_path) - - with open(media_pl_tmp_path) as f: - pl_string = f.read() - - # ensure metadata that wasn't supposed to didn't leak out - for line in pl_string.split('\n'): - self.assertFalse(line.startswith('#uri:')) - self.assertFalse(line.startswith('#iframe_uri:')) - - def test_explicit_master_pl_from_mem(self): - """Test that forcing a master playlist for a single track timeline - works. - """ - t = otio.schema.Timeline() - # Set the master playlist flag - t.metadata.update( - { - 'HLS': { - 'master_playlist': True - } - } - ) - - # build a track - track = otio.schema.Track('v1') - track.metadata.update( - { - 'streaming': { - 'bandwidth': 123456, - 'codec': 'avc.test', - 'width': 1920, - 'height': 1080, - 'frame_rate': 23.976, - }, - 'HLS': { - 'EXT-X-INDEPENDENT-SEGMENTS': None, - 'EXT-X-PLAYLIST-TYPE': 'VOD', - 'uri': 'v1/prog_index.m3u8', - 'iframe_uri': 'v1/iframe_index.m3u8' - } - } - ) - t.tracks.append(track) - - # Make a prototype media ref with the segment's initialization metadata - segmented_media_ref = otio.schema.ExternalReference( - target_url='video1.mp4', - metadata={ - 'streaming': { - 'init_byterange': { - 'byte_count': 729, - 'byte_offset': 0 - }, - 'init_uri': 'media-video-1.mp4' - } - } - ) - - # Make a copy of the media ref specifying the byte range for the - # segment - media_ref1 = segmented_media_ref.deepcopy() - media_ref1.available_range = otio.opentime.TimeRange( - otio.opentime.RationalTime(0, 1), - otio.opentime.RationalTime(2.002, 1) - ) - media_ref1.metadata.update( - { - 'streaming': { - 'byte_count': 534220, - 'byte_offset': 1361 - } - } - ) - - # make the segment and append it - segment1 = otio.schema.Clip(media_reference=media_ref1) - track.append(segment1) - - # Write out and validate the playlist - with tempfile.TemporaryDirectory() as temp_dir: - master_pl_tmp_path = os.path.join( - temp_dir, - "master.m3u8" - ) - otio.adapters.write_to_file(t, master_pl_tmp_path) - - with open(master_pl_tmp_path) as f: - pl_string = f.read() - - # Drop blank lines before comparing - pl_string = '\n'.join(line for line in pl_string.split('\n') if line) - - # Compare against the reference value - self.assertEqual(pl_string, MEM_SINGLE_TRACK_MASTER_PLAYLIST_REF_VALUE) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py b/contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py deleted file mode 100644 index d0414d781..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/test_maya_sequencer.py +++ /dev/null @@ -1,65 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Unit tests for the maya sequencer adapter""" - -import os -import tempfile -import unittest - -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") -BASELINE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.ma") -SETATTR_TO_CHECK = (".ef", ".sf", ".sn", ".se", ".ssf") - - -def filter_maya_file(contents): - return '\n'.join( - line for line in contents.split('\n') - if ( - line.strip().startswith('setAttr') and - any(a in line for a in SETATTR_TO_CHECK) or - ( - not line.startswith('//') and - not line.startswith('requires') and - not line.startswith('fileInfo') and - not line.startswith('currentUnit') and - not line.strip().startswith('rename') and - not line.strip().startswith('select') and - not line.strip().startswith('setAttr') and - not line.strip().startswith('0') and - not line.strip().startswith('1') - ) - ) - ) - - -@unittest.skipIf( - "OTIO_MAYA_PYTHON_BIN" not in os.environ, - "OTIO_MAYA_PYTHON_BIN not set, required for the maya adapter" -) -class MayaSequencerAdapterWriteTest(unittest.TestCase): - def test_basic_maya_sequencer_write(self): - self.maxDiff = None - timeline = otio.adapters.read_from_file(SCREENING_EXAMPLE_PATH) - tmp_path = tempfile.mkstemp(suffix=".ma", text=True)[1] - - otio.adapters.write_to_file(timeline, tmp_path) - self.assertTrue(os.path.exists(tmp_path)) - - with open(tmp_path) as fo: - test_data = fo.read() - - with open(BASELINE_PATH) as fo: - baseline_data = fo.read() - - self.assertMultiLineEqual( - filter_maya_file(baseline_data), - filter_maya_file(test_data) - ) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/opentimelineio_contrib/adapters/tests/tests_xges_adapter.py b/contrib/opentimelineio_contrib/adapters/tests/tests_xges_adapter.py deleted file mode 100644 index 127e9f857..000000000 --- a/contrib/opentimelineio_contrib/adapters/tests/tests_xges_adapter.py +++ /dev/null @@ -1,2695 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -import os -import tempfile -import unittest -from fractions import Fraction -from xml.etree import ElementTree - -import opentimelineio as otio -import opentimelineio.test_utils as otio_test_utils -from opentimelineio.schema import ( - Timeline, - Stack, - Track, - Transition, - Clip, - Gap, - ExternalReference, - TrackKind, - Effect, - Marker, - MarkerColor) - -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -XGES_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "xges_example.xges") -XGES_TIMING_PATH = os.path.join(SAMPLE_DATA_DIR, "xges_timing_example.xges") -XGES_NESTED_PATH = os.path.join(SAMPLE_DATA_DIR, "xges_nested_example.xges") -IMAGE_SEQUENCE_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, "image_sequence_example.otio") - -SCHEMA = otio.schema.schemadef.module_from_name("xges") -# TODO: remove once python2 has ended: -# (problem is that python2 needs a source code encoding -# definition to include utf8 text!!!) -if str is bytes: - UTF8_NAME = 'Ri"\',;=)(+9@{\xcf\x93\xe7\xb7\xb6\xe2\x98\xba'\ - '\xef\xb8\x8f l\xd1\xa6\xf1\xbd\x9a\xbb\xf1\xa6\x84\x83 \\' -else: - UTF8_NAME = str( - b'Ri"\',;=)(+9@{\xcf\x93\xe7\xb7\xb6\xe2\x98\xba\xef\xb8' - b'\x8f l\xd1\xa6\xf1\xbd\x9a\xbb\xf1\xa6\x84\x83 \\', - encoding="utf8") -GST_SECOND = 1000000000 - - -def _rat_tm_from_secs(val, rate=25.0): - """Return a RationalTime for the given timestamp (in seconds).""" - return otio.opentime.from_seconds(val).rescaled_to(rate) - - -def _tm_range_from_secs(start, dur, rate=25.0): - """ - Return a TimeRange for the given timestamp and duration (in - seconds). - """ - return otio.opentime.TimeRange( - _rat_tm_from_secs(start), _rat_tm_from_secs(dur)) - - -def _make_media_ref(uri="file:///example", start=0, duration=1, name=""): - """Return an ExternalReference.""" - ref = ExternalReference( - target_url=uri, - available_range=_tm_range_from_secs(start, duration)) - ref.name = name - return ref - - -def _make_clip(uri="file:///example", start=0, duration=1, name=""): - """Return a Clip.""" - ref = _make_media_ref(uri, start, duration) - return Clip(name=name, media_reference=ref) - - -def _add_marker(otio_item, name, color, start, duration): - """Add a marker to an otio item""" - otio_item.markers.append(Marker( - name=name, color=color, - marked_range=_tm_range_from_secs(start, duration))) - - -def _make_ges_marker( - position, otio_color=None, comment=None, metadatas=None): - """ - Return a GESMarker with the given timeline position (in seconds). - """ - if comment is not None: - metadatas = metadatas or SCHEMA.GstStructure("metadatas") - metadatas.set("comment", "string", comment) - ges_marker = SCHEMA.GESMarker(position * GST_SECOND, metadatas) - if otio_color is not None: - ges_marker.set_color_from_otio_color(otio_color) - return ges_marker - - -class XgesElement: - """ - Generates an xges string to be converted to an otio timeline. - """ - - def __init__(self, name=None, marker_list=None): - self.ges = ElementTree.Element("ges") - self.project = ElementTree.SubElement(self.ges, "project") - if name is not None: - self.project.attrib["metadatas"] = \ - "metadatas, name=(string){};".format( - SCHEMA.GstStructure.serialize_string(name)) - self.ressources = ElementTree.SubElement( - self.project, "ressources") - self.timeline = ElementTree.SubElement( - self.project, "timeline") - if marker_list is not None: - self.timeline.attrib["metadatas"] = \ - "metadatas, markers=(GESMarkerList){};".format( - SCHEMA.GstStructure.serialize_marker_list(marker_list)) - self.layer_priority = 0 - self.track_id = 0 - self.clip_id = 0 - self.layer = None - self.clip = None - - def add_audio_track(self): - """Add a basic Audio track.""" - track = ElementTree.SubElement( - self.timeline, "track", { - "caps": "audio/x-raw(ANY)", - "track-type": "2", - "track-id": str(self.track_id), - "properties": - r'properties, restriction-caps=(string)' - r'"audio/x-raw\,\ format\=\(string\)S32LE\,\ ' - r'channels\=\(int\)2\,\ rate\=\(int\)44100\,\ ' - r'layout\=\(string\)interleaved", ' - r'mixing=(boolean)true;'}) - self.track_id += 1 - return track - - def add_video_track(self, framerate=None): - """Add a basic Video track.""" - res_caps = \ - r"video/x-raw\,\ width\=\(int\)300\,\ height\=\(int\)250" - if framerate: - res_caps += fr"\,\ framerate\=\(fraction\){framerate}" - track = ElementTree.SubElement( - self.timeline, "track", { - "caps": "video/x-raw(ANY)", - "track-type": "4", - "track-id": str(self.track_id), - "properties": - 'properties, restriction-caps=(string)' - '"{}", mixing=(boolean)true;'.format(res_caps)}) - self.track_id += 1 - return track - - def add_text_track(self): - """Add a basic Audio track.""" - track = ElementTree.SubElement( - self.timeline, "track", { - "caps": "text/x-raw(ANY)", - "track-type": "8", - "track-id": str(self.track_id), - "properties": - 'properties, mixing=(boolean)false;'}) - self.track_id += 1 - return track - - def add_layer(self): - """Append a (lower priority) layer to the timeline.""" - self.layer = ElementTree.SubElement( - self.timeline, "layer", - {"priority": str(self.layer_priority)}) - self.layer_priority += 1 - return self.layer - - def add_asset(self, asset_id, extract_type, duration=None): - """Add an asset to the project if it does not already exist.""" - asset = self.ressources.find( - "./asset[@id='{}'][@extractable-type-name='{}']".format( - asset_id, extract_type)) - if asset is not None: - return asset - asset = ElementTree.SubElement( - self.ressources, "asset", - {"id": asset_id, "extractable-type-name": extract_type}) - if duration is not None: - asset.attrib["properties"] = \ - "properties, duration=(guint64){:d};".format( - duration * GST_SECOND) - return asset - - def add_clip( - self, start, duration, inpoint, type_name, track_types, - asset_id=None, name=None, asset_duration=None, - properties=None, metadatas=None): - """Add a clip to the most recent layer.""" - layer_priority = self.layer.get("priority") - if asset_id is None: - if type_name == "GESUriClip": - asset_id = "file:///example" - elif type_name == "GESTransitionClip": - asset_id = "crossfade" - else: - asset_id = type_name - if asset_duration is None and type_name == "GESUriClip": - asset_duration = 100 - self.clip = ElementTree.SubElement( - self.layer, "clip", { - "id": str(self.clip_id), - "asset-id": asset_id, - "type-name": type_name, - "track-types": str(track_types), - "layer-priority": str(layer_priority), - "start": str(start * GST_SECOND), - "inpoint": str(inpoint * GST_SECOND), - "duration": str(duration * GST_SECOND)}) - self.add_asset(asset_id, type_name, asset_duration) - if properties is not None: - self.clip.attrib["properties"] = str(properties) - if metadatas is not None: - self.clip.attrib["metadatas"] = str(metadatas) - if name is not None: - if properties is None: - properties = SCHEMA.GstStructure("properties") - properties.set("name", "string", name) - self.clip.attrib["properties"] = str(properties) - self.clip_id += 1 - return self.clip - - def add_effect( - self, effect_name, track_type, track_id, - type_name=None, properties=None, metadatas=None, - children_properties=None): - """Add an effect to the most recent clip.""" - if type_name is None: - type_name = "GESEffect" - clip_id = self.clip.get("id") - effect = ElementTree.SubElement( - self.clip, "effect", { - "asset-id": effect_name, - "clip-id": str(clip_id), - "type-name": type_name, - "track-type": str(track_type), - "track-id": str(track_id)}) - if properties is not None: - effect.attrib["properties"] = str(properties) - if metadatas is not None: - effect.attrib["metadatas"] = str(metadatas) - if children_properties is not None: - effect.attrib["children-properties"] = str( - children_properties) - return effect - - def get_otio_timeline(self): - """Return a Timeline using otio's read_from_string method.""" - string = ElementTree.tostring(self.ges, encoding="UTF-8") - return otio.adapters.read_from_string(string, "xges") - - -class CustomOtioAssertions: - """Custom Assertions to perform on otio objects""" - - @staticmethod - def _typed_name(otio_obj): - name = otio_obj.name - if not name: - name = '""' - return f"{otio_obj.schema_name()} {name}" - - @classmethod - def _otio_id(cls, otio_obj): - otio_id = cls._typed_name(otio_obj) - if isinstance(otio_obj, otio.core.Composable): - otio_parent = otio_obj.parent() - if otio_parent is None: - otio_id += " (No Parent)" - else: - index = otio_parent.index(otio_obj) - otio_id += " (Child {:d} of {})".format( - index, cls._typed_name(otio_parent)) - return otio_id - - @staticmethod - def _tm(rat_tm): - return "{:g}/{:g}({:g}s)".format( - rat_tm.value, rat_tm.rate, rat_tm.value / rat_tm.rate) - - @classmethod - def _range(cls, tm_range): - return "start_time:" + cls._tm(tm_range.start_time) \ - + ", duration:" + cls._tm(tm_range.duration) - - @classmethod - def _val_str(cls, val): - if isinstance(val, otio.opentime.RationalTime): - return cls._tm(val) - if isinstance(val, otio.opentime.TimeRange): - return cls._range(val) - return str(val) - - def assertOtioHasAttr(self, otio_obj, attr_name): - """Assert that the otio object has an attribute.""" - if not hasattr(otio_obj, attr_name): - raise AssertionError( - "{} has no attribute {}".format( - self._otio_id(otio_obj), attr_name)) - - def assertOtioAttrIsNone(self, otio_obj, attr_name): - """Assert that the otio object attribute is None.""" - self.assertOtioHasAttr(otio_obj, attr_name) - val = getattr(otio_obj, attr_name) - if val is not None: - raise AssertionError( - "{} {}: {} is not None".format( - self._otio_id(otio_obj), attr_name, - self._val_str(val))) - - def assertOtioHasAttrPath(self, otio_obj, attr_path): - """ - Assert that the otio object has the attribute: - attr_path[0].attr_path[1].---.attr_path[-1] - and returns the value and an attribute string. - If an attribute is callable, it will be called (with no - arguments) before returning. - If an int is given in the attribute path, it will be treated as - a list index to call. - """ - first = True - attr_str = "" - val = otio_obj - for attr_name in attr_path: - if isinstance(attr_name, int): - if not hasattr(val, "__getitem__"): - raise AssertionError( - "{}{} is not a list".format( - self._otio_id(otio_obj), attr_str)) - try: - val = val[attr_name] - except Exception as err: - raise AssertionError( - "{}{}: can't access item {:d}:\n{!s}".format( - self._otio_id(otio_obj), attr_str, - attr_name, err)) - if first: - first = False - attr_str += " " - attr_str += f"[{attr_name:d}]" - else: - if not hasattr(val, attr_name): - raise AssertionError( - "{}{} has no attribute {}".format( - self._otio_id(otio_obj), attr_str, attr_name)) - val = getattr(val, attr_name) - if first: - first = False - attr_str += " " + attr_name - else: - attr_str += "." + attr_name - if callable(val): - val = val() - return val, attr_str - - def assertOtioAttrPathEqual(self, otio_obj, attr_path, compare): - """ - Assert that the otio object has the attribute: - attr_path[0].attr_path[1].---.attr_path[-1] - equal to 'compare'. - See assertOtioHasAttrPath for special cases for the attr_path. - """ - val, attr_str = self.assertOtioHasAttrPath(otio_obj, attr_path) - if val != compare: - raise AssertionError( - "{}{}: {} != {}".format( - self._otio_id(otio_obj), attr_str, - self._val_str(val), self._val_str(compare))) - - def assertOtioAttrPathEqualList( - self, otio_obj, list_path, attr_path, compare_list): - """ - Assert that the otio object has the attribute: - list_path[0].---.list_path[-1][i] - .attr_path[0].---.attr_path[-1] - == compare_list[i] - See assertOtioHasAttrPath for special cases for the attr_path - and list_path. - """ - _list, list_str = self.assertOtioHasAttrPath(otio_obj, list_path) - try: - num = len(_list) - except Exception as err: - raise AssertionError( - "{}{} has no len:\n{!s}".format( - self._otio_id(otio_obj), list_str, err)) - num_cmp = len(compare_list) - if num != num_cmp: - raise AssertionError( - "{}{} has a length of {:d} != {:d}".format( - self._otio_id(otio_obj), list_str, num, num_cmp)) - for index, compare in enumerate(compare_list): - self.assertOtioAttrPathEqual( - otio_obj, list_path + [index] + attr_path, compare) - - def assertOtioAttrEqual(self, otio_obj, attr_name, compare): - """ - Assert that the otio object attribute is equal to 'compare'. - If an attribute is callable, it will be called (with no - arguments) before comparing. - """ - self.assertOtioAttrPathEqual(otio_obj, [attr_name], compare) - - def assertOtioIsInstance(self, otio_obj, otio_class): - """ - Assert that the otio object is an instance of the given class. - """ - if not isinstance(otio_obj, otio_class): - raise AssertionError( - "{} is not an otio {} instance".format( - self._otio_id(otio_obj), otio_class.__name__)) - - def assertOtioAttrIsInstance(self, otio_obj, attr_name, otio_class): - """ - Assert that the otio object attribute is an instance of the - given class. - """ - self.assertOtioHasAttr(otio_obj, attr_name) - val = getattr(otio_obj, attr_name) - if not isinstance(val, otio_class): - raise AssertionError( - "{} {} is not an otio {} instance".format( - self._otio_id(otio_obj), attr_name, - otio_class.__name__)) - - def assertOtioOffsetTotal(self, otio_trans, compare): - """ - Assert that the Transition has a certain total offset. - """ - in_set = otio_trans.in_offset - out_set = otio_trans.out_offset - if in_set + out_set != compare: - raise AssertionError( - "{} in_offset + out_offset: {} + {} != {}".format( - self._otio_id(otio_trans), - self._val_str(in_set), self._val_str(out_set), - self._val_str(compare))) - - def assertOtioNumChildren(self, otio_obj, compare): - """ - Assert that the otio object has a certain number of children. - """ - self.assertOtioIsInstance(otio_obj, otio.core.Composable) - num = len(otio_obj) - if num != compare: - raise AssertionError( - "{} has {:d} children != {}".format( - self._otio_id(otio_obj), num, - self._val_str(compare))) - - -class OtioTest: - """Tests to be used by OtioTestNode and OtioTestTree.""" - - @staticmethod - def none_source(inst, otio_item): - """Test that the source_range is None.""" - inst.assertOtioAttrIsNone(otio_item, "source_range") - - @staticmethod - def is_audio(inst, otio_track): - """Test that a Track is Audio.""" - inst.assertOtioAttrEqual(otio_track, "kind", TrackKind.Audio) - - @staticmethod - def is_video(inst, otio_track): - """Test that a Track is Video.""" - inst.assertOtioAttrEqual(otio_track, "kind", TrackKind.Video) - - @staticmethod - def has_ex_ref(inst, otio_clip): - """Test that a clip has an ExternalReference.""" - inst.assertOtioAttrIsInstance( - otio_clip, "media_reference", ExternalReference) - - @staticmethod - def no_effects(inst, otio_item): - """Test that an item has no effects.""" - inst.assertOtioAttrPathEqualList(otio_item, ["effects"], [], []) - - @staticmethod - def no_markers(inst, otio_item): - """Test that an item has no markers.""" - inst.assertOtioAttrPathEqualList(otio_item, ["markers"], [], []) - - @staticmethod - def start_time(start): - """ - Return an equality test for an Item's source_range.start_time. - Argument should be a timestamp in seconds. - """ - return lambda inst, otio_item: inst.assertOtioAttrPathEqual( - otio_item, ["source_range", "start_time"], - _rat_tm_from_secs(start)) - - @staticmethod - def duration(dur): - """ - Return an equality test for an Item's source_range.duration. - Argument should be a timestamp in seconds. - """ - return lambda inst, otio_item: inst.assertOtioAttrPathEqual( - otio_item, ["source_range", "duration"], - _rat_tm_from_secs(dur)) - - @staticmethod - def _test_both_rate(inst, otio_item, _rate): - inst.assertOtioAttrPathEqual( - otio_item, ["source_range", "start_time", "rate"], _rate) - inst.assertOtioAttrPathEqual( - otio_item, ["source_range", "duration", "rate"], _rate) - - @classmethod - def rate(cls, _rate): - """ - Return an equality test for an Item's - source_range.start_time.rate and source_range.duration.rate. - """ - return lambda inst, otio_item: cls._test_both_rate( - inst, otio_item, _rate) - - @staticmethod - def range(start, dur): - """ - Return an equality test for an Item's source_range. - Arguments should be timestamps in seconds. - """ - return lambda inst, otio_item: inst.assertOtioAttrEqual( - otio_item, "source_range", _tm_range_from_secs(start, dur)) - - @staticmethod - def range_in_parent(start, dur): - """ - Return an equality test for an Item's range_in_parent(). - Arguments should be timestamps in seconds. - """ - return lambda inst, otio_item: inst.assertOtioAttrEqual( - otio_item, "range_in_parent", _tm_range_from_secs(start, dur)) - - @staticmethod - def offset_total(total): - """ - Return an equality test for a Transition's total offset/range. - Argument should be a timestamp in seconds. - """ - return lambda inst, otio_trans: inst.assertOtioOffsetTotal( - otio_trans, _rat_tm_from_secs(total)) - - @staticmethod - def name(name): - """Return an equality test for an Otio Object's name.""" - return lambda inst, otio_item: inst.assertOtioAttrEqual( - otio_item, "name", name) - - @staticmethod - def effects(*effect_names): - """Return a test that the otio_item contains the effects""" - return lambda inst, otio_item: inst.assertOtioAttrPathEqualList( - otio_item, ["effects"], ["effect_name"], list(effect_names)) - - @staticmethod - def _test_marker_details(inst, otio_item, marker_details): - inst.assertOtioAttrPathEqualList( - otio_item, ["markers"], ["name"], - [mrk["name"] for mrk in marker_details]) - inst.assertOtioAttrPathEqualList( - otio_item, ["markers"], ["color"], - [mrk["color"] for mrk in marker_details]) - inst.assertOtioAttrPathEqualList( - otio_item, ["markers"], ["marked_range", "start_time"], - [_rat_tm_from_secs(mrk["start"]) for mrk in marker_details]) - inst.assertOtioAttrPathEqualList( - otio_item, ["markers"], ["marked_range", "duration"], - [_rat_tm_from_secs(mrk["duration"]) for mrk in marker_details]) - - @classmethod - def markers(cls, *marker_details): - """ - Return a test that the otio_item contains the markers specified by - the marker_details, which are dictionaries with the keys: - color: (the marker color), - name: (the name of the marker), - start: (the start time of the marker in seconds), - duration: (the range of the marker in seconds) - """ - return lambda inst, otio_item: cls._test_marker_details( - inst, otio_item, marker_details) - - -class OtioTestNode: - """ - An OtioTestTree Node that corresponds to some expected otio class. - This holds information about the children of the node, as well as - a list of additional tests to perform on the corresponding otio - object. These tests should come from OtioTest. - """ - - def __init__(self, expect_type, children=[], tests=[]): - if expect_type is Timeline: - if len(children) != 1: - raise ValueError("A Timeline must have one child") - elif not issubclass(expect_type, otio.core.Composition): - if children: - raise ValueError( - "No children are allowed if not a Timeline or " - "Composition type") - self.expect_type = expect_type - self.children = children - self.tests = tests - - -class OtioTestTree: - """ - Test an otio object has the correct type structure, and perform - additional tests along the way.""" - - def __init__(self, unittest_inst, base, type_tests=None): - """ - First argument is a unittest instance which will perform all - tests. - 'type_test' argument is a dictionary of classes who's values are a - list of tests to perform whenever a node is found that is an - instance of that class. These tests should come from OtioTest. - 'base' argument is the base OtioTestNode, where the comparison - will begin. - """ - self.unittest_inst = unittest_inst - if type_tests is None: - self.type_tests = {} - else: - self.type_tests = type_tests - self.base = base - - def test_compare(self, otio_obj): - """ - Test that the given otio object has the expected tree structure - and run all tests that are found. - """ - self._sub_test_compare(otio_obj, self.base) - - def _sub_test_compare(self, otio_obj, node): - self.unittest_inst.assertOtioIsInstance( - otio_obj, node.expect_type) - if isinstance(otio_obj, Timeline): - self._sub_test_compare(otio_obj.tracks, node.children[0]) - elif isinstance(otio_obj, otio.core.Composition): - self.unittest_inst.assertOtioNumChildren( - otio_obj, len(node.children)) - for sub_obj, child in zip(otio_obj, node.children): - self._sub_test_compare(sub_obj, child) - for otio_type in self.type_tests: - if isinstance(otio_obj, otio_type): - for test in self.type_tests[otio_type]: - test(self.unittest_inst, otio_obj) - for test in node.tests: - test(self.unittest_inst, otio_obj) - - -class CustomXgesAssertions: - """Custom Assertions to perform on a ges xml object""" - - @staticmethod - def _xges_id(xml_el): - xges_id = f"Element <{xml_el.tag}" - for key, val in xml_el.attrib.items(): - xges_id += f" {key}='{val}'" - xges_id += " /> " - return xges_id - - def assertXgesNumElementsAtPath(self, xml_el, path, compare): - """ - Assert that the xml element has a certain number of descendants - at the given xml path. - Returns the matching descendants. - """ - found = xml_el.findall(path) or [] - num = len(found) - if num != compare: - raise AssertionError( - "{}Number of elements found at path {}: " - "{:d} != {:d}".format( - self._xges_id(xml_el), path, num, compare)) - return found - - def assertXgesOneElementAtPath(self, xml_el, path): - """ - Assert that the xml element has exactly one descendants at the - given xml path. - Returns the matching descendent. - """ - return self.assertXgesNumElementsAtPath(xml_el, path, 1)[0] - - def assertXgesHasTag(self, xml_el, tag): - """Assert that the xml element has a certain tag.""" - if xml_el.tag != tag: - raise AssertionError( - "{}does not have the tag {}".format( - self._xges_id(xml_el), tag)) - - def assertXgesHasAttr(self, xml_el, attr_name): - """ - Assert that the xml element has a certain attribute. - Returns its value. - """ - if attr_name not in xml_el.attrib: - raise AssertionError( - "{}has no attribute {}".format( - self._xges_id(xml_el), attr_name)) - return xml_el.attrib[attr_name] - - def assertXgesHasAllAttrs(self, xml_el, *attr_names): - """ - Assert that the xml element has all given attributes. - """ - for attr_name in attr_names: - self.assertXgesHasAttr(xml_el, attr_name) - - def assertXgesNumElementsAtPathWithAttr( - self, xml_el, path_base, attrs, compare): - """ - Assert that the xml element has a certain number of descendants - at the given xml path with the given attributes. - Returns the matching descendants. - """ - path = path_base - for key, val in attrs.items(): - if key in ("start", "duration", "inpoint"): - val *= GST_SECOND - path += f"[@{key}='{val!s}']" - return self.assertXgesNumElementsAtPath(xml_el, path, compare) - - def assertXgesOneElementAtPathWithAttr( - self, xml_el, path_base, attrs): - """ - Assert that the xml element has exactly one descendants at the - given xml path with the given attributes. - Returns the matching descendent. - """ - return self.assertXgesNumElementsAtPathWithAttr( - xml_el, path_base, attrs, 1)[0] - - def assertXgesIsGesElement(self, ges_el): - """ - Assert that the xml element has the expected basic structure of - a ges element. - """ - self.assertXgesHasTag(ges_el, "ges") - project = self.assertXgesOneElementAtPath(ges_el, "./project") - self.assertXgesHasAllAttrs(project, "properties", "metadatas") - self.assertXgesOneElementAtPath(ges_el, "./project/ressources") - timeline = self.assertXgesOneElementAtPath( - ges_el, "./project/timeline") - self.assertXgesHasAllAttrs(timeline, "properties", "metadatas") - - def assertXgesAttrEqual(self, xml_el, attr_name, compare): - """ - Assert that the xml element's attribute is equal to 'compare'. - """ - val = self.assertXgesHasAttr(xml_el, attr_name) - compare = str(compare) - if val != compare: - raise AssertionError( - "{}attribute {}: {} != {}".format( - self._xges_id(xml_el), attr_name, val, compare)) - - def assertXgesHasInStructure( - self, xml_el, struct_name, field_name, field_type): - """ - Assert that the xml element has a GstStructure attribute that - contains the given field. - Returns the value. - """ - struct = self.assertXgesHasAttr(xml_el, struct_name) - struct = SCHEMA.GstStructure.new_from_str(struct) - if field_name not in struct.fields: - raise AssertionError( - "{}attribute {} does not contain the field {}".format( - self._xges_id(xml_el), struct_name, field_name)) - if struct.get_type_name(field_name) != field_type: - raise AssertionError( - "{}attribute {}'s field {} is not of the type {}".format( - self._xges_id(xml_el), struct_name, field_name, - field_type)) - return struct[field_name] - - def assertXgesHasProperty(self, xml_el, prop_name, prop_type): - """ - Assert that the xml element has the given property. - Returns the value. - """ - return self.assertXgesHasInStructure( - xml_el, "properties", prop_name, prop_type) - - def assertXgesHasMetadata(self, xml_el, meta_name, meta_type): - """ - Assert that the xml element has the given metadata. - Returns the value. - """ - return self.assertXgesHasInStructure( - xml_el, "metadatas", meta_name, meta_type) - - def assertXgesStructureFieldEqual( - self, xml_el, struct_name, field_name, field_type, compare): - """ - Assert that a certain xml element structure field is equal to - 'compare'. - """ - val = self.assertXgesHasInStructure( - xml_el, struct_name, field_name, field_type) - # TODO: remove once python2 has ended - if field_type == "string": - if type(val) is not str and isinstance(val, str): - val = val.encode("utf8") - if isinstance(val, otio.core.SerializableObject): - equal = val.is_equivalent_to(compare) - else: - equal = val == compare - if not equal: - raise AssertionError( - "{}{} {}:\n{!s}\n!=\n{!s}".format( - self._xges_id(xml_el), struct_name, field_name, - val, compare)) - - def assertXgesPropertyEqual( - self, xml_el, prop_name, prop_type, compare): - """ - Assert that a certain xml element property is equal to - 'compare'. - """ - self.assertXgesStructureFieldEqual( - xml_el, "properties", prop_name, prop_type, compare) - - def assertXgesMetadataEqual( - self, xml_el, meta_name, meta_type, compare): - """ - Assert that a certain xml element metadata is equal to - 'compare'. - """ - self.assertXgesStructureFieldEqual( - xml_el, "metadatas", meta_name, meta_type, compare) - - def assertXgesStructureEqual(self, xml_el, attr_name, compare): - """ - Assert that the xml element structure is equal to 'compare'. - """ - struct = self.assertXgesHasAttr(xml_el, attr_name) - struct = SCHEMA.GstStructure.new_from_str(struct) - if not isinstance(compare, SCHEMA.GstStructure): - compare = SCHEMA.GstStructure.new_from_str(compare) - if not struct.is_equivalent_to(compare): - raise AssertionError( - "{}{}:\n{!r}\n!=\n{!r}".format( - self._xges_id(xml_el), attr_name, struct, compare)) - - def assertXgesTrackTypes(self, ges_el, *track_types): - """ - Assert that the ges element contains one track for each given - track type, and no more. - Returns the tracks in the same order as the types. - """ - tracks = [] - for track_type in track_types: - track = self.assertXgesOneElementAtPathWithAttr( - ges_el, "./project/timeline/track", - {"track-type": str(track_type)}) - self.assertXgesHasAllAttrs( - track, "caps", "track-type", "track-id", - "properties", "metadatas") - tracks.append(track) - self.assertXgesNumElementsAtPath( - ges_el, "./project/timeline/track", len(track_types)) - return tracks - - def assertXgesNumLayers(self, ges_el, compare): - """ - Assert that the ges element contains the expected number of - layers. - Returns the layers. - """ - layers = self.assertXgesNumElementsAtPath( - ges_el, "./project/timeline/layer", compare) - for layer in layers: - self.assertXgesHasAllAttrs(layer, "priority") - return layers - - def assertXgesLayer(self, ges_el, priority): - return self.assertXgesOneElementAtPathWithAttr( - ges_el, "./project/timeline/layer", - {"priority": str(priority)}) - - def assertXgesNumClipsAtPath(self, xml_el, path, compare): - """ - Assert that the xml element contains the expected number of - clips at the given path. - Returns the clips. - """ - clips = self.assertXgesNumElementsAtPath(xml_el, path, compare) - for clip in clips: - self.assertXgesHasAllAttrs( - clip, "id", "asset-id", "type-name", "layer-priority", - "track-types", "start", "duration", "inpoint", "rate", - "properties", "metadatas") - return clips - - def assertXgesNumClips(self, ges_el, compare): - """ - Assert that the ges element contains the expected number of - clips. - Returns the clips. - """ - return self.assertXgesNumClipsAtPath( - ges_el, "./project/timeline/layer/clip", compare) - - def assertXgesNumClipsInLayer(self, layer_el, compare): - """ - Assert that the layer element contains the expected number of - clips. - Returns the clips. - """ - return self.assertXgesNumClipsAtPath(layer_el, "./clip", compare) - - def assertXgesClip(self, ges_el, attrs): - """ - Assert that the ges element contains only one clip with the - given attributes. - Returns the matching clip. - """ - clip = self.assertXgesOneElementAtPathWithAttr( - ges_el, "./project/timeline/layer/clip", attrs) - self.assertXgesHasAllAttrs( - clip, "id", "asset-id", "type-name", "layer-priority", - "track-types", "start", "duration", "inpoint", "rate", - "properties", "metadatas") - return clip - - def assertXgesAsset(self, ges_el, asset_id, extract_type): - """ - Assert that the ges element contains only one asset with the - given id and extract type. - Returns the matching asset. - """ - asset = self.assertXgesOneElementAtPathWithAttr( - ges_el, "./project/ressources/asset", - {"id": asset_id, "extractable-type-name": extract_type}) - self.assertXgesHasAllAttrs( - asset, "id", "extractable-type-name", "properties", - "metadatas") - return asset - - def assertXgesClipHasAsset(self, ges_el, clip_el): - """ - Assert that the ges clip has a corresponding asset. - Returns the asset. - """ - asset_id = self.assertXgesHasAttr(clip_el, "asset-id") - extract_type = self.assertXgesHasAttr(clip_el, "type-name") - return self.assertXgesAsset(ges_el, asset_id, extract_type) - - def assertXgesClipIsSubproject(self, ges_el, clip_el): - """ - Assert that the ges clip corresponds to a subproject. - Retruns the subprojects ges element. - """ - self.assertXgesClipHasAsset(ges_el, clip_el) - ges_asset = self.assertXgesAsset( - ges_el, clip_el.get("asset-id"), "GESTimeline") - sub_ges_el = self.assertXgesOneElementAtPath(ges_asset, "ges") - self.assertXgesIsGesElement(sub_ges_el) - return sub_ges_el - - def assertXgesNumClipEffects(self, clip_el, compare): - """ - Assert that the clip element contains the expected number of - effects. - Returns the effects. - """ - effects = self.assertXgesNumElementsAtPath( - clip_el, "./effect", compare) - for effect in effects: - self.assertXgesHasAllAttrs( - effect, "asset-id", "clip-id", "type-name", - "track-type", "track-id", "properties", "metadatas", - "children-properties") - return effects - - def assertXgesTimelineMarkerListEqual(self, ges_el, marker_list): - timeline = self.assertXgesOneElementAtPath( - ges_el, "./project/timeline") - self.assertXgesMetadataEqual( - timeline, "markers", "GESMarkerList", marker_list) - - -class AdaptersXGESTest( - unittest.TestCase, otio_test_utils.OTIOAssertions, - CustomOtioAssertions, CustomXgesAssertions): - - def _get_xges_from_otio_timeline(self, timeline): - ges_el = ElementTree.fromstring( - otio.adapters.write_to_string(timeline, "xges")) - self.assertIsNotNone(ges_el) - self.assertXgesIsGesElement(ges_el) - return ges_el - - def test_read(self): - timeline = otio.adapters.read_from_file(XGES_EXAMPLE_PATH) - test_tree = OtioTestTree( - self, type_tests={ - Stack: [OtioTest.none_source], - Track: [OtioTest.none_source], - Clip: [OtioTest.has_ex_ref]}, - base=OtioTestNode(Stack, children=[ - OtioTestNode( - Track, tests=[OtioTest.is_audio], - children=[OtioTestNode(Clip)]), - OtioTestNode( - Track, tests=[OtioTest.is_video], - children=[ - OtioTestNode(Gap), OtioTestNode(Clip), - OtioTestNode(Transition), OtioTestNode(Clip) - ]), - OtioTestNode( - Track, tests=[OtioTest.is_video], - children=[ - OtioTestNode(Gap), OtioTestNode(Clip), - OtioTestNode(Gap), OtioTestNode(Clip) - ]), - OtioTestNode( - Track, tests=[OtioTest.is_audio], - children=[OtioTestNode(Gap), OtioTestNode(Clip)]), - OtioTestNode( - Track, tests=[OtioTest.is_video], - children=[OtioTestNode(Gap), OtioTestNode(Clip)]), - OtioTestNode( - Track, tests=[OtioTest.is_audio], - children=[OtioTestNode(Gap), OtioTestNode(Clip)]) - ])) - test_tree.test_compare(timeline.tracks) - - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesTrackTypes(ges_el, 2, 4) - self.assertXgesNumLayers(ges_el, 5) - ids = [] - for priority, expect_num, expect_track_types in zip( - range(5), [1, 1, 2, 3, 1], [6, 2, 4, 4, 2]): - layer = self.assertXgesLayer(ges_el, priority) - clips = self.assertXgesNumClipsInLayer(layer, expect_num) - for clip in clips: - ids.append(clip.get("id")) - self.assertXgesAttrEqual( - clip, "track-types", expect_track_types) - self.assertXgesAttrEqual( - clip, "layer-priority", priority) - if clip.get("type-name") == "GESUriClip": - self.assertXgesClipHasAsset(ges_el, clip) - # check that ids are unique - for clip_id in ids: - self.assertIsNotNone(clip_id) - self.assertEqual(ids.count(clip_id), 1) - - def test_unsupported_track_type(self): - # want to test that a project with an unsupported track type - # will still give results for the supported tracks - xges_el = XgesElement() - xges_el.add_audio_track() - # text is unsupported - xges_el.add_text_track() - xges_el.add_video_track() - xges_el.add_layer() - xges_el.add_clip(0, 2, 0, "GESUriClip", 14, name="mixed") - xges_el.add_clip(1, 1, 0, "GESTransitionClip", 6) - xges_el.add_clip(1, 2, 0, "GESUriClip", 6, name="audio-video") - xges_el.add_clip(3, 2, 0, "GESUriClip", 8, name="text") - - if str is not bytes: - # TODO: remove str is not bytes test when python2 ends - # Python2 does not have assertWarns - # warning because unsupported text track type - with self.assertWarns(UserWarning): - timeline = xges_el.get_otio_timeline() - else: - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, base=OtioTestNode(Stack, children=[ - OtioTestNode( - Track, tests=[OtioTest.is_video], children=[ - OtioTestNode(Clip), OtioTestNode(Transition), - OtioTestNode(Clip)]), - OtioTestNode( - Track, tests=[OtioTest.is_audio], children=[ - OtioTestNode(Clip), OtioTestNode(Transition), - OtioTestNode(Clip)]) - ])) - test_tree.test_compare(timeline.tracks) - - def test_project_name(self): - xges_el = XgesElement(UTF8_NAME) - timeline = xges_el.get_otio_timeline() - self.assertOtioAttrEqual(timeline, "name", UTF8_NAME) - ges_el = self._get_xges_from_otio_timeline(timeline) - project_el = ges_el.find("./project") - # already asserted that project_el exists with IsGesElement in - # _get_xges_from_otio_timeline - self.assertXgesMetadataEqual( - project_el, "name", "string", UTF8_NAME) - - def test_clip_names(self): - xges_el = XgesElement() - xges_el.add_audio_track() - xges_el.add_video_track() - xges_el.add_layer() - names = [UTF8_NAME, "T", "C"] - xges_el.add_clip(0, 2, 0, "GESUriClip", 6, name=names[0]) - xges_el.add_clip(1, 1, 0, "GESTransitionClip", 6, name=names[1]) - xges_el.add_clip(1, 2, 0, "GESUriClip", 6, name=names[2]) - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, base=OtioTestNode(Stack, children=[ - OtioTestNode(Track, children=[ - OtioTestNode( - Clip, tests=[OtioTest.name(names[0])]), - OtioTestNode( - Transition, tests=[OtioTest.name(names[1])]), - OtioTestNode( - Clip, tests=[OtioTest.name(names[2])]) - ]), - OtioTestNode(Track, children=[ - OtioTestNode( - Clip, tests=[OtioTest.name(names[0])]), - OtioTestNode( - Transition, tests=[OtioTest.name(names[1])]), - OtioTestNode( - Clip, tests=[OtioTest.name(names[2])]) - ]), - ])) - test_tree.test_compare(timeline.tracks) - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesNumClips(ges_el, 3) - for clip_id, name in zip(range(3), names): - clip = self.assertXgesClip(ges_el, {"id": clip_id}) - self.assertXgesPropertyEqual( - clip, "name", "string", name) - - def test_clip_names_unique(self): - xges_el = XgesElement() - xges_el.add_audio_track() - xges_el.add_layer() - xges_el.add_clip(0, 1, 0, "GESUriClip", 2, name="clip2") - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, base=OtioTestNode(Stack, children=[ - OtioTestNode(Track, children=[ - OtioTestNode( - Clip, tests=[OtioTest.name("clip2")]) - ]) - ])) - test_tree.test_compare(timeline.tracks) - timeline.tracks[0].append(_make_clip(name="clip2")) - timeline.tracks[0].append(_make_clip(name="clip2")) - ges_el = self._get_xges_from_otio_timeline(timeline) - clips = self.assertXgesNumClips(ges_el, 3) - clip_names = [] - for clip in clips: - name = self.assertXgesHasProperty(clip, "name", "string") - self.assertNotIn(name, clip_names) - clip_names.append(name) - - def test_asset(self): - xges_el = XgesElement() - xges_el.add_layer() - asset_id = "file:///ex%%mple" - duration = 235 - xges_el.add_asset(asset_id, "GESUriClip", duration) - xges_el.add_clip(0, 1, 5, "GESUriClip", 2, asset_id=asset_id) - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, base=OtioTestNode(Stack, children=[ - OtioTestNode(Track, children=[ - OtioTestNode( - Clip, tests=[OtioTest.has_ex_ref]) - ]) - ])) - test_tree.test_compare(timeline.tracks) - self.assertOtioAttrPathEqual( - timeline.tracks[0][0], ["media_reference", "target_url"], - asset_id) - self.assertOtioAttrPathEqual( - timeline.tracks[0][0], - ["media_reference", "available_range"], - _tm_range_from_secs(0, duration)) - ges_el = self._get_xges_from_otio_timeline(timeline) - asset = self.assertXgesAsset(ges_el, asset_id, "GESUriClip") - self.assertXgesPropertyEqual( - asset, "duration", "guint64", duration * GST_SECOND) - - def test_framerate(self): - xges_el = XgesElement() - framerate = 45.0 - xges_el.add_video_track(framerate) - xges_el.add_layer() - xges_el.add_clip(0, 1, 0, "GESUriClip", 4) - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, base=OtioTestNode(Stack, children=[ - OtioTestNode(Track, children=[ - OtioTestNode(Clip, tests=[ - OtioTest.range(0, 1), - OtioTest.rate(framerate)]) - ]) - ])) - test_tree.test_compare(timeline.tracks) - - def test_effects(self): - xges_el = XgesElement() - xges_el.add_audio_track() - xges_el.add_video_track() - xges_el.add_layer() - xges_el.add_clip(0, 1, 0, "GESUriClip", 6) - - video_effect_attribs = [{ - "asset-id": "agingtv", - "track-type": 4, - "track-id": 0, - "children-properties": SCHEMA.GstStructure.new_from_str( - "properties, GstAgingTV::color-aging=(boolean)true, " - "GstAgingTV::dusts=(boolean)true, " - "GstAgingTV::pits=(boolean)true, " - "GstBaseTransform::qos=(boolean)true, " - "GstAgingTV::scratch-lines=(uint)7;")}, { - "asset-id": "videobalance", - "track-type": 4, - "track-id": 0, - "children-properties": SCHEMA.GstStructure.new_from_str( - "properties, GstVideoBalance::brightness=(double)0, " - "GstVideoBalance::contrast=(double)0.5, " - "GstVideoBalance::hue=(double)0, " - "GstBaseTransform::qos=(boolean)true, " - "GstVideoBalance::saturation=(double)1;")}] - audio_effect_attribs = [{ - "asset-id": "audiokaraoke", - "track-type": 2, - "track-id": 1, - "children-properties": SCHEMA.GstStructure.new_from_str( - "properties, GstAudioKaraoke::filter-band=(float)220, " - "GstAudioKaraoke::filter-width=(float)100, " - "GstAudioKaraoke::level=(float)1, " - "GstAudioKaraoke::mono-level=(float)1, " - "GstBaseTransform::qos=(boolean)false;")}] - effect_attribs = [ - video_effect_attribs[0], audio_effect_attribs[0], - video_effect_attribs[1]] - for attrs in effect_attribs: - xges_el.add_effect( - attrs["asset-id"], attrs["track-type"], - attrs["track-id"], - children_properties=attrs["children-properties"]) - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, type_tests={ - Stack: [OtioTest.no_effects], - Track: [OtioTest.no_effects]}, - base=OtioTestNode(Stack, children=[ - OtioTestNode( - Track, tests=[OtioTest.is_video], children=[ - OtioTestNode( - Clip, tests=[OtioTest.effects( - "agingtv", "videobalance")]) - ]), - OtioTestNode( - Track, tests=[OtioTest.is_audio], children=[ - OtioTestNode( - Clip, tests=[OtioTest.effects( - "audiokaraoke")]) - ]) - ])) - test_tree.test_compare(timeline.tracks) - ges_el = self._get_xges_from_otio_timeline(timeline) - tracks = self.assertXgesTrackTypes(ges_el, 2, 4) - audio_track = tracks[0] - video_track = tracks[1] - layers = self.assertXgesNumLayers(ges_el, 2) - # expect 2 layers since re-merging of the tracks will be - # prevented by the different effects for different track types - clip = self.assertXgesNumClipsInLayer(layers[0], 1)[0] - audio_effects = self.assertXgesNumClipEffects( - clip, len(audio_effect_attribs)) - for effect, attrs in zip(audio_effects, audio_effect_attribs): - self.assertXgesAttrEqual( - effect, "asset-id", attrs["asset-id"]) - self.assertXgesAttrEqual(effect, "track-type", 2) - self.assertXgesAttrEqual( - effect, "track-id", audio_track.get("track-id")) - self.assertXgesStructureEqual( - effect, "children-properties", - attrs["children-properties"]) - clip = self.assertXgesNumClipsInLayer(layers[1], 1)[0] - video_effects = self.assertXgesNumClipEffects( - clip, len(video_effect_attribs)) - for effect, attrs in zip(video_effects, video_effect_attribs): - self.assertXgesAttrEqual( - effect, "asset-id", attrs["asset-id"]) - self.assertXgesAttrEqual(effect, "track-type", 4) - self.assertXgesAttrEqual( - effect, "track-id", video_track.get("track-id")) - self.assertXgesStructureEqual( - effect, "children-properties", - attrs["children-properties"]) - - def test_track_effects(self): - timeline = Timeline() - effect_names = ["agingtv", "videobalance"] - track = Track() - track.kind = TrackKind.Video - timeline.tracks.append(track) - for name in effect_names: - track.effects.append(Effect(effect_name=name)) - track.append(Gap(source_range=_tm_range_from_secs(0, 3))) - track.append(_make_clip(start=2, duration=5)) - track.append(_make_clip(start=0, duration=4)) - - if str is not bytes: - # TODO: remove str is not bytes test when python2 ends - # Python2 does not have assertWarns - # TODO: warning is for the fact that we do not yet have a - # smart way to convert effect names into bin-descriptions - # Should be removed once this is sorted - with self.assertWarns(UserWarning): - ges_el = self._get_xges_from_otio_timeline(timeline) - else: - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesTrackTypes(ges_el, 4) - layer = self.assertXgesNumLayers(ges_el, 1)[0] - self.assertXgesNumClipsInLayer(layer, 4) - ids = [] - ids.append(self.assertXgesClip( - ges_el, { - "start": 3, "duration": 5, "inpoint": 2, - "type-name": "GESUriClip", "track-types": 4}).get("id")) - ids.append(self.assertXgesClip( - ges_el, { - "start": 8, "duration": 4, "inpoint": 0, - "type-name": "GESUriClip", "track-types": 4}).get("id")) - ids.append(self.assertXgesClip( - ges_el, { - "start": 3, "duration": 9, "inpoint": 0, - "asset-id": effect_names[0], - "type-name": "GESEffectClip", "track-types": 4}).get("id")) - ids.append(self.assertXgesClip( - ges_el, { - "start": 3, "duration": 9, "inpoint": 0, - "asset-id": effect_names[1], - "type-name": "GESEffectClip", "track-types": 4}).get("id")) - # check that ids are unique - for clip_id in ids: - self.assertIsNotNone(clip_id) - self.assertEqual(ids.count(clip_id), 1) - - def test_markers(self): - marker_list = SCHEMA.GESMarkerList( - _make_ges_marker(23, MarkerColor.RED), - _make_ges_marker(30), - _make_ges_marker( - 77, MarkerColor.BLUE, UTF8_NAME, SCHEMA.GstStructure( - "metadatas", {"Int": ("int", 30)}))) - # Note, the second marker is not colored, so we don't expect a - # corresponding otio marker - marker_list[2].set_color_from_otio_color(MarkerColor.BLUE) - xges_el = XgesElement(marker_list=marker_list) - xges_el.add_audio_track() - xges_el.add_layer() - xges_el.add_clip(1, 1, 0, "GESUriClip", 2) - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, type_tests={ - Track: [OtioTest.no_markers], - Clip: [OtioTest.no_markers], - Gap: [OtioTest.no_markers]}, - base=OtioTestNode( - Stack, tests=[OtioTest.markers({ - "name": "", "color": MarkerColor.RED, - "start": 23, "duration": 0}, { - "name": UTF8_NAME, "color": MarkerColor.BLUE, - "start": 77, "duration": 0})], - children=[ - OtioTestNode(Track, children=[ - OtioTestNode(Gap), - OtioTestNode(Clip) - ]) - ])) - test_tree.test_compare(timeline.tracks) - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesTrackTypes(ges_el, 2) - layer = self.assertXgesNumLayers(ges_el, 1)[0] - self.assertXgesNumClipsInLayer(layer, 1)[0] - self.assertXgesTimelineMarkerListEqual(ges_el, marker_list) - - def _add_test_properties_and_metadatas(self, el): - el.attrib["properties"] = str(SCHEMA.GstStructure( - "properties", { - "field2": ("int", 5), - "field1": ("string", UTF8_NAME)})) - el.attrib["metadatas"] = str(SCHEMA.GstStructure( - "metadatas", { - "field3": ("int", 6), - "field4": ("boolean", True)})) - - def _has_test_properties_and_metadatas(self, el): - self.assertXgesPropertyEqual(el, "field1", "string", UTF8_NAME) - self.assertXgesPropertyEqual(el, "field2", "int", 5) - self.assertXgesMetadataEqual(el, "field3", "int", 6) - self.assertXgesMetadataEqual(el, "field4", "boolean", True) - - def test_clip_properties_and_metadatas(self): - xges_el = XgesElement() - xges_el.add_video_track() - xges_el.add_layer() - clip = xges_el.add_clip(0, 1, 0, "GESUriClip", 4) - self._add_test_properties_and_metadatas(clip) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas( - self.assertXgesClip(ges_el, {})) - - def test_transition_properties_and_metadatas(self): - xges_el = XgesElement() - xges_el.add_video_track() - xges_el.add_layer() - xges_el.add_clip(0, 2, 0, "GESUriClip", 4) - transition = xges_el.add_clip(1, 1, 0, "GESTransitionClip", 4) - self._add_test_properties_and_metadatas(transition) - xges_el.add_clip(1, 2, 0, "GESUriClip", 4) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas(self.assertXgesClip( - ges_el, {"type-name": "GESTransitionClip"})) - - def test_project_properties_and_metadatas(self): - xges_el = XgesElement() - self._add_test_properties_and_metadatas(xges_el.project) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas( - self.assertXgesOneElementAtPath(ges_el, "./project")) - - def test_timeline_properties_and_metadatas(self): - xges_el = XgesElement() - self._add_test_properties_and_metadatas(xges_el.timeline) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas( - self.assertXgesOneElementAtPath( - ges_el, "./project/timeline")) - - def test_layer_properties_and_metadatas(self): - xges_el = XgesElement() - xges_el.add_video_track() - layer = xges_el.add_layer() - self._add_test_properties_and_metadatas(layer) - # NOTE: need a non-empty layer - xges_el.add_clip(0, 2, 0, "GESUriClip", 4) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas( - self.assertXgesNumLayers(ges_el, 1)[0]) - - def test_uri_clip_asset_properties_and_metadatas(self): - xges_el = XgesElement() - xges_el.add_video_track() - xges_el.add_layer() - asset_id = "file:///example-file" - asset = xges_el.add_asset(asset_id, "GESUriClip") - self._add_test_properties_and_metadatas(asset) - xges_el.add_clip(0, 1, 0, "GESUriClip", 4, asset_id) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas( - self.assertXgesAsset(ges_el, asset_id, "GESUriClip")) - - def _subproject_asset_props_and_metas_for_type(self, extract_type): - xges_el = self._make_nested_project() - asset = xges_el.ressources.find( - f"./asset[@extractable-type-name='{extract_type}']") - self.assertIsNotNone(asset) - asset_id = asset.get("id") - self.assertIsNotNone(asset_id) - self._add_test_properties_and_metadatas(asset) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas( - self.assertXgesAsset(ges_el, asset_id, extract_type)) - - def test_subproject_asset_properties_and_metadatas(self): - self._subproject_asset_props_and_metas_for_type("GESUriClip") - self._subproject_asset_props_and_metas_for_type("GESTimeline") - - def test_track_properties_and_metadatas(self): - xges_el = XgesElement() - track = xges_el.add_audio_track() - self._add_test_properties_and_metadatas(track) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self._has_test_properties_and_metadatas( - self.assertXgesOneElementAtPath( - ges_el, "./project/timeline/track")) - - def test_effect_properties_and_metadatas(self): - xges_el = XgesElement() - xges_el.add_video_track() - xges_el.add_layer() - xges_el.add_clip(0, 1, 0, "GESUriClip", 4) - effect = xges_el.add_effect("videobalance", 4, 0) - self._add_test_properties_and_metadatas(effect) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - clip = self.assertXgesClip(ges_el, {}) - self._has_test_properties_and_metadatas( - self.assertXgesNumClipEffects(clip, 1)[0]) - - def test_empty_timeline(self): - xges_el = XgesElement() - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, base=OtioTestNode( - Stack, tests=[OtioTest.none_source])) - test_tree.test_compare(timeline.tracks) - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesNumLayers(ges_el, 0) - - def SKIP_test_empty_layer(self): - # Test will fail since empty layers are lost! - xges_el = XgesElement() - xges_el.add_layer() - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, base=OtioTestNode( - Stack, tests=[OtioTest.none_source], children=[ - OtioTestNode(Track, tests=[OtioTest.none_source])])) - test_tree.test_compare(timeline.tracks) - ges_el = self._get_xges_from_otio_timeline(timeline) - layer_el = self.assertXgesNumLayers(ges_el, 1)[0] - self.assertXgesNumClipsInLayer(layer_el, 0) - - def test_timing(self): - # example input layer is of the form: - # [------] - # [---------------] - # [-----------] [--][--] - # - # 0 1 2 3 4 5 6 7 8 9 10 11 - # time in seconds - # - # where [----] are clips. The first clip has an inpoint of - # 15 seconds, and the second has an inpoint of 25 seconds. The - # rest have an inpoint of 0 - xges_el = XgesElement() - xges_el.add_audio_track() - xges_el.add_layer() - xges_el.add_clip(1, 2, 15, "GESUriClip", 2) - xges_el.add_clip(2, 1, 0, "GESTransitionClip", 2) - xges_el.add_clip(2, 4, 25, "GESUriClip", 2) - xges_el.add_clip(4, 2, 0, "GESTransitionClip", 2) - xges_el.add_clip(4, 3, 0, "GESUriClip", 2) - xges_el.add_clip(9, 1, 0, "GESUriClip", 2) - xges_el.add_clip(10, 1, 0, "GESUriClip", 2) - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, type_tests={ - Stack: [OtioTest.none_source], - Track: [ - OtioTest.none_source, OtioTest.is_audio], - Clip: [OtioTest.has_ex_ref]}, - base=OtioTestNode(Stack, children=[ - OtioTestNode(Track, children=[ - OtioTestNode(Gap, tests=[ - OtioTest.range_in_parent(0, 1)]), - OtioTestNode(Clip, tests=[ - OtioTest.range_in_parent(1, 1.5), - OtioTest.start_time(15)]), - OtioTestNode(Transition, tests=[ - OtioTest.offset_total(1)]), - OtioTestNode(Clip, tests=[ - OtioTest.range_in_parent(2.5, 2.5), - OtioTest.start_time(25.5)]), - OtioTestNode(Transition, tests=[ - OtioTest.offset_total(2)]), - OtioTestNode(Clip, tests=[ - OtioTest.range_in_parent(5, 2)]), - OtioTestNode(Gap, tests=[ - OtioTest.range_in_parent(7, 2)]), - OtioTestNode(Clip, tests=[ - OtioTest.range_in_parent(9, 1)]), - OtioTestNode(Clip, tests=[ - OtioTest.range_in_parent(10, 1)]) - ]) - ])) - test_tree.test_compare(timeline.tracks) - - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesTrackTypes(ges_el, 2) - self.assertXgesNumClips(ges_el, 7) - self.assertXgesClip( - ges_el, { - "start": 1, "duration": 2, "inpoint": 15, - "type-name": "GESUriClip", "track-types": 2}) - self.assertXgesClip( - ges_el, { - "start": 2, "duration": 1, "inpoint": 0, - "type-name": "GESTransitionClip", "track-types": 2}) - self.assertXgesClip( - ges_el, { - "start": 2, "duration": 4, "inpoint": 25, - "type-name": "GESUriClip", "track-types": 2}) - self.assertXgesClip( - ges_el, { - "start": 4, "duration": 2, "inpoint": 0, - "type-name": "GESTransitionClip", "track-types": 2}) - self.assertXgesClip( - ges_el, { - "start": 4, "duration": 3, "inpoint": 0, - "type-name": "GESUriClip", "track-types": 2}) - self.assertXgesClip( - ges_el, { - "start": 9, "duration": 1, "inpoint": 0, - "type-name": "GESUriClip", "track-types": 2}) - self.assertXgesClip( - ges_el, { - "start": 10, "duration": 1, "inpoint": 0, - "type-name": "GESUriClip", "track-types": 2}) - - def _make_nested_project(self): - xges_el = XgesElement() - xges_el.add_video_track() - xges_el.add_audio_track() - xges_el.add_layer() - asset = xges_el.add_asset("file:///example.xges", "GESTimeline") - xges_el.add_clip( - 70, 20, 10, "GESUriClip", 6, "file:///example.xges") - sub_xges_el = XgesElement() - sub_xges_el.add_video_track() - sub_xges_el.add_layer() - sub_xges_el.add_clip(50, 40, 30, "GESUriClip", 6) - asset.append(sub_xges_el.ges) - return xges_el - - def test_nested_projects_and_stacks(self): - xges_el = self._make_nested_project() - timeline = xges_el.get_otio_timeline() - test_tree = OtioTestTree( - self, type_tests={ - Track: [OtioTest.none_source], - Clip: [OtioTest.has_ex_ref]}, - base=OtioTestNode( - Stack, tests=[OtioTest.none_source], children=[ - OtioTestNode( - Track, tests=[OtioTest.is_video], - children=[ - OtioTestNode( - Gap, - tests=[OtioTest.duration(70)]), - OtioTestNode( - Stack, - tests=[OtioTest.range(10, 20)], - children=[ - OtioTestNode( - Track, - tests=[OtioTest.is_video], - children=[ - OtioTestNode(Gap, tests=[ - OtioTest.duration(50)]), - OtioTestNode(Clip, tests=[ - OtioTest.range(30, 40)]) - ]), - OtioTestNode( - Track, - tests=[OtioTest.is_audio], - children=[ - OtioTestNode(Gap, tests=[ - OtioTest.duration(50)]), - OtioTestNode(Clip, tests=[ - OtioTest.range(30, 40)]) - ]) - ]) - ]), - OtioTestNode( - Track, tests=[OtioTest.is_audio], - children=[ - OtioTestNode( - Gap, - tests=[OtioTest.duration(70)]), - OtioTestNode( - Stack, - tests=[OtioTest.range(10, 20)], - children=[ - OtioTestNode( - Track, - tests=[OtioTest.is_video], - children=[ - OtioTestNode(Gap, tests=[ - OtioTest.duration(50)]), - OtioTestNode(Clip, tests=[ - OtioTest.range(30, 40)]) - ]), - OtioTestNode( - Track, - tests=[OtioTest.is_audio], - children=[ - OtioTestNode(Gap, tests=[ - OtioTest.duration(50)]), - OtioTestNode(Clip, tests=[ - OtioTest.range(30, 40)]) - ]) - ]) - ]) - ])) - test_tree.test_compare(timeline.tracks) - self._xges_has_nested_clip(timeline, 70, 20, 10, 6, 50, 40, 30, 6) - - def test_nested_projects_and_stacks_edited(self): - xges_el = self._make_nested_project() - timeline = xges_el.get_otio_timeline() - # Previous test will assert the correct structure - - # Change the gap before the video sub-stack to 30 seconds - timeline.tracks[0][0].source_range = _tm_range_from_secs(0, 30) - - # The sub-project should be the same, but we now have two - # different clips referencing the same sub-project - - # Now have an audio clip, with the new start time - first_top_clip, _ = self._xges_has_nested_clip( - timeline, 30, 20, 10, 4, 50, 40, 30, 6) - # And the video clip, with the old start time - second_top_clip, _ = self._xges_has_nested_clip( - timeline, 70, 20, 10, 2, 50, 40, 30, 6) - # They both reference the same project - first_id = self.assertXgesHasAttr(first_top_clip, "asset-id") - self.assertXgesAttrEqual(second_top_clip, "asset-id", first_id) - - # Restore the timing - timeline.tracks[0][0].source_range = _tm_range_from_secs(0, 70) - # Change the video sub-stack to reference an earlier point - timeline.tracks[0][1].source_range = _tm_range_from_secs(0, 10) - - # The sub-project should be the same, but we now have two - # different clips referencing the same sub-project - - # Now have a video clip, with the new duration and inpoint - first_top_clip, _ = self._xges_has_nested_clip( - timeline, 70, 10, 0, 4, 50, 40, 30, 6) - # And an audio clip, with the old start time - second_top_clip, _ = self._xges_has_nested_clip( - timeline, 70, 20, 10, 2, 50, 40, 30, 6) - # They both reference the same project - first_id = self.assertXgesHasAttr(first_top_clip, "asset-id") - self.assertXgesAttrEqual(second_top_clip, "asset-id", first_id) - - # Restore the timing - timeline.tracks[0][1].source_range = _tm_range_from_secs(10, 20) - # Change the content of the video sub-stack by reducing the gap - timeline.tracks[0][1][0][0].source_range = _tm_range_from_secs(0, 20) - timeline.tracks[0][1][1][0].source_range = _tm_range_from_secs(0, 20) - - # The sub-project should now be different, so we should have two - # separate assets - first_top_clip, _ = self._xges_has_nested_clip( - timeline, 70, 20, 10, 4, 20, 40, 30, 6) - second_top_clip, _ = self._xges_has_nested_clip( - timeline, 70, 20, 10, 2, 50, 40, 30, 6) - # They now reference different projects - first_id = self.assertXgesHasAttr(first_top_clip, "asset-id") - second_id = self.assertXgesHasAttr(second_top_clip, "asset-id") - self.assertNotEqual(first_id, second_id) - - # Restore the stack's timing - timeline.tracks[0][1][0][0].source_range = _tm_range_from_secs(0, 50) - timeline.tracks[0][1][1][0].source_range = _tm_range_from_secs(0, 50) - # Change the content of the video sub-stack by referencing - # different times for its clip - timeline.tracks[0][1][0][1].source_range = _tm_range_from_secs(10, 60) - timeline.tracks[0][1][1][1].source_range = _tm_range_from_secs(10, 60) - - # The sub-project should now be different, so we should have two - # separate assets - first_top_clip, _ = self._xges_has_nested_clip( - timeline, 70, 20, 10, 4, 50, 60, 10, 6) - second_top_clip, _ = self._xges_has_nested_clip( - timeline, 70, 20, 10, 2, 50, 40, 30, 6) - # They now reference different projects - first_id = self.assertXgesHasAttr(first_top_clip, "asset-id") - second_id = self.assertXgesHasAttr(second_top_clip, "asset-id") - self.assertNotEqual(first_id, second_id) - - def _xges_has_nested_clip( - self, timeline, - top_start, top_duration, top_inpoint, top_track_types, - orig_start, orig_duration, orig_inpoint, orig_track_types, - effect_names=None): - """Returns the top clip and nested clip""" - if effect_names is None: - effect_names = [] - - if effect_names and str is not bytes: - # TODO: remove the str is not bytes check once python2 has - # ended. Python2 does not have assertWarns - # TODO: warning is for the fact that we do not yet have a - # smart way to convert effect names into bin-descriptions - # Should be removed once this is sorted - with self.assertWarns(UserWarning): - ges_el = self._get_xges_from_otio_timeline(timeline) - else: - ges_el = self._get_xges_from_otio_timeline(timeline) - if orig_track_types == 6: - self.assertXgesTrackTypes(ges_el, 2, 4) - else: - self.assertXgesTrackTypes(ges_el, top_track_types) - top_clip = self.assertXgesClip( - ges_el, { - "start": top_start, "duration": top_duration, - "inpoint": top_inpoint, "type-name": "GESUriClip", - "track-types": top_track_types}) - effects = self.assertXgesNumClipEffects( - top_clip, len(effect_names)) - for effect, name in zip(effects, effect_names): - self.assertXgesAttrEqual(effect, "asset-id", name) - - ges_el = self.assertXgesClipIsSubproject(ges_el, top_clip) - self.assertXgesNumClips(ges_el, 1) - orig_clip = self.assertXgesClip( - ges_el, { - "start": orig_start, "duration": orig_duration, - "inpoint": orig_inpoint, "type-name": "GESUriClip", - "track-types": orig_track_types}) - self.assertXgesNumClipEffects(orig_clip, 0) - self.assertXgesClipHasAsset(ges_el, orig_clip) - return top_clip, orig_clip - - def test_effect_stack(self): - timeline = Timeline() - effect_names = ["agingtv", "videobalance"] - for name in effect_names: - timeline.tracks.effects.append(Effect(effect_name=name)) - track = Track() - track.kind = TrackKind.Video - timeline.tracks.append(track) - track.append(_make_clip(start=20, duration=50)) - self._xges_has_nested_clip( - timeline, 0, 50, 0, 4, 0, 50, 20, 4, effect_names) - - def test_source_range_stack(self): - timeline = Timeline() - track = Track() - track.kind = TrackKind.Video - timeline.tracks.append(track) - track.append(_make_clip(start=20, duration=50)) - timeline.tracks.source_range = _tm_range_from_secs(10, 30) - self._xges_has_nested_clip(timeline, 0, 30, 10, 4, 0, 50, 20, 4) - - def test_source_range_track(self): - timeline = Timeline() - track = Track() - track.kind = TrackKind.Video - timeline.tracks.append(track) - track.append(_make_clip(start=20, duration=50)) - track.source_range = _tm_range_from_secs(10, 30) - self._xges_has_nested_clip(timeline, 0, 30, 10, 4, 0, 50, 20, 4) - - def test_double_track(self): - timeline = Timeline() - track1 = Track() - track1.kind = TrackKind.Video - timeline.tracks.append(track1) - track2 = Track() - track2.kind = TrackKind.Video - track1.append(_make_clip(start=40, duration=90)) - track1.append(track2) - track2.append(_make_clip(start=20, duration=50)) - self._xges_has_nested_clip(timeline, 90, 50, 0, 4, 0, 50, 20, 4) - - def test_double_stack(self): - timeline = Timeline() - stack = Stack() - stack.source_range = _tm_range_from_secs(10, 30) - track = Track() - track.kind = TrackKind.Video - track.append(_make_clip(start=20, duration=50)) - stack.append(track) - track = Track() - track.kind = TrackKind.Video - track.append(_make_clip()) - timeline.tracks.append(track) - timeline.tracks.append(stack) - self._xges_has_nested_clip(timeline, 0, 30, 10, 4, 0, 50, 20, 4) - - def test_track_merge(self): - timeline = Timeline() - for kind in [ - TrackKind.Audio, - TrackKind.Video]: - track = Track() - track.kind = kind - track.metadata["example-non-xges"] = str(kind) - track.metadata["XGES"] = { - "data": SCHEMA.GstStructure.new_from_str( - "name, key1=(string)hello, key2=(int)9;")} - track.append(_make_clip(start=2, duration=5)) - timeline.tracks.append(track) - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesClip( - ges_el, { - "start": 0, "duration": 5, "inpoint": 2, - "type-name": "GESUriClip", "track-types": 6}) - - # make tracks have different XGES metadata - for track in timeline.tracks: - track.metadata["XGES"]["data"].set( - "key1", "string", str(track.kind)) - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesClip( - ges_el, { - "start": 0, "duration": 5, "inpoint": 2, - "type-name": "GESUriClip", "track-types": 2}) - self.assertXgesClip( - ges_el, { - "start": 0, "duration": 5, "inpoint": 2, - "type-name": "GESUriClip", "track-types": 4}) - - def test_markers_from_otio(self): - timeline = Timeline() - _add_marker(timeline.tracks, "top marker", MarkerColor.PINK, 1, 0) - _add_marker(timeline.tracks, "", MarkerColor.ORANGE, 5, 3) - # duplicates are to be ignored - _add_marker(timeline.tracks, "top marker", MarkerColor.PINK, 1, 0) - _add_marker(timeline.tracks, "", MarkerColor.ORANGE, 5, 3) - track = Track() - timeline.tracks.append(track) - _add_marker(track, "track marker", MarkerColor.PURPLE, 2, 2) - _add_marker(track, "", MarkerColor.BLACK, 2, 0) - clip = _make_clip(duration=4) - track.append(clip) - _add_marker(clip, "clip1", MarkerColor.YELLOW, 1, 0) - gap = Gap(source_range=_tm_range_from_secs(0, 2)) - track.append(gap) - _add_marker(gap, "gap", MarkerColor.WHITE, 1, 0) - clip = _make_clip(duration=5) - track.append(clip) - _add_marker(clip, "clip2", MarkerColor.ORANGE, 2, 0) - _add_marker(clip, "", MarkerColor.GREEN, 1, 2) - - stack = Stack() - track.append(stack) - _add_marker(stack, "sub-stack", MarkerColor.RED, 1, 0) - track = Track() - stack.append(track) - _add_marker(track, "sub-track", MarkerColor.BLUE, 2, 0) - track.append(_make_clip(duration=3)) - clip = _make_clip(duration=2) - track.append(clip) - _add_marker(clip, "sub-clip", MarkerColor.MAGENTA, 1, 1) - - ges_el = self._get_xges_from_otio_timeline(timeline) - layer = self.assertXgesNumLayers(ges_el, 1)[0] - clips = self.assertXgesNumClipsInLayer(layer, 3) - self.assertXgesTimelineMarkerListEqual( - ges_el, SCHEMA.GESMarkerList( - _make_ges_marker(1, MarkerColor.PINK, "top marker"), - _make_ges_marker(5, MarkerColor.ORANGE), - _make_ges_marker(8, MarkerColor.ORANGE), - # 8 is the end of the marker range - _make_ges_marker(2, MarkerColor.PURPLE, "track marker"), - _make_ges_marker(4, MarkerColor.PURPLE, "track marker"), - _make_ges_marker(2, MarkerColor.BLACK), - _make_ges_marker(1, MarkerColor.YELLOW, "clip1"), - _make_ges_marker(5, MarkerColor.WHITE, "gap"), - # 5 = 4 + 1, since we want the position relative to the - # timeline, rather than the gap - _make_ges_marker(8, MarkerColor.ORANGE, "clip2"), - # Note, this matches the color and position of another - # marker, but we want both since this has a different - # comment - _make_ges_marker(7, MarkerColor.GREEN), - _make_ges_marker(9, MarkerColor.GREEN))) - - sub_ges_el = self.assertXgesClipIsSubproject(ges_el, clips[2]) - layer = self.assertXgesNumLayers(sub_ges_el, 1)[0] - clips = self.assertXgesNumClipsInLayer(layer, 2) - self.assertXgesTimelineMarkerListEqual( - sub_ges_el, SCHEMA.GESMarkerList( - _make_ges_marker(1, MarkerColor.RED, "sub-stack"), - _make_ges_marker(2, MarkerColor.BLUE, "sub-track"), - _make_ges_marker(4, MarkerColor.MAGENTA, "sub-clip"), - _make_ges_marker(5, MarkerColor.MAGENTA, "sub-clip"))) - - def test_timeline_is_unchanged(self): - timeline = Timeline(name="example") - timeline.tracks.source_range = _tm_range_from_secs(4, 5) - track = Track("Track", source_range=_tm_range_from_secs(2, 3)) - track.metadata["key"] = 5 - track.append(_make_clip()) - timeline.tracks.append(track) - - before = timeline.deepcopy() - otio.adapters.write_to_string(timeline, "xges") - self.assertIsOTIOEquivalentTo(before, timeline) - - def test_XgesTrack_usage(self): - xges_el = XgesElement() - xges_el.add_layer() - xges_el.add_clip(0, 1, 0, "GESUriClip", 4) - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesTrackTypes(ges_el) # assert no tracks! - - props_before = xges_el.add_video_track().get("properties") - timeline = xges_el.get_otio_timeline() - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertXgesTrackTypes(ges_el, 4) - track = self.assertXgesOneElementAtPath( - ges_el, "./project/timeline/track") - self.assertXgesStructureEqual(track, "properties", props_before) - - def test_XgesTrack_from_kind(self): - vid = SCHEMA.XgesTrack.\ - new_from_otio_track_kind(TrackKind.Video) - self.assertEqual(vid.track_type, 4) - aud = SCHEMA.XgesTrack.\ - new_from_otio_track_kind(TrackKind.Audio) - self.assertEqual(aud.track_type, 2) - - def test_XgesTrack_equality(self): - vid1 = SCHEMA.XgesTrack.\ - new_from_otio_track_kind(TrackKind.Video) - vid2 = SCHEMA.XgesTrack.\ - new_from_otio_track_kind(TrackKind.Video) - aud = SCHEMA.XgesTrack.\ - new_from_otio_track_kind(TrackKind.Audio) - self.assertTrue(vid1.is_equivalent_to(vid2)) - self.assertFalse(vid1.is_equivalent_to(aud)) - - def test_GstCaps_parsing(self): - caps = SCHEMA.GstCaps.new_from_str("ANY") - self.assertTrue(caps.is_any()) - self.assertEqual(len(caps), 0) - caps = SCHEMA.GstCaps.new_from_str( - "First( memory:SystemMemory, other:az09AZ) , " - "field1 = ( int ) 5 ,field2=(string){};" - "Second, fieldA=(fraction)3/67, fieldB=(boolean)true; " - "Third(ANY), fieldX=(int)-2".format( - SCHEMA.GstStructure.serialize_string(UTF8_NAME))) - self.assertFalse(caps.is_any()) - self.assertEqual(len(caps), 3) - struct = caps[0] - features = caps.get_features(0) - self.assertEqual(features.is_any, False) - self.assertEqual(len(features), 2) - self.assertEqual(features[0], "memory:SystemMemory") - self.assertEqual(features[1], "other:az09AZ") - self.assertEqual(struct.name, "First") - self.assertEqual(struct["field1"], 5) - self.assertEqual(struct["field2"], UTF8_NAME) - struct = caps[1] - features = caps.get_features(1) - self.assertEqual(features.is_any, False) - self.assertEqual(len(features), 0) - self.assertEqual(struct.name, "Second") - self.assertEqual(struct["fieldA"], "3/67") - self.assertEqual(struct["fieldB"], True) - struct = caps[2] - features = caps.get_features(2) - self.assertEqual(features.is_any, True) - self.assertEqual(len(features), 0) - self.assertEqual(struct.name, "Third") - self.assertEqual(struct["fieldX"], -2) - - def test_GstCaps_to_str(self): - caps_list = [ - {"caps": SCHEMA.GstCaps.new_any(), "str": "ANY"}, - { - "caps": SCHEMA.GstCaps( - SCHEMA.GstStructure("video/x-raw"), - SCHEMA.GstCapsFeatures.new_any()), - "str": "video/x-raw(ANY)"}, - { - "caps": SCHEMA.GstCaps( - SCHEMA.GstStructure( - "First", {"field1": ("string", UTF8_NAME)}), - SCHEMA.GstCapsFeatures( - "memory:SystemMemory", "other:az09AZ"), - SCHEMA.GstStructure( - "Second", {"fieldA": ("boolean", True)}), - None, - SCHEMA.GstStructure("Third", {"fieldX": ("int", -2)}), - SCHEMA.GstCapsFeatures.new_any()), - "str": - "First(memory:SystemMemory, other:az09AZ), " - "field1=(string){}; " - "Second, fieldA=(boolean)true; " - "Third(ANY), fieldX=(int)-2".format( - SCHEMA.GstStructure.serialize_string(UTF8_NAME))}] - for caps in caps_list: - string = str(caps["caps"]) - self.assertEqual(string, caps["str"]) - self.assertTrue(caps["caps"].is_equivalent_to( - SCHEMA.GstCaps.new_from_str(string))) - - def test_empty_GstCaps(self): - caps = SCHEMA.GstCaps() - self.assertEqual(len(caps), 0) - self.assertFalse(caps.is_any()) - self.assertEqual(str(caps), "EMPTY") - caps = SCHEMA.GstCaps.new_from_str("") - self.assertEqual(len(caps), 0) - self.assertFalse(caps.is_any()) - caps = SCHEMA.GstCaps.new_from_str("EMPTY") - self.assertEqual(len(caps), 0) - - def test_GstCapsFeatures_parsing(self): - features = SCHEMA.GstCapsFeatures.new_from_str("ANY") - self.assertEqual(features.is_any, True) - self.assertEqual(len(features), 0) - features = SCHEMA.GstCapsFeatures.new_from_str( - " memory:SystemMemory, other:az09AZ") - self.assertEqual(features.is_any, False) - self.assertEqual(len(features), 2) - self.assertEqual(features[0], "memory:SystemMemory") - self.assertEqual(features[1], "other:az09AZ") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstCapsFeatures.new_from_str("ANY ") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstCapsFeatures.new_from_str("memory") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstCapsFeatures.new_from_str("memory:") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstCapsFeatures.new_from_str("memory:0") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstCapsFeatures.new_from_str("mem0:a") - - def test_GESMarker_colors(self): - marker = SCHEMA.GESMarker(20) - self.assertEqual(marker.position, 20) - self.assertFalse(marker.is_colored()) - argb = 0x850fe409 - marker.set_color_from_argb(argb) - self.assertTrue(marker.is_colored()) - self.assertEqual(marker.get_argb_color(), argb) - marker = SCHEMA.GESMarker(20) - with self.assertRaises(otio.exceptions.OTIOError): - marker.set_color_from_argb(-1) - with self.assertRaises(otio.exceptions.OTIOError): - # too big - marker.set_color_from_argb(0xffffffff + 1) - - def test_GESMarker_color_to_otio_color(self): - marker = SCHEMA.GESMarker(20) - for otio_color in [col for col in dir(MarkerColor) - if col.isupper()]: - # should catch if otio adds a new color - marker.set_color_from_otio_color(otio_color) - self.assertTrue(marker.is_colored()) - nearest_otio = marker.get_nearest_otio_color() - self.assertEqual(otio_color, nearest_otio) - - def test_GESMarkerList_ordering(self): - marker_list = SCHEMA.GESMarkerList() - marker_list.add(SCHEMA.GESMarker(224)) - marker_list.add(SCHEMA.GESMarker(226)) - marker_list.add(SCHEMA.GESMarker(223)) - marker_list.add(SCHEMA.GESMarker(224)) - marker_list.add(SCHEMA.GESMarker(225)) - self.assertEqual(len(marker_list), 5) - self.assertEqual(marker_list[0].position, 223) - self.assertEqual(marker_list[1].position, 224) - self.assertEqual(marker_list[2].position, 224) - self.assertEqual(marker_list[3].position, 225) - self.assertEqual(marker_list[4].position, 226) - - def test_GstCapsFeatures_to_str(self): - features = SCHEMA.GstCapsFeatures.new_any() - string = str(features) - self.assertEqual(string, "ANY") - self.assertTrue(features.is_equivalent_to( - SCHEMA.GstCapsFeatures.new_from_str(string))) - features = SCHEMA.GstCapsFeatures( - "memory:SystemMemory", "other:az09AZ") - string = str(features) - self.assertEqual( - string, "memory:SystemMemory, other:az09AZ") - self.assertTrue(features.is_equivalent_to( - SCHEMA.GstCapsFeatures.new_from_str(string))) - - def test_serialize_string(self): - serialize = SCHEMA.GstStructure.serialize_string(UTF8_NAME) - deserialize = SCHEMA.GstStructure.deserialize_string(serialize) - self.assertEqual(deserialize, UTF8_NAME) - - def test_GstStructure_parsing(self): - struct = SCHEMA.GstStructure.new_from_str( - " properties , String-1 = ( string ) test , " - "String-2=(string)\"test\", String-3= ( string) {} , " - "Int =(int) -5 , Uint =(uint) 5 , Float-1=(float)0.5, " - "Float-2= (float ) 2, Boolean-1 =(boolean ) true, " - "Boolean-2=(boolean)No, Boolean-3=( boolean) 0 , " - "Fraction=(fraction) 2/5, Structure = (structure) " - "\"Name\\,\\ val\\=\\(string\\)\\\"test\\\\\\ test\\\"\\;\", " - "Caps =(GstCaps)\"Struct1\\(memory:SystemMemory\\)\\,\\ " - "val\\=\\(string\\)\\\"test\\\\\\ test\\\"\"," - "markers=(GESMarkerList)\"marker-times, position=(guint64)" - "2748; metadatas, val=(string)\\\"test\\\\ test\\\"; " - "marker-times, position=(guint64)1032; " - "metadatas, val=(int)-5\";" - "hidden!!!".format( - SCHEMA.GstStructure.serialize_string(UTF8_NAME)) - ) - self.assertEqual(struct.name, "properties") - self.assertEqual(struct["String-1"], "test") - self.assertEqual(struct["String-2"], "test") - self.assertEqual(struct["String-3"], UTF8_NAME) - self.assertEqual(struct["Int"], -5) - self.assertEqual(struct["Uint"], 5) - self.assertEqual(struct["Float-1"], 0.5) - self.assertEqual(struct["Float-2"], 2.0) - self.assertEqual(struct["Boolean-1"], True) - self.assertEqual(struct["Boolean-2"], False) - self.assertEqual(struct["Boolean-3"], False) - self.assertEqual(struct["Fraction"], "2/5") - self.assertTrue(struct["Structure"].is_equivalent_to( - SCHEMA.GstStructure( - "Name", {"val": ("string", "test test")}))) - self.assertTrue(struct["Caps"].is_equivalent_to( - SCHEMA.GstCaps( - SCHEMA.GstStructure( - "Struct1", {"val": ("string", "test test")}), - SCHEMA.GstCapsFeatures("memory:SystemMemory")))) - self.assertTrue(struct["markers"].is_equivalent_to( - SCHEMA.GESMarkerList( - SCHEMA.GESMarker(1032, SCHEMA.GstStructure( - "metadatas", {"val": ("int", -5)})), - SCHEMA.GESMarker(2748, SCHEMA.GstStructure( - "metadatas", {"val": ("string", "test test")}))))) - - def test_GstStructure_to_str_and_back(self): - # TODO: remove once python2 has ended - # Python2 does not have assertWarns - if str is bytes: - return - with self.assertWarns(UserWarning): - struct_before = SCHEMA.GstStructure( - "Struct:/Name0a", { - "str-ing": ("string", UTF8_NAME), - "i/nt": ("int", 67), - "f.lo+t": ("float", -0.78), - "frac_tion": ("fraction", "4/67"), - "my-type": ("mytype", "test"), - "a_list": ("list", "{ 0, 2, 1 }"), - "stru-cture": ("structure", SCHEMA.GstStructure( - "Name", {"val": ("string", UTF8_NAME)})), - "ca/ps": ("GstCaps", SCHEMA.GstCaps( - SCHEMA.GstStructure( - "Struct1", {"val": ("string", UTF8_NAME)}), - SCHEMA.GstCapsFeatures("memory:SystemMemory"))), - "markers+": ("GESMarkerList", SCHEMA.GESMarkerList( - SCHEMA.GESMarker( - 2039, SCHEMA.GstStructure( - "metadatas", - {"val": ("string", UTF8_NAME)})), - SCHEMA.GESMarker( - 209389023, SCHEMA.GstStructure( - "metadatas", - {"val": ("float", -0.96)})))) - }) - with self.assertWarns(UserWarning): - struct_after = SCHEMA.GstStructure.new_from_str( - str(struct_before)) - self.assertTrue(struct_before.is_equivalent_to(struct_after)) - - def test_GstStructure_dictionary_def(self): - struct = SCHEMA.GstStructure( - "properties", { - "String-1": ("string", "test"), - "String-2": ("string", "test space"), - "Int": ("int", -5), - "Uint": ("uint", 5), - "Float": ("float", 2.0), - "Boolean": ("boolean", True), - "Fraction": ("fraction", "2/5"), - "Structure": ("structure", SCHEMA.GstStructure( - "Name", {"val": ("string", "test space")})), - "Caps": ("GstCaps", SCHEMA.GstCaps( - SCHEMA.GstStructure( - "Struct1", - {"val": ("string", "test space")}), - SCHEMA.GstCapsFeatures("memory:SystemMemory"))), - "Markers": ("GESMarkerList", SCHEMA.GESMarkerList( - SCHEMA.GESMarker( - 2039, SCHEMA.GstStructure( - "metadatas", - {"val": ("string", "test space")})), - SCHEMA.GESMarker( - 209389023, SCHEMA.GstStructure( - "metadatas", - {"val": ("float", -0.96)})))) - } - ) - self.assertEqual(struct.name, "properties") - write = str(struct) - self.assertIn("String-1=(string)test", write) - self.assertIn("String-2=(string)\"test\\ space\"", write) - self.assertIn("Int=(int)-5", write) - self.assertIn("Uint=(uint)5", write) - self.assertIn("Float=(float)2.0", write) - self.assertIn("Boolean=(boolean)true", write) - self.assertIn("Fraction=(fraction)2/5", write) - self.assertIn( - "Structure=(structure)\"Name\\,\\ " - "val\\=\\(string\\)\\\"test\\\\\\ space\\\"\\;\"", - write) - self.assertIn( - "Caps=(GstCaps)\"Struct1\\(memory:SystemMemory\\)\\,\\ " - "val\\=\\(string\\)\\\"test\\\\\\ space\\\"\"", - write) - self.assertIn( - "Markers=(GESMarkerList)\"marker-times, position=(guint64)" - "2039; metadatas, val=(string)\\\"test\\\\ space\\\"; " - "marker-times, position=(guint64)209389023; " - "metadatas, val=(float)-0.96\"", - write) - - def test_GstStructure_equality(self): - struct1 = SCHEMA.GstStructure.new_from_str( - "name, prop1=(string)4, prop2=(int)4;") - struct2 = SCHEMA.GstStructure.new_from_str( - "name, prop2=(int)4, prop1=(string)4;") - struct3 = SCHEMA.GstStructure.new_from_str( - "name, prop1=(str)4, prop2=(gint)4;") - struct4 = SCHEMA.GstStructure.new_from_str( - "name-alt, prop1=(string)4, prop2=(int)4;") - struct5 = SCHEMA.GstStructure.new_from_str( - "name, prop1=(string)4, prop3=(int)4;") - struct6 = SCHEMA.GstStructure.new_from_str( - "name, prop1=(int)4, prop2=(int)4;") - struct7 = SCHEMA.GstStructure.new_from_str( - "name, prop1=(string)4, prop2=(int)5;") - struct8 = SCHEMA.GstStructure.new_from_str( - "name, prop1=(string)4, prop2=(int)4, prop3=(bool)true;") - struct9 = SCHEMA.GstStructure.new_from_str( - "name, prop1=(string)4;") - self.assertTrue(struct1.is_equivalent_to(struct2)) - self.assertTrue(struct1.is_equivalent_to(struct3)) - self.assertFalse(struct1.is_equivalent_to(struct4)) - self.assertFalse(struct1.is_equivalent_to(struct5)) - self.assertFalse(struct1.is_equivalent_to(struct6)) - self.assertFalse(struct1.is_equivalent_to(struct7)) - self.assertFalse(struct1.is_equivalent_to(struct8)) - self.assertFalse(struct1.is_equivalent_to(struct9)) - - def test_GstStructure_editing_string(self): - struct = SCHEMA.GstStructure.new_from_str( - 'properties, name=(string)before;') - self.assertEqual(struct["name"], "before") - struct.set("name", "string", "after") - self.assertEqual(struct["name"], "after") - self.assertEqual(str(struct), 'properties, name=(string)after;') - - def test_GstStructure_empty_string(self): - struct = SCHEMA.GstStructure.new_from_str( - 'properties, name=(string)"";') - self.assertEqual(struct["name"], "") - - def test_GstStructure_NULL_string(self): - struct = SCHEMA.GstStructure.new_from_str( - 'properties, name=(string)NULL;') - self.assertEqual(struct["name"], None) - struct = SCHEMA.GstStructure.new_from_str("properties") - struct.set("name", "string", None) - self.assertEqual(str(struct), 'properties, name=(string)NULL;') - struct = SCHEMA.GstStructure.new_from_str( - 'properties, name=(string)\"NULL\";') - self.assertEqual(struct["name"], "NULL") - self.assertEqual(str(struct), 'properties, name=(string)\"NULL\";') - - def test_GstStructure_fraction(self): - struct = SCHEMA.GstStructure.new_from_str( - 'properties, framerate=(fraction)2/5;') - self.assertEqual(struct["framerate"], "2/5") - struct.set("framerate", "fraction", Fraction("3/5")) - self.assertEqual(struct["framerate"], "3/5") - struct.set("framerate", "fraction", "4/5") - self.assertEqual(struct["framerate"], "4/5") - - def test_GstStructure_type_aliases(self): - struct = SCHEMA.GstStructure.new_from_str( - "properties,String-1=(str)test,String-2=(s)\"test\"," - "Int-1=(i)-5,Int-2=(gint)-5,Uint-1=(u)5,Uint-2=(guint)5," - "Float-1=(f)0.5,Float-2=(gfloat)0.5,Double-1=(d)0.7," - "Double-2=(gdouble)0.7,Boolean-1=(bool)true," - "Boolean-2=(b)true,Boolean-3=(gboolean)true," - "Fraction=(GstFraction)2/5," - "Structure=(GstStructure)\"name\\;\"") - self.assertEqual(struct.name, "properties") - self.assertEqual(struct["String-1"], "test") - self.assertEqual(struct["String-2"], "test") - self.assertEqual(struct["Int-1"], -5) - self.assertEqual(struct["Int-2"], -5) - self.assertEqual(struct["Uint-1"], 5) - self.assertEqual(struct["Uint-2"], 5) - self.assertEqual(struct["Float-1"], 0.5) - self.assertEqual(struct["Float-2"], 0.5) - self.assertEqual(struct["Double-1"], 0.7) - self.assertEqual(struct["Double-2"], 0.7) - self.assertEqual(struct["Boolean-1"], True) - self.assertEqual(struct["Boolean-2"], True) - self.assertEqual(struct["Boolean-3"], True) - self.assertEqual(struct["Fraction"], "2/5") - self.assertTrue(struct["Structure"].is_equivalent_to( - SCHEMA.GstStructure("name"))) - struct = SCHEMA.GstStructure("properties") - struct.set("prop", "s", "test test") - self.assertEqual(struct["prop"], "test test") - self.assertEqual(struct.get_type_name("prop"), "string") - struct.set("prop", "str", "test test") - self.assertEqual(struct["prop"], "test test") - self.assertEqual(struct.get_type_name("prop"), "string") - struct.set("prop", "i", -5) - self.assertEqual(struct["prop"], -5) - self.assertEqual(struct.get_type_name("prop"), "int") - struct.set("prop", "gint", -5) - self.assertEqual(struct["prop"], -5) - self.assertEqual(struct.get_type_name("prop"), "int") - struct.set("prop", "u", 5) - self.assertEqual(struct["prop"], 5) - self.assertEqual(struct.get_type_name("prop"), "uint") - struct.set("prop", "guint", 5) - self.assertEqual(struct["prop"], 5) - self.assertEqual(struct.get_type_name("prop"), "uint") - struct.set("prop", "f", 0.5) - self.assertEqual(struct["prop"], 0.5) - self.assertEqual(struct.get_type_name("prop"), "float") - struct.set("prop", "gfloat", 0.5) - self.assertEqual(struct["prop"], 0.5) - self.assertEqual(struct.get_type_name("prop"), "float") - struct.set("prop", "d", 0.7) - self.assertEqual(struct["prop"], 0.7) - self.assertEqual(struct.get_type_name("prop"), "double") - struct.set("prop", "gdouble", 0.7) - self.assertEqual(struct["prop"], 0.7) - self.assertEqual(struct.get_type_name("prop"), "double") - struct.set("prop", "b", True) - self.assertEqual(struct["prop"], True) - self.assertEqual(struct.get_type_name("prop"), "boolean") - struct.set("prop", "bool", True) - self.assertEqual(struct["prop"], True) - self.assertEqual(struct.get_type_name("prop"), "boolean") - struct.set("prop", "gboolean", True) - self.assertEqual(struct["prop"], True) - self.assertEqual(struct.get_type_name("prop"), "boolean") - struct.set("prop", "GstFraction", Fraction("2/5")) - self.assertEqual(struct["prop"], "2/5") - self.assertEqual(struct.get_type_name("prop"), "fraction") - struct.set("prop", "GstStructure", SCHEMA.GstStructure("name")) - self.assertTrue(struct["prop"].is_equivalent_to( - SCHEMA.GstStructure("name"))) - self.assertEqual(struct.get_type_name("prop"), "structure") - - def test_GstStructure_values_list(self): - structs = [ - SCHEMA.GstStructure.new_from_str( - "name, String1=(string)\"\", Int1=(int)0, " - "Float1=(float)0.1, Int2=(i)5, Float2=(f)0.2, " - "String2=(s)NULL, String3=(string)test"), - SCHEMA.GstStructure("name", { - "String1": ("string", ""), "Int1": ("int", 0), - "Float1": ("float", 0.1), "Int2": ("i", 5), - "Float2": ("f", 0.2), "String2": ("s", None), - "String3": ("string", "test")})] - - # TODO: remove once python2 has ended - # Python2 does not have assertCountEqual - def assertCountEqual(x, y): - if str is bytes: - self.assertEqual(sorted(x), sorted(y)) - else: - self.assertCountEqual(x, y) - - for struct in structs: - assertCountEqual( - struct.values(), ["", 0, 0.1, 5, 0.2, None, "test"]) - assertCountEqual( - struct.values_of_type("string"), ["", None, "test"]) - assertCountEqual( - struct.values_of_type("s"), ["", None, "test"]) - assertCountEqual( - struct.values_of_type("int"), [0, 5]) - assertCountEqual( - struct.values_of_type("i"), [0, 5]) - assertCountEqual( - struct.values_of_type("float"), [0.1, 0.2]) - assertCountEqual( - struct.values_of_type("f"), [0.1, 0.2]) - assertCountEqual( - struct.values_of_type("double"), []) - - def test_GstStructure_getting(self): - structs = [ - SCHEMA.GstStructure.new_from_str( - "name, String=(string)test, Int=(int)5;"), - SCHEMA.GstStructure("name", { - "String": ("string", "test"), "Int": ("int", 5)})] - for struct in structs: - self.assertEqual(struct.get("Strin"), None) - self.assertEqual(struct.get("Strin", "default"), "default") - self.assertEqual( - struct.get_typed("Strin", "string", "default"), "default") - self.assertEqual(struct.get("String"), "test") - self.assertEqual(struct.get_typed("String", "string"), "test") - self.assertEqual(struct.get_typed("String", "s"), "test") - self.assertEqual(struct.get("Int"), 5) - self.assertEqual(struct.get_typed("Int", "int"), 5) - self.assertEqual(struct.get_typed("Int", "i"), 5) - # TODO: remove once python2 has ended - # Python2 does not have assertWarns - if str is bytes: - continue - with self.assertWarns(UserWarning): - self.assertEqual( - struct.get_typed("String", "int", 23), 23) - with self.assertWarns(UserWarning): - self.assertEqual( - struct.get_typed("Int", "string", "def"), "def") - - def test_GstStructure_invalid_parse(self): - # invalid names: - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str("0name, prop=(int)4;") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str( - f"{UTF8_NAME}, prop=(int)4;") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure("0name", {"prop": ("int", 4)}) - # invalid fieldnames: - struct = SCHEMA.GstStructure.new_from_str("name") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str("name, prop erty=(int)4;") - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop erty", "int", 4) - with self.assertRaises(otio.exceptions.OTIOError): - # the following would cause problems with serializing - # followed by de-serializing, since it would create two - # different fields! - struct.set("prop=(int)4, other=", "string", "test") - # invalid type names - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str("name, prop=(my type)4;") - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "int ", 4) - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", " int", 4) - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "my type", 4) - # invalid serialized values - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str("name, prop=(int)4.5") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str("name, prop=(float)7.0s") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str('name, prop=(string);') - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str( - "name, prop=(boolean)yesyes;") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str( - "name, prop=(fraction)1/2.0;") - with self.assertRaises(otio.exceptions.OTIOError): - # no comma in list - SCHEMA.GstStructure.new_from_str( - "name, prop=(list){ 5, 6 7 };") - with self.assertRaises(otio.exceptions.OTIOError): - SCHEMA.GstStructure.new_from_str( - "name, prop=(list){ 5, 6, 7;") - # invalid setting values - with self.assertRaises(TypeError): - struct.set("prop", "int", 4.5) - with self.assertRaises(TypeError): - struct.set("prop", "float", "4.5") - with self.assertRaises(TypeError): - struct.set("prop", "string", 4) - with self.assertRaises(TypeError): - struct.set("prop", "boolean", 0) - with self.assertRaises(TypeError): - struct.set("prop", "fraction", 1) - with self.assertRaises(TypeError): - struct.set("prop", "mytype", 4) - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "mytype", "test ") - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "mytype", "&") - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "mytype", "(int)4") - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "mytype", "4, other_prop=(string)insert") - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "mytype", "4;") # would hide rest! - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "list", "{ 5, 6 7 }") # no comma - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "list", "{ {5}, { 6 7} }") # no comma - - def test_GstStructure_unknown_type(self): - # TODO: remove once python2 has ended - # Python2 does not have assertWarns - if str is bytes: - return - struct = SCHEMA.GstStructure("properties") - with self.assertRaises(otio.exceptions.OTIOError): - struct.set( - "prop", "MyType", "test, other_field=(string)insert") - # would cause errors when trying to reserialize! - with self.assertRaises(otio.exceptions.OTIOError): - struct.set("prop", "MyType ", "test ") - # don't want trailing whitespaces - with self.assertWarns(UserWarning): - struct.set("prop", "MyType", "test") - self.assertEqual(struct["prop"], "test") - with self.assertWarns(UserWarning): - struct = SCHEMA.GstStructure.new_from_str( - "properties, prop= ( MyOtherType ) 4-5 ;") - self.assertEqual(struct["prop"], "4-5") - self.assertEqual( - str(struct), "properties, prop=(MyOtherType)4-5;") - with self.assertWarns(UserWarning): - SCHEMA.GstStructure("properties", struct.fields) - with self.assertWarns(UserWarning): - struct = SCHEMA.GstStructure.new_from_str( - 'properties, prop=(string) { "spa\\ ce" , ' - '( string ) test } ;') - self.assertEqual( - struct["prop"], '{ "spa\\ ce", (string)test }') - self.assertEqual( - str(struct), 'properties, prop=(string){ "spa\\ ce", ' - '(string)test };') - with self.assertWarns(UserWarning): - struct = SCHEMA.GstStructure.new_from_str( - "properties, prop=(int)<1,3,4,5>;") - self.assertEqual(struct["prop"], "< 1, 3, 4, 5 >") - with self.assertWarns(UserWarning): - struct = SCHEMA.GstStructure.new_from_str( - "properties, prop=(int)[1,3];") - self.assertEqual(struct["prop"], "[ 1, 3 ]") - with self.assertWarns(UserWarning): - struct = SCHEMA.GstStructure.new_from_str( - "properties, prop=(MyType){(MyType){1,2}," - "(MyType){3a3,4,5}};") - self.assertEqual( - struct["prop"], - "{ (MyType){ 1, 2 }, (MyType){ 3a3, 4, 5 } }") - - def test_image_sequence_example(self): - timeline = otio.adapters.read_from_file(IMAGE_SEQUENCE_EXAMPLE_PATH) - - ges_el = self._get_xges_from_otio_timeline(timeline) - self.assertIsNotNone(ges_el) - self.assertXgesNumLayers(ges_el, 1) - self.assertXgesAsset( - ges_el, - "imagesequence:./sample_sequence/sample_sequence.%2504d.exr" + - "?rate=24/1&start-index=86400&stop-index=86450", - "GESUriClip") - - def SKIP_test_roundtrip_disk2mem2disk(self): - self.maxDiff = None - timeline = otio.adapters.read_from_file(XGES_EXAMPLE_PATH) - tmp_path = tempfile.mkstemp(suffix=".xges", text=True)[1] - - otio.adapters.write_to_file(timeline, tmp_path) - result = otio.adapters.read_from_file(tmp_path) - - original_json = otio.adapters.write_to_string(timeline, 'otio_json') - output_json = otio.adapters.write_to_string(result, 'otio_json') - self.assertMultiLineEqual(original_json, output_json) - - self.assertIsOTIOEquivalentTo(timeline, result) - - # But the xml text on disk is not identical because otio has a subset - # of features to xges and we drop all the nle specific preferences. - with open(XGES_EXAMPLE_PATH) as original_file: - with open(tmp_path) as output_file: - self.assertNotEqual(original_file.read(), output_file.read()) - - -if __name__ == '__main__': - unittest.main() diff --git a/contrib/opentimelineio_contrib/adapters/xges.py b/contrib/opentimelineio_contrib/adapters/xges.py deleted file mode 100644 index 37117679e..000000000 --- a/contrib/opentimelineio_contrib/adapters/xges.py +++ /dev/null @@ -1,3749 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""OpenTimelineIO GStreamer Editing Services XML Adapter.""" -import re -import os -import warnings -import numbers -from urllib.parse import quote -from urllib.parse import unquote -from urllib.parse import urlparse -from urllib.parse import parse_qs - -from fractions import Fraction -from xml.etree import ElementTree -from xml.dom import minidom -import itertools -import colorsys -import opentimelineio as otio - -META_NAMESPACE = "XGES" - -_TRANSITION_MAP = { - "crossfade": otio.schema.TransitionTypes.SMPTE_Dissolve -} -# Two way map -_TRANSITION_MAP.update({v: k for k, v in _TRANSITION_MAP.items()}) - - -class XGESReadError(otio.exceptions.OTIOError): - """An incorrectly formatted xges string.""" - - -class UnhandledValueError(otio.exceptions.OTIOError): - """Received value is not handled.""" - def __init__(self, name, value): - otio.exceptions.OTIOError.__init__( - self, f"Unhandled value {value!r} for {name}.") - - -class InvalidValueError(otio.exceptions.OTIOError): - """Received value is invalid.""" - def __init__(self, name, value, expect): - otio.exceptions.OTIOError.__init__( - self, "Invalid value {!r} for {}. Expect {}.".format( - value, name, expect)) - - -class DeserializeError(otio.exceptions.OTIOError): - """Receive an incorrectly serialized value.""" - MAX_LEN = 20 - - def __init__(self, read, reason): - if len(read) > self.MAX_LEN: - read = read[:self.MAX_LEN] + "..." - otio.exceptions.OTIOError.__init__( - self, "Could not deserialize the string ({}) because it {}." - "".format(read, reason)) - - -class UnhandledOtioError(otio.exceptions.OTIOError): - """Received otio object is not handled.""" - def __init__(self, otio_obj): - otio.exceptions.OTIOError.__init__( - self, "Unhandled otio schema {}.".format( - otio_obj.schema_name())) - - -def _show_ignore(msg): - """Tell user we found an error with 'msg', but we are ignoring it.""" - warnings.warn(msg + ".\nIGNORING.", stacklevel=2) - - -def _show_otio_not_supported(otio_obj, effect): - """ - Tell user that we do not properly support an otio type for 'otio_obj'. - 'effect' is a message to the user about what will happen instead. - """ - warnings.warn( - "The schema {} is not currently supported.\n{}.".format( - otio_obj.schema_name(), effect), - stacklevel=2) - - -def _wrong_type_for_arg(val, expect_type_name, arg_name): - """ - Raise exception in response to the 'arg_name' argument being given the - value 'val', when we expected it to be of the type corresponding to - 'expect_type_name'. - """ - raise TypeError( - "Expect a {} type for the '{}' argument. Received a {} type." - "".format(expect_type_name, arg_name, type(val).__name__)) - - -def _force_gst_structure_name(struct, struct_name, owner=""): - """ - If the GstStructure 'struct' does not have the given 'struct_name', - change its name to match with a warning. - 'owner' is used for the message to tell the user which object the - structure belongs to. - """ - if struct.name != struct_name: - if owner: - start = f"{owner}'s" - else: - start = "The" - warnings.warn( - "{} structure name is \"{}\" rather than the expected \"{}\"." - "\nOverwriting with the expected name.".format( - start, struct.name, struct_name)) - struct.name = struct_name - - -# TODO: remove unicode_to_str once python2 has ended: -def unicode_to_str(value): - """If python2, returns unicode as a utf8 str""" - if type(value) is not str and isinstance(value, str): - value = value.encode("utf8") - return value - - -class GESTrackType: - """ - Class for storing the GESTrackType types, and converting them to - the otio.schema.TrackKind. - """ - - UNKNOWN = 1 << 0 - AUDIO = 1 << 1 - VIDEO = 1 << 2 - TEXT = 1 << 3 - CUSTOM = 1 << 4 - OTIO_TYPES = (VIDEO, AUDIO) - NON_OTIO_TYPES = (UNKNOWN, TEXT, CUSTOM) - ALL_TYPES = OTIO_TYPES + NON_OTIO_TYPES - - @staticmethod - def to_otio_kind(track_type): - """ - Convert from GESTrackType 'track_type' to otio.schema.TrackKind. - """ - if track_type == GESTrackType.AUDIO: - return otio.schema.TrackKind.Audio - elif track_type == GESTrackType.VIDEO: - return otio.schema.TrackKind.Video - raise UnhandledValueError("track_type", track_type) - - @staticmethod - def from_otio_kind(*otio_kinds): - """ - Convert the list of otio.schema.TrackKind 'otio_kinds' to an - GESTrackType. - """ - track_type = 0 - for kind in otio_kinds: - if kind == otio.schema.TrackKind.Audio: - track_type |= GESTrackType.AUDIO - elif kind == otio.schema.TrackKind.Video: - track_type |= GESTrackType.VIDEO - else: - raise UnhandledValueError("track kind", kind) - return track_type - - -GST_SECOND = 1000000000 - - -class XGES: - """ - Class for converting an xges string, which stores GES projects, to an - otio.schema.Timeline. - """ - # The xml elements found in the given xges are converted as: - # - # + A <ges>, its <project>, its <timeline> and its <track>s are - # converted to an otio.schema.Stack. - # + A GESMarker on the <timeline> is converted to an - # otio.schema.Marker. - # + A <layer> is converted to otio.schema.Track, one for each track - # type found. - # + A <clip> + <asset> is converted to an otio.schema.Composable, one - # for each track type found: - # + A GESUriClip becomes an otio.schema.Clip with an - # otio.schema.ExternalReference. - # + A GESUriClip that references a sub-project instead becomes an - # otio.schema.Stack of the sub-project. - # + A GESTransitionClip becomes an otio.schema.Transition. - # + An <effect> on a uriclip is converted to an otio.schema.Effect. - # + An <asset> is wrapped - # - # TODO: Some parts of the xges are not converted. - # <clip> types to support: - # + GESTestClip, probably to a otio.schema.Clip with an - # otio.schema.GeneratorReference - # + GESTitleClip, maybe to a otio.schema.Clip with an - # otio.schema.MissingReference? - # + GESOverlayClip, difficult to convert since otio.schema.Clips can - # not overlap generically. Maybe use a separate otio.schema.Track? - # + GESBaseEffectClip, same difficulty. - # - # Also, for <clip>, we're missing - # + <source>, which contains <binding> elements that describe the - # property bindings. - # - # For <project>, we're missing: - # + <encoding-profile>, not vital. - # - # For <asset>, we're missing: - # + <stream-info>. - # - # For <timeline>, we're missing: - # + <groups>, and its children <group> elements. - # - # For <effect>, we're missing: - # + <binding>, same as the missing <clip> <binding> - - def __init__(self, ges_obj): - """ - 'ges_obj' should be the root of the xges xml tree (called "ges"). - If it is not an ElementTree, it will first be parsed as a string - to ElementTree. - """ - if not isinstance(ges_obj, ElementTree.Element): - ges_obj = ElementTree.fromstring(ges_obj) - if ges_obj.tag != "ges": - raise XGESReadError( - "The root element for the received xml is tagged as " - "{} rather than the expected 'ges' for xges".format( - ges_obj.tag)) - self.ges_xml = ges_obj - self.rate = 25.0 - - @staticmethod - def _findall(xmlelement, path): - """ - Return a list of all child xml elements found under 'xmlelement' - at 'path'. - """ - found = xmlelement.findall(path) - if found is None: - return [] - return found - - @classmethod - def _findonly(cls, xmlelement, path, allow_none=False): - """ - Find exactly one child xml element found under 'xmlelement' at - 'path' and return it. If we find multiple, we raise an error. If - 'allow_none' is False, we also error when we find no element, - otherwise we can return None. - """ - found = cls._findall(xmlelement, path) - if allow_none and not found: - return None - if len(found) != 1: - raise XGESReadError( - "Found {:d} xml elements under the path {} when only " - "one was expected.".format(len(found), path)) - return found[0] - - @staticmethod - def _get_attrib(xmlelement, key, expect_type): - """ - Get the xml attribute at 'key', try to convert it to the python - 'expect_type', and return it. Otherwise, raise an error. - """ - val = xmlelement.get(key) - if val is None: - raise XGESReadError( - "The xges {} element is missing the {} " - "attribute.".format(xmlelement.tag, key)) - try: - val = expect_type(val) - except (ValueError, TypeError): - raise XGESReadError( - "The xges {} element '{}' attribute has the value {}, " - "which is not of the expected {} type.".format( - xmlelement.tag, key, val, expect_type.__name__)) - return val - - @staticmethod - def _get_structure(xmlelement, attrib_name, struct_name=None): - """ - Try to find the GstStructure with the name 'struct_name' under - the 'attrib_name' attribute of 'xmlelement'. If we can not do so - we return an empty structure with the same name. If no - 'struct_name' is given, we use the 'attrib_name'. - """ - if struct_name is None: - struct_name = attrib_name - read_struct = xmlelement.get(attrib_name, struct_name + ";") - try: - struct = GstStructure.new_from_str(read_struct) - except DeserializeError as err: - _show_ignore( - "The {} attribute of {} could not be read as a " - "GstStructure:\n{!s}".format( - struct_name, xmlelement.tag, err)) - return GstStructure(struct_name) - _force_gst_structure_name(struct, struct_name, xmlelement.tag) - return struct - - @classmethod - def _get_properties(cls, xmlelement): - """Get the properties GstStructure from an xges 'xmlelement'.""" - return cls._get_structure(xmlelement, "properties") - - @classmethod - def _get_metadatas(cls, xmlelement): - """Get the metadatas GstStructure from an xges 'xmlelement'.""" - return cls._get_structure(xmlelement, "metadatas") - - @classmethod - def _get_children_properties(cls, xmlelement): - """ - Get the children-properties GstStructure from an xges - 'xmlelement'. - """ - return cls._get_structure( - xmlelement, "children-properties", "properties") - - @classmethod - def _get_from_properties( - cls, xmlelement, fieldname, expect_type, default=None): - """ - Try to get the property under 'fieldname' of the 'expect_type' - type name from the properties GstStructure of an xges element. - Otherwise return 'default'. - """ - structure = cls._get_properties(xmlelement) - return structure.get_typed(fieldname, expect_type, default) - - @classmethod - def _get_from_metadatas( - cls, xmlelement, fieldname, expect_type, default=None): - """ - Try to get the metadata under 'fieldname' of the 'expect_type' - type name from the metadatas GstStructure of an xges element. - Otherwise return 'default'. - """ - structure = cls._get_metadatas(xmlelement) - return structure.get_typed(fieldname, expect_type, default) - - @staticmethod - def _get_from_caps(caps, fieldname, structname=None, default=None): - """ - Extract a GstCaps from the 'caps' string and search it for the - first GstStructure (optionally, with the 'structname' name) with - the 'fieldname' field, and return its value. Otherwise, return - 'default'. - """ - try: - with warnings.catch_warnings(): - # unknown types may raise a warning. This will - # usually be irrelevant since we are searching for - # a specific field - caps = GstCaps.new_from_str(caps) - except DeserializeError as err: - _show_ignore( - "Failed to read the fields in the caps ({}):\n\t" - "{!s}".format(caps, err)) - else: - for struct in caps: - if structname is not None: - if struct.name != structname: - continue - # use below method rather than fields.get(fieldname) to - # allow us to want any value back, including None - for key in struct.fields: - if key == fieldname: - return struct[key] - return default - - def _set_rate_from_timeline(self, timeline): - """ - Set the rate of 'self' to the rate found in the video track - element of the xges 'timeline'. - """ - video_track = timeline.find("./track[@track-type='4']") - if video_track is None: - return - res_caps = self._get_from_properties( - video_track, "restriction-caps", "string") - if res_caps is None: - return - rate = self._get_from_caps(res_caps, "framerate") - if rate is None: - return - try: - rate = Fraction(rate) - except (ValueError, TypeError): - _show_ignore("Read a framerate that is not a fraction") - else: - self.rate = float(rate) - - def _to_rational_time(self, ns_timestamp): - """ - Converts the GstClockTime 'ns_timestamp' (nanoseconds as an int) - to an otio.opentime.RationalTime object. - """ - return otio.opentime.RationalTime( - (float(ns_timestamp) * self.rate) / float(GST_SECOND), - self.rate - ) - - @staticmethod - def _add_to_otio_metadata(otio_obj, key, val, parent_key=None): - """ - Add the data 'val' to the metadata of 'otio_obj' under 'key'. - If 'parent_key' is given, it is instead added to the - sub-dictionary found under 'parent_key'. - The needed dictionaries are automatically created. - """ - xges_dict = otio_obj.metadata.get(META_NAMESPACE) - if xges_dict is None: - otio_obj.metadata[META_NAMESPACE] = {} - xges_dict = otio_obj.metadata[META_NAMESPACE] - if parent_key is None: - _dict = xges_dict - else: - sub_dict = xges_dict.get(parent_key) - if sub_dict is None: - xges_dict[parent_key] = {} - sub_dict = xges_dict[parent_key] - _dict = sub_dict - _dict[key] = val - - @classmethod - def _add_properties_and_metadatas_to_otio( - cls, otio_obj, element, parent_key=None): - """ - Add the properties and metadatas attributes of the xges 'element' - to the metadata of 'otio_obj', as GstStructures. Optionally under - the 'parent_key'. - """ - cls._add_to_otio_metadata( - otio_obj, "properties", - cls._get_properties(element), parent_key) - cls._add_to_otio_metadata( - otio_obj, "metadatas", - cls._get_metadatas(element), parent_key) - - @classmethod - def _add_children_properties_to_otio( - cls, otio_obj, element, parent_key=None): - """ - Add the children-properties attribute of the xges 'element' to the - metadata of 'otio_obj', as GstStructures. Optionally under the - 'parent_key'. - """ - cls._add_to_otio_metadata( - otio_obj, "children-properties", - cls._get_children_properties(element), parent_key) - - def to_otio(self): - """ - Convert the xges given to 'self' to an otio.schema.Timeline - object, and returns it. - """ - otio_timeline = otio.schema.Timeline() - project = self._fill_otio_stack_from_ges(otio_timeline.tracks) - otio_timeline.name = self._get_from_metadatas( - project, "name", "string", "") - return otio_timeline - - def _fill_otio_stack_from_ges(self, otio_stack): - """ - Converts the top <ges> element given to 'self' into an - otio.schema.Stack by setting the metadata of the given - 'otio_stack', and filling it with otio.schema.Tracks. - Returns the <project> element found under <ges>. - """ - project = self._findonly(self.ges_xml, "./project") - timeline = self._findonly(project, "./timeline") - self._set_rate_from_timeline(timeline) - self._add_timeline_markers_to_otio_stack(timeline, otio_stack) - - tracks = self._findall(timeline, "./track") - tracks.sort( - key=lambda trk: self._get_attrib(trk, "track-id", int)) - xges_tracks = [] - for track in tracks: - try: - caps = GstCaps.new_from_str( - self._get_attrib(track, "caps", str)) - except DeserializeError as err: - _show_ignore( - "Could not deserialize the caps attribute for " - "track {:d}:\n{!s}".format( - self._get_attrib(track, "track-id", int), err)) - else: - xges_tracks.append( - XgesTrack( - caps, - self._get_attrib(track, "track-type", int), - self._get_properties(track), - self._get_metadatas(track))) - - self._add_properties_and_metadatas_to_otio( - otio_stack, project, "project") - self._add_properties_and_metadatas_to_otio( - otio_stack, timeline, "timeline") - self._add_to_otio_metadata(otio_stack, "tracks", xges_tracks) - self._add_layers_to_otio_stack(timeline, otio_stack) - return project - - def _add_timeline_markers_to_otio_stack( - self, timeline, otio_stack): - """ - Add the markers found in the GESMarkerlList metadata of the xges - 'timeline' to 'otio_stack' as otio.schema.Markers. - """ - metadatas = self._get_metadatas(timeline) - for marker_list in metadatas.values_of_type("GESMarkerList"): - for marker in marker_list: - if marker.is_colored(): - otio_stack.markers.append( - self._otio_marker_from_ges_marker(marker)) - - def _otio_marker_from_ges_marker(self, ges_marker): - """Convert the GESMarker 'ges_marker' to an otio.schema.Marker.""" - with warnings.catch_warnings(): - # don't worry about not being string typed - name = ges_marker.metadatas.get_typed("comment", "string", "") - marked_range = otio.opentime.TimeRange( - self._to_rational_time(ges_marker.position), - self._to_rational_time(0)) - return otio.schema.Marker( - name=name, color=ges_marker.get_nearest_otio_color(), - marked_range=marked_range) - - def _add_layers_to_otio_stack(self, timeline, otio_stack): - """ - Add the <layer> elements under the xges 'timeline' to 'otio_stack' - as otio.schema.Tracks. - """ - sort_otio_tracks = [] - for layer in self._findall(timeline, "./layer"): - priority = self._get_attrib(layer, "priority", int) - for otio_track in self._otio_tracks_from_layer_clips(layer): - sort_otio_tracks.append((otio_track, priority)) - sort_otio_tracks.sort(key=lambda ent: ent[1], reverse=True) - # NOTE: smaller priority is later in the list - for otio_track in (ent[0] for ent in sort_otio_tracks): - otio_stack.append(otio_track) - - def _otio_tracks_from_layer_clips(self, layer): - """ - Convert the xges 'layer' into otio.schema.Tracks, one for each - otio.schema.TrackKind. - """ - otio_tracks = [] - for track_type in GESTrackType.OTIO_TYPES: - otio_items, otio_transitions = \ - self._create_otio_composables_from_layer_clips( - layer, track_type) - if not otio_items and not otio_transitions: - continue - otio_track = otio.schema.Track() - otio_track.kind = GESTrackType.to_otio_kind(track_type) - self._add_otio_composables_to_otio_track( - otio_track, otio_items, otio_transitions) - self._add_properties_and_metadatas_to_otio(otio_track, layer) - otio_tracks.append(otio_track) - for track_type in GESTrackType.NON_OTIO_TYPES: - layer_clips = self._layer_clips_for_track_type( - layer, track_type) - if layer_clips: - _show_ignore( - "The xges layer of priority {:d} contains clips " - "{!s} of the unhandled track type {:d}".format( - self._get_attrib(layer, "priority", int), - [self._get_name(clip) for clip in layer_clips], - track_type)) - return otio_tracks - - @classmethod - def _layer_clips_for_track_type(cls, layer, track_type): - """ - Return the <clip> elements found under the xges 'layer' whose - "track-types" overlaps with track_type. - """ - return [ - clip for clip in cls._findall(layer, "./clip") - if cls._get_attrib(clip, "track-types", int) & track_type] - - @classmethod - def _clip_effects_for_track_type(cls, clip, track_type): - """ - Return the <effect> elements found under the xges 'clip' whose - "track-type" matches 'track_type'. - """ - return [ - effect for effect in cls._findall(clip, "./effect") - if cls._get_attrib(effect, "track-type", int) & track_type] - # NOTE: the attribute is 'track-type', not 'track-types' - - def _create_otio_composables_from_layer_clips( - self, layer, track_type): - """ - For all the <clip> elements found in the xges 'layer' that overlap - the given 'track_type', attempt to create an - otio.schema.Composable. - - Note that the created composables do not have their timing set. - Instead, the timing information of the <clip> is stored in a - dictionary alongside the composable. - - Returns a list of otio item dictionaries, and a list of otio - transition dictionaries. - Within the item dictionary: - "item" points to the actual otio.schema.Item, - "start", "duration" and "inpoint" give the corresponding - <clip> attributes. - Within the transition dictionary: - "transition" points to the actual otio.schema.Transition, - "start" and "duration" give the corresponding <clip> - attributes. - """ - otio_transitions = [] - otio_items = [] - for clip in self._layer_clips_for_track_type(layer, track_type): - clip_type = self._get_attrib(clip, "type-name", str) - start = self._get_attrib(clip, "start", int) - inpoint = self._get_attrib(clip, "inpoint", int) - duration = self._get_attrib(clip, "duration", int) - otio_composable = None - name = self._get_name(clip) - if clip_type == "GESTransitionClip": - otio_composable = self._otio_transition_from_clip(clip) - elif clip_type == "GESUriClip": - otio_composable = self._otio_item_from_uri_clip(clip) - else: - # TODO: support other clip types - # maybe represent a GESTitleClip as a gap, with the text - # in the metadata? - # or as a clip with a MissingReference? - _show_ignore( - "The xges clip {} is of an unsupported {} type" - "".format(name, clip_type)) - continue - otio_composable.name = name - self._add_properties_and_metadatas_to_otio( - otio_composable, clip, "clip") - self._add_clip_effects_to_otio_composable( - otio_composable, clip, track_type) - if isinstance(otio_composable, otio.schema.Transition): - otio_transitions.append({ - "transition": otio_composable, - "start": start, "duration": duration}) - elif isinstance(otio_composable, otio.core.Item): - otio_items.append({ - "item": otio_composable, "start": start, - "inpoint": inpoint, "duration": duration}) - return otio_items, otio_transitions - - def _add_clip_effects_to_otio_composable( - self, otio_composable, clip, track_type): - """ - Add the <effect> elements found under the xges 'clip' of the - given 'track_type' to the 'otio_composable'. - """ - clip_effects = self._clip_effects_for_track_type( - clip, track_type) - if not isinstance(otio_composable, otio.core.Item): - if clip_effects: - _show_ignore( - "The effects {!s} found under the xges clip {} can " - "not be represented".format( - [self._get_attrib(effect, "asset-id", str) - for effect in clip_effects], - self._get_name(clip))) - return - for effect in clip_effects: - effect_type = self._get_attrib(effect, "type-name", str) - if effect_type == "GESEffect": - otio_composable.effects.append( - self._otio_effect_from_effect(effect)) - else: - _show_ignore( - "The {} effect under the xges clip {} is of an " - "unsupported {} type".format( - self._get_attrib(effect, "asset-id", str), - self._get_name(clip), effect_type)) - - def _otio_effect_from_effect(self, effect): - """Convert the xges 'effect' into an otio.schema.Effect.""" - bin_desc = self._get_attrib(effect, "asset-id", str) - # TODO: a smart way to convert the bin description into a standard - # effect name that is recognised by other adapters - # e.g. a bin description can also contain parameter values, such - # as "agingtv scratch-lines=20" - otio_effect = otio.schema.Effect(effect_name=bin_desc) - self._add_to_otio_metadata( - otio_effect, "bin-description", bin_desc) - self._add_properties_and_metadatas_to_otio(otio_effect, effect) - self._add_children_properties_to_otio(otio_effect, effect) - return otio_effect - - @staticmethod - def _item_gap(second, first): - """ - Calculate the time gap between the start time of 'second' and the - end time of 'first', each of which are item dictionaries as - returned by _create_otio_composables_from_layer_clips. - If 'first' is None, we return the gap between the start of the - timeline and the start of 'second'. - If 'second' is None, we return 0 to indicate no gap. - """ - if second is None: - return 0 - if first is None: - return second["start"] - return second["start"] - first["start"] - first["duration"] - - def _add_otio_composables_to_otio_track( - self, otio_track, items, transitions): - """ - Insert 'items' and 'transitions' into 'otio_track' with correct - timings. - - 'items' and 'transitions' should be a list of dictionaries, as - returned by _create_otio_composables_from_layer_clips. - - Specifically, the item dictionaries should contain an un-parented - otio.schema.Item under the "item" key, and GstClockTimes under the - "start", "duration" and "inpoint" keys, corresponding to the times - found under the corresponding xges <clip>. - This method should set the correct source_range for the item - before inserting it into 'otio_track'. - - The transitions dictionaries should contain an un-parented - otio.schema.Transition under the "transition" key, and - GstClockTimes under the "start" and "duration" keys, corresponding - to the times found under the corresponding xges <clip>. - Whenever an overlap of non-transition <clip>s is detected, the - transition that matches the overlap will be searched for in - 'transitions', removed from the list, and the corresponding otio - transition will be inserted in 'otio_track' with the correct - timings. - """ - # otio tracks do not allow items to overlap - # in contrast an xges layer will let clips overlap, and their - # overlap may have some corresponding transition associated with - # it. Diagrammatically, we want to translate: - # _ _ _ _ _ _ ____________ _ _ _ _ _ _ ____________ _ _ _ _ _ _ - # + + + + - # xges-clip-0 | |xges-clip-1| xges-clip-2 - # _ _ _ _ _ _+____________+_ _ _ _ _ _+____________+_ _ _ _ _ _ - # .------------. .------------. - # :xges-trans-1: :xges-trans-2: - # '------------' '------------' - # -----------> <-----------------------------------> - # start duration (on xges-clip-1) - # -----------> <----------> - # start duration (on xges-trans-1) - # ------------------------------------> <----------> - # start duration (on xges-trans-2) - # - # . . . . .......................................... - # . Not : : - # . Avail. : xges-asset for xges-clip-1 : - # . . . . .:.......................................: - # <---------> - # inpoint (on xges-clip-1) - # <----------------------------------------------> - # duration (on xges-asset) - # - # to: - # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - # + + - # otio-clip-0 | otio-clip-1 | otio-clip-2 - # _ _ _ _ _ _ _ _ _+_ _ _ _ _ _ _ _ _ _ _ _ _+_ _ _ _ _ _ _ _ _ - # .------------. .------------. - # :otio-trans-1: :otio-trans-2: - # '------------' '------------' - # <---> <----> <----> <---> - # .in_offset .out_offset .in_offset .out_offset - # - # . . . . .......................................... - # . Not : : - # . Avail. : otio-med-ref for otio-clip-1 : - # . . . . .:.......................................: - # <---------------> <-----------------------> - # s_range.start_time s_range.duration (on otio-clip-1) - # <------> <-------------------------------------> - # a_range.start_time a_range.duration (on otio-med-ref) - # - # where: - # s_range = source_range - # a_range = available_range - # - # so: - # for otio-trans-1: - # .in_offset + .out_offset = xges-trans-1-duration - # for otio-clip-1: - # s_range.start_time = xges-clip-1-inpoint - # + otio-trans-1.in_offset - # s_range.duration = xges-clip-1-duration - # - otio-trans-1.in_offset - # - otio-trans-2.out_offset - # - # - # We also want to insert any otio-gaps when the first xges clip - # does not start at zero, or if there is an implied gap between - # xges clips - items.sort(key=lambda ent: ent["start"]) - prev_otio_transition = None - for item, prev_item, next_item in zip( - items, [None] + items, items[1:] + [None]): - otio_start = self._to_rational_time(item["inpoint"]) - otio_duration = self._to_rational_time(item["duration"]) - otio_transition = None - pre_gap = self._item_gap(item, prev_item) - post_gap = self._item_gap(next_item, item) - if pre_gap < 0: - # overlap: transition should have been - # handled by the previous iteration - otio_start += prev_otio_transition.in_offset - otio_duration -= prev_otio_transition.in_offset - # start is delayed until the otio transition's position - # duration looses what start gains - elif pre_gap > 0: - otio_track.append(self._create_otio_gap(pre_gap)) - - if post_gap < 0: - # overlap - duration = -post_gap - transition = [ - t for t in transitions - if t["start"] == next_item["start"] and - t["duration"] == duration] - if len(transition) == 1: - otio_transition = transition[0]["transition"] - transitions.remove(transition[0]) - # remove transitions once they have been extracted - elif len(transition) == 0: - # NOTE: this can happen if auto-transition is false - # for the xges timeline - otio_transition = self._default_otio_transition() - else: - raise XGESReadError( - "Found {:d} {!s} transitions with start={:d} " - "and duration={:d} within a single layer".format( - len(transition), otio_track.kind, - next_item["start"], duration)) - half = float(duration) / 2.0 - otio_transition.in_offset = self._to_rational_time(half) - otio_transition.out_offset = self._to_rational_time(half) - otio_duration -= otio_transition.out_offset - # trim the end of the clip, which is where the otio - # transition starts - otio_item = item["item"] - otio_item.source_range = otio.opentime.TimeRange( - otio_start, otio_duration) - otio_track.append(otio_item) - if otio_transition: - otio_track.append(otio_transition) - prev_otio_transition = otio_transition - if transitions: - raise XGESReadError( - "xges layer contains {:d} {!s} transitions that could " - "not be associated with any clip overlap".format( - len(transitions), otio_track.kind)) - - @classmethod - def _get_name(cls, element): - """ - Get the "name" of the xges 'element' found in its properties, or - return a generic name if none is found. - """ - name = cls._get_from_properties(element, "name", "string") - if not name: - name = element.tag - return name - - def _otio_transition_from_clip(self, clip): - """ - Convert the xges transition 'clip' into an otio.schema.Transition. - Note that the timing of the object is not set. - """ - return otio.schema.Transition( - transition_type=_TRANSITION_MAP.get( - self._get_attrib(clip, "asset-id", str), - otio.schema.TransitionTypes.Custom)) - - @staticmethod - def _default_otio_transition(): - """ - Create a default otio.schema.Transition. - Note that the timing of the object is not set. - """ - return otio.schema.Transition( - transition_type=otio.schema.TransitionTypes.SMPTE_Dissolve) - - def _otio_item_from_uri_clip(self, clip): - """ - Convert the xges uri 'clip' into an otio.schema.Item. - Note that the timing of the object is not set. - - If 'clip' is found to reference a sub-project, this will return - an otio.schema.Stack of the sub-project, also converted from the - found <ges> element. - Otherwise, an otio.schema.Clip with an - otio.schema.ExternalReference is returned. - """ - asset_id = self._get_attrib(clip, "asset-id", str) - sub_project_asset = self._asset_by_id(asset_id, "GESTimeline") - if sub_project_asset is not None: - # this clip refers to a sub project - otio_item = otio.schema.Stack() - sub_ges = XGES(self._findonly(sub_project_asset, "./ges")) - sub_ges._fill_otio_stack_from_ges(otio_item) - self._add_properties_and_metadatas_to_otio( - otio_item, sub_project_asset, "sub-project-asset") - # NOTE: we include asset-id in the metadata, so that two - # stacks that refer to a single sub-project will not be - # split into separate assets when converting from - # xges->otio->xges - self._add_to_otio_metadata(otio_item, "asset-id", asset_id) - uri_clip_asset = self._asset_by_id(asset_id, "GESUriClip") - if uri_clip_asset is None: - _show_ignore( - "Did not find the expected GESUriClip asset with " - "the id {}".format(asset_id)) - else: - self._add_properties_and_metadatas_to_otio( - otio_item, uri_clip_asset, "uri-clip-asset") - else: - otio_item = otio.schema.Clip( - media_reference=self._otio_reference_from_id(asset_id)) - return otio_item - - def _create_otio_gap(self, gst_duration): - """ - Create a new otio.schema.Gap with the given GstClockTime - 'gst_duration' duration. - """ - source_range = otio.opentime.TimeRange( - self._to_rational_time(0), - self._to_rational_time(gst_duration)) - return otio.schema.Gap(source_range=source_range) - - def _otio_image_sequence_from_url(self, ref_url): - - # TODO: Add support for missing policy - params = {} - fname, ext = os.path.splitext(unquote(os.path.basename(ref_url.path))) - index_format = re.findall(r"%\d+d", fname) - if index_format: - params["frame_zero_padding"] = int(index_format[-1][2:-1]) - fname = fname[0:-len(index_format[-1])] - - url_params = parse_qs(ref_url.query) - if "framerate" in url_params: - rate = params["rate"] = float(Fraction(url_params["framerate"][-1])) - if "start-index" in url_params and "stop-index" in url_params: - start = int(url_params["start-index"][-1]) - stop = int(url_params["stop-index"][-1]) - params["available_range"] = otio.opentime.TimeRange( - otio.opentime.RationalTime(int(start), rate), - otio.opentime.RationalTime(int(stop - start), rate), - ) - else: - rate = params["rate"] = float(30) - - return otio.schema.ImageSequenceReference( - "file://" + os.path.dirname(ref_url.path), - fname, ext, **params) - - def _otio_reference_from_id(self, asset_id): - """ - Create a new otio.schema.Reference from the given 'asset_id' - of an xges <clip>. - """ - asset = self._asset_by_id(asset_id, "GESUriClip") - if asset is None: - _show_ignore( - "Did not find the expected GESUriClip asset with the " - "id {}".format(asset_id)) - return otio.schema.MissingReference() - - duration = self._get_from_properties( - asset, "duration", "guint64") - - if duration is None: - available_range = None - else: - available_range = otio.opentime.TimeRange( - start_time=self._to_rational_time(0), - duration=self._to_rational_time(duration) - ) - - ref_url = urlparse(asset_id) - if ref_url.scheme == "imagesequence": - otio_ref = self._otio_image_sequence_from_url(ref_url) - else: - otio_ref = otio.schema.ExternalReference( - target_url=asset_id, - available_range=available_range - ) - self._add_properties_and_metadatas_to_otio(otio_ref, asset) - return otio_ref - - def _asset_by_id(self, asset_id, asset_type): - """ - Return the single xges <asset> element with "id"=='asset_id' and - "extractable-type-name"=='asset_type. - """ - return self._findonly( - self.ges_xml, - "./project/ressources/asset[@id='{}']" - "[@extractable-type-name='{}']".format( - asset_id, asset_type), - allow_none=True - ) - - -class XGESOtio: - """ - Class for converting an otio.schema.Timeline into an xges string. - """ - # The otio objects found in the given timeline are converted as: - # - # + A Stack is converted to a a <ges>, its <project>, its <timeline> - # and its <track>s. If the Stack is found underneath a Track, we - # also create a uri <clip> that references the <project> as an - # <asset>. - # + A Track is converted to a <layer>. - # + A Clip with an ExternalReference is converted to a uri <clip> and - # an <asset>. - # + A Transition is converted to a transition <clip>. - # + An Effect on a Clip or Stack is converted to <effect>s under the - # corresponding <clip>. - # + An Effect on a Track is converted to an effect <clip> that covers - # the <layer>. - # + A Marker is converted to a GESMarker for the <timeline>. - # - # TODO: Some parts of otio are not supported: - # + Clips with MissingReference or GeneratorReference references. - # The latter could probably be converted to a test <clip>. - # + The global_start_time on a Timeline is ignored. - # + TimeEffects are not converted into <effect>s or effect <clip>s. - # + We don't support a non-zero start time for uri files in xges, - # unlike MediaReference. - # + We don't have a good way to convert Effects into xges effects. - # Currently we just copy the names. - # + We don't support TimeEffects. Need to wait until xges supports - # this. - # + We don't support converting Transition transition_types into xges - # transition types. Currently they all become the default transition - # type. - - def __init__(self, input_otio=None): - """ - Initialise with the otio.schema.Timeline 'input_otio'. - """ - if input_otio is not None: - # copy the timeline so that we can freely change it - self.timeline = input_otio.deepcopy() - else: - self.timeline = None - self.all_names = set() - # map track types to a track id - self.track_id_for_type = {} - # map from a sub-<ges> element to an asset id - self.sub_projects = {} - - @staticmethod - def _rat_to_gstclocktime(rat_time): - """ - Convert an otio.opentime.RationalTime to a GstClockTime - (nanoseconds as an int). - """ - return int(otio.opentime.to_seconds(rat_time) * GST_SECOND) - - @classmethod - def _range_to_gstclocktimes(cls, time_range): - """ - Convert an otio.opentime.TimeRange to a tuple of the start_time - and duration as GstClockTimes. - """ - return (cls._rat_to_gstclocktime(time_range.start_time), - cls._rat_to_gstclocktime(time_range.duration)) - - @staticmethod - def _insert_new_sub_element(into_parent, tag, attrib=None): - """ - Create a new 'tag' xml element as a child of 'into_parent' with - the given 'attrib' attributes, and returns it. - """ - return ElementTree.SubElement(into_parent, tag, attrib or {}) - - @classmethod - def _add_properties_and_metadatas_to_element( - cls, element, otio_obj, parent_key=None, - properties=None, metadatas=None): - """ - Add the xges GstStructures "properties" and "metadatas" found in - the metadata of 'otio_obj', optionally looking under 'parent_key', - to the corresponding attributes of the xges 'element'. - If 'properties' or 'metadatas' are given, these will be used - instead of the ones found. - """ - element.attrib["properties"] = str( - properties or - cls._get_element_properties(otio_obj, parent_key)) - element.attrib["metadatas"] = str( - metadatas or - cls._get_element_metadatas(otio_obj, parent_key)) - - @classmethod - def _add_children_properties_to_element( - cls, element, otio_obj, parent_key=None, - children_properties=None): - """ - Add the xges GstStructure "children-properties" found in the - metadata of 'otio_obj', optionally looking under 'parent_key', to - the corresponding attributes of the xges 'element'. - If 'children-properties' is given, this will be used instead of - the one found. - """ - element.attrib["children-properties"] = str( - children_properties or - cls._get_element_children_properties(otio_obj, parent_key)) - - @staticmethod - def _get_from_otio_metadata( - otio_obj, key, parent_key=None, default=None): - """ - Fetch some xges data stored under 'key' from the metadata of - 'otio_obj'. If 'parent_key' is given, we fetch the data from the - dictionary under 'parent_key' in the metadata of 'otio_obj'. If - nothing was found, 'default' is returned instead. - This is used to find data that was added to 'otio_obj' using - XGES._add_to_otio_metadata. - """ - _dict = otio_obj.metadata.get(META_NAMESPACE, {}) - if parent_key is not None: - _dict = _dict.get(parent_key, {}) - return _dict.get(key, default) - - @classmethod - def _get_element_structure( - cls, otio_obj, key, struct_name, parent_key=None): - """ - Fetch a GstStructure under 'key' from the metadata of 'otio_obj', - optionally looking under 'parent_key'. - If the structure can not be found, a new empty structure with the - name 'struct_name' is created and returned instead. - This method will ensure that the returned GstStructure will have - the name 'struct_name'. - """ - struct = cls._get_from_otio_metadata( - otio_obj, key, parent_key, GstStructure(struct_name)) - _force_gst_structure_name(struct, struct_name, "{} {}".format( - type(otio_obj).__name__, otio_obj.name)) - return struct - - @classmethod - def _get_element_properties(cls, otio_obj, parent_key=None): - """ - Fetch the "properties" GstStructure under from the metadata of - 'otio_obj', optionally looking under 'parent_key'. - If the structure is not found, an empty one is returned instead. - """ - return cls._get_element_structure( - otio_obj, "properties", "properties", parent_key) - - @classmethod - def _get_element_metadatas(cls, otio_obj, parent_key=None): - """ - Fetch the "metdatas" GstStructure under from the metadata of - 'otio_obj', optionally looking under 'parent_key'. - If the structure is not found, an empty one is returned instead. - """ - return cls._get_element_structure( - otio_obj, "metadatas", "metadatas", parent_key) - - @classmethod - def _get_element_children_properties(cls, otio_obj, parent_key=None): - """ - Fetch the "children-properties" GstStructure under from the - metadata of 'otio_obj', optionally looking under 'parent_key'. - If the structure is not found, an empty one is returned instead. - """ - return cls._get_element_structure( - otio_obj, "children-properties", "properties", parent_key) - - @staticmethod - def _set_structure_value(struct, field, _type, value): - """ - For the given GstStructure 'struct', set the value under 'field' - to 'value' with the given type name '_type'. - If the type name is different from the current type name for - 'field', the value is still set, but we also issue a warning. - """ - if field in struct.fields: - current_type = struct.get_type_name(field) - if current_type != _type: - # the type changing is unexpected - warnings.warn( - "The structure {} has a {} typed value {!s} under {}." - "\nOverwriting with the {} typed value {!s}".format( - struct.name, current_type, - struct.get_value(field), field, _type, value)) - struct.set(field, _type, value) - - @staticmethod - def _asset_exists(asset_id, ressources, *extract_types): - """ - Test whether we have already created the xges <asset> under the - xges 'ressources' with id 'asset_id', and matching one of the - 'extract_types'. - """ - assets = ressources.findall("./asset") - if asset_id is None or assets is None: - return False - for extract_type in extract_types: - for asset in assets: - if asset.get("extractable-type-name") == extract_type \ - and asset.get("id") == asset_id: - return True - return False - - @classmethod - def _xges_element_equal(cls, first_el, second_el): - """Test if 'first_el' is equal to 'second_el'.""" - # start with most likely failures - if first_el.attrib != second_el.attrib: - return False - if len(first_el) != len(second_el): - return False - if first_el.tag != second_el.tag: - return False - # zip should be safe for comparison since we've already checked - # for equal length - for first_child, second_child in zip(first_el, second_el): - if not cls._xges_element_equal(first_child, second_child): - return False - if first_el.text != second_el.text: - return False - if first_el.tail != second_el.tail: - return False - return True - - def _serialize_stack_to_ressource(self, otio_stack, ressources): - """ - Use 'otio_stack' to create a new xges <asset> under the xges - 'ressources' corresponding to a sub-project. If the asset already - exists, it is not created. In either case, returns the asset id - for the corresponding <asset>. - """ - sub_obj = XGESOtio() - sub_ges = sub_obj._serialize_stack_to_ges(otio_stack) - for existing_sub_ges in self.sub_projects: - if self._xges_element_equal(existing_sub_ges, sub_ges): - # Already have the sub project as an asset, so return its - # asset id - return self.sub_projects[existing_sub_ges] - asset_id = self._get_from_otio_metadata(otio_stack, "asset-id") - if not asset_id: - asset_id = otio_stack.name or "sub-project" - orig_asset_id = asset_id - for i in itertools.count(start=1): - if not self._asset_exists( - asset_id, ressources, "GESUriClip", "GESTimeline"): - # NOTE: asset_id must be unique for both the - # GESTimeline and GESUriClip extractable types - break - asset_id = orig_asset_id + f"_{i:d}" - # create a timeline asset - asset = self._insert_new_sub_element( - ressources, "asset", attrib={ - "id": asset_id, "extractable-type-name": "GESTimeline"}) - self._add_properties_and_metadatas_to_element( - asset, otio_stack, "sub-project-asset") - asset.append(sub_ges) - self.sub_projects[sub_ges] = asset_id - - # also create a uri asset for the clip - uri_asset = self._insert_new_sub_element( - ressources, "asset", attrib={ - "id": asset_id, "extractable-type-name": "GESUriClip"}) - self._add_properties_and_metadatas_to_element( - uri_asset, otio_stack, "uri-clip-asset") - return asset_id - - def _serialize_external_reference_to_ressource( - self, reference, ressources): - """ - Use the the otio.schema.ExternalReference 'reference' to create - a new xges <asset> under the xges 'ressources' corresponding to a - uri clip asset. If the asset already exists, it is not created. - """ - if isinstance(reference, otio.schema.ImageSequenceReference): - base_url = urlparse(reference.target_url_base) - asset_id = "imagesequence:" + base_url.path - if not base_url.path.endswith("/"): - asset_id += "/" - asset_id += quote( - reference.name_prefix + "%0" - + str(reference.frame_zero_padding) - + "d" + reference.name_suffix) - - params = [] - if reference.rate: - rate = reference.rate.as_integer_ratio() - params.append("rate=%i/%i" % (rate[0], rate[1])) - - if reference.available_range: - params.append( - "start-index=%i" % - int(reference.available_range.start_time.value)) - params.append( - "stop-index=%i" % ( - reference.available_range.start_time.value - + reference.available_range.duration.value)) - - if params: - asset_id += '?' - asset_id += '&'.join(params) - else: - asset_id = reference.target_url - if self._asset_exists(asset_id, ressources, "GESUriClip"): - return asset_id - properties = self._get_element_properties(reference) - if properties.get_typed("duration", "guint64") is None: - a_range = reference.available_range - if a_range is not None: - self._set_structure_value( - properties, "duration", "guint64", - sum(self._range_to_gstclocktimes(a_range))) - # TODO: check that this is correct approach for when - # start_time is not 0. - # duration is the sum of the a_range start_time and - # duration we ignore that frames before start_time are - # not available - asset = self._insert_new_sub_element( - ressources, "asset", attrib={ - "id": asset_id, "extractable-type-name": "GESUriClip"}) - self._add_properties_and_metadatas_to_element( - asset, reference, properties=properties) - return asset_id - - @classmethod - def _get_effect_bin_desc(cls, otio_effect): - """ - Get the xges effect bin-description property from 'otio_effect'. - """ - bin_desc = cls._get_from_otio_metadata( - otio_effect, "bin-description") - if bin_desc is None: - # TODO: have a smart way to convert an effect name into a bin - # description - warnings.warn( - "Did not find a GESEffect bin-description for the {0} " - "effect. Using \"{0}\" as the bin-description." - "".format(otio_effect.effect_name)) - bin_desc = otio_effect.effect_name - return bin_desc - - def _serialize_item_effect( - self, otio_effect, clip, clip_id, track_type): - """ - Convert 'otio_effect' into a 'track_type' xges <effect> under the - xges 'clip' with the given 'clip_id'. - """ - if isinstance(otio_effect, otio.schema.TimeEffect): - _show_otio_not_supported(otio_effect, "Ignoring") - return - track_id = self.track_id_for_type.get(track_type) - if track_id is None: - _show_ignore( - "Could not get the required track-id for the {} effect " - "because no xges track with the track-type {:d} exists" - "".format(otio_effect.effect_name, track_type)) - return - effect = self._insert_new_sub_element( - clip, "effect", attrib={ - "asset-id": str(self._get_effect_bin_desc(otio_effect)), - "clip-id": str(clip_id), - "type-name": "GESEffect", - "track-type": str(track_type), - "track-id": str(track_id) - } - ) - self._add_properties_and_metadatas_to_element(effect, otio_effect) - self._add_children_properties_to_element(effect, otio_effect) - - def _serialize_item_effects( - self, otio_item, clip, clip_id, track_types): - """ - Place all the effects found on 'otio_item' that overlap - 'track_types' under the xges 'clip' with the given 'clip_id'. - """ - for track_type in ( - t for t in GESTrackType.ALL_TYPES if t & track_types): - for otio_effect in otio_item.effects: - self._serialize_item_effect( - otio_effect, clip, clip_id, track_type) - - def _serialize_track_effect_to_effect_clip( - self, otio_effect, layer, layer_priority, start, duration, - track_types, clip_id): - """ - Convert the effect 'otio_effect' found on an otio.schema.Track - into a GESEffectClip xges <clip> under the xges 'layer' with the - given 'layer_priority'. 'start', 'duration', 'clip_id' and - 'track-types' will be used for the corresponding attributes of the - <clip>. - """ - if isinstance(otio_effect, otio.schema.TimeEffect): - _show_otio_not_supported(otio_effect, "Ignoring") - return - self._insert_new_sub_element( - layer, "clip", attrib={ - "id": str(clip_id), - "asset-id": str(self._get_effect_bin_desc(otio_effect)), - "type-name": "GESEffectClip", - "track-types": str(track_types), - "layer-priority": str(layer_priority), - "start": str(start), - "rate": '0', - "inpoint": "0", - "duration": str(duration), - "properties": "properties;", - "metadatas": "metadatas;" - } - ) - # TODO: add properties and metadatas if we support converting - # GESEffectClips to otio track effects - - def _get_properties_with_unique_name( - self, named_otio, parent_key=None): - """ - Find the xges "properties" GstStructure found in the metadata of - 'named_otio', optionally under 'parent_key'. If the "name" - property is not found or not unique for the project, it is - modified to make it so. Then the structure is returned. - """ - properties = self._get_element_properties(named_otio, parent_key) - name = properties.get_typed("name", "string") - if not name: - name = named_otio.name or named_otio.schema_name() - tmpname = name - for i in itertools.count(start=1): - if tmpname not in self.all_names: - break - tmpname = name + f"_{i:d}" - self.all_names.add(tmpname) - self._set_structure_value(properties, "name", "string", tmpname) - return properties - - def _get_clip_times( - self, otio_composable, prev_composable, next_composable, - prev_otio_end): - """ - Convert the timing of 'otio_composable' into an xges <clip> - times, using the previous object in the parent otio.schema.Track - 'prev_composable', the next object in the track 'next_composable', - and the end time of 'prev_composable' in GstClockTime - 'prev_otio_end', as references. 'next_composable' and - 'prev_composable' may be None when no such sibling exists. - 'prev_otio_end' should be the 'otio_end' that was returned from - this method for 'prev_composable', or the initial time of the - xges <timeline>. - - Returns the "start", "duration" and "inpoint" attributes for the - <clip>, as well as the end time of 'otio_composable', all in - the coordinates of the xges <timeline> and in GstClockTimes. - """ - # see _add_otio_composables_to_track for the translation from - # xges clips to otio clips. Here we reverse this by setting: - # for xges-trans-1: - # otio_end = prev_otio_end - # start = prev_otio_end - # - otio-trans-1.in_offset - # duration = otio-trans-1.in_offset - # + otio-trans-1.out_offset - # - # for xges-clip-1: - # otio_end = prev_otio_end - # + otio-clip-1.s_range.duration - # start = prev_otio_end - # - otio-clip-1.in_offset - # duration = otio-clip-1.s_range.duration - # + otio-trans-1.in_offset - # + otio-trans-2.out_offset - # inpoint = otio-clip-1.s_range.start_time - # - otio-trans-1.in_offset - if isinstance(otio_composable, otio.core.Item): - otio_start_time, otio_duration = self._range_to_gstclocktimes( - otio_composable.trimmed_range()) - otio_end = prev_otio_end + otio_duration - start = prev_otio_end - duration = otio_duration - inpoint = otio_start_time - if isinstance(prev_composable, otio.schema.Transition): - in_offset = self._rat_to_gstclocktime( - prev_composable.in_offset) - start -= in_offset - duration += in_offset - inpoint -= in_offset - if isinstance(next_composable, otio.schema.Transition): - duration += self._rat_to_gstclocktime( - next_composable.out_offset) - elif isinstance(otio_composable, otio.schema.Transition): - otio_end = prev_otio_end - in_offset = self._rat_to_gstclocktime( - otio_composable.in_offset) - out_offset = self._rat_to_gstclocktime( - otio_composable.out_offset) - start = prev_otio_end - in_offset - duration = in_offset + out_offset - inpoint = 0 - else: - # NOTE: core schemas only give Item and Transition as - # composable types - raise UnhandledOtioError(otio_composable) - return start, duration, inpoint, otio_end - - def _serialize_composable_to_clip( - self, otio_composable, prev_composable, next_composable, - layer, layer_priority, track_types, ressources, clip_id, - prev_otio_end): - """ - Convert 'otio_composable' into an xges <clip> with the id - 'clip_id', under the xges 'layer' with 'layer_priority'. The - previous object in the parent otio.schema.Track - 'prev_composable', the next object in the track 'next_composable', - and the end time of 'prev_composable' in GstClockTime - 'prev_otio_end', are used as references. Any xges <asset> - elements needed for the <clip> are placed under the xges - 'ressources'. - - 'next_composable' and 'prev_composable' may be None when no such - sibling exists. 'prev_otio_end' should be the 'otio_end' that was - returned from this method for 'prev_composable', or the initial - time of the xges <timeline>. 'clip_id' should be the 'clip_id' - that was returned from this method for 'prev_composable', or 0 - for the first clip. - - Note that a new clip may not be created for some otio types, such - as otio.schema.Gaps, but the timings will be updated to accomodate - them. - - Returns the 'clip_id' for the next clip, and the end time of - 'otio_composable' in the coordinates of the xges <timeline> in - GstClockTime. - """ - start, duration, inpoint, otio_end = self._get_clip_times( - otio_composable, prev_composable, next_composable, - prev_otio_end) - - asset_id = None - asset_type = None - if isinstance(otio_composable, otio.schema.Gap): - pass - elif isinstance(otio_composable, otio.schema.Transition): - asset_type = "GESTransitionClip" - # FIXME: get transition type from metadata if transition is - # not supported by otio - # currently, any Custom_Transition is being turned into a - # crossfade - asset_id = _TRANSITION_MAP.get( - otio_composable.transition_type, "crossfade") - elif isinstance(otio_composable, otio.schema.Clip): - ref = otio_composable.media_reference - if ref is None or ref.is_missing_reference: - pass # treat as a gap - # FIXME: properly handle missing reference - elif isinstance(ref, - (otio.schema.ExternalReference, - otio.schema.ImageSequenceReference)): - asset_type = "GESUriClip" - asset_id = self._serialize_external_reference_to_ressource( - ref, ressources) - elif isinstance(ref, otio.schema.MissingReference): - pass # shouldn't really happen - elif isinstance(ref, otio.schema.GeneratorReference): - # FIXME: insert a GESTestClip if possible once otio - # supports GeneratorReferenceTypes - _show_otio_not_supported( - ref, "Treating as a gap") - else: - _show_otio_not_supported( - ref, "Treating as a gap") - elif isinstance(otio_composable, otio.schema.Stack): - asset_id = self._serialize_stack_to_ressource( - otio_composable, ressources) - asset_type = "GESUriClip" - else: - _show_otio_not_supported(otio_composable, "Treating as a gap") - - if asset_id is None: - if isinstance(prev_composable, otio.schema.Transition) \ - or isinstance(next_composable, otio.schema.Transition): - # unassigned clip is preceded or followed by a transition - # transitions in GES are only between two clips, so - # we will insert an empty GESTitleClip to act as a - # transparent clip, which emulates an otio gap - asset_id = "GESTitleClip" - asset_type = "GESTitleClip" - # else gap is simply the absence of a clip - if asset_id is None: - # No clip is inserted, so return same clip_id - return (clip_id, otio_end) - - clip = self._insert_new_sub_element( - layer, "clip", attrib={ - "id": str(clip_id), - "asset-id": str(asset_id), - "type-name": str(asset_type), - "track-types": str(track_types), - "layer-priority": str(layer_priority), - "start": str(start), - "rate": '0', - "inpoint": str(inpoint), - "duration": str(duration), - } - ) - self._add_properties_and_metadatas_to_element( - clip, otio_composable, "clip", - properties=self._get_properties_with_unique_name( - otio_composable, "clip")) - if isinstance(otio_composable, otio.core.Item): - self._serialize_item_effects( - otio_composable, clip, clip_id, track_types) - return (clip_id + 1, otio_end) - - def _serialize_stack_to_tracks(self, otio_stack, timeline): - """ - Create the xges <track> elements for the xges 'timeline' using - 'otio_stack'. - """ - xges_tracks = self._get_from_otio_metadata(otio_stack, "tracks") - if xges_tracks is None: - xges_tracks = [] - # FIXME: track_id is currently arbitrarily set. - # Only the xges effects, source and bindings elements use - # a track-id attribute, which are not yet supported anyway. - track_types = self._get_stack_track_types(otio_stack) - for track_type in GESTrackType.OTIO_TYPES: - if track_types & track_type: - xges_tracks.append( - XgesTrack.new_from_track_type(track_type)) - for track_id, xges_track in enumerate(xges_tracks): - track_type = xges_track.track_type - self._insert_new_sub_element( - timeline, "track", - attrib={ - "caps": str(xges_track.caps), - "track-type": str(track_type), - "track-id": str(track_id), - "properties": str(xges_track.properties), - "metadatas": str(xges_track.metadatas) - }) - if track_type in self.track_id_for_type: - warnings.warn( - "More than one XgesTrack was found with the same " - "track type {0:d}.\nAll xges elements with " - "track-type={0:d} (such as effects) will use " - "track-id={1:d}.".format( - track_type, self.track_id_for_type[track_type])) - else: - self.track_id_for_type[track_type] = track_id - - def _serialize_track_to_layer( - self, otio_track, timeline, layer_priority): - """ - Convert 'otio_track' into an xges <layer> for the xges 'timeline' - with the given 'layer_priority'. The layer is not yet filled with - clips. - """ - layer = self._insert_new_sub_element( - timeline, "layer", - attrib={"priority": str(layer_priority)}) - self._add_properties_and_metadatas_to_element(layer, otio_track) - return layer - - def _serialize_stack_to_project( - self, otio_stack, ges, otio_timeline): - """ - Convert 'otio_stack' into an xges <project> for the xges 'ges' - element. 'otio_timeline' should be the otio.schema.Timeline that - 'otio_stack' belongs to, or None if 'otio_stack' is a sub-stack. - """ - metadatas = self._get_element_metadatas(otio_stack, "project") - if not metadatas.get_typed("name", "string"): - if otio_timeline is not None and otio_timeline.name: - self._set_structure_value( - metadatas, "name", "string", otio_timeline.name) - elif otio_stack.name: - self._set_structure_value( - metadatas, "name", "string", otio_stack.name) - project = self._insert_new_sub_element(ges, "project") - self._add_properties_and_metadatas_to_element( - project, otio_stack, "project", metadatas=metadatas) - return project - - @staticmethod - def _already_have_marker_at_position( - position, color, comment, marker_list): - """ - Test whether we already have a GESMarker in the GESMarkerList - 'marker_list' at the given 'position', approximately of the given - otio.schema.MarkerColor 'color' and with the given 'comment'. - """ - comment = comment or None - for marker in marker_list.markers_at_position(position): - if marker.get_nearest_otio_color() == color and \ - marker.metadatas.get("comment") == comment: - return True - return False - - def _put_otio_marker_into_marker_list(self, otio_marker, marker_list): - """ - Translate the otio.schema.Marker 'otio_marker' into a GESMarker - and place it in the GESMarkerList 'marker_list' if it is not - suspected to be a duplicate. - If the duration of 'otio_marker' is not 0, up to two markers can - be put in 'marker_list': one for the start time and one for the - end time. - """ - start, dur = self._range_to_gstclocktimes(otio_marker.marked_range) - if dur: - positions = (start, start + dur) - else: - positions = (start, ) - for position in positions: - name = otio_marker.name - if not self._already_have_marker_at_position( - position, otio_marker.color, name, marker_list): - ges_marker = GESMarker(position) - ges_marker.set_color_from_otio_color(otio_marker.color) - if name: - ges_marker.metadatas.set( - "comment", "string", name) - marker_list.add(ges_marker) - - def _serialize_stack_to_timeline(self, otio_stack, project): - """ - Convert 'otio_stack' into an xges <timeline> under the xges - 'project', and return it. The timeline is not filled. - """ - timeline = self._insert_new_sub_element(project, "timeline") - metadatas = self._get_element_metadatas(otio_stack, "timeline") - if otio_stack.markers: - marker_list = metadatas.get_typed("markers", "GESMarkerList") - if marker_list is None: - lists = metadatas.values_of_type("GESMarkerList") - if lists: - marker_list = max(lists, key=lambda lst: len(lst)) - if marker_list is None: - self._set_structure_value( - metadatas, "markers", "GESMarkerList", GESMarkerList()) - marker_list = metadatas.get("markers") - for otio_marker in otio_stack.markers: - self._put_otio_marker_into_marker_list( - otio_marker, marker_list) - self._add_properties_and_metadatas_to_element( - timeline, otio_stack, "timeline", metadatas=metadatas) - return timeline - - def _serialize_stack_to_ges(self, otio_stack, otio_timeline=None): - """ - Convert 'otio_stack' into an xges <ges> and return it. - 'otio_timeline' should be the otio.schema.Timeline that - 'otio_stack' belongs to, or None if 'otio_stack' is a sub-stack. - """ - ges = ElementTree.Element("ges", version="0.6") - project = self._serialize_stack_to_project( - otio_stack, ges, otio_timeline) - ressources = self._insert_new_sub_element(project, "ressources") - timeline = self._serialize_stack_to_timeline(otio_stack, project) - self._serialize_stack_to_tracks(otio_stack, timeline) - - clip_id = 0 - for layer_priority, otio_track in enumerate(reversed(otio_stack)): - # NOTE: stack orders tracks with later tracks having higher - # priority, so we reverse the list for xges - layer = self._serialize_track_to_layer( - otio_track, timeline, layer_priority) - # FIXME: should the start be effected by the global_start_time - # on the otio timeline? - otio_end = 0 - track_types = self._get_track_types(otio_track) - for otio_composable in otio_track: - neighbours = otio_track.neighbors_of(otio_composable) - clip_id, otio_end = self._serialize_composable_to_clip( - otio_composable, neighbours[0], neighbours[1], - layer, layer_priority, track_types, ressources, - clip_id, otio_end) - if otio_track.effects: - min_start = None - max_end = 0 - for clip in layer: - start = int(clip.get("start")) - end = start + int(clip.get("duration")) - if min_start is None or start < min_start: - min_start = start - if end > max_end: - max_end = end - if min_start is None: - min_start = 0 - for otio_effect in otio_track.effects: - self._serialize_track_effect_to_effect_clip( - otio_effect, layer, layer_priority, min_start, - max_end - min_start, track_types, clip_id) - clip_id += 1 - return ges - - @staticmethod - def _remove_non_xges_metadata(otio_obj): - """Remove non-xges metadata from 'otio_obj.'""" - keys = [k for k in otio_obj.metadata.keys()] - for key in keys: - if key != META_NAMESPACE: - del otio_obj.metadata[key] - - @staticmethod - def _add_track_types(otio_track, track_type): - """ - Append the given 'track_type' to the metadata of 'otio_track'. - """ - otio_track.metadata["track-types"] |= track_type - - @staticmethod - def _set_track_types(otio_track, track_type): - """Set the given 'track_type' on the metadata of 'otio_track.""" - otio_track.metadata["track-types"] = track_type - - @staticmethod - def _get_track_types(otio_track): - """ - Get the track types that we set on the metadata of 'otio_track'. - """ - return otio_track.metadata["track-types"] - - @classmethod - def _get_stack_track_types(cls, otio_stack): - """Get the xges track types corresponding to 'otio_stack'.""" - track_types = 0 - for otio_track in otio_stack: - track_types |= cls._get_track_types(otio_track) - return track_types - - @classmethod - def _init_track_types(cls, otio_track): - """Initialise the track type metadat on 'otio_track'.""" - # May overwrite the metadata, but we have a deepcopy of the - # original timeline and track-type is not otherwise used. - cls._set_track_types( - otio_track, GESTrackType.from_otio_kind(otio_track.kind)) - - @classmethod - def _merge_track_in_place(cls, otio_track, merge): - """ - Merge the otio.schema.Track 'merge' into 'otio_track'. - Note that the two tracks should be equal, modulo their track kind. - """ - cls._add_track_types(otio_track, cls._get_track_types(merge)) - - @classmethod - def _equal_track_modulo_kind(cls, otio_track, compare): - """ - Test whether 'otio_track' is equivalent to 'compare', ignoring - any difference in their otio.schema.TrackKind. - """ - otio_track_types = cls._get_track_types(otio_track) - compare_track_types = cls._get_track_types(compare) - if otio_track_types & compare_track_types: - # do not want to merge two tracks if they overlap in - # their track types. Otherwise, we may "loose" a track - # after merging - return False - tmp_kind = compare.kind - compare.kind = otio_track.kind - cls._set_track_types(compare, otio_track_types) - same = otio_track.is_equivalent_to(compare) - compare.kind = tmp_kind - cls._set_track_types(compare, compare_track_types) - return same - - @classmethod - def _merge_tracks_in_stack(cls, otio_stack): - """ - Merge equivalent tracks found in the stack, modulo their track - kind. - """ - index = len(otio_stack) - 1 # start with higher priority - while index > 0: - track = otio_stack[index] - next_track = otio_stack[index - 1] - if cls._equal_track_modulo_kind(track, next_track): - # want to merge if two tracks are the same, except their - # track kind is *different* - # merge down - cls._merge_track_in_place(next_track, track) - del otio_stack[index] - # next track will be the merged one, which allows - # us to merge again. Currently this is redundant since - # there are only two track kinds - index -= 1 - - @classmethod - def _pad_source_range_track(cls, otio_stack): - """ - Go through the children of 'otio_stack'. If we find an - otio.schema.Track with a set source_range, we replace it with an - otio.schema.Track with no source_range. This track will have only - one child, which will be an otio.schema.Stack with the same - source_range. This stack will have only one child, which will be - the original track. - This is done because the source_range of a track is ignored when - converting to xges, but the source_range of a stack is not. - """ - index = 0 - while index < len(otio_stack): - # we are using this form of iteration to make transparent - # that we may be editing the stack's content - child = otio_stack[index] - if isinstance(child, otio.schema.Track) and \ - child.source_range is not None: - # each track will correspond to a layer, but xges can - # not trim a layer, so to account for the source_range, - # we will place the layer below a clip by using - # sub-projects. - # i.e. we will insert above a track and stack, where the - # stack takes the source_range instead - new_track = otio.schema.Track( - name=child.name, - kind=child.kind) - cls._init_track_types(new_track) - new_stack = otio.schema.Stack( - name=child.name, - source_range=child.source_range) - child.source_range = None - otio_stack[index] = new_track - new_track.append(new_stack) - new_stack.append(child) - index += 1 - - @staticmethod - def _pad_double_track(otio_track): - """ - If we find another otio.schema.Track under 'otio_track', we - replace it with an otio.schema.Stack that contains the previous - track as a single child. - This is done because the conversion to xges expects to only find - non-tracks under a track. - """ - index = 0 - while index < len(otio_track): - # we are using this form of iteration to make transparent - # that we may be editing the track's content - child = otio_track[index] - if isinstance(child, otio.schema.Track): - # have two tracks in a row, we expect tracks to be - # below a stack, so we will insert a stack inbetween - insert = otio.schema.Stack(name=child.name) - otio_track[index] = insert - insert.append(child) - index += 1 - - @classmethod - def _pad_non_track_children_of_stack(cls, otio_stack): - """ - If we find a child of 'otio_stack' that is not an - otio.schema.Track, we replace it with a new otio.schema.Track - that contains the previous child as its own single child. - This is done because the conversion to xges expects to only find - tracks under a stack. - """ - index = 0 - while index < len(otio_stack): - # we are using this form of iteration to make transparent - # that we may be editing the stack's content - child = otio_stack[index] - if not isinstance(child, otio.schema.Track): - # we expect a stack to only contain tracks, so we will - # insert a track inbetween - insert = otio.schema.Track(name=child.name) - if isinstance(child, otio.schema.Stack): - cls._set_track_types( - insert, cls._get_stack_track_types(child)) - else: - warnings.warn( - "Found an otio {} object directly under a " - "Stack.\nTreating as a Video and Audio source." - "".format(child.schema_name())) - cls._set_track_types( - insert, GESTrackType.VIDEO | GESTrackType.AUDIO) - otio_stack[index] = insert - insert.append(child) - index += 1 - - @staticmethod - def _move_markers_into(from_otio, into_otio): - """Move the markers found in 'from_otio' into 'into_otio'.""" - for otio_marker in from_otio.markers: - otio_marker.marked_range = from_otio.transformed_time_range( - otio_marker.marked_range, into_otio) - into_otio.markers.append(otio_marker) - if hasattr(from_otio.markers, "clear"): - from_otio.markers.clear() - else: - # TODO: remove below when python2 has ended - # markers has no clear method - while from_otio.markers: - from_otio.markers.pop() - - @classmethod - def _move_markers_to_stack(cls, otio_stack): - """ - Move all the otio.schema.Markers found in the children of - 'otio_stack' into itself. - """ - for otio_track in otio_stack: - cls._move_markers_into(otio_track, otio_stack) - for otio_composable in otio_track: - if isinstance(otio_composable, otio.core.Item) and \ - not isinstance(otio_composable, otio.schema.Stack): - cls._move_markers_into(otio_composable, otio_stack) - - @classmethod - def _perform_bottom_up(cls, func, otio_composable, filter_type): - """ - Perform the given 'func' on all otio composables of the given - 'filter_type' that are found below the given 'otio_composable'. - - This works from the lowest child upwards. - - The given function 'func' should accept a single argument, and - should not change the number or order of siblings within the - arguments's parent, but it is OK to change the children of the - argument. - """ - if isinstance(otio_composable, otio.core.Composition): - for child in otio_composable: - cls._perform_bottom_up(func, child, filter_type) - if isinstance(otio_composable, filter_type): - func(otio_composable) - - def _prepare_timeline(self): - """ - Prepare the timeline given to 'self' for conversion to xges, by - placing it in a desired format. - """ - if self.timeline.tracks.source_range is not None or \ - self.timeline.tracks.effects: - # only xges clips can correctly handle a trimmed - # source_range, so place this stack one layer down. Note - # that a dummy track will soon be inserted between these - # two stacks - # - # if the top stack contains effects, we do the same so that - # we can simply apply the effects to the clip - orig_stack = self.timeline.tracks.deepcopy() - # seem to get an error if we don't copy the stack - self.timeline.tracks = otio.schema.Stack() - self.timeline.tracks.name = orig_stack.name - self.timeline.tracks.append(orig_stack) - # get rid of non-xges metadata. In particular, this will allow - # two otio objects to look the same if they only differ by some - # unused metadata - self._perform_bottom_up( - self._remove_non_xges_metadata, - self.timeline.tracks, otio.core.SerializableObject) - # this needs to be first, to give all tracks the required - # metadata. Any tracks created after this must manually set - # this metadata - self._perform_bottom_up( - self._init_track_types, - self.timeline.tracks, otio.schema.Track) - self._perform_bottom_up( - self._pad_double_track, - self.timeline.tracks, otio.schema.Track) - self._perform_bottom_up( - self._pad_non_track_children_of_stack, - self.timeline.tracks, otio.schema.Stack) - # the next operations must be after the previous ones, to ensure - # that all stacks only contain tracks as items - self._perform_bottom_up( - self._pad_source_range_track, - self.timeline.tracks, otio.schema.Stack) - self._perform_bottom_up( - self._merge_tracks_in_stack, - self.timeline.tracks, otio.schema.Stack) - self._perform_bottom_up( - self._move_markers_to_stack, - self.timeline.tracks, otio.schema.Stack) - - def to_xges(self): - """ - Convert the otio.schema.Timeline given to 'self' into an xges - string. - """ - self._prepare_timeline() - ges = self._serialize_stack_to_ges( - self.timeline.tracks, self.timeline) - # with indentations. - string = ElementTree.tostring(ges, encoding="UTF-8") - dom = minidom.parseString(string) - return dom.toprettyxml(indent=' ') - - -# -------------------- -# adapter requirements -# -------------------- -def read_from_string(input_str): - """ - Necessary read method for otio adapter - - Args: - input_str (str): A GStreamer Editing Services formated project - - Returns: - OpenTimeline: An OpenTimeline object - """ - - return XGES(input_str).to_otio() - - -def write_to_string(input_otio): - """ - Necessary write method for otio adapter - - Args: - input_otio (OpenTimeline): An OpenTimeline object - - Returns: - str: The string contents of an FCP X XML - """ - - return XGESOtio(input_otio).to_xges() - - -# -------------------- -# schemas -# -------------------- - -@otio.core.register_type -class GstStructure(otio.core.SerializableObject): - """ - An OpenTimelineIO Schema that acts as a named dictionary with - typed entries, essentially mimicking the GstStructure of the - GStreamer C library. - - In particular, this schema mimics the gst_structure_to_string and - gst_structure_from_string C methods. As such, it can be used to - read and write the properties and metadatas attributes found in - xges elements. - - Note that the types are to correspond to GStreamer/GES GTypes, - rather than python types. - - Current supported GTypes: - GType Associated Accepted - Python type aliases - ====================================== - gint int int, i - glong int - gint64 int - guint int uint, u - gulong int - guint64 int - gfloat float float, f - gdouble float double, d - gboolean bool boolean, - bool, b - string str or None str, s - GstFraction str or fraction - Fraction - GstStructure GstStructure structure - schema - GstCaps GstCaps - schema - GESMarkerList GESMarkerList - schema - - Note that other types can be given: these must be given as strings - and the user will be responsible for making sure they are already in - a serialized form. - """ - _serializable_label = "GstStructure.1" - - name = otio.core.serializable_field( - "name", str, "The name of the structure") - fields = otio.core.serializable_field( - "fields", dict, "The fields of the structure, of the form:\n" - " {fielname: (type, value), ...}\n" - "where 'fieldname' is a str that names the field, 'type' is " - "a str that names the value type, and 'value' is the actual " - "value. Note that the name of the type corresponds to the " - "GType that would be used in the Gst/GES library, or some " - "accepted alias, rather than the python type.") - - INT_TYPES = ("int", "glong", "gint64") - UINT_TYPES = ("uint", "gulong", "guint64") - FLOAT_TYPES = ("float", "double") - BOOLEAN_TYPE = "boolean" - FRACTION_TYPE = "fraction" - STRING_TYPE = "string" - STRUCTURE_TYPE = "structure" - CAPS_TYPE = "GstCaps" - MARKER_LIST_TYPE = "GESMarkerList" - KNOWN_TYPES = INT_TYPES + UINT_TYPES + FLOAT_TYPES + ( - BOOLEAN_TYPE, FRACTION_TYPE, STRING_TYPE, STRUCTURE_TYPE, - CAPS_TYPE, MARKER_LIST_TYPE) - - TYPE_ALIAS = { - "i": "int", - "gint": "int", - "u": "uint", - "guint": "uint", - "f": "float", - "gfloat": "float", - "d": "double", - "gdouble": "double", - "b": BOOLEAN_TYPE, - "bool": BOOLEAN_TYPE, - "gboolean": BOOLEAN_TYPE, - "GstFraction": FRACTION_TYPE, - "str": STRING_TYPE, - "s": STRING_TYPE, - "GstStructure": STRUCTURE_TYPE - } - - def __init__(self, name=None, fields=None): - otio.core.SerializableObject.__init__(self) - if name is None: - name = "Unnamed" - if fields is None: - fields = {} - name = unicode_to_str(name) - if type(name) is not str: - _wrong_type_for_arg(name, "str", "name") - self._check_name(name) - self.name = name - try: - fields = dict(fields) - except (TypeError, ValueError): - _wrong_type_for_arg(fields, "dict", "fields") - self.fields = {} - for key in fields: - entry = fields[key] - if type(entry) is not tuple: - try: - entry = tuple(entry) - except (TypeError, ValueError): - raise TypeError( - "Expect dict to be filled with tuple-like " - "entries") - if len(entry) != 2: - raise TypeError( - "Expect dict to be filled with 2-entry tuples") - self.set(key, *entry) - - def __repr__(self): - return f"GstStructure({self.name!r}, {self.fields!r})" - - UNKNOWN_PREFIX = "[UNKNOWN]" - - @classmethod - def _make_type_unknown(cls, _type): - return cls.UNKNOWN_PREFIX + _type - # note the sqaure brackets make the type break the TYPE_FORMAT - - @classmethod - def _is_unknown_type(cls, _type): - return _type[:len(cls.UNKNOWN_PREFIX)] == cls.UNKNOWN_PREFIX - - @classmethod - def _get_unknown_type(cls, _type): - return _type[len(cls.UNKNOWN_PREFIX):] - - def _field_to_str(self, key): - """Return field in a serialized form""" - _type, value = self.fields[key] - _type = unicode_to_str(_type) - key = unicode_to_str(key) - value = unicode_to_str(value) - if type(key) is not str: - raise TypeError("Found a key that is not a str type") - if type(_type) is not str: - raise TypeError( - "Found a type name that is not a str type") - self._check_key(key) - _type = self.TYPE_ALIAS.get(_type, _type) - if self._is_unknown_type(_type): - _type = self._get_unknown_type(_type) - self._check_type(_type) - self._check_unknown_typed_value(value) - # already in serialized form - else: - self._check_type(_type) - value = self.serialize_value(_type, value) - return f"{key}=({_type}){value}" - - def _fields_to_str(self): - write = [] - for key in self.fields: - write.append(f", {self._field_to_str(key)}") - return "".join(write) - - def _name_to_str(self): - """Return the name in a serialized form""" - name = unicode_to_str(self.name) - self._check_name(name) - return name - - def __str__(self): - """Emulates gst_structure_to_string""" - return f"{self._name_to_str()}{self._fields_to_str()};" - - def get_type_name(self, key): - """Return the field type""" - _type = self.fields[key][0] - _type = unicode_to_str(_type) - return _type - - def get_value(self, key): - """Return the field value""" - value = self.fields[key][1] - value = unicode_to_str(value) - return value - - def __getitem__(self, key): - return self.get_value(key) - - def __len__(self): - return len(self.fields) - - @staticmethod - def _val_type_err(typ, val, expect): - raise TypeError( - "Received value ({!s}) is a {} rather than a {}, even " - "though the {} type was given".format( - val, type(val).__name__, expect, typ)) - - def set(self, key, _type, value): - """Set a field to the given typed value""" - key = unicode_to_str(key) - _type = unicode_to_str(_type) - value = unicode_to_str(value) - if type(key) is not str: - _wrong_type_for_arg(key, "str", "key") - if type(_type) is not str: - _wrong_type_for_arg(_type, "str", "_type") - _type = self.TYPE_ALIAS.get(_type, _type) - if self.fields.get(key) == (_type, value): - return - self._check_key(key) - type_is_unknown = True - if self._is_unknown_type(_type): - # this can happen if the user is setting a GstStructure - # using a preexisting GstStructure, the type will then - # be passed and marked as unknown - _type = self._get_unknown_type(_type) - self._check_type(_type) - else: - self._check_type(_type) - if _type in self.INT_TYPES: - type_is_unknown = False - # TODO: simply check for int once python2 has ended - # currently in python2, can receive either an int or - # a long - if not isinstance(value, numbers.Integral): - self._val_type_err(_type, value, "int") - elif _type in self.UINT_TYPES: - type_is_unknown = False - # TODO: simply check for int once python2 has ended - # currently in python2, can receive either an int or - # a long - if not isinstance(value, numbers.Integral): - self._val_type_err(_type, value, "int") - if value < 0: - raise InvalidValueError( - "value", value, "a positive integer for {} " - "types".format(_type)) - elif _type in self.FLOAT_TYPES: - type_is_unknown = False - if type(value) is not float: - self._val_type_err(_type, value, "float") - elif _type == self.BOOLEAN_TYPE: - type_is_unknown = False - if type(value) is not bool: - self._val_type_err(_type, value, "bool") - elif _type == self.FRACTION_TYPE: - type_is_unknown = False - if type(value) is Fraction: - value = str(value) # store internally as a str - elif type(value) is str: - try: - Fraction(value) - except ValueError: - raise InvalidValueError( - "value", value, "a fraction for the {} " - "types".format(_type)) - else: - self._val_type_err(_type, value, "Fraction or str") - elif _type == self.STRING_TYPE: - type_is_unknown = False - if value is not None and type(value) is not str: - self._val_type_err(_type, value, "str or None") - elif _type == self.STRUCTURE_TYPE: - type_is_unknown = False - if not isinstance(value, GstStructure): - self._val_type_err(_type, value, "GstStructure") - elif _type == self.CAPS_TYPE: - type_is_unknown = False - if not isinstance(value, GstCaps): - self._val_type_err(_type, value, "GstCaps") - elif _type == self.MARKER_LIST_TYPE: - type_is_unknown = False - if not isinstance(value, GESMarkerList): - self._val_type_err(_type, value, "GESMarkerList") - if type_is_unknown: - self._check_unknown_typed_value(value) - warnings.warn( - "The GstStructure type {} with the value ({}) is " - "unknown. The value will be stored and serialized as " - "given.".format(_type, value)) - _type = self._make_type_unknown(_type) - self.fields[key] = (_type, value) - # NOTE: in python2, otio will convert a str value to a unicode - - def get(self, key, default=None): - """Return the raw value associated with key""" - if key in self.fields: - value = self.get_value(key) - value = unicode_to_str(value) - return value - return default - - def get_typed(self, key, expect_type, default=None): - """ - Return the raw value associated with key if its type matches. - Raises a warning if a value exists under key but is of the - wrong type. - """ - expect_type = unicode_to_str(expect_type) - if type(expect_type) is not str: - _wrong_type_for_arg(expect_type, "str", "expect_type") - expect_type = self.TYPE_ALIAS.get(expect_type, expect_type) - if key in self.fields: - type_name = self.get_type_name(key) - if expect_type == type_name: - value = self.get_value(key) - value = unicode_to_str(value) - return value - warnings.warn( - "The structure {} contains a value under {}, but is " - "a {}, rather than the expected {} type".format( - self.name, key, type_name, expect_type)) - return default - - def values(self): - """Return a list of all values contained in the structure""" - return [self.get_value(key) for key in self.fields] - - def values_of_type(self, _type): - """ - Return a list of all values contained of the given type in the - structure - """ - _type = unicode_to_str(_type) - if type(_type) is not str: - _wrong_type_for_arg(_type, "str", "_type") - _type = self.TYPE_ALIAS.get(_type, _type) - return [self.get_value(key) for key in self.fields - if self.get_type_name(key) == _type] - - ASCII_SPACES = r"(\\?[ \t\n\r\f\v])*" - END_FORMAT = r"(?P<end>" + ASCII_SPACES + r")" - NAME_FORMAT = r"(?P<name>[a-zA-Z][a-zA-Z0-9/_.:-]*)" - # ^Format requirement for the name of a GstStructure - SIMPLE_STRING = r"[a-zA-Z0-9_+/:.-]+" - # see GST_ASCII_CHARS (below) - KEY_FORMAT = r"(?P<key>" + SIMPLE_STRING + r")" - # NOTE: GstStructure technically allows more general keys, but - # these can break the parsing. - TYPE_FORMAT = r"(?P<type>" + SIMPLE_STRING + r")" - BASIC_VALUE_FORMAT = \ - r'(?P<value>("(\\.|[^"])*")|(' + SIMPLE_STRING + r'))' - # consume simple string or a string between quotes. Second will - # consume anything that is escaped, including a '"' - # NOTE: \\. is used rather than \\" since: - # + '"start\"end;"' should be captured as '"start\"end"' since - # the '"' is escaped. - # + '"start\\"end;"' should be captured as '"start\\"' since the - # '\' is escaped, not the '"' - # In the fist case \\. will consume '\"', and in the second it will - # consumer '\\', as desired. The second would not work with just \\" - - # TODO: remove the trailing '$' when python2 has ended and use - # re's fullmatch rather than match (not available in python2) - - @staticmethod - def _check_against_regex(check, regex, name): - # TODO: once python2 has ended, use 'fullmatch' - if not regex.match(check): - raise InvalidValueError( - name, check, "to match the regular expression {}" - "".format(regex.pattern)) - - # TODO: once python2 has ended, we can drop the trailing $ and use - # re.fullmatch in _check_against_regex - NAME_REGEX = re.compile(NAME_FORMAT + "$") - KEY_REGEX = re.compile(KEY_FORMAT + "$") - TYPE_REGEX = re.compile(TYPE_FORMAT + "$") - - @classmethod - def _check_name(cls, name): - cls._check_against_regex(name, cls.NAME_REGEX, "name") - - @classmethod - def _check_key(cls, key): - cls._check_against_regex(key, cls.KEY_REGEX, "key") - - @classmethod - def _check_type(cls, _type): - cls._check_against_regex(_type, cls.TYPE_REGEX, "type") - - @classmethod - def _check_unknown_typed_value(cls, value): - if type(value) is not str: - cls._val_type_err("unknown", value, "string") - try: - # see if the value could be successfully parsed in again - ret_type, ret_val, _ = cls._parse_value(value, False) - except DeserializeError as err: - raise InvalidValueError( - "value", value, "unknown-typed values to be in a " - "serialized format ({!s})".format(err)) - else: - if ret_type is not None: - raise InvalidValueError( - "value", value, "unknown-typed values to *not* " - "start with a type specification, only the " - "serialized value should be given") - if ret_val != value: - raise InvalidValueError( - "value", value, "unknown-typed values to be the " - "same as its parsed value {}".format(ret_val)) - - PARSE_NAME_REGEX = re.compile( - ASCII_SPACES + NAME_FORMAT + END_FORMAT) - - @classmethod - def _parse_name(cls, read): - match = cls.PARSE_NAME_REGEX.match(read) - if match is None: - raise DeserializeError( - read, "does not start with a correct name") - name = match.group("name") - read = read[match.end("end"):] - return name, read - - @classmethod - def _parse_range_list_array(cls, read): - start = read[0] - end = {'[': ']', '{': '}', '<': '>'}.get(start) - read = read[1:] - values = [start, ' '] - first = True - while read and read[0] != end: - if first: - first = False - else: - if read and read[0] != ',': - DeserializeError( - read, "does not contain a comma between listed " - "items") - values.append(", ") - read = read[1:] - _type, value, read = cls._parse_value(read, False) - if _type is not None: - if cls._is_unknown_type(_type): - # remove unknown marker for serialization - _type = cls._get_unknown_type(_type) - values.extend(('(', _type, ')')) - values.append(value) - if not read: - raise DeserializeError( - read, f"ended before {end} could be found") - read = read[1:] # skip past 'end' - match = cls.END_REGEX.match(read) # skip whitespace - read = read[match.end("end"):] - # NOTE: we are ignoring the incorrect cases where a range - # has 0, 1 or 4+ values! This is the users responsiblity. - values.extend((' ', end)) - return "".join(values), read - - FIELD_START_REGEX = re.compile( - ASCII_SPACES + KEY_FORMAT + ASCII_SPACES + r"=" + END_FORMAT) - FIELD_TYPE_REGEX = re.compile( - ASCII_SPACES + r"(\(" + ASCII_SPACES + TYPE_FORMAT - + ASCII_SPACES + r"\))?" + END_FORMAT) - FIELD_VALUE_REGEX = re.compile( - ASCII_SPACES + BASIC_VALUE_FORMAT + END_FORMAT) - END_REGEX = re.compile(END_FORMAT) - - @classmethod - def _parse_value(cls, read, deserialize=True): - match = cls.FIELD_TYPE_REGEX.match(read) - # match shouldn't be None since the (TYPE_FORMAT) is optional - # and the rest is just ASCII_SPACES - _type = match.group("type") - if _type is None and deserialize: - # if deserialize is False, the (type) is optional - raise DeserializeError( - read, "does not contain a valid '(type)' format") - _type = cls.TYPE_ALIAS.get(_type, _type) - type_is_unknown = True - read = read[match.end("end"):] - if read and read[0] in ('[', '{', '<'): - # range/list/array types - # this is an unknown type, even though _type itself may - # be known. e.g. a list on integers will have _type as 'int' - # but the corresponding value can not be deserialized as an - # integer - value, read = cls._parse_range_list_array(read) - if deserialize: - # prevent printing on subsequent calls if we find a - # list within a list, etc. - warnings.warn( - "GstStructure received a range/list/array of type " - "{}, which can not be deserialized. Storing the " - "value as {}.".format(_type, value)) - else: - match = cls.FIELD_VALUE_REGEX.match(read) - if match is None: - raise DeserializeError( - read, "does not have a valid value format") - read = read[match.end("end"):] - value = match.group("value") - if deserialize: - if _type in cls.KNOWN_TYPES: - type_is_unknown = False - try: - value = cls.deserialize_value(_type, value) - except DeserializeError as err: - raise DeserializeError( - read, "contains an invalid typed value " - "({!s})".format(err)) - else: - warnings.warn( - "GstStructure found a type {} that is unknown. " - "The corresponding value ({}) will not be " - "deserialized and will be stored as given." - "".format(_type, value)) - if type_is_unknown and _type is not None: - _type = cls._make_type_unknown(_type) - return _type, value, read - - @classmethod - def _parse_field(cls, read): - match = cls.FIELD_START_REGEX.match(read) - if match is None: - raise DeserializeError( - read, "does not have a valid 'key=...' format") - key = match.group("key") - read = read[match.end("end"):] - _type, value, read = cls._parse_value(read) - return key, _type, value, read - - @classmethod - def _parse_fields(cls, read): - read = unicode_to_str(read) - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - fields = {} - while read and read[0] != ';': - if read and read[0] != ',': - DeserializeError( - read, "does not separate fields with commas") - read = read[1:] - key, _type, value, read = cls._parse_field(read) - fields[key] = (_type, value) - if read: - # read[0] == ';' - read = read[1:] - return fields, read - - @classmethod - def new_from_str(cls, read): - """ - Returns a new instance of GstStructure, based on the Gst library - function gst_structure_from_string. - Strings obtained from the GstStructure str() method can be - parsed in to recreate the original GstStructure. - """ - read = unicode_to_str(read) - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - name, read = cls._parse_name(read) - fields = cls._parse_fields(read)[0] - return GstStructure(name=name, fields=fields) - - @staticmethod - def _val_read_err(typ, val): - raise DeserializeError( - val, f"does not translated to the {typ} type") - - @classmethod - def deserialize_value(cls, _type, value): - """Return the value as the corresponding type""" - _type = unicode_to_str(_type) - if type(_type) is not str: - _wrong_type_for_arg(_type, "str", "_type") - value = unicode_to_str(value) - if type(value) is not str: - _wrong_type_for_arg(value, "str", "value") - _type = cls.TYPE_ALIAS.get(_type, _type) - if _type in cls.INT_TYPES or _type in cls.UINT_TYPES: - try: - value = int(value) - except ValueError: - cls._val_read_err(_type, value) - if _type in cls.UINT_TYPES and value < 0: - cls._val_read_err(_type, value) - elif _type in cls.FLOAT_TYPES: - try: - value = float(value) - except ValueError: - cls._val_read_err(_type, value) - elif _type == cls.BOOLEAN_TYPE: - try: - value = cls.deserialize_boolean(value) - except DeserializeError: - cls._val_read_err(_type, value) - elif _type == cls.FRACTION_TYPE: - try: - value = str(Fraction(value)) # store internally as a str - except ValueError: - cls._val_read_err(_type, value) - elif _type == cls.STRING_TYPE: - try: - value = cls.deserialize_string(value) - except DeserializeError as err: - raise DeserializeError( - value, "does not translate to a string ({!s})" - "".format(err)) - elif _type == cls.STRUCTURE_TYPE: - try: - value = cls.deserialize_structure(value) - except DeserializeError as err: - raise DeserializeError( - value, "does not translate to a GstStructure ({!s})" - "".format(err)) - elif _type == cls.CAPS_TYPE: - try: - value = cls.deserialize_caps(value) - except DeserializeError as err: - raise DeserializeError( - value, "does not translate to a GstCaps ({!s})" - "".format(err)) - elif _type == cls.MARKER_LIST_TYPE: - try: - value = cls.deserialize_marker_list(value) - except DeserializeError as err: - raise DeserializeError( - value, "does not translate to a GESMarkerList " - "({!s})".format(err)) - else: - raise ValueError( - "The type {} is unknown, so the value ({}) can not " - "be deserialized.".format(_type, value)) - return value - - @classmethod - def serialize_value(cls, _type, value): - """Serialize the typed value as a string""" - _type = unicode_to_str(_type) - if type(_type) is not str: - _wrong_type_for_arg(_type, "str", "_type") - value = unicode_to_str(value) - _type = cls.TYPE_ALIAS.get(_type, _type) - if _type in cls.INT_TYPES + cls.UINT_TYPES + cls.FLOAT_TYPES \ - + (cls.FRACTION_TYPE, ): - return str(value) - if _type == cls.BOOLEAN_TYPE: - return cls.serialize_boolean(value) - if _type == cls.STRING_TYPE: - return cls.serialize_string(value) - if _type == cls.STRUCTURE_TYPE: - return cls.serialize_structure(value) - if _type == cls.CAPS_TYPE: - return cls.serialize_caps(value) - if _type == cls.MARKER_LIST_TYPE: - return cls.serialize_marker_list(value) - raise ValueError( - "The type {} is unknown, so the value ({}) can not be " - "serialized.".format(_type, str(value))) - - # see GST_ASCII_IS_STRING in gst_private.h - GST_ASCII_CHARS = [ - ord(letter) for letter in - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789" - "_-+/:." - ] - LEADING_OCTAL_CHARS = [ord(letter) for letter in "0123"] - OCTAL_CHARS = [ord(letter) for letter in "01234567"] - - @classmethod - def serialize_string(cls, value): - """ - Emulates gst_value_serialize_string. - Accepts a bytes, str or None type. - Returns a str type. - """ - if value is not None and type(value) is not str: - _wrong_type_for_arg(value, "None or str", "value") - return cls._wrap_string(value) - - @classmethod - def _wrap_string(cls, read): - if read is None: - return "NULL" - if read == "NULL": - return "\"NULL\"" - if type(read) is bytes: - # NOTE: in python2 this will be True if read is a str type - # in python3 it will not - pass - elif type(read) is str: - read = read.encode() - else: - _wrong_type_for_arg(read, "None, str, or bytes", "read") - if not read: - return '""' - added_wrap = False - ser_string_list = [] - for byte in bytearray(read): - # For python3 we could have just called `byte in read` - # For python2 we need the `bytearray(read)` cast to convert - # the str type to int - # TODO: simplify once python2 has ended - if byte in cls.GST_ASCII_CHARS: - ser_string_list.append(chr(byte)) - elif byte < 0x20 or byte >= 0x7f: - ser_string_list.append(f"\\{byte:03o}") - added_wrap = True - else: - ser_string_list.append("\\" + chr(byte)) - added_wrap = True - if added_wrap: - ser_string_list.insert(0, '"') - ser_string_list.append('"') - return "".join(ser_string_list) - - @classmethod - def deserialize_string(cls, read): - """ - Emulates gst_value_deserialize_string. - Accepts a str type. - Returns a str or None type. - """ - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - if read == "NULL": - return None - if not read: - return "" - if read[0] != '"' or read[-1] != '"': - return read - return cls._unwrap_string(read) - - @classmethod - def _unwrap_string(cls, read): - """Emulates gst_string_unwrap""" - if type(read) is bytes: - # TODO: remove once python2 has ended - read_array = bytearray(read) - else: - read_array = bytearray(read.encode()) - byte_list = [] - bytes_iter = iter(read_array) - - def next_byte(): - try: - return next(bytes_iter) - except StopIteration: - raise DeserializeError(read, "end unexpectedly") - - byte = next_byte() - if byte != ord('"'): - raise DeserializeError( - read, "does not start with '\"', but ends with '\"'") - while True: - byte = next_byte() - if byte in cls.GST_ASCII_CHARS: - byte_list.append(byte) - elif byte == ord('"'): - try: - next(bytes_iter) - except StopIteration: - # expect there to be no more bytes - break - raise DeserializeError( - read, "contains an un-escaped '\"' before the end") - elif byte == ord('\\'): - byte = next_byte() - if byte in cls.LEADING_OCTAL_CHARS: - # could be the start of an octal - byte2 = next_byte() - byte3 = next_byte() - if byte2 in cls.OCTAL_CHARS and byte3 in cls.OCTAL_CHARS: - nums = [b - ord('0') for b in (byte, byte2, byte3)] - byte = (nums[0] << 6) + (nums[1] << 3) + nums[2] - byte_list.append(byte) - else: - raise DeserializeError( - read, "contains the start of an octal " - "sequence but not the end") - else: - if byte == 0: - raise DeserializeError( - read, "contains a null byte after an escape") - byte_list.append(byte) - else: - raise DeserializeError( - read, "contains an unexpected un-escaped character") - out_str = bytes(bytearray(byte_list)) - if type(out_str) is str: - # TODO: remove once python2 has ended - # and simplify above to only call bytes(byte_list) - return out_str - try: - return out_str.decode() - except (UnicodeError, ValueError): - raise DeserializeError( - read, "contains invalid utf-8 byte sequences") - - @staticmethod - def serialize_boolean(value): - """ - Emulates gst_value_serialize_boolean. - Accepts bool type. - Returns a str type. - """ - if type(value) is not bool: - _wrong_type_for_arg(value, "bool", "value") - if value: - return "true" - return "false" - - @staticmethod - def deserialize_boolean(read): - """ - Emulates gst_value_deserialize_boolean. - Accepts str type. - Returns a bool type. - """ - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - if read.lower() in ("true", "t", "yes", "1"): - return True - if read.lower() in ("false", "f", "no", "0"): - return False - raise DeserializeError(read, "is an unknown boolean value") - - @classmethod - def serialize_structure(cls, value): - """ - Emulates gst_value_serialize_structure. - Accepts a GstStructure. - Returns a str type. - """ - if not isinstance(value, GstStructure): - _wrong_type_for_arg(value, "GstStructure", "value") - return cls._wrap_string(str(value)) - - @classmethod - def deserialize_structure(cls, read): - """ - Emulates gst_value_serialize_structure. - Accepts a str type. - Returns a GstStructure. - """ - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - if read[0] == '"': - # NOTE: since all GstStructure strings end with ';', we - # don't ever expect the above to *not* be true, but the - # GStreamer library allows for this case - try: - read = cls._unwrap_string(read) - # NOTE: in the GStreamer library, serialized - # GstStructure and GstCaps strings are sent to - # _priv_gst_value_parse_string with unescape set to - # TRUE. What this essentially does is replace "\x" with - # just "x". Since caps and structure strings should only - # contain printable ascii characters before they are - # passed to _wrap_string, this should be equivalent to - # calling _unwrap_string. Our method is more clearly a - # reverse of the serialization method. - except DeserializeError as err: - raise DeserializeError( - read, "could not be unwrapped as a string ({!s})" - "".format(err)) - return GstStructure.new_from_str(read) - - @classmethod - def serialize_caps(cls, value): - """ - Emulates gst_value_serialize_caps. - Accepts a GstCaps. - Returns a str type. - """ - if not isinstance(value, GstCaps): - _wrong_type_for_arg(value, "GstCaps", "value") - return cls._wrap_string(str(value)) - - @classmethod - def deserialize_caps(cls, read): - """ - Emulates gst_value_serialize_caps. - Accepts a str type. - Returns a GstCaps. - """ - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - if read[0] == '"': - # can be not true if a caps only contains a single empty - # structure, or is ALL or NONE - try: - read = cls._unwrap_string(read) - except DeserializeError as err: - raise DeserializeError( - read, "could not be unwrapped as a string ({!s})" - "".format(err)) - return GstCaps.new_from_str(read) - - @classmethod - def serialize_marker_list(cls, value): - """ - Emulates ges_marker_list_serialize. - Accepts a GESMarkerList. - Returns a str type. - """ - if not isinstance(value, GESMarkerList): - _wrong_type_for_arg(value, "GESMarkerList", "value") - caps = GstCaps() - for marker in value.markers: - caps.append(GstStructure( - "marker-times", - {"position": ("guint64", marker.position)})) - caps.append(marker.metadatas) - # NOTE: safe to give the metadatas to the caps since we - # will not be using caps after this function - # i.e. the caller will still have essential ownership of - # the matadatas - return cls._escape_string(str(caps)) - - @staticmethod - def _escape_string(read): - """ - Emulates some of g_strescape's behaviour in - ges_marker_list_serialize - """ - # NOTE: in the original g_strescape, all the special characters - # '\b', '\f', '\n', '\r', '\t', '\v', '\' and '"' are escaped, - # and all characters in the range 0x01-0x1F and non-ascii - # characters are replaced by an octal sequence - # (similar to _wrap_string). - # However, a caps string should only contain printable ascii - # characters, so it should be sufficient to simply escape '\' - # and '"'. - escaped = ['"'] - for character in read: - if character in ('"', '\\'): - escaped.append('\\') - escaped.append(character) - escaped.append('"') - return "".join(escaped) - - @classmethod - def deserialize_marker_list(cls, read): - """ - Emulates ges_marker_list_deserialize. - Accepts a str type. - Returns a GESMarkerList. - """ - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - read = cls._unescape_string(read) - # Above is actually performed by _priv_gst_value_parse_value, - # but it is called immediately before gst_value_deserialize - caps = GstCaps.new_from_str(read) - if len(caps) % 2: - raise DeserializeError( - read, "does not contain an even-sized caps") - position = None - marker_list = GESMarkerList() - for index, (struct, _) in enumerate(caps.structs): - if index % 2 == 0: - if struct.name != "marker-times": - raise DeserializeError( - read, "contains a structure named {} rather " - "than the expected \"marker-times\"".format( - struct.name)) - if "position" not in struct.fields: - raise DeserializeError( - read, "is missing a position value") - if struct.get_type_name("position") != "guint64": - raise DeserializeError( - read, "does not have a guint64 typed position") - position = struct["position"] - else: - marker_list.add(GESMarker(position, struct)) - return marker_list - - @staticmethod - def _unescape_string(read): - """ - Emulates behaviour of _priv_gst_value_parse_string with - unescape set to TRUE. This should undo _escape_string - """ - if read[0] != '"': - return read - character_iter = iter(read) - - def next_char(): - try: - return next(character_iter) - except StopIteration: - raise DeserializeError(read, "ends unexpectedly") - - next_char() # skip '"' - unescaped = [] - while True: - character = next_char() - if character == '"': - break - if character == '\\': - unescaped.append(next_char()) - else: - unescaped.append(character) - return "".join(unescaped) - - -@otio.core.register_type -class GstCapsFeatures(otio.core.SerializableObject): - """ - An OpenTimelineIO Schema that contains a collection of features, - mimicking a GstCapsFeatures of the Gstreamer C libarary. - """ - _serializable_label = "GstCapsFeatures.1" - is_any = otio.core.serializable_field( - "is_any", bool, "Whether a GstCapsFeatures matches any. If " - "True, then features must be empty.") - features = otio.core.serializable_field( - "features", list, "A list of features, as strings") - - def __init__(self, *features): - """ - Initialize the GstCapsFeatures. - - 'features' should be a series of feature names as strings. - """ - otio.core.SerializableObject.__init__(self) - self.is_any = False - self.features = [] - for feature in features: - feature = unicode_to_str(feature) - if type(feature) is not str: - _wrong_type_for_arg(feature, "strs", "features") - self._check_feature(feature) - self.features.append(feature) - # NOTE: if 'features' is a str, rather than a list of strs - # then this will iterate through all of its characters! But, - # a single character can not match the feature regular - # expression. - - def __getitem__(self, index): - return self.features[index] - - def __len__(self): - return len(self.features) - - @classmethod - def new_any(cls): - features = cls() - features.is_any = True - return features - - # Based on gst_caps_feature_name_is_valid - FEATURE_FORMAT = r"(?P<feature>[a-zA-Z]*:[a-zA-Z][a-zA-Z0-9]*)" - # TODO: once python2 has ended, we can drop the trailing $ and use - # re.fullmatch in _check_feature - FEATURE_REGEX = re.compile(FEATURE_FORMAT + "$") - - @classmethod - def _check_feature(cls, feature): - # TODO: once python2 has ended, use 'fullmatch' - if not cls.FEATURE_REGEX.match(feature): - raise InvalidValueError( - "feature", feature, "to match the regular expression " - "{}".format(cls.FEATURE_REGEX.pattern)) - - PARSE_FEATURE_REGEX = re.compile( - r" *" + FEATURE_FORMAT + "(?P<end>)") - - @classmethod - def new_from_str(cls, read): - """ - Returns a new instance of GstCapsFeatures, based on the Gst - library function gst_caps_features_from_string. - Strings obtained from the GstCapsFeatures str() method can be - parsed in to recreate the original GstCapsFeatures. - """ - read = unicode_to_str(read) - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - if read == "ANY": - return cls.new_any() - first = True - features = [] - while read: - if first: - first = False - else: - if read[0] != ',': - DeserializeError( - read, "does not separate features with commas") - read = read[1:] - match = cls.PARSE_FEATURE_REGEX.match(read) - if match is None: - raise DeserializeError( - read, "does not match the regular expression {}" - "".format(cls.PARSE_FEATURE_REGEX.pattern)) - features.append(match.group("feature")) - read = read[match.end("end"):] - return cls(*features) - - def __repr__(self): - if self.is_any: - return "GstCapsFeatures.new_any()" - write = ["GstCapsFeatures("] - first = True - for feature in self.features: - if first: - first = False - else: - write.append(", ") - write.append(repr(feature)) - write.append(")") - return "".join(write) - - def __str__(self): - """Emulate gst_caps_features_to_string""" - if not self.features and self.is_any: - return "ANY" - write = [] - first = True - for feature in self.features: - feature = unicode_to_str(feature) - if type(feature) is not str: - raise TypeError( - "Found a feature that is not a str type") - if first: - first = False - else: - write.append(", ") - write.append(feature) - return "".join(write) - - -@otio.core.register_type -class GstCaps(otio.core.SerializableObject): - """ - An OpenTimelineIO Schema that acts as an ordered collection of - GstStructures, essentially mimicking the GstCaps of the Gstreamer C - libarary. Each GstStructure is linked to a GstCapsFeatures, which is - a list of features. - - In particular, this schema mimics the gst_caps_to_string and - gst_caps_from_string C methods. - """ - _serializable_label = "GstCaps.1" - - structs = otio.core.serializable_field( - "structs", list, "A list of GstStructures and GstCapsFeatures, " - "of the form:\n" - " (struct, features)\n" - "where 'struct' is a GstStructure, and 'features' is a " - "GstCapsFeatures") - flags = otio.core.serializable_field( - "flags", int, "Additional GstCapsFlags on the GstCaps") - - GST_CAPS_FLAG_ANY = 1 << 4 - # from GST_MINI_OBJECT_FLAG_LAST - - def __init__(self, *structs): - """ - Initialize the GstCaps. - - 'structs' should be a series of GstStructures, and - GstCapsFeatures pairs: - struct0, features0, struct1, features1, ... - None may be given in place of a GstCapsFeatures, in which case - an empty features is assigned to the structure. - - Note, this instance will need to take ownership of any given - GstStructure or GstCapsFeatures. - """ - otio.core.SerializableObject.__init__(self) - if len(structs) % 2: - raise InvalidValueError( - "*structs", structs, "an even number of arguments") - self.flags = 0 - self.structs = [] - struct = None - for index, arg in enumerate(structs): - if index % 2 == 0: - struct = arg - else: - self.append(struct, arg) - - def get_structure(self, index): - """Return the GstStructure at the given index""" - return self.structs[index][0] - - def get_features(self, index): - """Return the GstStructure at the given index""" - return self.structs[index][1] - - def __getitem__(self, index): - return self.get_structure(index) - - def __len__(self): - return len(self.structs) - - @classmethod - def new_any(cls): - caps = cls() - caps.flags = cls.GST_CAPS_FLAG_ANY - return caps - - def is_any(self): - return self.flags & self.GST_CAPS_FLAG_ANY != 0 - - FEATURES_FORMAT = r"\((?P<features>[^)]*)\)" - NAME_FEATURES_REGEX = re.compile( - GstStructure.ASCII_SPACES + GstStructure.NAME_FORMAT - + r"(" + FEATURES_FORMAT + r")?" + GstStructure.END_FORMAT) - - @classmethod - def new_from_str(cls, read): - """ - Returns a new instance of GstCaps, based on the Gst library - function gst_caps_from_string. - Strings obtained from the GstCaps str() method can be parsed in - to recreate the original GstCaps. - """ - read = unicode_to_str(read) - if type(read) is not str: - _wrong_type_for_arg(read, "str", "read") - if read == "ANY": - return cls.new_any() - if read in ("EMPTY", "NONE"): - return cls() - structs = [] - # restriction-caps is otherwise serialized in the format: - # "struct-name-nums(feature), " - # "field1=(type1)val1, field2=(type2)val2; " - # "struct-name-alphas(feature), " - # "fieldA=(typeA)valA, fieldB=(typeB)valB" - # Note the lack of ';' for the last structure, and the - # '(feature)' is optional. - # - # NOTE: gst_caps_from_string also accepts: - # "struct-name(feature" - # without the final ')', but this must be the end of the string, - # but we will require that this final ')' is still given - while read: - match = cls.NAME_FEATURES_REGEX.match(read) - if match is None: - raise DeserializeError( - read, "does not match the regular expression {}" - "".format(cls.NAME_FEATURE_REGEX.pattern)) - read = read[match.end("end"):] - name = match.group("name") - features = match.group("features") - # NOTE: features may be None since the features part of the - # regular expression is optional - if features is None: - features = GstCapsFeatures() - else: - features = GstCapsFeatures.new_from_str(features) - fields, read = GstStructure._parse_fields(read) - structs.append(GstStructure(name, fields)) - structs.append(features) - return cls(*structs) - - def __repr__(self): - if self.is_any(): - return "GstCaps.new_any()" - write = ["GstCaps("] - first = True - for struct in self.structs: - if first: - first = False - else: - write.append(", ") - write.append(repr(struct[0])) - write.append(", ") - write.append(repr(struct[1])) - write.append(")") - return "".join(write) - - def __str__(self): - """Emulate gst_caps_to_string""" - if self.is_any(): - return "ANY" - if not self.structs: - return "EMPTY" - first = True - write = [] - for struct, features in self.structs: - if first: - first = False - else: - write.append("; ") - write.append(struct._name_to_str()) - if features.is_any or features.features: - # NOTE: is gst_caps_to_string, the feature will not - # be written if it only contains the - # GST_FEATURE_MEMORY_SYSTEM_MEMORY feature, since this - # considered equal to being an empty features. - # We do not seem to require this behaviour - write.append(f"({features!s})") - write.append(struct._fields_to_str()) - return "".join(write) - - def append(self, structure, features=None): - """Append a structure with the given features""" - if not isinstance(structure, GstStructure): - _wrong_type_for_arg(structure, "GstStructure", "structure") - if features is None: - features = GstCapsFeatures() - if not isinstance(features, GstCapsFeatures): - _wrong_type_for_arg( - features, "GstCapsFeatures or None", "features") - self.structs.append((structure, features)) - - -@otio.core.register_type -class GESMarker(otio.core.SerializableObject): - """ - An OpenTimelineIO Schema that is a timestamp with metadata, - essentially mimicking the GstMarker of the GES C libarary. - """ - _serializable_label = "GESMarker.1" - - position = otio.core.serializable_field( - "position", int, "The timestamp of the marker as a " - "GstClockTime (unsigned integer time in nanoseconds)") - - metadatas = otio.core.serializable_field( - "metadatas", GstStructure, "The metadatas associated with the " - "position") - - def __init__(self, position=0, metadatas=None): - """ - Note, this instance will need to take ownership of any given - GstSructure. - """ - otio.core.SerializableObject.__init__(self) - if metadatas is None: - metadatas = GstStructure("metadatas") - if type(position) is not int: - # TODO: remove below once python2 has ended - # currently in python2, can receive either an int or - # a long - if isinstance(position, numbers.Integral): - position = int(position) - # may still be an int if the position is too big - if type(position) is not int: - _wrong_type_for_arg(position, "int", "position") - if position < 0: - raise InvalidValueError( - "position", position, "a positive integer") - - if not isinstance(metadatas, GstStructure): - _wrong_type_for_arg(metadatas, "GstStructure", "metadatas") - _force_gst_structure_name(metadatas, "metadatas", "GESMarker") - self.position = position - self.metadatas = metadatas - - GES_META_MARKER_COLOR = "marker-color" - - def set_color_from_argb(self, argb): - """Set the color of the marker using the AARRGGBB hex value""" - if not isinstance(argb, int): - _wrong_type_for_arg(argb, "int", "argb") - if argb < 0 or argb > 0xffffffff: - raise InvalidValueError( - "argb", argb, "an unsigned 8 digit AARRGGBB hexadecimal") - self.metadatas.set(self.GES_META_MARKER_COLOR, "uint", argb) - - def is_colored(self): - """Return whether a marker is colored""" - return self.GES_META_MARKER_COLOR in self.metadatas.fields - - def get_argb_color(self): - """Return the markers color, or None if it has not been set""" - if self.is_colored: - return self.metadatas[self.GES_META_MARKER_COLOR] - return None - - OTIO_COLOR_TO_ARGB = { - otio.schema.MarkerColor.RED: 0xffff0000, - otio.schema.MarkerColor.PINK: 0xffff7070, - otio.schema.MarkerColor.ORANGE: 0xffffa000, - otio.schema.MarkerColor.YELLOW: 0xffffff00, - otio.schema.MarkerColor.GREEN: 0xff00ff00, - otio.schema.MarkerColor.CYAN: 0xff00ffff, - otio.schema.MarkerColor.BLUE: 0xff0000ff, - otio.schema.MarkerColor.PURPLE: 0xffa000d0, - otio.schema.MarkerColor.MAGENTA: 0xffff00ff, - otio.schema.MarkerColor.WHITE: 0xffffffff, - otio.schema.MarkerColor.BLACK: 0xff000000 - } - - def set_color_from_otio_color(self, otio_color): - """ - Set the color of the marker using to an otio color, by mapping it - to a corresponding argb color. - """ - if otio_color not in self.OTIO_COLOR_TO_ARGB: - raise InvalidValueError( - "otio_color", otio_color, "an otio.schema.MarkerColor") - self.set_color_from_argb(self.OTIO_COLOR_TO_ARGB[otio_color]) - - @staticmethod - def _otio_color_from_hue(hue): - """Return an otio color, based on hue in [0.0, 1.0]""" - if hue <= 0.04 or hue > 0.93: - return otio.schema.MarkerColor.RED - if hue <= 0.13: - return otio.schema.MarkerColor.ORANGE - if hue <= 0.2: - return otio.schema.MarkerColor.YELLOW - if hue <= 0.43: - return otio.schema.MarkerColor.GREEN - if hue <= 0.52: - return otio.schema.MarkerColor.CYAN - if hue <= 0.74: - return otio.schema.MarkerColor.BLUE - if hue <= 0.82: - return otio.schema.MarkerColor.PURPLE - return otio.schema.MarkerColor.MAGENTA - - def get_nearest_otio_color(self): - """ - Return an otio.schema.MarkerColor based on the markers argb color, - or None if it has not been set. - For colors close to the otio color set, this should return the - expected color name. - For edge cases, the 'correct' color is more apparently subjective. - This method does not work well for colors that are fairly gray - (low saturation values in HLS). For really gray colours, WHITE or - BLACK will be returned depending on the lightness. - The transparency of a color is ignored. - """ - argb = self.get_argb_color() - if argb is None: - return None - nearest = None - red = float((argb & 0xff0000) >> 16) / 255.0 - green = float((argb & 0x00ff00) >> 8) / 255.0 - blue = float(argb & 0x0000ff) / 255.0 - hue, lightness, saturation = colorsys.rgb_to_hls(red, green, blue) - if saturation < 0.2: - if lightness > 0.65: - nearest = otio.schema.MarkerColor.WHITE - else: - nearest = otio.schema.MarkerColor.BLACK - if nearest is None: - if lightness < 0.13: - nearest = otio.schema.MarkerColor.BLACK - if lightness > 0.9: - nearest = otio.schema.MarkerColor.WHITE - if nearest is None: - nearest = self._otio_color_from_hue(hue) - if nearest == otio.schema.MarkerColor.RED \ - and lightness > 0.53: - nearest = otio.schema.MarkerColor.PINK - if nearest == otio.schema.MarkerColor.MAGENTA \ - and hue < 0.89 and lightness < 0.42: - # some darker magentas look more like purple - nearest = otio.schema.MarkerColor.PURPLE - return nearest - - def __repr__(self): - return "GESMarker({!r}, {!r})".format( - self.position, self.metadatas) - - -@otio.core.register_type -class GESMarkerList(otio.core.SerializableObject): - """ - An OpenTimelineIO Schema that is a list of GESMarkers, ordered by - their positions, essentially mimicking the GstMarkerList of the GES - C libarary. - """ - _serializable_label = "GESMarkerList.1" - - markers = otio.core.serializable_field( - "markers", list, "A list of GESMarkers") - - def __init__(self, *markers): - """ - Note, this instance will need to take ownership of any given - GESMarker. - """ - otio.core.SerializableObject.__init__(self) - self.markers = [] - for marker in markers: - self.add(marker) - - def add(self, marker): - """ - Add the GESMarker to the GESMarkerList such that the markers - list remains ordered by marker position (smallest first). - """ - if not isinstance(marker, GESMarker): - _wrong_type_for_arg(marker, "GESMarker", "marker") - for index, existing_marker in enumerate(self.markers): - if existing_marker.position > marker.position: - self.markers.insert(index, marker) - return - self.markers.append(marker) - - def markers_at_position(self, position): - """Return a list of markers with the given position""" - if not isinstance(position, int): - _wrong_type_for_arg(position, "int", "position") - return [mrk for mrk in self.markers if mrk.position == position] - - def __getitem__(self, index): - return self.markers[index] - - def __len__(self): - return len(self.markers) - - def __repr__(self): - write = ["GESMarkerList("] - first = True - for marker in self.markers: - if first: - first = False - else: - write.append(", ") - write.append(repr(marker)) - write.append(")") - return "".join(write) - - -@otio.core.register_type -class XgesTrack(otio.core.SerializableObject): - """ - An OpenTimelineIO Schema for storing a GESTrack. - - Not to be confused with OpenTimelineIO's schema.Track. - """ - _serializable_label = "XgesTrack.1" - - caps = otio.core.serializable_field( - "caps", GstCaps, "The GstCaps of the track") - track_type = otio.core.serializable_field( - "track-type", int, "The GESTrackType of the track") - properties = otio.core.serializable_field( - "properties", GstStructure, "The GObject properties of the track") - metadatas = otio.core.serializable_field( - "metadatas", GstStructure, "Metadata for the track") - - def __init__( - self, caps=None, track_type=GESTrackType.UNKNOWN, - properties=None, metadatas=None): - """ - Initialize the XgesTrack. - - properties and metadatas are passed as the second argument to - GstStructure. - """ - otio.core.SerializableObject.__init__(self) - if caps is None: - caps = GstCaps() - if not isinstance(caps, GstCaps): - _wrong_type_for_arg(caps, "GstCaps", "caps") - if not isinstance(track_type, int): - _wrong_type_for_arg(track_type, "int", "track_type") - if track_type not in GESTrackType.ALL_TYPES: - raise InvalidValueError( - "track_type", track_type, "a GESTrackType") - if properties is None: - properties = GstStructure("properties") - if metadatas is None: - metadatas = GstStructure("metadatas") - if not isinstance(properties, GstStructure): - _wrong_type_for_arg(properties, "GstStructure", "properties") - if not isinstance(metadatas, GstStructure): - _wrong_type_for_arg(metadatas, "GstStructure", "metadatas") - _force_gst_structure_name(properties, "properties", "XGESTrack") - _force_gst_structure_name(metadatas, "metadatas", "XGESTrack") - self.caps = caps - self.track_type = track_type - self.properties = properties - self.metadatas = metadatas - - def __repr__(self): - return \ - "XgesTrack(caps={!r}, track_type={!r}, "\ - "properties={!r}, metadatas={!r})".format( - self.caps, self.track_type, - self.properties, self.metadatas) - - @classmethod - def new_from_otio_track_kind(cls, kind): - """Return a new default XgesTrack for the given track kind""" - return cls.new_from_track_type(GESTrackType.from_otio_kind(kind)) - - @classmethod - def new_from_track_type(cls, track_type): - """Return a new default XgesTrack for the given track type""" - props = {} - if track_type == GESTrackType.VIDEO: - caps = GstCaps.new_from_str("video/x-raw(ANY)") - # TODO: remove restriction-caps property once the GES - # library supports default, non-NULL restriction-caps for - # GESVideoTrack (like GESAudioTrack). - # For time being, framerate is needed for stability. - props["restriction-caps"] = \ - ("string", "video/x-raw, framerate=(fraction)30/1") - elif track_type == GESTrackType.AUDIO: - caps = GstCaps.new_from_str("audio/x-raw(ANY)") - else: - raise UnhandledValueError("track_type", track_type) - props["mixing"] = ("boolean", True) - return cls(caps, track_type, GstStructure("properties", props)) diff --git a/docs/tutorials/adapters.md b/docs/tutorials/adapters.md index 5f9aa2a72..e5f87da27 100644 --- a/docs/tutorials/adapters.md +++ b/docs/tutorials/adapters.md @@ -1,83 +1,39 @@ # Adapters -OpenTimelineIO supports, or plans to support, conversion adapters for many -existing file formats. +While OpenTimelineIO favors the `.otio` JSON format, Python OpenTimelineIO supports many file formats via adapter plugins. -## Final Cut Pro XML +## Built-In Adapters -Final Cut 7 XML Format -- Status: Supported via the `fcp_xml` adapter -- [Reference](https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/FinalCutPro_XML/AboutThisDoc/AboutThisDoc.html#//apple_ref/doc/uid/TP30001152-TPXREF101) +The OpenTimelineIO native file format adapters that are present in the `opentimelineio` python package are: -Final Cut Pro X XML Format: -- Status: Supported via the `fcpx_xml` adapter -- [Intro to FCP X XML](https://developer.apple.com/library/mac/documentation/FinalCutProX/Reference/FinalCutProXXMLFormat/Introduction/Introduction.html) +- [otio_json](https://github.com/AcademySoftwareFoundation/OpenTimelineIO/blob/main/src/py-opentimelineio/opentimelineio/adapters/otio_json.py) - OpenTimelineIO's native file format. +- [otiod](https://github.com/AcademySoftwareFoundation/OpenTimelineIO/blob/main/src/py-opentimelineio/opentimelineio/adapters/otiod.py) - a directory bundle of a `.otio` file along with referenced media. +- [otioz](https://github.com/AcademySoftwareFoundation/OpenTimelineIO/blob/main/src/py-opentimelineio/opentimelineio/adapters/otioz.py) - a zip file bundle of a `.otio` file along with referenced media. -## Adobe Premiere Project +## Batteries-Included Adapters -- Based on guidance from Adobe, we support interchange with Adobe Premiere via - the FCP 7 XML format (see above). +To also install a curated list of additional useful adapters, use the [OpenTimelineIO-Plugins ](https://pypi.org/project/OpenTimelineIO-Plugins/) python package. In addition to the OpenTimelineIO native adapters, you'll get aditional useful adapters including: -## CMX3600 EDL +- [AAF](https://github.com/OpenTimelineIO/otio-aaf-adapter) +- [ale](https://github.com/OpenTimelineIO/otio-ale-adapter) +- [burnins](https://github.com/OpenTimelineIO/otio-burnins-adapter) +- [cmx_3600](https://github.com/OpenTimelineIO/otio-cmx3600-adapter) +- [fcp_xml](https://github.com/OpenTimelineIO/otio-fcp-adapter) +- [fcpx_xml](https://github.com/OpenTimelineIO/otio-fcpx-xml-adapter) +- [hls_playlist](https://github.com/OpenTimelineIO/otio-hls-playlist-adapter) +- [maya_sequencer](https://github.com/OpenTimelineIO/otio-maya-sequencer-adapter) +- [svg](https://github.com/OpenTimelineIO/otio-svg-adapter) +- [xges](https://github.com/OpenTimelineIO/otio-xges-adapter) -- Status: Supported via the `cmx_3600` adapter -- Includes support for ASC_CDL color correction metadata -- Full specification: SMPTE 258M-2004 "For Television −− Transfer of Edit Decision Lists" -- http://xmil.biz/EDL-X/CMX3600.pdf -- [Reference](https://prohelp.apple.com/finalcutpro_help-r01/English/en/finalcutpro/usermanual/chapter_96_section_0.html) +These adapters are supported by the broader OpenTimelineIO community. While the OTIO core team consults and sometimes contribute to their development, they may be maintained and supported at varying levels. -## Avid AAF +## Additional Adapters -- Status: Reads and writes AAF compositions - - includes clip, gaps, transitions but not markers or effects - - This adapter is still in progress, see the ongoing work here: [AAF Project](https://github.com/AcademySoftwareFoundation/OpenTimelineIO/projects/1) -- [Spec](https://static.amwa.tv/ms-01-aaf-object-spec.pdf) -- [Protocol](https://static.amwa.tv/as-01-aaf-edit-protocol-spec.pdf) +Below are some other adapters that may be useful to some users: -- Depends on the [PyAAF2](https://github.com/markreidvfx/pyaaf2) module, so either: - - `pip install pyaaf2` - - ...or set `${OTIO_AAF_PYTHON_LIB}` to point the location of the PyAAF2 module +- [kdenlive](https://invent.kde.org/multimedia/kdenlive-opentimelineio) -# Contrib Adapters +## Custom Adapters -The contrib area hosts adapters which come from the community (_not_ supported - by the core-otio team) and may require extra dependencies. +Adapters are implemented as plugins for OpenTimelineIO and can either be registered via an [environment variable](./otio-env-variables) or by packaging in a Python module with a particular entrypoint defined. For more detail, see the [Writing an OTIO Adapter](./write-an-adapter) tutorial. -## RV Session File - -- Status: write-only adapter supported via the `rv_session` adapter. -- need to set environment variables to locate `py-interp` and `rvSession.py` - from within the RV distribution -- set `${OTIO_RV_PYTHON_BIN}` to point at `py-interp` from within rv, for - example: - `setenv OTIO_RV_PYTHON_BIN /Applications/RV64.app/Contents/MacOS/py-interp` -- set `${OTIO_RV_PYTHON_LIB}` to point at the parent directory of `rvSession.py`: - `setenv OTIO_RV_PYTHON_LIB /Applications/RV64.app/Contents/src/python` - -## Maya Sequencer - -- Status: supported via the `maya_sequencer` adapter. -- set `${OTIO_MAYA_PYTHON_BIN}` to point the location of `mayapy` within the maya - installation. - -## HLS Playlist - -- Status: supported via the `hls_playlist` adapter. - -## Avid Log Exchange (ALE) - -- Status: supported via the `ale` adapter. - -## Text Burn-in Adapter - -Uses FFmpeg to burn text overlays into video media. - -- Status: supported via the `burnins` adapter. - -## GStreamer Editing Services Adapter - -- Status: supported via the `xges` adapter. - -## Kdenlive Adapter - -- Status: supported via the kdenlive adapter diff --git a/docs/tutorials/otio-plugins.md b/docs/tutorials/otio-plugins.md index 924de10d8..7a8d9c478 100644 --- a/docs/tutorials/otio-plugins.md +++ b/docs/tutorials/otio-plugins.md @@ -12,11 +12,10 @@ file should be regenerated. # Manifests -The manifests describe plugins that are visible to OpenTimelineIO. The core and -contrib manifests are listed first, then any user-defined local plugins. +The manifests describe plugins that are visible to OpenTimelineIO. The core +manifest is listed first, then any user-defined local plugins. - `opentimelineio/adapters/builtin_adapters.plugin_manifest.json` -- `opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json` # Core Plugins @@ -33,76 +32,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 - -``` -OpenTimelineIO Final Cut Pro 7 XML Adapter. -``` - -*source*: `opentimelineio/adapters/fcp_xml.py` - - -*Supported Features (with arguments)*: - -- read_from_string: - - input_str -- write_to_string: - - input_otio - - - - - ### otio_json ``` @@ -260,385 +189,6 @@ read on unix and windows platforms. -### svg - -``` -OTIO to SVG Adapter -Points in calculations are y-up. -Points in SVG are y-down. -``` - -*source*: `opentimelineio/adapters/svg.py` - - -*Supported Features (with arguments)*: - -- write_to_string: - - input_otio - - width - - height - - - - - -## Media Linkers - -Media Linkers run after the adapter has read in the file and convert the media -references into valid references where appropriate. - -[Tutorial on how to write a Media Linker](write-a-media-linker). - - - -## SchemaDefs - -SchemaDef plugins define new external schema. - -[Tutorial on how to write a schemadef](write-a-schemadef). - - - -## HookScripts - -HookScripts are extra plugins that run on _hooks_. - -[Tutorial on how to write a hookscript](write-a-hookscript). - - - -## Hooks - -Hooks are the points at which hookscripts will run. - - - - - -# Contrib Plugins - -Plugins in Contrib are supported by the community and provided as-is. - -Manifest path: `opentimelineio_contrib/adapters/contrib_adapters.plugin_manifest.json` - - - -## Adapter Plugins - -Adapter plugins convert to and from OpenTimelineIO. - -[Adapters documentation page for more information](./adapters). - -[Tutorial on how to write an adapter](write-an-adapter). - - -### AAF - -``` -OpenTimelineIO Advanced Authoring Format (AAF) Adapter - -Depending on if/where PyAAF is installed, you may need to set this env var: - OTIO_AAF_PYTHON_LIB - should point at the PyAAF module. -``` - -*source*: `opentimelineio_contrib/adapters/advanced_authoring_format.py` - - -*Supported Features (with arguments)*: - -- read_from_file: -``` -Reads AAF content from `filepath` and outputs an OTIO - timeline object. - - Args: - filepath (str): AAF filepath - simplify (bool, optional): simplify timeline structure by stripping empty - items - transcribe_log (bool, optional): log activity as items are getting - transcribed - attach_markers (bool, optional): attaches markers to their appropriate items - like clip, gap. etc on the track - bake_keyframed_properties (bool, optional): bakes animated property values - for each frame in a source clip - Returns: - otio.schema.Timeline -``` - - filepath - - simplify - - transcribe_log - - attach_markers - - bake_keyframed_properties -- write_to_file: - - input_otio - - filepath - - - - - -### ale - -``` -OpenTimelineIO Avid Log Exchange (ALE) Adapter -``` - -*source*: `opentimelineio_contrib/adapters/ale.py` - - -*Supported Features (with arguments)*: - -- read_from_string: - - input_str - - fps -- write_to_string: - - input_otio - - columns - - fps - - video_format - - - - - -### burnins - -``` -FFMPEG Burnins Adapter -``` - -*source*: `opentimelineio_contrib/adapters/burnins.py` - - -*Supported Features (with arguments)*: - -- write_to_file: -``` -required OTIO function hook -``` - - input_otio - - filepath - - - - - -### fcpx_xml - -``` -OpenTimelineIO Final Cut Pro X XML Adapter. -``` - -*source*: `opentimelineio_contrib/adapters/fcpx_xml.py` - - -*Supported Features (with arguments)*: - -- read_from_string: -``` -Necessary read method for otio adapter - - Args: - input_str (str): An FCP X XML string - - Returns: - OpenTimeline: An OpenTimeline object -``` - - input_str -- write_to_string: -``` -Necessary write method for otio adapter - - Args: - input_otio (OpenTimeline): An OpenTimeline object - - Returns: - str: The string contents of an FCP X XML -``` - - input_otio - - - - - -### hls_playlist - -``` -HLS Playlist OpenTimelineIO adapter - -This adapter supports authoring of HLS playlists within OpenTimelineIO by using -clips to represent media fragments. - -Status: - - Export of Media Playlists well supported - - Export of Master Playlists supported - - Import of Media Playlists well supported - - Import of Master Playlists unsupported - - Explicit Variant Stream controls in Master Playlists unsupported - -In general, you can author otio as follows: - t = otio.schema.Timeline() - track = otio.schema.Track("v1") - track.metadata['HLS'] = { - "EXT-X-INDEPENDENT-SEGMENTS": None, - "EXT-X-PLAYLIST-TYPE": "VOD" - } - t.tracks.append(track) - - # Make a prototype media ref with the fragment's initialization metadata - fragmented_media_ref = otio.schema.ExternalReference( - target_url='video1.mp4', - metadata={ - "streaming": { - "init_byterange": { - "byte_count": 729, - "byte_offset": 0 - }, - "init_uri": "media-video-1.mp4" - } - } - ) - - # Make a copy of the media ref specifying the byte range for the fragment - media_ref1 = fragmented_media_ref.deepcopy() - media_ref1.available_range=otio.opentime.TimeRange( - otio.opentime.RationalTime(0, 1), - otio.opentime.RationalTime(2.002, 1) - ) - media_ref1.metadata['streaming'].update( - { - "byte_count": 534220, - "byte_offset": 1361 - } - ) - - # make the fragment and append it - fragment1 = otio.schema.Clip(media_reference=media_ref1) - track.append(fragment1) - - # (repeat to define each fragment) - -The code above would yield an HLS playlist like: - #EXTM3U - #EXT-X-VERSION:7 - #EXT-X-TARGETDURATION:2 - #EXT-X-PLAYLIST-TYPE:VOD - #EXT-X-INDEPENDENT-SEGMENTS - #EXT-X-MEDIA-SEQUENCE:1 - #EXT-X-MAP:BYTERANGE="729@0",URI="media-video-1.mp4" - #EXTINF:2.00200, - #EXT-X-BYTERANGE:534220@1361 - video1.mp4 - #EXT-X-ENDLIST - -If you add min_segment_duration and max_segment_duration to the timeline's -metadata dictionary as RationalTime objects, you can control the rule set -deciding how many fragments to accumulate into a single segment. When nothing -is specified for these metadata keys, the adapter will create one segment per -fragment. - -In general, any metadata added to the track metadata dict under the HLS -namespace will be included at the top level of the exported playlist (see -``EXT-X-INDEPENDENT-SEGMENTS`` and ``EXT-X-PLAYLIST-TYPE`` in the example -above). Each segment will pass through any metadata in the HLS namespace from -the media_reference. - -If you write a Timeline with more than one track specified, then the adapter -will create an HLS master playlist. - -The following track metadata keys will be used to inform exported master -playlist metadata per variant stream: - bandwidth - codec - language - mimeType - group_id (audio) - autoselect (audio) - default (audio) -These values are translated to EXT-X-STREAM-INF and EXT-X-MEDIA -attributes as defined in sections 4.3.4.2 and 4.3.4.1 of -draft-pantos-http-live-streaming, respectively. -``` - -*source*: `opentimelineio_contrib/adapters/hls_playlist.py` - - -*Supported Features (with arguments)*: - -- read_from_string: -``` -Adapter entry point for reading. -``` - - input_str -- write_to_string: -``` -Adapter entry point for writing. -``` - - input_otio - - - - - -### maya_sequencer - -``` -Maya Sequencer Adapter Harness -``` - -*source*: `opentimelineio_contrib/adapters/maya_sequencer.py` - - -*Supported Features (with arguments)*: - -- read_from_file: - - filepath -- write_to_file: - - input_otio - - filepath - - - - - -### xges - -``` -OpenTimelineIO GStreamer Editing Services XML Adapter. -``` - -*source*: `opentimelineio_contrib/adapters/xges.py` - - -*Supported Features (with arguments)*: - -- read_from_string: -``` -Necessary read method for otio adapter - - Args: - input_str (str): A GStreamer Editing Services formated project - - Returns: - OpenTimeline: An OpenTimeline object -``` - - input_str -- write_to_string: -``` -Necessary write method for otio adapter - - Args: - input_otio (OpenTimeline): An OpenTimeline object - - Returns: - str: The string contents of an FCP X XML -``` - - input_otio - - - - - ## Media Linkers Media Linkers run after the adapter has read in the file and convert the media @@ -655,96 +205,6 @@ SchemaDef plugins define new external schema. [Tutorial on how to write a schemadef](write-a-schemadef). -### xges - -``` -OpenTimelineIO GStreamer Editing Services XML Adapter. -``` - -*source*: `opentimelineio_contrib/adapters/xges.py` - - -*Serializable Classes*: - -- GESMarker: -``` -An OpenTimelineIO Schema that is a timestamp with metadata, - essentially mimicking the GstMarker of the GES C libarary. -``` -- GESMarkerList: -``` -An OpenTimelineIO Schema that is a list of GESMarkers, - ordered by - their positions, essentially mimicking the GstMarkerList of the GES - C libarary. -``` -- GstCaps: -``` -An OpenTimelineIO Schema that acts as an ordered collection of - GstStructures, essentially mimicking the GstCaps of the Gstreamer C - libarary. Each GstStructure is linked to a GstCapsFeatures, which is - a list of features. - - In particular, this schema mimics the gst_caps_to_string and - gst_caps_from_string C methods. -``` -- GstCapsFeatures: -``` -An OpenTimelineIO Schema that contains a collection of - features, - mimicking a GstCapsFeatures of the Gstreamer C libarary. -``` -- GstStructure: -``` -An OpenTimelineIO Schema that acts as a named dictionary with - typed entries, essentially mimicking the GstStructure of the - GStreamer C library. - - In particular, this schema mimics the gst_structure_to_string and - gst_structure_from_string C methods. As such, it can be used to - read and write the properties and metadatas attributes found in - xges elements. - - Note that the types are to correspond to GStreamer/GES GTypes, - rather than python types. - - Current supported GTypes: - GType Associated Accepted - Python type aliases - ====================================== - gint int int, i - glong int - gint64 int - guint int uint, u - gulong int - guint64 int - gfloat float float, f - gdouble float double, d - gboolean bool boolean, - bool, b - string str or None str, s - GstFraction str or fraction - Fraction - GstStructure GstStructure structure - schema - GstCaps GstCaps - schema - GESMarkerList GESMarkerList - schema - - Note that other types can be given: these must be given as strings - and the user will be responsible for making sure they are already in - a serialized form. -``` -- XgesTrack: -``` -An OpenTimelineIO Schema for storing a GESTrack. - - Not to be confused with OpenTimelineIO's schema.Track. -``` - - - ## HookScripts diff --git a/docs/tutorials/quickstart.md b/docs/tutorials/quickstart.md index 283513b59..ffd98ff32 100644 --- a/docs/tutorials/quickstart.md +++ b/docs/tutorials/quickstart.md @@ -15,11 +15,14 @@ OTIOView has an additional prerequisite to OTIO: - `python -m pip install opentimelineio` -## Configure Environment Variables for extra adapters +## Setup Any Additional Adapters You May Want + +A default OTIO installation includes only the "Core" adapters, which include the native OTIO JSON format (`.otio`), OpenTimelineIO directory bundles (`.otiod`), and OpenTimelineIO ZIP bundles (`.otiod`). + +A curated list of adapters for popular file formats like EDL, AAF, ALE, and FCP XML can be installed using the [OpenTimelineIO Plugins package in PyPI](https://pypi.org/project/OpenTimelineIO-Plugins/). These plugins can also be individually installed from their PyPI packages. + +For mor information, see the [Adapters](./adapters) section. -A default OTIO installation includes only the "Core" adapters, which include CMX EDL, Final Cut Pro 7 XML, and the built in JSON format. -In order to get access to the "contrib" adapters (which includes the maya sequencer, rv and others), please consult the -[Adapters documentation page for details](./adapters). ## Run OTIOView @@ -132,13 +135,13 @@ GDB will automatically break when it hits the SIGINT line. ## Mac / Linux -The doxygen docs can be generated with the following commands: +The doxygen docs can be generated with the following commands: ``` cd doxygen ; doxygen config/dox_config ; cd .. ``` -Another option is to trigger the make target: +Another option is to trigger the make target: ``` make doc-cpp diff --git a/setup.cfg b/setup.cfg index 8effc794f..88fec56b3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -38,8 +38,6 @@ ignore = ignore = tests* requirements* - contrib/opentimelineio_contrib/application_plugins - contrib/opentimelineio_contrib/application_plugins/* ignore-bad-ideas = *.egg-info *egg-info/* @@ -59,9 +57,6 @@ source = otio = src/py-opentimelineio/opentimelineio *site-packages/opentimelineio -contrib = - contrib/opentimelineio_contrib - *site-packages/opentimelineio_contrib [coverage:report] include =* diff --git a/setup.py b/setup.py index 203fbef9b..ea3d4b820 100644 --- a/setup.py +++ b/setup.py @@ -237,7 +237,6 @@ def _append_version_info_to_init_scripts(build_lib): for module, parentdir in [ ("opentimelineio", "src/py-opentimelineio"), - ("opentimelineio_contrib", "contrib"), ("opentimelineview", "src") ]: target_file = os.path.join(build_lib, module, "__init__.py") @@ -335,15 +334,11 @@ def run(self): 'opentimelineio': [ 'adapters/builtin_adapters.plugin_manifest.json', ], - 'opentimelineio_contrib': [ - 'adapters/contrib_adapters.plugin_manifest.json', - ], }, packages=( find_packages(where="src/py-opentimelineio") + # opentimelineio - find_packages(where="src") + # opentimelineview - find_packages(where="contrib", exclude=["opentimelineio_contrib.adapters.tests"]) # opentimelineio_contrib # noqa + find_packages(where="src") # opentimelineview ), ext_modules=[ @@ -357,7 +352,6 @@ def run(self): ], package_dir={ - 'opentimelineio_contrib': 'contrib/opentimelineio_contrib', 'opentimelineio': 'src/py-opentimelineio/opentimelineio', 'opentimelineview': 'src/opentimelineview', }, @@ -366,7 +360,6 @@ def run(self): python_requires='>=3.7, !=3.9.0', # noqa: E501 install_requires=[ - 'pyaaf2>=1.4,<1.7', 'importlib_metadata>=1.4; python_version < "3.8"', ], entry_points={ diff --git a/src/opentimelineio/composition.h b/src/opentimelineio/composition.h index 675d18c3e..f23ec5792 100644 --- a/src/opentimelineio/composition.h +++ b/src/opentimelineio/composition.h @@ -101,7 +101,7 @@ class Composition : public Item bool shallow_search = false) const; // Return all objects within the given search_range. - std::vector<Retainer<Composable>> children_in_range( + virtual std::vector<Retainer<Composable>> children_in_range( TimeRange const& search_range, ErrorStatus* error_status = nullptr) const; diff --git a/src/opentimelineio/stack.cpp b/src/opentimelineio/stack.cpp index ce10b204f..5638a82c3 100644 --- a/src/opentimelineio/stack.cpp +++ b/src/opentimelineio/stack.cpp @@ -79,6 +79,26 @@ Stack::range_of_all_children(ErrorStatus* error_status) const return result; } +std::vector<SerializableObject::Retainer<Composable>> +Stack::children_in_range( + TimeRange const& search_range, + ErrorStatus* error_status) const +{ + std::vector<SerializableObject::Retainer<Composable>> children; + for (auto child : this->children()) + { + if (auto item = dynamic_retainer_cast<Item>(child)) + { + TimeRange range = item->trimmed_range(error_status); + if (range.intersects(search_range)) + { + children.push_back(child); + } + } + } + return children; +} + TimeRange Stack::trimmed_range_of_child_at_index(int index, ErrorStatus* error_status) const diff --git a/src/opentimelineio/stack.h b/src/opentimelineio/stack.h index 7354774de..6645cb780 100644 --- a/src/opentimelineio/stack.h +++ b/src/opentimelineio/stack.h @@ -40,6 +40,10 @@ class Stack : public Composition std::map<Composable*, TimeRange> range_of_all_children(ErrorStatus* error_status = nullptr) const override; + std::vector<Retainer<Composable>> children_in_range( + TimeRange const& search_range, + ErrorStatus* error_status = nullptr) const override; + std::optional<IMATH_NAMESPACE::Box2d> available_image_bounds(ErrorStatus* error_status) const override; diff --git a/src/py-opentimelineio/CMakeLists.txt b/src/py-opentimelineio/CMakeLists.txt index f0192106a..8364173e9 100644 --- a/src/py-opentimelineio/CMakeLists.txt +++ b/src/py-opentimelineio/CMakeLists.txt @@ -14,10 +14,4 @@ if(OTIO_INSTALL_PYTHON_MODULES) DESTINATION "${OTIO_RESOLVED_PYTHON_INSTALL_DIR}") endif() - if(OTIO_INSTALL_CONTRIB) - install(DIRECTORY "${PROJECT_SOURCE_DIR}/contrib/opentimelineio_contrib" - DESTINATION "${OTIO_RESOLVED_PYTHON_INSTALL_DIR}" - PATTERN "tests" EXCLUDE - PATTERN "Makefile" EXCLUDE) - endif() endif() diff --git a/src/py-opentimelineio/opentimelineio/adapters/__init__.py b/src/py-opentimelineio/opentimelineio/adapters/__init__.py index 6ed93684d..7ee655774 100644 --- a/src/py-opentimelineio/opentimelineio/adapters/__init__.py +++ b/src/py-opentimelineio/opentimelineio/adapters/__init__.py @@ -15,6 +15,7 @@ import os import itertools +import pathlib from .. import ( exceptions, @@ -132,10 +133,15 @@ def read_from_file( timeline = read_from_file("file_with_no_extension", "cmx_3600") """ - adapter = _from_filepath_or_name(filepath, adapter_name) + # convert pathlib Path objects to simple string + string_filepath = filepath + if isinstance(string_filepath, pathlib.PurePath): + string_filepath = os.fspath(filepath) + + adapter = _from_filepath_or_name(string_filepath, adapter_name) return adapter.read_from_file( - filepath=filepath, + filepath=string_filepath, media_linker_name=media_linker_name, media_linker_argument_map=media_linker_argument_map, **adapter_argument_map @@ -189,9 +195,14 @@ def write_to_file( adapter = _from_filepath_or_name(filepath, adapter_name) + # convert pathlib Path objects to simple string + string_filepath = filepath + if isinstance(string_filepath, pathlib.PurePath): + string_filepath = os.fspath(filepath) + return adapter.write_to_file( input_otio=input_otio, - filepath=filepath, + filepath=string_filepath, **adapter_argument_map ) 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..9b63f4191 100644 --- a/src/py-opentimelineio/opentimelineio/adapters/builtin_adapters.plugin_manifest.json +++ b/src/py-opentimelineio/opentimelineio/adapters/builtin_adapters.plugin_manifest.json @@ -1,12 +1,6 @@ { "OTIO_SCHEMA" : "PluginManifest.1", "adapters": [ - { - "OTIO_SCHEMA": "Adapter.1", - "name": "fcp_xml", - "filepath": "fcp_xml.py", - "suffixes": ["xml"] - }, { "OTIO_SCHEMA" : "Adapter.1", "name" : "otio_json", @@ -24,18 +18,6 @@ "name" : "otiod", "filepath" : "otiod.py", "suffixes" : ["otiod"] - }, - { - "OTIO_SCHEMA" : "Adapter.1", - "name" : "cmx_3600", - "filepath" : "cmx_3600.py", - "suffixes" : ["edl"] - }, - { - "OTIO_SCHEMA" : "Adapter.1", - "name" : "svg", - "filepath" : "svg.py", - "suffixes" : ["svg"] } ], "hooks": { 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<name>.*?)\s*(?P<speed>-?[0-9\.]*)\s*(?P<tc>[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<range>\[(?P<start>[0-9]+)-(?P<end>[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<comment_body>.*)' - - # 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/src/py-opentimelineio/opentimelineio/adapters/fcp_xml.py b/src/py-opentimelineio/opentimelineio/adapters/fcp_xml.py deleted file mode 100644 index eeb271967..000000000 --- a/src/py-opentimelineio/opentimelineio/adapters/fcp_xml.py +++ /dev/null @@ -1,2012 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""OpenTimelineIO Final Cut Pro 7 XML Adapter.""" - -import collections -import functools -import itertools -import math -import os -import re -from xml.etree import cElementTree -from xml.dom import minidom - -import urllib.parse as urllib_parse -from collections.abc import Mapping - -from .. import ( - core, - opentime, - schema, -) - -# namespace to use for metadata -META_NAMESPACE = 'fcp_xml' - -# Regex to match identifiers like clipitem-22 -ID_RE = re.compile(r"^(?P<tag>[a-zA-Z]*)-(?P<id>\d*)$") - - -# --------- -# utilities -# --------- - - -class _Context(Mapping): - """ - An inherited value context. - - In FCP XML there is a concept of inheritance down the element heirarchy. - For instance, a ``clip`` element may not specify the ``rate`` locally, but - instead inherit it from the parent ``track`` element. - - This object models that as a stack of elements. When a value needs to be - queried from the context, it will be gathered by walking from the top of - the stack until the value is found. - - For example, to find the ``rate`` element as an immediate child most - appropriate to the current context, you would do something like:: - ``my_current_context["./rate"]`` - - This object can be thought of as immutable. You get a new context when you - push an element. This prevents inadvertant tampering with parent contexts - that may be used at levels above. - - This DOES NOT support ``id`` attribute dereferencing, please make sure to - do that prior to using this structure. - - .. seealso:: https://developer.apple.com/library/archive/documentation\ - /AppleApplications/Reference/FinalCutPro_XML/Basics/Basics.html#\ - //apple_ref/doc/uid/TP30001154-TPXREF102 - """ - - def __init__(self, element=None, parent_elements=None): - if parent_elements is not None: - self.elements = parent_elements[:] - else: - self.elements = [] - - if element is not None: - self.elements.append(element) - - def _all_keys(self): - """ - Returns a set of all the keys available in the context stack. - """ - return set( - itertools.chain.fromiterable(e.keys() for e in self.elements) - ) - - def __getitem__(self, key): - # Walk down the contexts until the item is found - for element in reversed(self.elements): - found_element = element.find(key) - if found_element is not None: - return found_element - - raise KeyError(key) - - def __iter__(self): - # This is unlikely to be used, so we'll do it the expensive way - return iter(self._all_keys) - - def __len__(self): - # This is unlikely to be used, so we'll do it the expensive way - return len(self._all_keys) - - def context_pushing_element(self, element): - """ - Pushes an element to the top of the stack. - - :param element: Element to push to the stack. - :return: The new context with the provided element pushed to the top - of the stack. - :raises: :class: `ValueError` if the element is already in the stack. - """ - for context_element in self.elements: - if context_element == element: - raise ValueError( - f"element {element} already in context" - ) - - return _Context(element, self.elements) - - -def _url_to_path(url): - parsed = urllib_parse.urlparse(url) - return parsed.path - - -def _bool_value(element): - """ - Given an xml element, returns the tag text converted to a bool. - - :param element: The element to fetch the value from. - - :return: A boolean. - """ - return (element.text.lower() == "true") - - -def _element_identification_string(element): - """ - Gets a string that will hopefully help in identifing an element when there - is an error. - """ - info_string = f"tag: {element.tag}" - try: - elem_id = element.attrib["id"] - info_string += f" id: {elem_id}" - except KeyError: - pass - - return info_string - - -def _name_from_element(element): - """ - Fetches a name suitable for OTIO objects from the ``name`` element child - of the provided element. - If no element exists, returns empty string. - - :param element: The element to find the name for. - - :return: The name string or and empty string - """ - name_elem = element.find("./name") - if name_elem is not None: - return name_elem.text if name_elem.text is not None else "" - - return "" - - -def _otio_rate(timebase, ntsc): - """ - Given an FCP XML timebase and NTSC boolean, returns the float framerate. - """ - if not ntsc: - return timebase - - return (timebase * 1000.0 / 1001) - - -def _rate_from_context(context): - """ - Given the context object, gets the appropriate rate. - - :param context: The :class: `_Context` instance to find the rate in. - - :return: The rate value or ``None`` if no rate is available in the context. - """ - timebase = context.get("./rate/timebase") - ntsc = context.get("./rate/ntsc") - - if timebase is None: - return None - - return _otio_rate( - float(timebase.text), - _bool_value(ntsc) if ntsc is not None else None, - ) - - -def _time_from_timecode_element(tc_element, context=None): - """ - Given a timecode xml element, returns the time that represents. - - .. todo:: Non Drop-Frame timecode is not yet supported by OTIO. - - :param tc_element: The ``timecode`` element. - :param context: The context dict under which this timecode is being gotten. - - :return: The :class: `opentime.RationalTime` representation of the - timecode. - """ - if context is not None: - local_context = context.context_pushing_element(tc_element) - else: - local_context = _Context(tc_element) - - # Resolve the rate - rate = _rate_from_context(local_context) - - # Try using the display format and frame number - frame = tc_element.find("./frame") - - # Use frame number, if available - if frame is not None: - frame_num = int(frame.text) - return opentime.RationalTime(frame_num, rate) - - # If a TC string is provided, parse rate from it - tc_string_element = tc_element.find("./string") - if tc_string_element is None: - raise ValueError("Timecode element missing required elements") - - tc_string = tc_string_element.text - - return opentime.from_timecode(tc_string, rate) - - -def _track_kind_from_element(media_element): - """ - Given an FCP XML media sub-element, returns an appropriate - :class: `schema.TrackKind` value corresponding to that media type. - - :param media_element: An XML element that is a child of the ``media`` tag. - - :return: The corresponding :class`schema.TrackKind` value. - :raises: :class: `ValueError` When the media type is unsupported. - """ - element_tag = media_element.tag.lower() - if element_tag == "audio": - return schema.TrackKind.Audio - elif element_tag == "video": - return schema.TrackKind.Video - - raise ValueError(f"Unsupported media kind: {media_element.tag}") - - -def _is_primary_audio_channel(track): - """ - Determines whether or not this is the "primary" audio track. - - audio may be structured in stereo where each channel occupies a separate - track. This importer keeps stereo pairs ganged together as a single track. - - :param track: An XML track element. - - :return: A boolean ``True`` if this is the first track. - """ - exploded_index = track.attrib.get('currentExplodedTrackIndex', '0') - exploded_count = track.attrib.get('totalExplodedTrackCount', '1') - - return (exploded_index == '0' or exploded_count == '1') - - -def _transition_cut_point(transition_item, context): - """ - Returns the end time at which the transition progresses from one clip to - the next. - - :param transition_item: The XML element for the transition. - :param context: The context dictionary applying to this transition. - - :return: The :class: `opentime.RationalTime` the transition cuts at. - """ - alignment = transition_item.find('./alignment').text - start = int(transition_item.find('./start').text) - end = int(transition_item.find('./end').text) - - # start/end time is in the parent context's rate - local_context = context.context_pushing_element(transition_item) - rate = _rate_from_context(local_context) - - if alignment in ('end', 'end-black'): - value = end - elif alignment in ('start', 'start-black'): - value = start - elif alignment in ('center',): - value = int((start + end) / 2) - else: - value = int((start + end) / 2) - - return opentime.RationalTime(value, rate) - - -def _xml_tree_to_dict(node, ignore_tags=None, omit_timing=True): - """ - Translates the tree under a provided node mapping to a dictionary/list - representation. XML tag attributes are placed in the dictionary with an - ``@`` prefix. - - .. note:: In addition to the provided ignore tags, this filters a subset of - timing metadata such as ``frame`` and ``string`` elements within timecode - elements. - - .. warning:: This scheme does not allow for leaf elements to have - attributes. for the moment this doesn't seem to be an issue. - - :param node: The root xml element to express childeren of in the - dictionary. - :param ignore_tags: A collection of tagnames to skip when converting. - :param omit_timing: If ``True``, omits timing-specific tags. - - :return: The dictionary representation. - """ - if node.tag == "timecode": - additional_ignore_tags = {"frame", "string"} - else: - additional_ignore_tags = tuple() - - out_dict = collections.OrderedDict() - - # Handle the attributes - out_dict.update( - collections.OrderedDict( - (f"@{k}", v) for k, v in node.attrib.items() - ) - ) - - # Now traverse the child tags - encountered_tags = set() - list_tags = set() - for info_node in node: - # Skip tags we were asked to omit - node_tag = info_node.tag - if ignore_tags and node_tag in ignore_tags: - continue - - # Skip some special case tags related to timing information - if node_tag in additional_ignore_tags: - continue - - # If there are children, make this a sub-dictionary by recursing - if len(info_node): - node_value = _xml_tree_to_dict(info_node) - else: - node_value = info_node.text - - # If we've seen this node before, then treat it as a list - if node_tag in list_tags: - # We've established that this tag is a list, append to that - out_dict[node_tag].append(node_value) - elif node_tag in encountered_tags: - # This appears to be a list we didn't know about, convert - out_dict[node_tag] = [ - out_dict[node_tag], node_value - ] - list_tags.add(node_tag) - else: - # Store the value - out_dict[node_tag] = node_value - encountered_tags.add(node_tag) - - return out_dict - - -def _dict_to_xml_tree(data_dict, tag): - """ - Given a dictionary, returns an element tree storing the data. This is the - inverse of :func:`_xml_tree_to_dict`. - - Any key/value pairs in the dictionary heirarchy where the key is prefixed - with ``@`` will be treated as attributes on the containing element. - - .. note:: This will automatically omit some kinds of metadata it should - be up to the xml building functions to manage (such as timecode and id). - - :param data_dict: The dictionary to turn into an XML tree. - :param tag: The tag name to use for the top-level element. - - :return: The top element for the dictionary - """ - top_attributes = collections.OrderedDict( - (k[1:], v) for k, v in data_dict.items() - if k != "@id" and k.startswith("@") - ) - top_element = cElementTree.Element(tag, **top_attributes) - - def elements_for_value(python_value, element_tag): - """ Creates a list of appropriate XML elements given a value. """ - - # XXX because our API creates python-wrapped versions of OTIO's - # AnyDictionary, AnyVector instead of "real" python dict/list - # instances, this uses a more duck-typing friendly approach to - # figuring out how to translate objects into xml. - # - # This also works with the OrderedDict that are produced by this - # API. - - # test for dictionary like objects - try: - python_value.items() - element = _dict_to_xml_tree(python_value, element_tag) - return [element] - except AttributeError: - pass - - # test for list-like objects (but not string-derived) - if not isinstance(python_value, str): - try: - iter(python_value) - return itertools.chain.from_iterable( - elements_for_value(item, element_tag) for item in python_value - ) - except TypeError: - pass - - # everything else goes in as a string - element = cElementTree.Element(element_tag) - if python_value is not None: - element.text = str(python_value) - return [element] - - # Drop timecode, rate, and link elements from roundtripping because they - # may become stale with timeline updates. - default_ignore_keys = {"timecode", "rate", "link"} - specific_ignore_keys = {"samplecharacteristics": {"timecode"}} - ignore_keys = specific_ignore_keys.get(tag, default_ignore_keys) - - # push the elements into the tree - for key, value in data_dict.items(): - if key in ignore_keys: - continue - - # We already handled the attributes - if key.startswith("@"): - continue - - elements = elements_for_value(value, key) - top_element.extend(elements) - - return top_element - - -def _element_with_item_metadata(tag, item): - """ - Given a tag name, gets the FCP XML metadata dict and creates a tree of XML - with that metadata under a top element with the provided tag. - - :param tag: The XML tag for the root element. - :param item: An otio object with a metadata dict. - """ - item_meta = item.metadata.get(META_NAMESPACE) - if item_meta: - return _dict_to_xml_tree(item_meta, tag) - - return cElementTree.Element(tag) - - -def _get_or_create_subelement(parent_element, tag): - """ - Given an element and tag name, either gets the direct child of parent with - that tag name or creates a new subelement with that tag and returns it. - - :param parent_element: The element to get or create the subelement from. - :param tag: The tag for the subelement. - """ - sub_element = parent_element.find(tag) - if sub_element is None: - sub_element = cElementTree.SubElement(parent_element, tag) - - return sub_element - - -def _make_pretty_string(tree_e): - # most of the parsing in this adapter is done with cElementTree because it - # is simpler and faster. However, the string representation it returns is - # far from elegant. Therefor we feed it through minidom to provide an xml - # with indentations. - string = cElementTree.tostring(tree_e, encoding="UTF-8", method="xml") - dom = minidom.parseString(string) - return dom.toprettyxml(indent=' ') - - -def marker_for_element(marker_element, rate): - """ - Creates an :class: `schema.Marker` for the provided element. - - :param marker_element: The XML element for the marker. - :param rate: The rate for the object the marker is attached to. - - :return: The :class: `schema.Marker` instance. - """ - # TODO: The spec doc indicates that in and out are required, but doesn't - # say they have to be locally specified, so is it possible they - # could be inherited? - marker_in = opentime.RationalTime( - float(marker_element.find("./in").text), rate - ) - marker_out_value = float(marker_element.find("./out").text) - if marker_out_value > 0: - marker_out = opentime.RationalTime( - marker_out_value, rate - ) - marker_duration = (marker_out - marker_in) - else: - marker_duration = opentime.RationalTime(rate=rate) - - marker_range = opentime.TimeRange(marker_in, marker_duration) - - md_dict = _xml_tree_to_dict(marker_element, {"in", "out", "name"}) - metadata = {META_NAMESPACE: md_dict} if md_dict else None - - return schema.Marker( - name=_name_from_element(marker_element), - marked_range=marker_range, - metadata=metadata - ) - - -def markers_from_element(element, context=None): - """ - Given an element, returns the list of markers attached to it. - - :param element: An element with one or more ``marker`` child elements. - :param context: The context for this element. - - :return: A :class: `list` of :class: `schema.Marker` instances attached - to the provided element. - """ - if context is not None: - local_context = context.context_pushing_element(element) - else: - local_context = _Context(element) - rate = _rate_from_context(local_context) - - return [marker_for_element(e, rate) for e in element.iterfind("./marker")] - - -class FCP7XMLParser: - """ - Implements parsing of an FCP XML file into an OTIO timeline. - - Parsing FCP XML elements include two concepts that require carrying state: - 1. Inheritance - 2. The id Attribute - - .. seealso:: https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/FinalCutPro_XML/Basics/Basics.html#//apple_ref/doc/uid/TP30001154-TPXREF102 # noqa - - Inheritance is implemented using a _Context object that is pushed down - through layers of parsing. A given parsing method is passed the element to - parse into an otio object along with the context that element exists under - (e.x. a track element parsing method is given the track element and the - sequence context for that track). - - The id attribute dereferencing is handled through a lookup table stored on - parser instances and using the ``_derefed_`` methods to take an element and - find dereference elements. - """ - - _etree = None - """ The root etree for the FCP XML. """ - - _id_map = None - """ A mapping of id to the first element encountered with that id. """ - - def __init__(self, element_tree): - """ - Constructor, must be init with an xml etree. - """ - self._etree = element_tree - - self._id_map = {} - - def _derefed_element(self, element): - """ - Given an element, dereferences it by it's id attribute if needed. If - the element has an id attribute and it's our first time encountering - it, store the id. - """ - if element is None: - return element - - try: - elem_id = element.attrib["id"] - except KeyError: - return element - - return self._id_map.setdefault(elem_id, element) - - def _derefed_iterfind(self, element, path): - """ - Given an elemnt, finds elements with the provided path below and - returns an iterator of the dereferenced versions of those. - - :param element: The XML etree element. - :param path: The path to find subelements. - - :return: iterator of subelements dereferenced by id. - """ - return ( - self._derefed_element(e) for e in element.iterfind(path) - ) - - def top_level_sequences(self): - """" - Returns a list of timelines for the top-level sequences in the file. - """ - context = _Context() - - # If the tree has just sequences at the top level, this will catch them - top_iter = self._derefed_iterfind(self._etree, "./sequence") - - # If there is a project or bin at the top level, this should cath them - project_and_bin_iter = self._derefed_iterfind( - self._etree, ".//children/sequence" - ) - - # Make an iterator that will exhaust both the above - sequence_iter = itertools.chain(top_iter, project_and_bin_iter) - - return [self.timeline_for_sequence(s, context) for s in sequence_iter] - - def timeline_for_sequence(self, sequence_element, context): - """ - Returns either an :class`schema.Timeline` parsed from a sequence - element. - - :param sequence_element: The sequence element. - :param context: The context dictionary. - - :return: The appropriate OTIO object for the element. - """ - local_context = context.context_pushing_element(sequence_element) - - name = _name_from_element(sequence_element) - parsed_tags = {"name", "media", "marker", "duration"} - md_dict = _xml_tree_to_dict(sequence_element, parsed_tags) - - sequence_timecode = self._derefed_element( - sequence_element.find("./timecode") - ) - if sequence_timecode is not None: - seq_start_time = _time_from_timecode_element( - sequence_timecode, local_context - ) - else: - seq_start_time = None - - media_element = self._derefed_element(sequence_element.find("./media")) - if media_element is None: - tracks = None - else: - # Reach down into the media block and escalate metadata to the - # sequence - for media_type in media_element: - media_info_dict = _xml_tree_to_dict(media_type, {"track"}) - if media_info_dict: - media_dict = md_dict.setdefault( - "media", collections.OrderedDict() - ) - media_dict[media_type.tag] = media_info_dict - - tracks = self.stack_for_element(media_element, local_context) - tracks.name = name - - # TODO: Should we be parsing the duration tag and pad out a track with - # gap to match? - - timeline = schema.Timeline( - name=name, - global_start_time=seq_start_time, - metadata={META_NAMESPACE: md_dict} if md_dict else {}, - ) - timeline.tracks = tracks - - # Push the sequence markers onto the top stack - markers = markers_from_element(sequence_element, context) - timeline.tracks.markers.extend(markers) - - return timeline - - def stack_for_element(self, element, context): - """ - Given an element, parses out track information as a stack. - - :param element: The element under which to find the tracks (typically - a ``media`` element. - :param context: The current parser context. - - :return: A :class: `schema.Stack` of the tracks. - """ - # Determine the context - local_context = context.context_pushing_element(element) - - tracks = [] - media_type_elements = self._derefed_iterfind(element, "./") - for media_type_element in media_type_elements: - try: - track_kind = _track_kind_from_element(media_type_element) - except ValueError: - # Unexpected element - continue - - is_audio = (track_kind == schema.TrackKind.Audio) - track_elements = self._derefed_iterfind( - media_type_element, "./track" - ) - for track_element in track_elements: - if is_audio and not _is_primary_audio_channel(track_element): - continue - - tracks.append( - self.track_for_element( - track_element, track_kind, local_context - ) - ) - - markers = markers_from_element(element, context) - - stack = schema.Stack( - children=tracks, - markers=markers, - name=_name_from_element(element), - ) - - return stack - - def track_for_element(self, track_element, track_kind, context): - """ - Given a track element, constructs the OTIO track. - - :param track_element: The track XML element. - :param track_kind: The :class: `schema.TrackKind` for the track. - :param context: The context dict for this track. - """ - local_context = context.context_pushing_element(track_element) - name_element = track_element.find("./name") - track_name = (name_element.text if name_element is not None else '') - - timeline_item_tags = {"clipitem", "generatoritem", "transitionitem"} - - md_dict = _xml_tree_to_dict(track_element, timeline_item_tags) - track_metadata = {META_NAMESPACE: md_dict} if md_dict else None - - track = schema.Track( - name=track_name, - kind=track_kind, - metadata=track_metadata, - ) - - # Iterate through and parse track items - track_rate = _rate_from_context(local_context) - current_timeline_time = opentime.RationalTime(0, track_rate) - head_transition_element = None - for i, item_element in enumerate(track_element): - if item_element.tag not in timeline_item_tags: - continue - - item_element = self._derefed_element(item_element) - - # Do a lookahead to try and find the tail transition item - try: - tail_transition_element = track_element[i + 1] - if tail_transition_element.tag != "transitionitem": - tail_transition_element = None - else: - tail_transition_element = self._derefed_element( - tail_transition_element - ) - except IndexError: - tail_transition_element = None - - track_item, item_range = self.item_and_timing_for_element( - item_element, - head_transition_element, - tail_transition_element, - local_context, - ) - - # Insert gap between timeline cursor and the new item if needed. - if current_timeline_time < item_range.start_time: - gap_duration = (item_range.start_time - current_timeline_time) - gap_range = opentime.TimeRange( - duration=gap_duration.rescaled_to(track_rate) - ) - track.append(schema.Gap(source_range=gap_range)) - - # Add the item and advance the timeline cursor - track.append(track_item) - current_timeline_time = item_range.end_time_exclusive() - - # Stash the element for the next iteration if it's a transition - if item_element.tag == "transitionitem": - head_transition_element = item_element - - return track - - def media_reference_for_file_element(self, file_element, context): - """ - Given a file XML element, returns the - :class`schema.ExternalReference`. - - :param file_element: The file xml element. - :param context: The parent context dictionary. - - :return: An :class: `schema.ExternalReference`. - """ - local_context = context.context_pushing_element(file_element) - media_ref_rate = _rate_from_context(local_context) - - name = _name_from_element(file_element) - - # Get the full metadata - metadata_ignore_keys = {"duration", "name", "pathurl", "mediaSource"} - md_dict = _xml_tree_to_dict(file_element, metadata_ignore_keys) - metadata_dict = {META_NAMESPACE: md_dict} if md_dict else None - - # Determine the file path - path_element = file_element.find("./pathurl") - if path_element is not None: - path = path_element.text - else: - path = None - - # Determine the mediasource - mediasource_element = file_element.find("./mediaSource") - if mediasource_element is not None: - mediasource = mediasource_element.text - else: - mediasource = None - - # Find the timing - timecode_element = file_element.find("./timecode") - if timecode_element is not None: - start_time = _time_from_timecode_element( - timecode_element, local_context - ) - start_time = start_time.rescaled_to(media_ref_rate) - else: - start_time = opentime.RationalTime(0, media_ref_rate) - - duration_element = file_element.find("./duration") - if duration_element is not None: - duration = opentime.RationalTime( - float(duration_element.text), media_ref_rate - ) - available_range = opentime.TimeRange(start_time, duration) - elif timecode_element is not None: - available_range = opentime.TimeRange( - start_time, - opentime.RationalTime(0, media_ref_rate), - ) - else: - available_range = None - - if path is not None: - media_reference = schema.ExternalReference( - target_url=path, - available_range=available_range, - metadata=metadata_dict, - ) - media_reference.name = name - elif mediasource is not None: - media_reference = schema.GeneratorReference( - name=name, - generator_kind=mediasource, - available_range=available_range, - metadata=metadata_dict, - ) - else: - media_reference = schema.MissingReference( - name=name, - available_range=available_range, - metadata=metadata_dict, - ) - - return media_reference - - def media_reference_for_effect_element(self, effect_element): - """ - Given an effect element, returns a generator reference. - - :param effect_element: The effect for the generator. - - :return: An :class: `schema.GeneratorReference` instance. - """ - name = _name_from_element(effect_element) - md_dict = _xml_tree_to_dict(effect_element, {"name", "effectid"}) - - effectid_element = effect_element.find("./effectid") - generator_kind = ( - effectid_element.text if effectid_element is not None else "" - ) - - return schema.GeneratorReference( - name=name, - generator_kind=generator_kind, - metadata=({META_NAMESPACE: md_dict} if md_dict else None) - ) - - def item_and_timing_for_element( - self, item_element, head_transition, tail_transition, context - ): - """ Given a track item, returns a tuple with the appropriate OpenTimelineIO - schema item as the first element and an :class: `opentime.TimeRange` of - the resolved timeline range the clip - occupies. - - :param item_element: The track item XML node. - :param head_transition: The xml element for the transition immediately - before or ``None``. - :param tail_transition: The xml element for the transition immediately - after or ``None``. - :param context: The context dictionary. - - :return: An :class: `core.Item` subclass instance and - :class: `opentime.TimeRange` for the item. - """ - parent_rate = _rate_from_context(context) - - # Establish the start/end time in the timeline - start_value = int(item_element.find("./start").text) - end_value = int(item_element.find("./end").text) - - if start_value == -1: - # determine based on the cut point of the head transition - start = _transition_cut_point(head_transition, context) - - # This offset is needed to determing how much to advance from the - # clip media's in time. Duration accounts for this offset for the - # out time. - transition_rate = _rate_from_context( - context.context_pushing_element(head_transition) - ) - start_offset = start - opentime.RationalTime( - int(head_transition.find('./start').text), transition_rate - ) - else: - start = opentime.RationalTime(start_value, parent_rate) - start_offset = opentime.RationalTime() - - if end_value == -1: - # determine based on the cut point of the tail transition - end = _transition_cut_point(tail_transition, context) - else: - end = opentime.RationalTime(end_value, parent_rate) - - item_range = opentime.TimeRange(start, (end - start)) - - # Get the metadata dictionary for the item - item_metadata_ignore_keys = { - "name", - "start", - "end", - "in", - "out", - "duration", - "file", - "marker", - "effect", - "rate", - "sequence", - } - metadata_dict = _xml_tree_to_dict( - item_element, item_metadata_ignore_keys - ) - - # deserialize the item - if item_element.tag in {"clipitem", "generatoritem"}: - item = self.clip_for_element( - item_element, item_range, start_offset, context - ) - elif item_element.tag == "transitionitem": - item = self.transition_for_element(item_element, context) - else: - name = f"unknown-{item_element.tag}" - item = core.Item(name=name, source_range=item_range) - - if metadata_dict: - item.metadata.setdefault(META_NAMESPACE, {}).update(metadata_dict) - - return (item, item_range) - - def clip_for_element( - self, clipitem_element, item_range, start_offset, context - ): - """ - Given a clipitem xml element, returns an :class: `schema.Clip`. - - :param clipitem_element: The element to create a clip for. - :param item_range: The time range in the timeline the clip occupies. - :param start_offset: The amount by which the ``in`` time of the clip - source should be advanced (usually due to a transition). - :param context: The parent context for the clip. - - :return: The :class: `schema.Clip` instance. - """ - local_context = context.context_pushing_element(clipitem_element) - - name = _name_from_element(clipitem_element) - - file_element = self._derefed_element(clipitem_element.find("./file")) - sequence_element = self._derefed_element( - clipitem_element.find("./sequence") - ) - if clipitem_element.tag == "generatoritem": - generator_effect_element = clipitem_element.find( - "./effect[effecttype='generator']" - ) - else: - generator_effect_element = None - - media_start_time = opentime.RationalTime() - if sequence_element is not None: - item = self.stack_for_element(sequence_element, local_context) - # TODO: is there an applicable media start time we should be - # using from nested sequences? - elif file_element is not None or generator_effect_element is not None: - if file_element is not None: - media_reference = self.media_reference_for_file_element( - file_element, local_context - ) - # See if there is a start offset - timecode_element = file_element.find("./timecode") - if timecode_element is not None: - media_start_time = _time_from_timecode_element( - timecode_element, local_context - ) - elif generator_effect_element is not None: - media_reference = self.media_reference_for_effect_element( - generator_effect_element - ) - - item = schema.Clip( - name=name, - media_reference=media_reference, - ) - else: - raise TypeError( - 'Type of clip item is not supported {}'.format( - _element_identification_string(clipitem_element) - ) - ) - - # Add the markers - markers = markers_from_element(clipitem_element, context) - item.markers.extend(markers) - - # Find the in time (source time relative to media start) - clip_rate = _rate_from_context(local_context) - in_value = float(clipitem_element.find('./in').text) - in_time = opentime.RationalTime(in_value, clip_rate) - - # Offset the "in" time by the start offset of the media - soure_start_time = in_time + media_start_time + start_offset - duration = item_range.duration - - # Source Range is the item range expressed in the clip's rate (for now) - source_range = opentime.TimeRange( - soure_start_time.rescaled_to(clip_rate), - duration.rescaled_to(clip_rate), - ) - - item.source_range = source_range - - # Parse the filters - filter_iter = self._derefed_iterfind(clipitem_element, "./filter") - for filter_element in filter_iter: - item.effects.append( - self.effect_from_filter_element(filter_element) - ) - - return item - - def effect_from_filter_element(self, filter_element): - """ - Given a filter element, creates an :class: `schema.Effect`. - - :param filter_element: The ``filter`` element containing the effect. - - :return: The effect instance. - """ - effect_element = filter_element.find("./effect") - - if effect_element is None: - raise ValueError( - f"could not find effect in filter: {filter_element}" - ) - - name = _name_from_element(effect_element) - - effect_metadata = _xml_tree_to_dict(effect_element, {"name"}) - - return schema.Effect( - name, - metadata={META_NAMESPACE: effect_metadata}, - ) - - def transition_for_element(self, item_element, context): - """ - Creates an OTIO transition for the provided transition element. - - :param item_element: The element to create a transition for. - :param context: The parent context for the element. - - :return: The :class: `schema.Transition` instance. - """ - # start and end times are in the parent's rate - rate = _rate_from_context(context) - start = opentime.RationalTime( - int(item_element.find('./start').text), - rate - ) - end = opentime.RationalTime( - int(item_element.find('./end').text), - rate - ) - cut_point = _transition_cut_point(item_element, context) - - transition = schema.Transition( - name=_name_from_element(item_element.find('./effect')), - transition_type=schema.TransitionTypes.SMPTE_Dissolve, - in_offset=cut_point - start, - out_offset=end - cut_point, - ) - - return transition - - -# ------------------------ -# building single track -# ------------------------ - - -def _backreference_for_item(item, tag, br_map): - """ - Given an item, determines what the id in the backreference map should be. - If the item is already tracked in the map, it will be returned, otherwise - a new id will be minted. - - .. note:: ``br_map`` may be mutated by this function. ``br_map`` is - intended to be an opaque data structure and only accessed through this - function, the structure of data in br_map may change. - - :param item: The :class: `core.SerializableObject` to create an id for. - :param tag: The tag name that will be used for object in xml. - :param br_map: The dictionary containing backreference information - generated so far. - - :return: A 2-tuple of (id_string, is_new_id) where the ``id_string`` is - the value for the xml id attribute and ``is_new_id`` is ``True`` when - this is the first time that id was encountered. - """ - # br_map is structured as a dictionary with tags as keys, and dictionaries - # of hash to id int as values. - - def id_string(id_int): - return f"{tag}-{id_int}" - - # Determine how to uniquely identify the referenced item - if isinstance(item, schema.ExternalReference): - item_hash = hash(str(item.target_url)) - else: - # TODO: This may become a performance issue. It means that every - # non-ref object is serialized to json and hashed each time it's - # encountered. - item_hash = hash( - core.serialize_json_to_string(item) - ) - - is_new_id = False - item_id = br_map.get(tag, {}).get(item_hash) - if item_id is not None: - return (id_string(item_id), is_new_id) - - # This is a new id, figure out what it should be. - is_new_id = True - - # Attempt to preserve the ID from the input metadata. - preferred_id = None - orig_id_string = item.metadata.get(META_NAMESPACE, {}).get("@id") - if orig_id_string is not None: - orig_id_match = ID_RE.match(orig_id_string) - if orig_id_match is not None: - match_groups = orig_id_match.groupdict() - orig_tagname = match_groups["tag"] - if orig_tagname == tag: - preferred_id = int(match_groups["id"]) - - # Generate an id by finding the lowest value in a contiguous range not - # colliding with an existing value - tag_id_map = br_map.setdefault(tag, {}) - existing_ids = set(tag_id_map.values()) - if preferred_id is not None and preferred_id not in existing_ids: - item_id = preferred_id - else: - # Make a range from 1 including the ID after the largest assigned - # (hence the +2 since range is non-inclusive on the upper bound) - max_assigned_id = max(existing_ids) if existing_ids else 0 - max_possible_id = (max_assigned_id + 2) - possible_ids = set(range(1, max_possible_id)) - - # Select the lowest unassigned ID - item_id = min(possible_ids.difference(existing_ids)) - - # Store the created id - tag_id_map[item_hash] = item_id - - return (id_string(item_id), is_new_id) - - -def _backreference_build(tag): - """ - A decorator for functions creating XML elements to implement the id system - described in FCP XML. - - This wrapper determines if the otio item is equivalent to one encountered - before with the provided tag name. If the item hasn't been encountered then - the wrapped function will be invoked and the XML element from that function - will have the ``id`` attribute set and be stored in br_map. - If the item is equivalent to a previously provided item, the wrapped - function won't be invoked and a simple tag with the previous instance's id - will be returned instead. - - The wrapped function must: - - Have the otio item as the first positional argument. - - Have br_map (backreference map, a dictionary) as the last positional - arg. br_map stores the state for encountered items. - - :param tag: The xml tag of the element the wrapped function generates. - """ - # We can also encode these back-references if an item is accessed multiple - # times. To do this we store an id attribute on the element. For back- - # references we then only need to return an empty element of that type with - # the id we logged before - - def singleton_decorator(func): - @functools.wraps(func) - def wrapper(item, *args, **kwargs): - if "br_map" in kwargs: - br_map = kwargs["br_map"] - else: - br_map = args[-1] - - item_id, id_is_new = _backreference_for_item(item, tag, br_map) - - # if the item exists in the map already, we should use the - # abbreviated XML element referring to the original - if not id_is_new: - return cElementTree.Element(tag, id=item_id) - - # This is the first time for this unique item, it needs it's full - # XML. Get the element generated by the wrapped function and add - # the id attribute. - elem = func(item, *args, **kwargs) - elem.attrib["id"] = item_id - - return elem - - return wrapper - - return singleton_decorator - - -def _append_new_sub_element(parent, tag, attrib=None, text=None): - """ - Creates a sub-element with the provided tag, attributes, and text. - - This is a convenience because the :class: `SubElement` constructor does not - provide the ability to set ``text``. - - :param parent: The parent element. - :param tag: The tag string for the element. - :param attrib: An optional dictionary of attributes for the element. - :param text: Optional text value for the element. - - :return: The new XML element. - """ - elem = cElementTree.SubElement(parent, tag, **attrib or {}) - if text is not None: - elem.text = text - - return elem - - -def _build_rate(fps): - """ - Given a framerate, makes a ``rate`` xml tree. - - :param fps: The framerate. - :return: The fcp xml ``rate`` tree. - """ - rate = math.ceil(fps) - - rate_e = cElementTree.Element('rate') - _append_new_sub_element(rate_e, 'timebase', text=str(int(rate))) - _append_new_sub_element( - rate_e, - 'ntsc', - text='FALSE' if rate == fps else 'TRUE' - ) - return rate_e - - -def _build_timecode(time, fps, drop_frame=False, additional_metadata=None): - """ - Makes a timecode xml element tree. - - .. warning:: The drop_frame parameter is currently ignored and - auto-determined by rate. This is because the underlying otio timecode - conversion assumes DFTC based on rate. - - :param time: The :class: `opentime.RationalTime` for the timecode. - :param fps: The framerate for the timecode. - :param drop_frame: If True, generates drop-frame timecode. - :param additional_metadata: A dictionary with other metadata items like - ``field``, ``reel``, ``source``, and ``format``. It is assumed this - dictionary is of the form generated by :func:`_xml_tree_to_dict` when - the file was read originally. - - :return: The ``timecode`` element. - """ - - if additional_metadata: - # Only allow legal child items for the timecode element - filtered = { - k: v for k, v in additional_metadata.items() - if k in ("field", "reel", "source", "format") - } - tc_element = _dict_to_xml_tree(filtered, "timecode") - else: - tc_element = cElementTree.Element("timecode") - - tc_element.append(_build_rate(fps)) - rate_is_not_ntsc = (tc_element.find('./rate/ntsc').text == "FALSE") - if drop_frame and rate_is_not_ntsc: - tc_fps = fps * (1000 / 1001.0) - else: - tc_fps = fps - - # Get the time values - tc_time = opentime.RationalTime(time.value_rescaled_to(fps), tc_fps) - tc_string = opentime.to_timecode(tc_time, tc_fps, drop_frame) - - _append_new_sub_element(tc_element, "string", text=tc_string) - - frame_number = int(round(time.value)) - _append_new_sub_element( - tc_element, "frame", text=f"{frame_number:.0f}" - ) - - drop_frame = (";" in tc_string) - display_format = "DF" if drop_frame else "NDF" - _append_new_sub_element(tc_element, "displayformat", text=display_format) - - return tc_element - - -def _build_item_timings( - item_e, - item, - timeline_range, - transition_offsets, - timecode -): - # source_start is absolute time taking into account the timecode of the - # media. But xml regards the source in point from the start of the media. - # So we subtract the media timecode. - item_rate = item.source_range.start_time.rate - source_start = (item.source_range.start_time - timecode) - source_start = source_start.rescaled_to(item_rate) - - source_end = (item.source_range.end_time_exclusive() - timecode) - source_end = source_end.rescaled_to(item_rate) - - start = f'{timeline_range.start_time.value:.0f}' - end = f'{timeline_range.end_time_exclusive().value:.0f}' - - item_e.append(_build_rate(item_rate)) - - if transition_offsets[0] is not None: - start = '-1' - source_start -= transition_offsets[0] - if transition_offsets[1] is not None: - end = '-1' - source_end += transition_offsets[1] - - _append_new_sub_element( - item_e, 'duration', - text=f'{item.source_range.duration.value:.0f}' - ) - _append_new_sub_element(item_e, 'start', text=start) - _append_new_sub_element(item_e, 'end', text=end) - _append_new_sub_element( - item_e, - 'in', - text=f'{source_start.value:.0f}' - ) - _append_new_sub_element( - item_e, - 'out', - text=f'{source_end.value:.0f}' - ) - - -@_backreference_build('file') -def _build_empty_file(media_ref, parent_range, br_map): - file_e = _element_with_item_metadata("file", media_ref) - _append_new_sub_element(file_e, "name", text=media_ref.name) - - if media_ref.available_range is not None: - available_range = media_ref.available_range - else: - available_range = opentime.TimeRange( - opentime.RationalTime(0, parent_range.start_time.rate), - parent_range.duration, - ) - - ref_rate = available_range.start_time.rate - file_e.append(_build_rate(ref_rate)) - - # Only provide a duration if one came from the media, don't invent one. - # For example, Slugs have no duration specified. - if media_ref.available_range: - duration = available_range.duration.rescaled_to(ref_rate) - _append_new_sub_element( - file_e, - 'duration', - text=f'{duration.value:.0f}', - ) - - # timecode - ref_tc_metadata = media_ref.metadata.get(META_NAMESPACE, {}).get( - "timecode" - ) - tc_element = _build_timecode_from_metadata( - available_range.start_time, ref_tc_metadata - ) - file_e.append(tc_element) - - file_media_e = _get_or_create_subelement(file_e, "media") - if file_media_e.find("video") is None: - _append_new_sub_element(file_media_e, "video") - - return file_e - - -@_backreference_build('file') -def _build_file(media_reference, br_map): - file_e = _element_with_item_metadata("file", media_reference) - - available_range = media_reference.available_range - - # If the media reference is of one of the supported types, populate - # the appropriate source info element - if isinstance(media_reference, schema.ExternalReference): - _append_new_sub_element( - file_e, 'pathurl', text=media_reference.target_url - ) - url_path = _url_to_path(media_reference.target_url) - - fallback_file_name = ( - media_reference.name if media_reference.name - else os.path.basename(url_path) - ) - elif isinstance(media_reference, schema.GeneratorReference): - _append_new_sub_element( - file_e, 'mediaSource', text=media_reference.generator_kind - ) - fallback_file_name = media_reference.generator_kind - - _append_new_sub_element( - file_e, - 'name', - text=(media_reference.name or fallback_file_name), - ) - - # timing info - file_e.append(_build_rate(available_range.start_time.rate)) - _append_new_sub_element( - file_e, 'duration', - text=f'{available_range.duration.value:.0f}' - ) - - # timecode - ref_tc_metadata = media_reference.metadata.get(META_NAMESPACE, {}).get( - "timecode" - ) - tc_element = _build_timecode_from_metadata( - available_range.start_time, ref_tc_metadata - ) - file_e.append(tc_element) - - # we need to flag the file reference with the content types, otherwise it - # will not get recognized - # TODO: We should use a better method for this. Perhaps pre-walk the - # timeline and find all the track kinds this media is present in? - if file_e.find("media") is None: - file_media_e = _get_or_create_subelement(file_e, "media") - - audio_exts = {'.wav', '.aac', '.mp3', '.aif', '.aiff', '.m4a'} - has_video = (os.path.splitext(url_path)[1].lower() not in audio_exts) - if has_video and file_media_e.find("video") is None: - _append_new_sub_element(file_media_e, "video") - - # TODO: This is assuming all files have an audio track. Not sure what - # the implications of that are. - if file_media_e.find("audio") is None: - _append_new_sub_element(file_media_e, "audio") - - return file_e - - -def _build_transition_item( - transition_item, - timeline_range, - transition_offsets, - br_map, -): - transition_e = _element_with_item_metadata( - "transitionitem", transition_item - ) - _append_new_sub_element( - transition_e, - 'start', - text=f'{timeline_range.start_time.value:.0f}' - ) - _append_new_sub_element( - transition_e, - 'end', - text=f'{timeline_range.end_time_exclusive().value:.0f}' - ) - - # Only add an alignment if it didn't already come in from the metadata dict - if transition_e.find("alignment") is None: - # default center aligned - alignment = "center" - if not transition_item.in_offset.value: - alignment = 'start-black' - elif not transition_item.out_offset.value: - alignment = 'end-black' - - _append_new_sub_element(transition_e, 'alignment', text=alignment) - # todo support 'start' and 'end' alignment - - transition_e.append(_build_rate(timeline_range.start_time.rate)) - - # Only add an effect if it didn't already come in from the metadata dict - if not transition_e.find("./effect"): - try: - effectid = transition_item.metadata[META_NAMESPACE]["effectid"] - except KeyError: - effectid = "Cross Dissolve" - - effect_e = _append_new_sub_element(transition_e, 'effect') - _append_new_sub_element(effect_e, 'name', text=transition_item.name) - _append_new_sub_element(effect_e, 'effectid', text=effectid) - _append_new_sub_element(effect_e, 'effecttype', text='transition') - _append_new_sub_element(effect_e, 'mediatype', text='video') - - return transition_e - - -@_backreference_build("clipitem") -def _build_clip_item_without_media( - clip_item, - timeline_range, - transition_offsets, - br_map, -): - # TODO: Does this need to be a separate function or could it be unified - # with _build_clip_item? - clip_item_e = _element_with_item_metadata("clipitem", clip_item) - if "frameBlend" not in clip_item_e.attrib: - clip_item_e.attrib["frameBlend"] = "FALSE" - - if clip_item.media_reference.available_range: - media_start_time = clip_item.media_reference.available_range.start_time - else: - media_start_time = opentime.RationalTime( - 0, timeline_range.start_time.rate - ) - - _append_new_sub_element(clip_item_e, 'name', text=clip_item.name) - clip_item_e.append( - _build_empty_file( - clip_item.media_reference, timeline_range, br_map - ) - ) - clip_item_e.extend([_build_marker(m) for m in clip_item.markers]) - - _build_item_timings( - clip_item_e, - clip_item, - timeline_range, - transition_offsets, - media_start_time, - ) - - return clip_item_e - - -@_backreference_build("clipitem") -def _build_clip_item(clip_item, timeline_range, transition_offsets, br_map): - # This is some wacky logic, but here's why: - # Pretty much any generator from Premiere just reports as being a clip that - # uses Slug as mediaSource rather than a pathurl (color matte seems to be - # the exception). I think this is becasue it is aiming to roundtrip effects - # with itself rather than try to make them backward compatable with FCP 7. - # This allows Premiere generators to still come in as slugs and still exist - # as placeholders for effects that may not have a true analog in FCP 7. - # Since OTIO does not yet interpret these generators into specific - # first-class schema objects (e.x. color matte, bars, etc.), the - # "artificial" mediaSources on clipitem and generatoritem both interpret as - # generator references. So, for the moment, to detect if likely have the - # metadata to make an fcp 7 style generatoritem we look for the effecttype - # field, if that is missing we write the generator using mediaSource in the - # Premiere Pro style. - # This adapter is currently built to effectively round-trip and let savvy - # users push the correct data into the metadata dictionary to drive - # behavior, but in the future when there are specific generator schema in - # otio we could correctly translate a first-class OTIO generator concept - # into an equivalent FCP 7 generatoritem or a Premiere Pro style overloaded - # clipitem. - is_generator = isinstance( - clip_item.media_reference, schema.GeneratorReference - ) - - media_ref_fcp_md = clip_item.media_reference.metadata.get('fcp_xml', {}) - is_generatoritem = ( - is_generator and 'effecttype' in media_ref_fcp_md - ) - - tagname = "generatoritem" if is_generatoritem else "clipitem" - clip_item_e = _element_with_item_metadata(tagname, clip_item) - if "frameBlend" not in clip_item_e.attrib: - clip_item_e.attrib["frameBlend"] = "FALSE" - - if is_generatoritem: - clip_item_e.append(_build_generator_effect(clip_item, br_map)) - else: - clip_item_e.append(_build_file(clip_item.media_reference, br_map)) - - # set the clip name from the media reference if not defined on the clip - if clip_item.name is not None: - name = clip_item.name - elif is_generator: - name = clip_item.media_reference.name - else: - url_path = _url_to_path(clip_item.media_reference.target_url) - name = os.path.basename(url_path) - - _append_new_sub_element(clip_item_e, 'name', text=name) - - if clip_item.media_reference.available_range: - clip_item_e.append( - _build_rate(clip_item.source_range.start_time.rate) - ) - clip_item_e.extend(_build_marker(m) for m in clip_item.markers) - - if clip_item.media_reference.available_range: - timecode = clip_item.media_reference.available_range.start_time - else: - timecode = opentime.RationalTime( - 0, clip_item.source_range.start_time.rate - ) - - _build_item_timings( - clip_item_e, - clip_item, - timeline_range, - transition_offsets, - timecode - ) - - return clip_item_e - - -def _build_generator_effect(clip_item, br_map): - """ - Builds an effect element for the generator ref on the provided clip item. - - :param clip_item: a clip with a :class: `schema.GeneratorReference` as - its ``media_reference``. - :param br_map: The backreference map. - """ - # Since we don't support effects in a standard way, just try and build - # based on the metadata provided at deserialization so we can roundtrip - generator_ref = clip_item.media_reference - try: - fcp_xml_effect_info = generator_ref.metadata[META_NAMESPACE] - except KeyError: - return _build_empty_file( - generator_ref, - clip_item.source_range, - br_map, - ) - - # Get the XML Tree built from the metadata - effect_element = _dict_to_xml_tree(fcp_xml_effect_info, "effect") - - # Validate the metadata and make sure it contains the required elements - for required in ("effecttype", "mediatype", "effectcategory"): - if effect_element.find(required) is None: - return _build_empty_file( - generator_ref, - clip_item.source_range, - br_map, - ) - - # Add the name - _append_new_sub_element(effect_element, "name", text=generator_ref.name) - _append_new_sub_element( - effect_element, "effectid", text=generator_ref.generator_kind - ) - - return effect_element - - -@_backreference_build("clipitem") -def _build_track_item(track, timeline_range, transition_offsets, br_map): - clip_item_e = _element_with_item_metadata("clipitem", track) - if "frameBlend" not in clip_item_e.attrib: - clip_item_e.attrib["frameBlend"] = "FALSE" - - _append_new_sub_element( - clip_item_e, - 'name', - text=os.path.basename(track.name) - ) - - track_e = _build_sequence_for_stack(track, timeline_range, br_map) - - clip_item_e.append(_build_rate(track.source_range.start_time.rate)) - clip_item_e.extend([_build_marker(m) for m in track.markers]) - clip_item_e.append(track_e) - timecode = opentime.RationalTime(0, timeline_range.start_time.rate) - - _build_item_timings( - clip_item_e, - track, - timeline_range, - transition_offsets, - timecode - ) - - return clip_item_e - - -def _build_item(item, timeline_range, transition_offsets, br_map): - if isinstance(item, schema.Transition): - return _build_transition_item( - item, - timeline_range, - transition_offsets, - br_map - ) - elif isinstance(item, schema.Clip): - if isinstance( - item.media_reference, - schema.MissingReference - ): - return _build_clip_item_without_media( - item, - timeline_range, - transition_offsets, - br_map - ) - else: - return _build_clip_item( - item, - timeline_range, - transition_offsets, - br_map - ) - elif isinstance(item, schema.Stack): - return _build_track_item( - item, - timeline_range, - transition_offsets, - br_map - ) - else: - raise ValueError('Unsupported item: ' + str(item)) - - -def _build_top_level_track(track, track_rate, br_map): - track_e = _element_with_item_metadata("track", track) - - for n, item in enumerate(track): - if isinstance(item, schema.Gap): - continue - - transition_offsets = [None, None] - previous_item = track[n - 1] if n > 0 else None - next_item = track[n + 1] if n + 1 < len(track) else None - if not isinstance(item, schema.Transition): - # find out if this item has any neighboring transition - if isinstance(previous_item, schema.Transition): - if previous_item.out_offset.value: - transition_offsets[0] = previous_item.in_offset - else: - transition_offsets[0] = None - if isinstance(next_item, schema.Transition): - if next_item.in_offset.value: - transition_offsets[1] = next_item.out_offset - else: - transition_offsets[1] = None - - timeline_range = track.range_of_child_at_index(n) - timeline_range = opentime.TimeRange( - timeline_range.start_time.rescaled_to(track_rate), - timeline_range.duration.rescaled_to(track_rate) - ) - track_e.append( - _build_item(item, timeline_range, transition_offsets, br_map) - ) - - return track_e - - -def _build_marker(marker): - marker_e = _element_with_item_metadata("marker", marker) - - marked_range = marker.marked_range - - _append_new_sub_element(marker_e, 'name', text=marker.name) - _append_new_sub_element( - marker_e, 'in', - text=f'{marked_range.start_time.value:.0f}' - ) - _append_new_sub_element( - marker_e, 'out', - text='{:.0f}'.format( - marked_range.start_time.value + marked_range.duration.value - ) - ) - - return marker_e - - -def _build_timecode_from_metadata(time, tc_metadata=None): - """ - Makes a timecode element with the given time and (if available) - ```timecode`` metadata stashed on input. - - :param time: The :class: `opentime.RationalTime` to encode. - :param tc_metadata: The xml dict for the ``timecode`` element populated - on read. - - :return: A timecode element. - """ - if tc_metadata is None: - tc_metadata = {} - - try: - - # Parse the rate in the preserved metadata, if available - tc_rate = _otio_rate( - tc_metadata["timebase"], _bool_value(tc_metadata["ntsc"]) - ) - except KeyError: - # Default to the rate in the start time - tc_rate = time.rate - - drop_frame = (tc_metadata.get("displayformat", "NDF") == "DF") - - return _build_timecode( - time, - tc_rate, - drop_frame, - additional_metadata=tc_metadata, - ) - - -@_backreference_build('sequence') -def _build_sequence_for_timeline(timeline, timeline_range, br_map): - sequence_e = _element_with_item_metadata("sequence", timeline) - - _add_stack_elements_to_sequence( - timeline.tracks, sequence_e, timeline_range, br_map - ) - - # In the case of timelines, use the timeline name rather than the stack - # name. - if timeline.name: - sequence_e.find('./name').text = timeline.name - - # Add the sequence global start - if timeline.global_start_time is not None: - seq_tc_metadata = timeline.metadata.get(META_NAMESPACE, {}).get( - "timecode" - ) - tc_element = _build_timecode_from_metadata( - timeline.global_start_time, seq_tc_metadata - ) - sequence_e.append(tc_element) - - return sequence_e - - -@_backreference_build('sequence') -def _build_sequence_for_stack(stack, timeline_range, br_map): - sequence_e = _element_with_item_metadata("sequence", stack) - - _add_stack_elements_to_sequence(stack, sequence_e, timeline_range, br_map) - - return sequence_e - - -def _add_stack_elements_to_sequence(stack, sequence_e, timeline_range, br_map): - _append_new_sub_element(sequence_e, 'name', text=stack.name) - _append_new_sub_element( - sequence_e, 'duration', - text=f'{timeline_range.duration.value:.0f}' - ) - sequence_e.append(_build_rate(timeline_range.start_time.rate)) - track_rate = timeline_range.start_time.rate - - media_e = _get_or_create_subelement(sequence_e, "media") - video_e = _get_or_create_subelement(media_e, 'video') - audio_e = _get_or_create_subelement(media_e, 'audio') - - # This is a fix for Davinci Resolve. After the "video" tag, it expects - # a <format> tag, even if empty. See issue 839 - _get_or_create_subelement(video_e, "format") - - # XXX: Due to the way that backreferences are created later on, the XML - # is assumed to have its video tracks serialized before its audio - # tracks. Because the order that they are added to the media is - # dependent on what order the metadata is in in the fcp_xml metadata - # (as a previous function is usually creating them), this code - # enforces the order. - media_e.clear() - media_e.extend([video_e, audio_e]) - - for track in stack: - track_elements = _build_top_level_track(track, track_rate, br_map) - if track.kind == schema.TrackKind.Video: - video_e.append(track_elements) - elif track.kind == schema.TrackKind.Audio: - audio_e.append(track_elements) - - for marker in stack.markers: - sequence_e.append(_build_marker(marker)) - - -def _build_collection(collection, br_map): - tracks = [] - for item in collection: - if not isinstance(item, schema.Timeline): - continue - - timeline_range = opentime.TimeRange( - start_time=item.global_start_time, - duration=item.duration() - ) - tracks.append( - _build_sequence_for_timeline(item, timeline_range, br_map) - ) - - return tracks - - -# -------------------- -# adapter requirements -# -------------------- - -def read_from_string(input_str): - tree = cElementTree.fromstring(input_str) - - parser = FCP7XMLParser(tree) - sequences = parser.top_level_sequences() - - if len(sequences) == 1: - return sequences[0] - elif len(sequences) > 1: - return schema.SerializableCollection( - name="Sequences", - children=sequences, - ) - else: - raise ValueError('No top-level sequences found') - - -def write_to_string(input_otio): - tree_e = cElementTree.Element('xmeml', version="4") - project_e = _append_new_sub_element(tree_e, 'project') - _append_new_sub_element(project_e, 'name', text=input_otio.name) - children_e = _append_new_sub_element(project_e, 'children') - - br_map = collections.defaultdict(dict) - - if isinstance(input_otio, schema.Timeline): - timeline_range = opentime.TimeRange( - start_time=input_otio.global_start_time, - duration=input_otio.duration() - ) - children_e.append( - _build_sequence_for_timeline( - input_otio, timeline_range, br_map - ) - ) - elif isinstance(input_otio, schema.SerializableCollection): - children_e.extend( - _build_collection(input_otio, br_map) - ) - - return _make_pretty_string(tree_e) diff --git a/src/py-opentimelineio/opentimelineio/adapters/svg.py b/src/py-opentimelineio/opentimelineio/adapters/svg.py deleted file mode 100644 index 54cc94c2e..000000000 --- a/src/py-opentimelineio/opentimelineio/adapters/svg.py +++ /dev/null @@ -1,1293 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""OTIO to SVG Adapter - Points in calculations are y-up. - Points in SVG are y-down.""" - -# otio -import opentimelineio as otio -from xml.etree.ElementTree import Element, SubElement, tostring -from xml.dom import minidom - -# python -import math -import random - -random_colors_used = [] - - -class Color: - def __init__(self, r=0.0, g=0.0, b=0.0, a=255.0): - self.value = (r, g, b, a) - - def __getitem__(self, item): - return self.value[item] - - @staticmethod - def random_color(): - color = Color.__generate_new_color() - random_colors_used.append(color) - return color - - @staticmethod - def __generate_new_color(): - max_distance = None - best_color = None - for _ in range(100): - color = Color.__get_random_color() - if len(random_colors_used) == 0: - return color - best_distance = min([Color.__color_distance(color, c) - for c in random_colors_used]) - if not max_distance or best_distance > max_distance: - max_distance = best_distance - best_color = color - return best_color - - @staticmethod - def __get_random_color(): - return Color(random.random(), random.random(), random.random(), 1.0) - - @staticmethod - def __color_distance(c1, c2): - return sum([abs(x[0] - x[1]) for x in zip(c1.value, c2.value)]) - - @property - def r(self): - return self.value[0] - - @property - def g(self): - return self.value[1] - - @property - def b(self): - return self.value[2] - - @property - def a(self): - return self.value[3] - - def svg_color(self): - return 'rgb({:.8f},{:.8f},{:.8f})'.format( - self.r * 255.0, - self.g * 255.0, - self.b * 255.0 - ) - - -COLORS = { - 'transparent': Color(0, 0, 0, 0), - 'black': Color(0.0, 0.0, 0.0, 1.0), - 'white': Color(1.0, 1.0, 1.0, 1.0), - 'transluscent_white': Color(1.0, 1.0, 1.0, 0.7), - 'purple': Color(0.5, 0.0, 0.5, 1.0), - 'light_blue': Color(0.529, 0.808, 0.922, 1.0), - 'blue': Color(0.0, 0.0, 1.0, 1.0), - 'dark_blue': Color(0.0, 0.0, 0.54, 1.0), - 'green': Color(0.0, 0.5, 0.0, 1.0), - 'dark_green': Color(0.0, 0.39, 0.0, 1.0), - 'yellow': Color(1.0, 1.0, 0.0, 1.0), - 'gold': Color(1.0, 0.84, 0.0, 1.0), - 'orange': Color(1.0, 0.647, 0.0, 1.0), - 'red': Color(1.0, 0.0, 0.0, 1.0), - 'dark_red': Color(0.54, 0.0, 0.0, 1.0), - 'brown': Color(0.54, 0.27, 0.1, 1.0), - 'pink': Color(1.0, 0.75, 0.79, 1.0), - 'gray': Color(0.5, 0.5, 0.5, 1.0), - 'dark_gray': Color(0.66, 0.66, 0.66, 1.0), - 'dark_gray_transluscent': Color(0.66, 0.66, 0.66, 0.7843) -} - - -class Point: - def __init__(self, x, y): - self.x = x - self.y = y - - def svg_point_string(self): - return f"{self.x:.8f},{self.y:.8f}" - - -class Rect: - origin = Point(0, 0) - width = 0.0 - height = 0.0 - - def __init__(self, origin=Point(0, 0), width=0.0, height=0.0): - self.origin = origin - self.width = width - self.height = height - - def normalized(self): - normalized_origin = Point( - self.origin.x + (self.width if self.width < 0 else 0), - self.origin.y + (self.height if self.height < 0 else 0), - ) - normalized_width = abs(self.width) - normalized_height = abs(self.height) - return Rect(normalized_origin, normalized_width, normalized_height) - - def min_x(self): - return self.normalized().origin.x - - def min_y(self): - return self.normalized().origin.y - - def mid_x(self): - return self.origin.x + (self.width * 0.5) - - def mid_y(self): - return self.origin.y + (self.height * 0.5) - - def max_x(self): - norm = self.normalized() - return norm.origin.x + norm.width - - def max_y(self): - norm = self.normalized() - return norm.origin.y + norm.height - - def contract(self, distance): - self.origin.x += distance - self.origin.y += distance - self.width -= 2.0 * distance - self.height -= 2.0 * distance - - -def convert_point_to_svg_coordinates(point, image_height): - y = image_height - point.y - return Point(point.x, y) - - -def convert_rect_to_svg_coordinates(rect, image_height): - """Convert to SVG coordinate system (0,0 at top-left)""" - normalized_rect = rect.normalized() - normalized_rect.origin = convert_point_to_svg_coordinates( - normalized_rect.origin, image_height) - normalized_rect.height *= -1 - return normalized_rect.normalized() - - -class SVGWriter: - - def __init__( - self, - image_width=2406.0, - image_height=1054.0, - image_margin=20.0, - arrow_margin=10.0, - arrow_label_margin=5.0, - font_size=15.0, - font_family='sans-serif' - ): - self.image_width = image_width - self.image_height = image_height - self.image_margin = image_margin - self.arrow_margin = arrow_margin - self.arrow_label_margin = arrow_label_margin - self.font_size = font_size - self.text_margin = 0.5 * font_size - self.font_family = font_family - - self.all_clips_data = [] - self.trackwise_clip_count = [] - self.tracks_duration = [] - self.track_transition_available = [] - self.max_total_duration = 0 - self.global_min_time = 0 - self.global_max_time = 0 - self.scale_x = 1.0 - self.scale_y = 1.0 - self.x_origin = 0 - self.clip_rect_height = 0 - self.vertical_drawing_index = -1 - self.svg_elem = Element( - "svg", - { - "height": f"{self.image_height:.8f}", - "width": f"{self.image_width:.8f}", - "version": "4.0", - "xmlns": "http://www.w3.org/2000/svg", - "xmlns:xlink": "http://www.w3.org/1999/xlink", - } - ) - - # white background - SubElement(self.svg_elem, "rect", - { - "width": "100%", - "height": "100%", - "fill": "white", - }) - - def draw_rect(self, rect, stroke_width=2.0, stroke_color=COLORS['black']): - svg_rect = convert_rect_to_svg_coordinates(rect, self.image_height) - SubElement( - self.svg_elem, - "rect", - { - "x": f"{svg_rect.origin.x:.8f}", - "y": f"{svg_rect.origin.y:.8f}", - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}", - "style": "fill:rgb(255,255,255);stroke-width:{:.8f};" - "stroke:{};opacity:1;fill-opacity:0;".format( - stroke_width, - stroke_color.svg_color() - ) - } - ) - - def draw_labeled_rect(self, rect, stroke_width=2.0, - stroke_color=COLORS['black'], - fill_color=COLORS['white'], - label='', - label_size=10.0): - svg_rect = convert_rect_to_svg_coordinates(rect, self.image_height) - g_elem = SubElement(self.svg_elem, "g", - { - "transform": "translate({:.8f},{:.8f})".format( - svg_rect.origin.x, - svg_rect.origin.y) - }) - SubElement( - g_elem, - "rect", - { - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}", - "style": "fill:{};stroke-width:{:.8f};" - "stroke:{};opacity:1;".format( - fill_color.svg_color(), - stroke_width, - stroke_color.svg_color() - ) - } - ) - sub_svg_elem = SubElement(g_elem, "svg", - { - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}" - }) - text_elem = SubElement(sub_svg_elem, "text", - { - "x": "50%", - "y": "50%", - "font-size": f"{label_size:.8f}", - "font-family": self.font_family, - "style": - "stroke:{};stroke-width:{:.8f};" - "fill:{};opacity:{:.8f};".format( - COLORS['black'].svg_color(), - stroke_width / 4.0, - COLORS['black'].svg_color(), - COLORS['black'].a), - "alignment-baseline": "middle", - "text-anchor": "middle"}) - text_elem.text = label - - def draw_dashed_rect( - self, - rect, - stroke_width=2.0, - stroke_color=COLORS['black'], - fill_color=COLORS['white'] - ): - svg_rect = convert_rect_to_svg_coordinates(rect, self.image_height) - SubElement( - self.svg_elem, - "rect", - { - "x": f"{svg_rect.origin.x:.8f}", - "y": f"{svg_rect.origin.y:.8f}", - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}", - "stroke-dasharray": "5", - "style": "fill:{};stroke-width:{:.8f};stroke:{};" - "opacity:1;fill-opacity:{:.8f}".format( - fill_color.svg_color(), - stroke_width, - stroke_color.svg_color(), - fill_color.a - ) - } - ) - - def draw_labeled_dashed_rect_with_border(self, rect, stroke_width=2.0, - fill_color=COLORS['white'], - border_color=COLORS['black'], - label='', - label_size=10.0): - svg_rect = convert_rect_to_svg_coordinates(rect, self.image_height) - g_elem = SubElement(self.svg_elem, "g", - { - "transform": "translate({:.8f},{:.8f})".format( - svg_rect.origin.x, svg_rect.origin.y) - }) - SubElement( - g_elem, - "rect", - { - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}", - "stroke-dasharray": "5", - "style": "fill:{};stroke-width:{:.8f};" - "stroke:{};opacity:{:.8f};".format( - fill_color.svg_color(), - stroke_width, - border_color.svg_color(), - fill_color.a - ) - } - ) - sub_svg_elem = SubElement(g_elem, "svg", - { - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}" - }) - text_elem = SubElement( - sub_svg_elem, - "text", - { - "x": "50%", - "y": "50%", - "font-size": f"{label_size:.8f}", - "font-family": self.font_family, - "style": "stroke:{};stroke-width:{:.8f};" - "fill:{};opacity:{:.8f};".format( - COLORS['black'].svg_color(), - stroke_width / 4.0, - COLORS['black'].svg_color(), - COLORS['black'].a), - "alignment-baseline": "middle", - "text-anchor": "middle" - } - ) - text_elem.text = label - - def draw_solid_rect(self, rect, fill_color=COLORS['white']): - svg_rect = convert_rect_to_svg_coordinates(rect, self.image_height) - SubElement( - self.svg_elem, - "rect", - { - "x": f"{svg_rect.origin.x:.8f}", - "y": f"{svg_rect.origin.y:.8f}", - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}", - "style": "fill:{};stroke-width:0;" - "stroke:rgb(0,0,0);opacity:{:.8f};".format( - fill_color.svg_color(), - fill_color.a - ) - } - ) - - def draw_solid_rect_with_border(self, rect, stroke_width=2.0, - fill_color=COLORS['white'], - border_color=COLORS['black']): - svg_rect = convert_rect_to_svg_coordinates(rect, self.image_height) - SubElement( - self.svg_elem, - "rect", - { - "x": f"{svg_rect.origin.x:.8f}", - "y": f"{svg_rect.origin.y:.8f}", - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}", - "style": "fill:{};stroke-width:{:.8f};" - "stroke:{};opacity:{:.8f};".format( - fill_color.svg_color(), - stroke_width, - border_color.svg_color(), - fill_color.a - ) - } - ) - - def draw_labeled_solid_rect_with_border(self, rect, stroke_width=2.0, - fill_color=COLORS['white'], - border_color=COLORS['black'], - label='', - label_size=10.0): - svg_rect = convert_rect_to_svg_coordinates(rect, self.image_height) - g_elem = SubElement(self.svg_elem, "g", - { - "transform": "translate({:.8f},{:.8f})".format( - svg_rect.origin.x, svg_rect.origin.y) - }) - SubElement( - g_elem, - "rect", - { - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}", - "style": "fill:{};stroke-width:{:.8f};" - "stroke:{};opacity:{:.8f};".format( - fill_color.svg_color(), - stroke_width, - border_color.svg_color(), - fill_color.a - ) - } - ) - sub_svg_elem = SubElement( - g_elem, - "svg", - { - "width": f"{svg_rect.width:.8f}", - "height": f"{svg_rect.height:.8f}" - } - ) - text_elem = SubElement( - sub_svg_elem, - "text", - { - "x": "50%", - "y": "50%", - "font-size": f"{label_size:.8f}", - "font-family": self.font_family, - "style": "stroke:{};stroke-width:{:.8f};" - "fill:{};opacity:{:.8f};".format( - COLORS['black'].svg_color(), - stroke_width / 4.0, - COLORS['black'].svg_color(), - COLORS['black'].a - ), - "alignment-baseline": "middle", - "text-anchor": "middle" - } - ) - text_elem.text = label - - def draw_line(self, start_point, end_point, stroke_width, - stroke_color=COLORS['black'], is_dashed=False): - point1 = convert_point_to_svg_coordinates( - start_point, - self.image_height - ) - point2 = convert_point_to_svg_coordinates(end_point, self.image_height) - style_str = "stroke-width:{:.8f};stroke:{}" \ - ";opacity:{:.8f};" \ - "stroke-linecap:butt;".format(stroke_width, - stroke_color.svg_color(), - stroke_color.a) - if is_dashed: - style_str = style_str + "stroke-dasharray:4 1" - SubElement(self.svg_elem, "line", - { - "x1": f"{point1.x:.8f}", - "y1": f"{point1.y:.8f}", - "x2": f"{point2.x:.8f}", - "y2": f"{point2.y:.8f}", - "style": style_str - }) - - def draw_arrow(self, start_point, end_point, stroke_width, - stroke_color=COLORS['black']): - point1 = convert_point_to_svg_coordinates( - start_point, - self.image_height - ) - point2 = convert_point_to_svg_coordinates(end_point, self.image_height) - direction = Point(point2.x - point1.x, point2.y - point1.y) - direction_magnitude = math.sqrt(direction.x * direction.x + - direction.y * direction.y) - inv_magnitude = 1.0 / direction_magnitude - arrowhead_length = 9.0 - arrowhead_half_width = arrowhead_length * 0.5 - direction = Point( - direction.x * inv_magnitude, - direction.y * inv_magnitude - ) - point2 = Point(point2.x - arrowhead_length * direction.x, - point2.y - arrowhead_length * direction.y) - triangle_tip = Point(point2.x + arrowhead_length * direction.x, - point2.y + arrowhead_length * direction.y) - perpendicular_dir = Point(-direction.y, direction.x) - triangle_pt_1 = Point( - point2.x + arrowhead_half_width * perpendicular_dir.x, - point2.y + arrowhead_half_width * perpendicular_dir.y - ) - triangle_pt_2 = Point( - point2.x - arrowhead_half_width * perpendicular_dir.x, - point2.y - arrowhead_half_width * perpendicular_dir.y - ) - SubElement( - self.svg_elem, - "line", - { - "x1": f"{point1.x:.8f}", - "y1": f"{point1.y:.8f}", - "x2": f"{point2.x:.8f}", - "y2": f"{point2.y:.8f}", - "style": "stroke-width:{:.8f};stroke:{};opacity:{:.8f};" - "stroke-linecap:butt;".format( - stroke_width, - stroke_color.svg_color(), - stroke_color.a - ) - } - ) - SubElement( - self.svg_elem, - "polygon", - { - "points": " ".join( - p.svg_point_string() - for p in [ - triangle_tip, - triangle_pt_1, - triangle_pt_2 - ] - ), - "style": f"fill:{stroke_color.svg_color()};" - } - ) - - def draw_text(self, text, location, - text_size, color=COLORS['black'], stroke_width=1.0): - location_svg = convert_point_to_svg_coordinates( - location, - self.image_height - ) - text_elem = SubElement( - self.svg_elem, - "text", - { - "x": f"{location_svg.x:.8f}", - "y": f"{location_svg.y:.8f}", - "font-size": f"{text_size:.8f}", - "font-family": self.font_family, - "style": "stroke:{};stroke-width:{:.8f};" - "fill:{};opacity:{:.8f};".format( - color.svg_color(), - stroke_width / 4.0, - color.svg_color(), - color.a - ) - } - ) - text_elem.text = text - - def get_image(self): - xmlstr = tostring( - self.svg_elem, - encoding='utf-8', - method='xml' - ).decode('utf8') - - return minidom.parseString(xmlstr).toprettyxml(indent=' ') - - -class ClipData: - - def __init__(self, src_start=0.0, src_end=0.0, avlbl_start=0.0, - avlbl_end=0.0, avlbl_duration=0.0, - trim_start=0.0, trim_duration=0.0, clip_id=0, - transition_begin=None, transition_end=None): - self.src_start = src_start - self.src_end = src_end - self.avlbl_start = avlbl_start - self.avlbl_end = avlbl_end - self.avlbl_duration = avlbl_duration - self.trim_start = trim_start - self.trim_duration = trim_duration - self.clip_id = clip_id - self.transition_begin = transition_begin - self.transition_end = transition_end - - -def draw_item(otio_obj, svg_writer, extra_data=()): - WRITE_TYPE_MAP = { - otio.schema.Timeline: _draw_timeline, - otio.schema.Stack: _draw_stack, - otio.schema.Track: _draw_track, - otio.schema.Clip: _draw_clip, - otio.schema.Gap: _draw_gap, - otio.schema.Transition: _draw_transition, - otio.schema.SerializableCollection: _draw_collection, - } - if type(otio_obj) in WRITE_TYPE_MAP: - return WRITE_TYPE_MAP[type(otio_obj)](otio_obj, svg_writer, extra_data) - - -# Draw Timeline and calculate Clip and Gap data -def _draw_timeline(timeline, svg_writer, extra_data=()): - clip_count = 0 - transition_track_count = 0 - for track in timeline.tracks: - if len(track) == 0: - continue - current_track_clips_data = [] - current_track_has_transition = False - current_transition = None - track_duration = 0 - min_time = 0 - max_time = 0 - for item in track: - if isinstance(item, otio.schema.Transition): - current_track_has_transition = True - current_transition = item - current_track_clips_data[-1].transition_end = item - continue - avlbl_start = ( - track_duration - item.trimmed_range().start_time.value - ) - if isinstance(item, otio.schema.Clip): - avlbl_start += item.available_range().start_time.value - min_time = min(min_time, avlbl_start) - src_start = track_duration - track_duration += item.trimmed_range().duration.value - src_end = track_duration - 1 - avlbl_end = 0.0 - trim_start = item.trimmed_range().start_time.value - trim_duration = item.trimmed_range().duration.value - if isinstance(item, otio.schema.Clip): - avlbl_end = ( - item.available_range().start_time.value - + item.available_range().duration.value - - item.trimmed_range().start_time.value - - item.trimmed_range().duration.value - + track_duration - 1 - ) - clip_count += 1 - avlbl_duration = item.available_range().duration.value - clip_data = ClipData(src_start, src_end, avlbl_start, - avlbl_end, avlbl_duration, trim_start, - trim_duration, - clip_count - 1) - if current_transition is not None: - clip_data.transition_begin = current_transition - current_transition = None - current_track_clips_data.append(clip_data) - elif isinstance(item, otio.schema.Gap): - avlbl_end = src_end - avlbl_duration = trim_duration - current_transition = None - clip_data = ClipData(src_start, src_end, avlbl_start, - avlbl_end, avlbl_duration, trim_start, - trim_duration, - "Gap", -1) - current_track_clips_data.append(clip_data) - max_time = max(max_time, avlbl_end) - svg_writer.global_max_time = max(svg_writer.global_max_time, max_time) - svg_writer.global_min_time = min(svg_writer.global_min_time, min_time) - svg_writer.all_clips_data.append(current_track_clips_data) - svg_writer.tracks_duration.append(track_duration) - svg_writer.track_transition_available.append( - current_track_has_transition - ) - if current_track_has_transition: - transition_track_count += 1 - # store track-wise clip count to draw arrows from stack to tracks - if len(svg_writer.trackwise_clip_count) == 0: - svg_writer.trackwise_clip_count.append(clip_count) - else: - svg_writer.trackwise_clip_count.append( - clip_count - svg_writer.trackwise_clip_count[ - len(svg_writer.trackwise_clip_count) - 1]) - # The scale in x direction is calculated considering margins on the - # left and right side if the image - svg_writer.scale_x = ( - (svg_writer.image_width - (2.0 * svg_writer.image_margin)) - / (svg_writer.global_max_time - svg_writer.global_min_time + 1.0) - ) - svg_writer.x_origin = ((-svg_writer.global_min_time) * svg_writer.scale_x + - svg_writer.image_margin) - track_count = len(svg_writer.tracks_duration) - # The rect height is calculated considering the following: - # Total space available: - # image height - top & bottom margin - - # space for two labels for the bottom-most rect - # Number of total rects to fit the height of the drawing space: - # track_count * 2.0 = one for track rect and one for the sequence of - # components on that track - # + 2.0 = timeline and stack rects - # clip_count = we need to draw a rect for a media reference per clip - # transition_track_count = we need one more row per the number of tracks - # with transitions - # NumberOfRects * 2.0 - 1.0 = to account for "one rect space" between all - # the rects - total_image_margin_space = 2.0 * svg_writer.image_margin - bottom_label_space = 2.0 * svg_writer.font_size - svg_total_draw_space = ( - svg_writer.image_height - - total_image_margin_space - - bottom_label_space - ) - track_sequence_rect_count = track_count * 2.0 - timeline_stack_rect_count = 2.0 - rect_count = (track_sequence_rect_count + timeline_stack_rect_count + - clip_count + transition_track_count) - total_slots = rect_count * 2.0 - 1.0 - svg_writer.clip_rect_height = svg_total_draw_space / total_slots - - # Draw Timeline - svg_writer.vertical_drawing_index += 2 - timeline_origin = Point(svg_writer.x_origin, - svg_writer.image_height - svg_writer.image_margin - - svg_writer.vertical_drawing_index * - svg_writer.clip_rect_height) - svg_writer.max_total_duration = max(svg_writer.tracks_duration) - label_text_size = 0.4 * svg_writer.clip_rect_height - svg_writer.draw_labeled_solid_rect_with_border( - Rect( - timeline_origin, - svg_writer.max_total_duration * svg_writer.scale_x, - svg_writer.clip_rect_height - ), - label="Timeline", - label_size=label_text_size - ) - time_marker_height = 0.15 * svg_writer.clip_rect_height - for i in range(1, int(svg_writer.max_total_duration)): - start_pt = Point(svg_writer.x_origin + (i * svg_writer.scale_x), - timeline_origin.y) - end_pt = Point(start_pt.x, start_pt.y + time_marker_height) - svg_writer.draw_line( - start_point=start_pt, - end_point=end_pt, - stroke_width=1.0, - stroke_color=COLORS['black'] - ) - # Draw arrow from timeline to stack - timeline_width = svg_writer.max_total_duration * svg_writer.scale_x - arrow_start = Point(svg_writer.x_origin + timeline_width * 0.5, - timeline_origin.y - svg_writer.arrow_margin) - arrow_end = Point(svg_writer.x_origin + timeline_width * 0.5, - timeline_origin.y - svg_writer.clip_rect_height + - svg_writer.arrow_margin) - svg_writer.draw_arrow(start_point=arrow_start, end_point=arrow_end, - stroke_width=2.0, stroke_color=COLORS['black']) - arrow_label_location = Point(arrow_start.x + svg_writer.arrow_label_margin, - (arrow_start.y + arrow_end.y) * 0.5) - svg_writer.draw_text('tracks', arrow_label_location, svg_writer.font_size) - # Draw global_start_time info - if timeline.global_start_time is None: - start_time_text = r'global_start_time: {}'.format('None') - else: - start_time_text = r'global_start_time: {}'.format( - repr(float(round(timeline.global_start_time.value, 1)))) - start_time_location = Point(timeline_origin.x + svg_writer.font_size, - timeline_origin.y - svg_writer.font_size) - svg_writer.draw_text( - start_time_text, - start_time_location, - svg_writer.font_size - ) - - # Draw stack - draw_item(timeline.tracks, svg_writer, - (svg_writer.x_origin, svg_writer.max_total_duration)) - - -# Draw stack -def _draw_stack(stack, svg_writer, extra_data=()): - stack_x_origin = extra_data[0] - stack_duration = extra_data[1] - svg_writer.vertical_drawing_index += 2 - stack_origin = Point(stack_x_origin, - svg_writer.image_height - svg_writer.image_margin - - svg_writer.vertical_drawing_index * - svg_writer.clip_rect_height) - stack_text_size = 0.4 * svg_writer.clip_rect_height - svg_writer.draw_labeled_solid_rect_with_border( - Rect(stack_origin, stack_duration * svg_writer.scale_x, - svg_writer.clip_rect_height), - label="Stack", fill_color=COLORS['dark_gray_transluscent'], - label_size=stack_text_size) - time_marker_height = 0.15 * svg_writer.clip_rect_height - for i in range(1, int(svg_writer.max_total_duration)): - start_pt = Point( - svg_writer.x_origin + (i * svg_writer.scale_x), - stack_origin.y - ) - end_pt = Point(start_pt.x, start_pt.y + time_marker_height) - svg_writer.draw_line( - start_point=start_pt, - end_point=end_pt, - stroke_width=1.0, - stroke_color=COLORS['black'] - ) - for i in range(0, len(svg_writer.tracks_duration)): - draw_item( - stack[i], - svg_writer, - ( - stack_x_origin, - svg_writer.tracks_duration[i], - svg_writer.all_clips_data[i], - svg_writer.track_transition_available[i] - ) - ) - # Draw arrows from stack to tracks - # arrow from stack to first track - stack_width = stack_duration * svg_writer.scale_x - arrow_start = Point(svg_writer.x_origin + stack_width * 0.5, - stack_origin.y - svg_writer.arrow_margin) - arrow_end = Point(svg_writer.x_origin + stack_width * 0.5, - stack_origin.y - svg_writer.clip_rect_height + - svg_writer.arrow_margin) - svg_writer.draw_arrow(start_point=arrow_start, end_point=arrow_end, - stroke_width=2.0, - stroke_color=COLORS['black']) - end_arrow_offset = 1 - # arrows from stack to rest of the tracks - for i in range(1, len(svg_writer.trackwise_clip_count)): - arrow_x_increment_per_track = 10.0 - end_arrow_offset += ( - svg_writer.trackwise_clip_count[i - 1] * 2.0 + 4.0 - ) - arrow_start = Point( - ( - (i * arrow_x_increment_per_track) - + svg_writer.x_origin - + stack_width * 0.5 - ), - stack_origin.y - svg_writer.arrow_margin - ) - arrow_end = Point( - ( - (i * arrow_x_increment_per_track) - + svg_writer.x_origin - + stack_width * 0.5 - ), - stack_origin.y - (end_arrow_offset * svg_writer.clip_rect_height) + - svg_writer.arrow_margin - ) - svg_writer.draw_arrow( - start_point=arrow_start, - end_point=arrow_end, - stroke_width=2.0, - stroke_color=COLORS['black'] - ) - arrow_label_text = fr'children[{len(svg_writer.trackwise_clip_count)}]' - arrow_label_location = Point( - arrow_start.x + svg_writer.arrow_label_margin, - stack_origin.y - svg_writer.clip_rect_height * 0.5 - ) - svg_writer.draw_text( - arrow_label_text, - arrow_label_location, - svg_writer.font_size - ) - # Draw range info - if stack.trimmed_range() is None: - trimmed_range_text = r'trimmed_range() -> {}'.format('None') - else: - trimmed_range_text = r'trimmed_range() -> {}, {}'.format( - repr(float(round(stack.trimmed_range().start_time.value, 1))), - repr(float(round(stack.trimmed_range().duration.value, 1)))) - if stack.source_range is None: - source_range_text = r'source_range: {}'.format('None') - else: - source_range_text = r'source_range: {}, {}'.format( - repr(float(round(stack.source_range.start_time.value, 1))), - repr(float(round(stack.source_range.duration.value, 1)))) - trimmed_range_location = Point( - stack_origin.x + svg_writer.font_size, - stack_origin.y + svg_writer.clip_rect_height + svg_writer.text_margin - ) - source_range_location = Point(stack_origin.x + svg_writer.font_size, - stack_origin.y - svg_writer.font_size) - svg_writer.draw_text(trimmed_range_text, trimmed_range_location, - svg_writer.font_size, - ) - svg_writer.draw_text( - source_range_text, - source_range_location, - svg_writer.font_size - ) - - -def _draw_track(track, svg_writer, extra_data=()): - svg_writer.vertical_drawing_index += 2 - track_x_origin = extra_data[0] - track_duration = extra_data[1] - clips_data = extra_data[2] - track_has_transition = extra_data[3] - track_origin = Point(track_x_origin, - svg_writer.image_height - svg_writer.image_margin - - svg_writer.vertical_drawing_index * - svg_writer.clip_rect_height) - track_text_size = 0.4 * svg_writer.clip_rect_height - track_text = track.name if track.name else 'Track' - svg_writer.draw_labeled_solid_rect_with_border( - Rect(track_origin, track_duration * svg_writer.scale_x, - svg_writer.clip_rect_height), - label=track_text, fill_color=COLORS['dark_gray_transluscent'], - label_size=track_text_size) - time_marker_height = 0.15 * svg_writer.clip_rect_height - for i in range(1, int(track_duration)): - start_pt = Point( - svg_writer.x_origin + (i * svg_writer.scale_x), - track_origin.y - ) - end_pt = Point(start_pt.x, start_pt.y + time_marker_height) - svg_writer.draw_line( - start_point=start_pt, - end_point=end_pt, - stroke_width=1.0, - stroke_color=COLORS['black'] - ) - item_count = 0 - clip_count = 0 - transition_count = 0 - svg_writer.vertical_drawing_index += 2 - if track_has_transition: - svg_writer.vertical_drawing_index += 2 - for item in track: - if isinstance(item, otio.schema.Clip): - clip_count += 1 - draw_item(item, svg_writer, (clips_data[item_count], clip_count)) - item_count += 1 - elif isinstance(item, otio.schema.Gap): - draw_item(item, svg_writer, (clips_data[item_count],)) - item_count += 1 - elif isinstance(item, otio.schema.Transition): - cut_x = svg_writer.x_origin + (clips_data[clip_count].src_start * - svg_writer.scale_x) - draw_item(item, svg_writer, (cut_x,)) - transition_count += 1 - svg_writer.vertical_drawing_index += (2 * clip_count) - # Draw arrow from track to clips - track_width = track_duration * svg_writer.scale_x - arrow_start = Point(svg_writer.x_origin + track_width * 0.5, - track_origin.y - svg_writer.arrow_margin) - arrow_end = Point(svg_writer.x_origin + track_width * 0.5, - track_origin.y - svg_writer.clip_rect_height + - svg_writer.arrow_margin) - svg_writer.draw_arrow(start_point=arrow_start, end_point=arrow_end, - stroke_width=2.0, - stroke_color=COLORS['black']) - arrow_label_text = fr'children[{item_count + transition_count}]' - arrow_label_location = Point( - arrow_start.x + svg_writer.arrow_label_margin, - track_origin.y - svg_writer.clip_rect_height * 0.5 - ) - svg_writer.draw_text( - arrow_label_text, - arrow_label_location, - svg_writer.font_size - ) - # Draw range info - if track.trimmed_range() is None: - trimmed_range_text = r'trimmed_range() -> {}'.format('None') - else: - trimmed_range_text = r'trimmed_range() -> {}, {}'.format( - repr(float(round(track.trimmed_range().start_time.value, 1))), - repr(float(round(track.trimmed_range().duration.value, 1)))) - if track.source_range is None: - source_range_text = r'source_range: {}'.format('None') - else: - source_range_text = r'source_range: {}, {}'.format( - repr(float(round(track.source_range.start_time.value, 1))), - repr(float(round(track.source_range.duration.value, 1)))) - trimmed_range_location = Point( - track_origin.x + svg_writer.font_size, - track_origin.y + svg_writer.clip_rect_height + svg_writer.text_margin - ) - source_range_location = Point(track_origin.x + svg_writer.font_size, - track_origin.y - svg_writer.font_size) - svg_writer.draw_text(trimmed_range_text, trimmed_range_location, - svg_writer.font_size, - ) - svg_writer.draw_text( - source_range_text, - source_range_location, - svg_writer.font_size - ) - - -def _draw_clip(clip, svg_writer, extra_data=()): - clip_data = extra_data[0] - clip_count = extra_data[1] - clip_color = Color.random_color() - clip_origin = Point( - svg_writer.x_origin + (clip_data.src_start * svg_writer.scale_x), - svg_writer.image_height - svg_writer.image_margin - - svg_writer.vertical_drawing_index * svg_writer.clip_rect_height) - clip_rect = Rect(clip_origin, clip_data.trim_duration * svg_writer.scale_x, - svg_writer.clip_rect_height) - clip_text_size = 0.4 * svg_writer.clip_rect_height - clip_text = fr'Clip-{clip_data.clip_id}' if len( - clip.name) == 0 else clip.name - svg_writer.draw_labeled_solid_rect_with_border( - clip_rect, - label=clip_text, fill_color=clip_color, - label_size=clip_text_size) - time_marker_height = 0.15 * svg_writer.clip_rect_height - for i in range(int(clip_data.src_start), int(clip_data.src_end) + 1): - start_pt = Point( - svg_writer.x_origin + (i * svg_writer.scale_x), clip_origin.y - ) - end_pt = Point(start_pt.x, start_pt.y + time_marker_height) - svg_writer.draw_line( - start_point=start_pt, - end_point=end_pt, - stroke_width=1.0, - stroke_color=COLORS['black'] - ) - # Draw range info - if clip.trimmed_range() is None: - trimmed_range_text = r'trimmed_range() -> {}'.format('None') - else: - trimmed_range_text = r'trimmed_range() -> {}, {}'.format( - repr(float(round(clip.trimmed_range().start_time.value, 1))), - repr(float(round(clip.trimmed_range().duration.value, 1)))) - if clip.source_range is None: - source_range_text = r'source_range: {}'.format('None') - else: - source_range_text = r'source_range: {}, {}'.format( - repr(float(round(clip.source_range.start_time.value, 1))), - repr(float(round(clip.source_range.duration.value, 1)))) - trimmed_range_location = Point(clip_origin.x + svg_writer.font_size, - clip_origin.y + svg_writer.clip_rect_height + - svg_writer.text_margin) - source_range_location = Point(clip_origin.x + svg_writer.font_size, - clip_origin.y - svg_writer.font_size) - svg_writer.draw_text(trimmed_range_text, trimmed_range_location, - svg_writer.font_size, - ) - svg_writer.draw_text(source_range_text, source_range_location, svg_writer.font_size) - - # Draw media reference - trim_media_origin = Point( - svg_writer.x_origin + (clip_data.src_start * svg_writer.scale_x), - svg_writer.image_height - svg_writer.image_margin - - (svg_writer.vertical_drawing_index + clip_count * 2) * - svg_writer.clip_rect_height) - media_origin = Point( - svg_writer.x_origin + (clip_data.avlbl_start * svg_writer.scale_x), - svg_writer.image_height - svg_writer.image_margin - - (svg_writer.vertical_drawing_index + clip_count * 2) * - svg_writer.clip_rect_height) - svg_writer.draw_rect( - Rect(media_origin, clip_data.avlbl_duration * svg_writer.scale_x, - svg_writer.clip_rect_height)) - media_text_size = 0.4 * svg_writer.clip_rect_height - media_text = fr'Media-{clip_data.clip_id}' if len( - clip.media_reference.name) == 0 else clip.media_reference.name - svg_writer.draw_labeled_solid_rect_with_border( - Rect(trim_media_origin, clip_data.trim_duration * svg_writer.scale_x, - svg_writer.clip_rect_height), - label=media_text, fill_color=clip_color, - label_size=media_text_size) - for i in range(int(clip_data.avlbl_start), - int(clip_data.avlbl_end) + 1): - start_pt = Point(svg_writer.x_origin + (i * svg_writer.scale_x), media_origin.y) - if start_pt.x < media_origin.x: - continue - end_pt = Point(start_pt.x, start_pt.y + time_marker_height) - svg_writer.draw_line(start_point=start_pt, end_point=end_pt, stroke_width=1.0, - stroke_color=COLORS['black']) - # Draw media_reference info - if clip.available_range() is None: - available_range_text = r'available_range: {}'.format('None') - else: - available_range_text = r'available_range: {}, {}'.format( - repr(float(round(clip.available_range().start_time.value, 1))), - repr(float(round(clip.available_range().duration.value, 1)))) - available_range_location = Point(media_origin.x + svg_writer.font_size, - media_origin.y - svg_writer.font_size) - svg_writer.draw_text(available_range_text, available_range_location, - svg_writer.font_size, - ) - if hasattr(clip.media_reference, 'target_url'): - if clip.media_reference.target_url is None: - target_url_text = r'target_url: {}'.format('Media Unavailable') - else: - target_url_text = fr'target_url: {clip.media_reference.target_url}' - target_url_location = Point(media_origin.x + svg_writer.font_size, - media_origin.y - 2.0 * svg_writer.font_size) - svg_writer.draw_text(target_url_text, target_url_location, svg_writer.font_size) - # Draw arrow from clip to media reference - clip_media_height_difference = (((clip_count - 1) * 2.0 + 1) * - svg_writer.clip_rect_height) - media_arrow_start = Point( - clip_origin.x + (clip_data.trim_duration * svg_writer.scale_x) * 0.5, - clip_origin.y - svg_writer.arrow_margin) - media_arrow_end = Point( - clip_origin.x + (clip_data.trim_duration * svg_writer.scale_x) * 0.5, - clip_origin.y - clip_media_height_difference + svg_writer.arrow_margin) - svg_writer.draw_arrow(start_point=media_arrow_start, end_point=media_arrow_end, - stroke_width=2.0, stroke_color=COLORS['black']) - arrow_label_text = r'media_reference' - arrow_label_location = Point(media_arrow_start.x + svg_writer.arrow_label_margin, - media_arrow_start.y - - svg_writer.clip_rect_height * 0.5) - svg_writer.draw_text(arrow_label_text, arrow_label_location, svg_writer.font_size) - # Draw media transition sections - if clip_data.transition_end is not None: - cut_x = clip_origin.x + clip_rect.width - section_start_pt = Point(cut_x, media_origin.y) - # Handle the case of transition ending at cut - if clip_data.transition_end.out_offset.value == 0.0: - media_transition_rect = Rect(section_start_pt, - -clip_data.transition_end.in_offset.value * - svg_writer.scale_x, - svg_writer.clip_rect_height) - marker_x = [clip_data.src_end, - clip_data.src_end - clip_data.transition_end.in_offset.value] - else: - media_transition_rect = Rect(section_start_pt, - clip_data.transition_end.out_offset.value * - svg_writer.scale_x, - svg_writer.clip_rect_height) - marker_x = [clip_data.src_end, - clip_data.src_end + clip_data.transition_end.out_offset.value] - section_color = Color(clip_color[0], clip_color[1], clip_color[2], 0.5) - svg_writer.draw_dashed_rect(media_transition_rect, fill_color=section_color) - marker_x.sort() - # Draw markers for transition sections - for i in range(int(marker_x[0]), - int(marker_x[1]) + 1): - start_pt = Point(svg_writer.x_origin + (i * svg_writer.scale_x), - media_origin.y) - if start_pt.x < media_transition_rect.min_x(): - continue - end_pt = Point(start_pt.x, start_pt.y + time_marker_height) - svg_writer.draw_line(start_point=start_pt, end_point=end_pt, - stroke_width=1.0, - stroke_color=COLORS['black']) - if clip_data.transition_begin is not None: - cut_x = clip_origin.x - section_start_pt = Point(cut_x, media_origin.y) - # Handle the case of transition starting at cut - if clip_data.transition_begin.in_offset.value == 0.0: - media_transition_rect = Rect(section_start_pt, - clip_data.transition_begin.out_offset.value * - svg_writer.scale_x, - svg_writer.clip_rect_height) - marker_x = [clip_data.src_start, - clip_data.src_start + - clip_data.transition_begin.out_offset.value] - else: - media_transition_rect = Rect(section_start_pt, - -clip_data.transition_begin.in_offset.value * - svg_writer.scale_x, - svg_writer.clip_rect_height) - marker_x = [clip_data.src_start, - clip_data.src_start - - clip_data.transition_begin.out_offset.value] - section_color = Color(clip_color[0], clip_color[1], clip_color[2], 0.5) - svg_writer.draw_dashed_rect(media_transition_rect, fill_color=section_color) - marker_x.sort() - # Draw markers for transition sections - for i in range(int(marker_x[0]), - int(marker_x[1]) + 1): - start_pt = Point(svg_writer.x_origin + (i * svg_writer.scale_x), - media_origin.y) - if start_pt.x < media_transition_rect.min_x(): - continue - end_pt = Point(start_pt.x, start_pt.y + 0.15 * svg_writer.clip_rect_height) - svg_writer.draw_line(start_point=start_pt, end_point=end_pt, - stroke_width=1.0, - stroke_color=COLORS['black']) - - -def _draw_gap(gap, svg_writer, extra_data=()): - gap_data = extra_data[0] - gap_origin = Point(svg_writer.x_origin + (gap_data.src_start * svg_writer.scale_x), - svg_writer.image_height - svg_writer.image_margin - - svg_writer.vertical_drawing_index * svg_writer.clip_rect_height) - gap_text_size = 0.4 * svg_writer.clip_rect_height - gap_text = 'Gap' - svg_writer.draw_labeled_dashed_rect_with_border( - Rect(gap_origin, gap_data.trim_duration * svg_writer.scale_x, - svg_writer.clip_rect_height), - label=gap_text, label_size=gap_text_size) - time_marker_height = 0.15 * svg_writer.clip_rect_height - for i in range(int(gap_data.src_start), int(gap_data.src_end) + 1): - start_pt = Point(svg_writer.x_origin + (i * svg_writer.scale_x), gap_origin.y) - end_pt = Point(start_pt.x, start_pt.y + time_marker_height) - svg_writer.draw_line(start_point=start_pt, end_point=end_pt, stroke_width=1.0, - stroke_color=COLORS['black']) - # Draw range info - if gap.trimmed_range() is None: - trimmed_range_text = r'trimmed_range() -> {}'.format('None') - else: - trimmed_range_text = r'trimmed_range() -> {}, {}'.format( - repr(float(round(gap.trimmed_range().start_time.value, 1))), - repr(float(round(gap.trimmed_range().duration.value, 1)))) - if gap.source_range is None: - source_range_text = r'source_range: {}'.format('None') - else: - source_range_text = r'source_range: {}, {}'.format( - repr(float(round(gap.source_range.start_time.value, 1))), - repr(float(round(gap.source_range.duration.value, 1)))) - trimmed_range_location = Point(gap_origin.x + svg_writer.font_size, - gap_origin.y + svg_writer.clip_rect_height + - svg_writer.text_margin) - source_range_location = Point(gap_origin.x + svg_writer.font_size, - gap_origin.y - svg_writer.font_size) - svg_writer.draw_text(trimmed_range_text, trimmed_range_location, - svg_writer.font_size, - ) - svg_writer.draw_text(source_range_text, source_range_location, svg_writer.font_size) - - -def _draw_transition(transition, svg_writer, extra_data=()): - cut_x = extra_data[0] - transition_origin = Point(cut_x - (transition.in_offset.value * svg_writer.scale_x), - svg_writer.image_height - svg_writer.image_margin - - (svg_writer.vertical_drawing_index - 2) * - svg_writer.clip_rect_height) - transition_rect = Rect(transition_origin, - (transition.in_offset.value + transition.out_offset.value) * - svg_writer.scale_x, - svg_writer.clip_rect_height) - transition_name = 'Transition' if len( - transition.name) == 0 else transition.name - transition_name_size = 0.4 * svg_writer.clip_rect_height - svg_writer.draw_labeled_rect(transition_rect, label=transition_name, - label_size=transition_name_size) - line_end = Point(transition_origin.x + transition_rect.width, - transition_origin.y + transition_rect.height) - svg_writer.draw_line(transition_origin, line_end, stroke_width=1.0, - stroke_color=COLORS['black']) - in_offset_location = Point(transition_origin.x + svg_writer.font_size, - transition_origin.y - svg_writer.font_size) - out_offset_location = Point(transition_origin.x + svg_writer.font_size, - transition_origin.y - 2.0 * svg_writer.font_size) - in_offset_text = r'in_offset: ' \ - r'{}'.format(repr(float(round(transition.in_offset.value, 1)))) - out_offset_text = r'out_offset: ' \ - r'{}'.format(repr(float(round(transition.out_offset.value, 1)))) - svg_writer.draw_text(in_offset_text, in_offset_location, svg_writer.font_size) - svg_writer.draw_text(out_offset_text, out_offset_location, svg_writer.font_size) - cut_location = Point(cut_x, transition_origin.y) - cut_line_end = Point(cut_x, - svg_writer.image_height - svg_writer.image_margin - - svg_writer.vertical_drawing_index * - svg_writer.clip_rect_height) - svg_writer.draw_line(cut_location, cut_line_end, stroke_width=1.0, - stroke_color=COLORS['black']) - - -def _draw_collection(collection, svg_writer, extra_data=()): - pass - - -def convert_otio_to_svg(timeline, width, height): - global random_colors_used - - svg_writer = SVGWriter(image_width=width, image_height=height, - font_family='sans-serif', image_margin=20.0, font_size=15.0, - arrow_label_margin=5.0) - random_colors_used = [] - random.seed(100) - draw_item(timeline, svg_writer, ()) - - return svg_writer.get_image() - - -# -------------------- -# adapter requirements -# -------------------- - -def write_to_string(input_otio, width=2406.0, height=1054.0): - return convert_otio_to_svg(input_otio, width=width, height=height) diff --git a/src/py-opentimelineio/opentimelineio/console/autogen_plugin_documentation.py b/src/py-opentimelineio/opentimelineio/console/autogen_plugin_documentation.py index dabb3a349..fe776fbce 100644 --- a/src/py-opentimelineio/opentimelineio/console/autogen_plugin_documentation.py +++ b/src/py-opentimelineio/opentimelineio/console/autogen_plugin_documentation.py @@ -39,8 +39,8 @@ # Manifests -The manifests describe plugins that are visible to OpenTimelineIO. The core and -contrib manifests are listed first, then any user-defined local plugins. +The manifests describe plugins that are visible to OpenTimelineIO. The core +manifest is listed first, then any user-defined local plugins. {manifests} @@ -50,14 +50,6 @@ {manifest_contents} -# Contrib Plugins - -Plugins in Contrib are supported by the community and provided as-is. - -Manifest path: `{contrib_manifest_path}` - -{contrib_manifest_contents} - {local_manifest_text} """ @@ -278,6 +270,11 @@ def _manifest_formatted( for pt in otio.plugins.manifest.OTIO_PLUGIN_TYPES: pt_lines = [] + if pt == "hooks": + # hooks get handled differently by plugin_info_map() so we will skip them + display_map[pt] = "" + continue + sorted_plugins = [ plugin_info_map[pt][name] for name in sorted(plugin_info_map[pt].keys()) @@ -324,39 +321,36 @@ def generate_and_write_documentation_plugins( manifest_path_list = plugin_info_map['manifests'][:] if public_only: - manifest_path_list = manifest_path_list[:2] + # keep only core manifests + manifest_path_list = [ + p for p in manifest_path_list + if p.replace("\\", PATH_SEP).split(PATH_SEP)[-3] == "opentimelineio" + ] + + sanitized_path_list = manifest_path_list.copy() - sanitized_paths = manifest_path_list[:] if sanitized_paths: # conform all paths to unix-style path separators and leave relative # paths (relative to root of OTIO directory) - sanitized_paths = [ + sanitized_path_list = [ PATH_SEP.join(p.replace("\\", PATH_SEP).split(PATH_SEP)[-3:]) - for p in manifest_path_list + for p in sanitized_path_list ] - manifest_list = "\n".join(f"- `{mp}`" for mp in sanitized_paths) + manifest_list = "\n".join(f"- `{mp}`" for mp in sanitized_path_list) core_manifest_path = manifest_path_list[0] - core_manifest_path_sanitized = sanitized_paths[0] + core_manifest_path_sanitized = sanitized_path_list[0] core_manifest_text = _manifest_formatted( plugin_info_map, [core_manifest_path], sanitized_paths ) - contrib_manifest_path = manifest_path_list[1] - contrib_manifest_path_sanitized = sanitized_paths[1] - contrib_manifest_text = _manifest_formatted( - plugin_info_map, - [contrib_manifest_path], - sanitized_paths - ) - local_manifest_text = "" if len(plugin_info_map) > 2 and not public_only: local_manifest_paths = manifest_path_list[2:] - local_manifest_paths_sanitized = sanitized_paths[2:] + local_manifest_paths_sanitized = sanitized_path_list[2:] local_manifest_list = "\n".join( f"- `{mp}`" for mp in local_manifest_paths_sanitized ) @@ -378,8 +372,6 @@ def generate_and_write_documentation_plugins( manifests=manifest_list, manifest_path=core_manifest_path_sanitized, manifest_contents=core_manifest_text, - contrib_manifest_path=contrib_manifest_path_sanitized, - contrib_manifest_contents=contrib_manifest_text, local_manifest_text=local_manifest_text, ) ) diff --git a/src/py-opentimelineio/opentimelineio/plugins/manifest.py b/src/py-opentimelineio/opentimelineio/plugins/manifest.py index 27c3f4f62..62a4f0627 100644 --- a/src/py-opentimelineio/opentimelineio/plugins/manifest.py +++ b/src/py-opentimelineio/opentimelineio/plugins/manifest.py @@ -234,7 +234,6 @@ def load_manifest(): 1. Manifests specified via the :term:`OTIO_PLUGIN_MANIFEST_PATH` variable 2. Entrypoint based plugin manifests 3. Builtin plugin manifest - 4. Contrib plugin manifest """ result = Manifest() @@ -335,29 +334,6 @@ def load_manifest(): plugin_manifest = manifest_from_file(builtin_manifest_path) result.extend(plugin_manifest) - # the contrib plugin manifest (located in the opentimelineio_contrib package) - try: - try: - contrib_manifest_path = ( - resources.files("opentimelineio_contrib.adapters") - / "contrib_adapters.plugin_manifest.json" - ).as_posix() - except AttributeError: - # For python <= 3.7 - with resources.path( - "opentimelineio_contrib.adapters", - "contrib_adapters.plugin_manifest.json" - ) as p: - contrib_manifest_path = p.as_posix() - - except ModuleNotFoundError: - logging.debug("no opentimelineio_contrib.adapters package found") - - else: - if os.path.abspath(contrib_manifest_path) not in result.source_files: - contrib_manifest = manifest_from_file(contrib_manifest_path) - result.extend(contrib_manifest) - # force the schemadefs to load and add to schemadef module namespace for s in result.schemadefs: s.module() diff --git a/tests/baselines/plugin_module/otio_override_adapter/plugin_manifest.json b/tests/baselines/plugin_module/otio_override_adapter/plugin_manifest.json index 79f9a860d..bc755e6aa 100644 --- a/tests/baselines/plugin_module/otio_override_adapter/plugin_manifest.json +++ b/tests/baselines/plugin_module/otio_override_adapter/plugin_manifest.json @@ -3,9 +3,9 @@ "adapters": [ { "OTIO_SCHEMA" : "Adapter.1", - "name" : "cmx_3600", + "name" : "otiod", "filepath" : "adapter.py", - "suffixes" : ["edl"] + "suffixes" : ["otiod"] } ] } 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/empty_name_tags.xml b/tests/sample_data/empty_name_tags.xml deleted file mode 100755 index f0a6d00c8..000000000 --- a/tests/sample_data/empty_name_tags.xml +++ /dev/null @@ -1,22347 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE xmeml> -<xmeml version="4"> - <sequence id="sequence-7" TL.SQAudioVisibleBase="0" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="3336240568253" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="236" Monitor.ProgramZoomOut="37261151928000" Monitor.ProgramZoomIn="0" TL.SQTimePerPixel="0.012243429641003688" MZ.EditLine="6335561232000" MZ.Sequence.PreviewFrameSizeHeight="1080" MZ.Sequence.PreviewFrameSizeWidth="1920" MZ.Sequence.AudioTimeDisplayFormat="200" MZ.Sequence.PreviewRenderingClassID="1297106761" MZ.Sequence.PreviewRenderingPresetCodec="1297107278" MZ.Sequence.PreviewRenderingPresetPath="EncoderPresets/SequencePreview/795454d9-d3c2-429d-9474-923ab13b7018/I-Frame Only MPEG.epr" MZ.Sequence.PreviewUseMaxRenderQuality="false" MZ.Sequence.PreviewUseMaxBitDepth="false" MZ.Sequence.EditingModeGUID="795454d9-d3c2-429d-9474-923ab13b7018" MZ.Sequence.VideoTimeDisplayFormat="109" MZ.WorkOutPoint="156619735272000" MZ.WorkInPoint="0" explodedTracks="true"> - <uuid>0bc28b40-0179-49f0-8e46-361b1ba55c8a</uuid> - <duration>3517</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <name>myshow</name> - <media> - <video> - <format> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <codec> - <name>Apple ProRes 422</name> - <appspecificdata> - <appname>Final Cut Pro</appname> - <appmanufacturer>Apple Inc.</appmanufacturer> - <appversion>7.0</appversion> - <data> - <qtcodec> - <codecname>Apple ProRes 422</codecname> - <codectypename>Apple ProRes 422</codectypename> - <codectypecode>apcn</codectypecode> - <codecvendorcode>appl</codecvendorcode> - <spatialquality>1024</spatialquality> - <temporalquality>0</temporalquality> - <keyframerate>0</keyframerate> - <datarate>0</datarate> - </qtcodec> - </data> - </appspecificdata> - </codec> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - <colordepth>24</colordepth> - </samplecharacteristics> - </format> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <generatoritem id="clipitem-457"> - <name>Grey</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <start>0</start> - <end>15</end> - <in>86313</in> - <out>86328</out> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <effect> - <name>Color</name> - <effectid>Color</effectid> - <effectcategory>Matte</effectcategory> - <effecttype>generator</effecttype> - <mediatype>video</mediatype> - <parameter authoringApp="PremierePro"> - <parameterid>fillcolor</parameterid> - <name>Color</name> - <value> - <alpha>0</alpha> - <red>55</red> - <green>55</green> - <blue>55</blue> - </value> - </parameter> - </effect> - </generatoritem> - <clipitem id="clipitem-458"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>15</start> - <end>90</end> - <in>0</in> - <out>75</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>794593800000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-243"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>3502</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>01:23:49:21</string> - <frame>120717</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-458</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - </link> - <link> - <linkclipref>clipitem-619</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-652</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-459"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>90</start> - <end>222</end> - <in>75</in> - <out>207</out> - <pproTicksIn>794593800000</pproTicksIn> - <pproTicksOut>2193078888000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-459</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>3</clipindex> - </link> - <link> - <linkclipref>clipitem-620</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-653</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-460"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>222</start> - <end>396</end> - <in>207</in> - <out>381</out> - <pproTicksIn>2193078888000</pproTicksIn> - <pproTicksOut>4036536504000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-460</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - </link> - <link> - <linkclipref>clipitem-621</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>3</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-654</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>3</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-461"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>396</start> - <end>493</end> - <in>381</in> - <out>478</out> - <pproTicksIn>4036536504000</pproTicksIn> - <pproTicksOut>5064211152000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-461</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>5</clipindex> - </link> - <link> - <linkclipref>clipitem-622</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-655</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>4</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-462"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>478</in> - <out>583</out> - <pproTicksIn>5064211152000</pproTicksIn> - <pproTicksOut>6176642472000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-462</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>6</clipindex> - </link> - <link> - <linkclipref>clipitem-623</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>5</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-656</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>5</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-463"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>583</in> - <out>677</out> - <pproTicksIn>6176642472000</pproTicksIn> - <pproTicksOut>7172533368000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-463</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>7</clipindex> - </link> - <link> - <linkclipref>clipitem-624</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>6</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-657</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>6</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-464"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>677</in> - <out>765</out> - <pproTicksIn>7172533368000</pproTicksIn> - <pproTicksOut>8104856760000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-464</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>8</clipindex> - </link> - <link> - <linkclipref>clipitem-625</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>7</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-658</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>7</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-465"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>780</start> - <end>870</end> - <in>765</in> - <out>855</out> - <pproTicksIn>8104856760000</pproTicksIn> - <pproTicksOut>9058369320000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-465</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>9</clipindex> - </link> - <link> - <linkclipref>clipitem-626</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>8</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-659</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>8</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-466"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>855</in> - <out>1120</out> - <pproTicksIn>9058369320000</pproTicksIn> - <pproTicksOut>11865934080000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-466</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>10</clipindex> - </link> - <link> - <linkclipref>clipitem-627</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>9</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-660</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>9</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-467"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1135</start> - <end>1229</end> - <in>1120</in> - <out>1214</out> - <pproTicksIn>11865934080000</pproTicksIn> - <pproTicksOut>12861824976000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-467</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>11</clipindex> - </link> - <link> - <linkclipref>clipitem-628</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>10</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-661</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>10</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-468"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>1214</in> - <out>1342</out> - <pproTicksIn>12861824976000</pproTicksIn> - <pproTicksOut>14217931728000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-468</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>12</clipindex> - </link> - <link> - <linkclipref>clipitem-629</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>11</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-662</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>11</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-469"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>1342</in> - <out>1393</out> - <pproTicksIn>14217931728000</pproTicksIn> - <pproTicksOut>14758255512000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-469</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>13</clipindex> - </link> - <link> - <linkclipref>clipitem-630</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>12</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-663</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>12</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-470"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>1393</in> - <out>1467</out> - <pproTicksIn>14758255512000</pproTicksIn> - <pproTicksOut>15542254728000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-470</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>14</clipindex> - </link> - <link> - <linkclipref>clipitem-631</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>13</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-664</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>13</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-471"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>1467</in> - <out>1522</out> - <pproTicksIn>15542254728000</pproTicksIn> - <pproTicksOut>16124956848000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-471</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>15</clipindex> - </link> - <link> - <linkclipref>clipitem-632</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>14</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-665</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>14</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-472"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>1522</in> - <out>1660</out> - <pproTicksIn>16124956848000</pproTicksIn> - <pproTicksOut>17587009440000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-472</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>16</clipindex> - </link> - <link> - <linkclipref>clipitem-633</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>15</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-666</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>15</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-473"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1675</start> - <end>1734</end> - <in>1660</in> - <out>1719</out> - <pproTicksIn>17587009440000</pproTicksIn> - <pproTicksOut>18212089896000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-473</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>17</clipindex> - </link> - <link> - <linkclipref>clipitem-634</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>16</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-667</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>16</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-474"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1734</start> - <end>1802</end> - <in>1719</in> - <out>1787</out> - <pproTicksIn>18212089896000</pproTicksIn> - <pproTicksOut>18932521608000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-474</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>18</clipindex> - </link> - <link> - <linkclipref>clipitem-635</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>17</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-668</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>17</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-475"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1802</start> - <end>1862</end> - <in>1787</in> - <out>1847</out> - <pproTicksIn>18932521608000</pproTicksIn> - <pproTicksOut>19568196648000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-475</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>19</clipindex> - </link> - <link> - <linkclipref>clipitem-636</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>18</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-669</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>18</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-476"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1862</start> - <end>1975</end> - <in>1847</in> - <out>1960</out> - <pproTicksIn>19568196648000</pproTicksIn> - <pproTicksOut>20765384640000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-476</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>20</clipindex> - </link> - <link> - <linkclipref>clipitem-637</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>19</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-670</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>19</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-477"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1975</start> - <end>2046</end> - <in>1960</in> - <out>2031</out> - <pproTicksIn>20765384640000</pproTicksIn> - <pproTicksOut>21517600104000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-477</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>21</clipindex> - </link> - <link> - <linkclipref>clipitem-638</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>20</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-671</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>20</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-478"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2046</start> - <end>2094</end> - <in>2031</in> - <out>2079</out> - <pproTicksIn>21517600104000</pproTicksIn> - <pproTicksOut>22026140136000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-478</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>22</clipindex> - </link> - <link> - <linkclipref>clipitem-639</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>21</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-672</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>21</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-479"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>2079</in> - <out>2140</out> - <pproTicksIn>22026140136000</pproTicksIn> - <pproTicksOut>22672409760000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-479</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>23</clipindex> - </link> - <link> - <linkclipref>clipitem-640</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>22</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-673</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>22</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-480"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>2140</in> - <out>2192</out> - <pproTicksIn>22672409760000</pproTicksIn> - <pproTicksOut>23223328128000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-480</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>24</clipindex> - </link> - <link> - <linkclipref>clipitem-641</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>23</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-674</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>23</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-481"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>2192</in> - <out>2244</out> - <pproTicksIn>23223328128000</pproTicksIn> - <pproTicksOut>23774246496000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-481</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>25</clipindex> - </link> - <link> - <linkclipref>clipitem-642</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>24</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-675</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>24</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-482"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2259</start> - <end>2306</end> - <in>2244</in> - <out>2291</out> - <pproTicksIn>23774246496000</pproTicksIn> - <pproTicksOut>24272191944000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-482</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>26</clipindex> - </link> - <link> - <linkclipref>clipitem-643</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>25</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-676</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>25</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-483"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>2291</in> - <out>2373</out> - <pproTicksIn>24272191944000</pproTicksIn> - <pproTicksOut>25140947832000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-483</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>27</clipindex> - </link> - <link> - <linkclipref>clipitem-644</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>26</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-677</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>26</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-484"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2388</start> - <end>2585</end> - <in>2373</in> - <out>2570</out> - <pproTicksIn>25140947832000</pproTicksIn> - <pproTicksOut>27228080880000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-484</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>28</clipindex> - </link> - <link> - <linkclipref>clipitem-645</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>27</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-678</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>27</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-485"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2585</start> - <end>2692</end> - <in>2570</in> - <out>2677</out> - <pproTicksIn>27228080880000</pproTicksIn> - <pproTicksOut>28361701368000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-485</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>29</clipindex> - </link> - <link> - <linkclipref>clipitem-646</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>28</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-679</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>28</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-486"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2692</start> - <end>2819</end> - <in>2677</in> - <out>2804</out> - <pproTicksIn>28361701368000</pproTicksIn> - <pproTicksOut>29707213536000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-486</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>30</clipindex> - </link> - <link> - <linkclipref>clipitem-647</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>29</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-680</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>29</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-487"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>2804</in> - <out>2923</out> - <pproTicksIn>29707213536000</pproTicksIn> - <pproTicksOut>30967969032000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-487</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>31</clipindex> - </link> - <link> - <linkclipref>clipitem-648</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>30</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-681</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>30</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-488"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>2923</in> - <out>3043</out> - <pproTicksIn>30967969032000</pproTicksIn> - <pproTicksOut>32239319112000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-488</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>32</clipindex> - </link> - <link> - <linkclipref>clipitem-649</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>31</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-682</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>31</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-489"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>3043</in> - <out>3292</out> - <pproTicksIn>32239319112000</pproTicksIn> - <pproTicksOut>34877370528000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-489</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>33</clipindex> - </link> - <link> - <linkclipref>clipitem-650</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>32</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-683</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>32</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-490"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3307</start> - <end>3517</end> - <in>3292</in> - <out>3502</out> - <pproTicksIn>34877370528000</pproTicksIn> - <pproTicksOut>37102233168000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-490</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>34</clipindex> - </link> - <link> - <linkclipref>clipitem-651</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>33</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-684</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>33</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-491"> - <masterclipid>masterclip-251</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>165</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>90</start> - <end>222</end> - <in>25</in> - <out>157</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1663349688000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-244"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>166</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-492"> - <masterclipid>masterclip-252</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>222</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>222</start> - <end>396</end> - <in>25</in> - <out>199</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>2108322216000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-245"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>223</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-493"> - <masterclipid>masterclip-253</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>153</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>25</in> - <out>130</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1377295920000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-246"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>154</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-494"> - <masterclipid>masterclip-254</masterclipid> - <name>myshow</name> - <enabled>TRUE</enabled> - <duration>1139</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>1009</in> - <out>1103</out> - <pproTicksIn>10689935256000</pproTicksIn> - <pproTicksOut>11685826152000</pproTicksOut> - <sequence id="sequence-8" TL.SQAudioVisibleBase="0" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="0" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="236" Monitor.ProgramZoomOut="11940096168000" Monitor.ProgramZoomIn="0" TL.SQTimePerPixel="0.024469178379316326" MZ.EditLine="11632853232000" MZ.Sequence.PreviewFrameSizeHeight="1080" MZ.Sequence.PreviewFrameSizeWidth="1920" MZ.Sequence.AudioTimeDisplayFormat="200" MZ.Sequence.PreviewRenderingPresetCodec="1297107278" MZ.Sequence.PreviewRenderingPresetPath="EncoderPresets/SequencePreview/795454d9-d3c2-429d-9474-923ab13b7018/I-Frame Only MPEG.epr" MZ.Sequence.PreviewUseMaxRenderQuality="false" MZ.Sequence.PreviewUseMaxBitDepth="false" MZ.Sequence.EditingModeGUID="795454d9-d3c2-429d-9474-923ab13b7018" MZ.Sequence.VideoTimeDisplayFormat="109" MZ.WorkOutPoint="995890896000" MZ.WorkInPoint="0"> - <duration>1103</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <name>myshow</name> - <media> - <video> - <format> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <codec> - <name>Apple ProRes 422</name> - <appspecificdata> - <appname>Final Cut Pro</appname> - <appmanufacturer>Apple Inc.</appmanufacturer> - <appversion>7.0</appversion> - <data> - <qtcodec> - <codecname>Apple ProRes 422</codecname> - <codectypename>Apple ProRes 422</codectypename> - <codectypecode>apcn</codectypecode> - <codecvendorcode>appl</codecvendorcode> - <spatialquality>1024</spatialquality> - <temporalquality>0</temporalquality> - <keyframerate>0</keyframerate> - <datarate>0</datarate> - </qtcodec> - </data> - </appspecificdata> - </codec> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - <colordepth>24</colordepth> - </samplecharacteristics> - </format> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-495"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1009</start> - <end>1103</end> - <in>583</in> - <out>677</out> - <pproTicksIn>6176642472000</pproTicksIn> - <pproTicksOut>7172533368000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-243" /> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-495</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-497</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-498</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="51" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-496"> - <masterclipid>masterclip-255</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>142</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>984</start> - <end>1127</end> - <in>0</in> - <out>143</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1515025512000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-247"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>155</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Time Remap</name> - <effectid>timeremap</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <parameter authoringApp="PremierePro"> - <parameterid>variablespeed</parameterid> - <name>variablespeed</name> - <valuemin>0</valuemin> - <valuemax>1</valuemax> - <value>1</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>speed</parameterid> - <name>speed</name> - <valuemin>-100000</valuemin> - <valuemax>100000</valuemax> - <value>108.451</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>reverse</parameterid> - <name>reverse</name> - <value>FALSE</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>frameblending</parameterid> - <name>frameblending</name> - <value>FALSE</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>graphdict</parameterid> - <name>graphdict</name> - <valuemin>0</valuemin> - <valuemax>154</valuemax> - <value>0</value> - <keyframe> - <when>0</when> - <value>0</value> - <speedvirtualkf>TRUE</speedvirtualkf> - <speedkfin>TRUE</speedkfin> - </keyframe> - <keyframe> - <when>1</when> - <value>1</value> - </keyframe> - <keyframe> - <when>51</when> - <value>51</value> - </keyframe> - <keyframe> - <when>114</when> - <value>126</value> - </keyframe> - <keyframe> - <when>142</when> - <value>154</value> - <speedvirtualkf>TRUE</speedvirtualkf> - <speedkfout>TRUE</speedkfout> - </keyframe> - <interpolation> - <name>FCPCurve</name> - </interpolation> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - </video> - <audio> - <numOutputChannels>2</numOutputChannels> - <format> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - </format> - <outputs> - <group> - <index>1</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>1</index> - </channel> - </group> - <group> - <index>2</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>2</index> - </channel> - </group> - </outputs> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-497" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1009</start> - <end>1103</end> - <in>583</in> - <out>677</out> - <pproTicksIn>6176642472000</pproTicksIn> - <pproTicksOut>7172533368000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-495</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-497</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-498</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-498" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1009</start> - <end>1103</end> - <in>583</in> - <out>677</out> - <pproTicksIn>6176642472000</pproTicksIn> - <pproTicksOut>7172533368000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-495</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-497</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-498</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - </audio> - </media> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - <marker> - <comment /> - <name /> - <in>1009</in> - <out>-1</out> - </marker> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - </sequence> - <marker> - <comment /> - <name /> - <in>1009</in> - <out>-1</out> - </marker> - <labels> - <label2>Forest</label2> - </labels> - </clipitem> - <clipitem id="clipitem-499"> - <masterclipid>masterclip-256</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>154</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>25</in> - <out>113</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1197187992000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-248"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>155</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-500"> - <masterclipid>masterclip-257</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>331</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>25</in> - <out>290</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>3072429360000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-249"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>332</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-501"> - <masterclipid>masterclip-258</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>143</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1135</start> - <end>1229</end> - <in>25</in> - <out>119</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1260755496000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-250"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>143</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-502"> - <masterclipid>masterclip-259</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>203</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>52</in> - <out>180</out> - <pproTicksIn>550918368000</pproTicksIn> - <pproTicksOut>1907025120000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-251"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>204</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <marker> - <comment /> - <name /> - <in>52</in> - <out>-1</out> - </marker> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-503"> - <masterclipid>masterclip-260</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>99</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>25</in> - <out>76</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>805188384000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-252"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>100</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-504"> - <masterclipid>masterclip-261</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>122</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>25</in> - <out>99</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1048863816000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-253"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>123</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-505"> - <masterclipid>masterclip-262</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>104</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>25</in> - <out>80</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>847566720000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-254"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>104</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-506"> - <masterclipid>masterclip-263</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>186</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>25</in> - <out>163</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1726917192000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-255"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>187</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-507"> - <masterclipid>masterclip-264</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>107</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1675</start> - <end>1734</end> - <in>25</in> - <out>84</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>889945056000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-256"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>108</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-508"> - <masterclipid>masterclip-265</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>116</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1734</start> - <end>1802</end> - <in>25</in> - <out>93</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>985296312000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-257"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>117</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-509"> - <masterclipid>masterclip-266</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>161</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1862</start> - <end>1975</end> - <in>25</in> - <out>138</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1462052592000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-258"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>162</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-510"> - <masterclipid>masterclip-267</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>119</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1975</start> - <end>2046</end> - <in>25</in> - <out>96</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1017080064000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-259"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>120</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-511"> - <masterclipid>masterclip-268</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>109</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>25</in> - <out>86</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>911134224000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-260"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>110</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-512"> - <masterclipid>masterclip-269</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>101</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>25</in> - <out>77</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>815782968000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-261"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>101</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-513"> - <masterclipid>masterclip-270</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>25</in> - <out>77</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>815782968000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-262"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>101</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-514"> - <masterclipid>masterclip-271</masterclipid> - <name>myshow</name> - <enabled>TRUE</enabled> - <duration>1114</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>1009</in> - <out>1091</out> - <pproTicksIn>10689935256000</pproTicksIn> - <pproTicksOut>11558691144000</pproTicksOut> - <sequence id="sequence-9" TL.SQAudioVisibleBase="0" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="9429179760000" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="236" Monitor.ProgramZoomOut="11643447816000" Monitor.ProgramZoomIn="0" TL.SQTimePerPixel="0.0064335326876799378" MZ.EditLine="10689935256000" MZ.Sequence.PreviewFrameSizeHeight="1080" MZ.Sequence.PreviewFrameSizeWidth="1920" MZ.Sequence.AudioTimeDisplayFormat="200" MZ.Sequence.PreviewRenderingClassID="1297106761" MZ.Sequence.PreviewRenderingPresetCodec="1297107278" MZ.Sequence.PreviewRenderingPresetPath="EncoderPresets/SequencePreview/795454d9-d3c2-429d-9474-923ab13b7018/I-Frame Only MPEG.epr" MZ.Sequence.PreviewUseMaxRenderQuality="false" MZ.Sequence.PreviewUseMaxBitDepth="false" MZ.Sequence.EditingModeGUID="795454d9-d3c2-429d-9474-923ab13b7018" MZ.Sequence.VideoTimeDisplayFormat="109" MZ.WorkOutPoint="868755888000" MZ.WorkInPoint="0"> - <duration>1091</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <name>myshow</name> - <media> - <video> - <format> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <codec> - <name>Apple ProRes 422</name> - <appspecificdata> - <appname>Final Cut Pro</appname> - <appmanufacturer>Apple Inc.</appmanufacturer> - <appversion>7.0</appversion> - <data> - <qtcodec> - <codecname>Apple ProRes 422</codecname> - <codectypename>Apple ProRes 422</codectypename> - <codectypecode>apcn</codectypecode> - <codecvendorcode>appl</codecvendorcode> - <spatialquality>1024</spatialquality> - <temporalquality>0</temporalquality> - <keyframerate>0</keyframerate> - <datarate>0</datarate> - </qtcodec> - </data> - </appspecificdata> - </codec> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - <colordepth>24</colordepth> - </samplecharacteristics> - </format> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-515"> - <masterclipid>masterclip-272</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>14783</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1009</start> - <end>1091</end> - <in>2443</in> - <out>2525</out> - <pproTicksIn>25882568712000</pproTicksIn> - <pproTicksOut>26751324600000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-263"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>14783</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:59:59:00</string> - <frame>86376</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <link> - <linkclipref>clipitem-515</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-518</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-519</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-516"> - <masterclipid>masterclip-273</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>130</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1001</start> - <end>1099</end> - <in>17</in> - <out>115</out> - <pproTicksIn>180107928000</pproTicksIn> - <pproTicksOut>1218377160000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-264"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>131</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>140</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0.00104165</horiz> - <vert>0.117593</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <filter> - <effect> - <name>Crop</name> - <effectid>crop</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>left</parameterid> - <name>left</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>right</parameterid> - <name>right</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>42</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>top</parameterid> - <name>top</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>bottom</parameterid> - <name>bottom</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-517"> - <masterclipid>masterclip-274</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>130</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1001</start> - <end>1099</end> - <in>17</in> - <out>115</out> - <pproTicksIn>180107928000</pproTicksIn> - <pproTicksOut>1218377160000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-265"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>131</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>140</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0.00104165</horiz> - <vert>0.117593</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <filter> - <effect> - <name>Crop</name> - <effectid>crop</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>left</parameterid> - <name>left</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>57</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>right</parameterid> - <name>right</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>top</parameterid> - <name>top</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>bottom</parameterid> - <name>bottom</name> - <valuemin>0</valuemin> - <valuemax>100</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - </video> - <audio> - <numOutputChannels>2</numOutputChannels> - <format> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - </format> - <outputs> - <group> - <index>1</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>1</index> - </channel> - </group> - <group> - <index>2</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>2</index> - </channel> - </group> - </outputs> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-518" premiereChannelType="stereo"> - <masterclipid>masterclip-272</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>14783</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1009</start> - <end>1091</end> - <in>2443</in> - <out>2525</out> - <pproTicksIn>25882568712000</pproTicksIn> - <pproTicksOut>26751324600000</pproTicksOut> - <file id="file-263" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-515</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-518</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-519</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-519" premiereChannelType="stereo"> - <masterclipid>masterclip-272</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>14783</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1009</start> - <end>1091</end> - <in>2443</in> - <out>2525</out> - <pproTicksIn>25882568712000</pproTicksIn> - <pproTicksOut>26751324600000</pproTicksOut> - <file id="file-263" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-515</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-518</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-519</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - </audio> - </media> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - </sequence> - <labels> - <label2>Forest</label2> - </labels> - </clipitem> - <clipitem id="clipitem-520"> - <masterclipid>masterclip-275</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>155</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2585</start> - <end>2692</end> - <in>25</in> - <out>132</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1398485088000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-266"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>156</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-521"> - <masterclipid>masterclip-276</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>167</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>25</in> - <out>144</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1525620096000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-267"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>168</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-522"> - <masterclipid>masterclip-277</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>168</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>25</in> - <out>145</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1536214680000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-268"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>169</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-523"> - <masterclipid>masterclip-278</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>297</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>25</in> - <out>274</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>2902916016000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-269"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>298</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:41:00</string> - <frame>984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-524"> - <masterclipid>masterclip-279</masterclipid> - <name>Graphic</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>0</start> - <end>15</end> - <in>86313</in> - <out>86328</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>914609247552000</pproTicksOut> - <alphatype>straight</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-270"> - <name>Graphic</name> - <mediaSource>GraphicAndType</mediaSource> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00;00;00;00</string> - <frame>0</frame> - <displayformat>DF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>mymovie.mov</name> - <effectid>GraphicAndType</effectid> - <effectcategory>graphic</effectcategory> - <effecttype>filter</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <pproExpanded>true</pproExpanded> - <parameter authoringApp="PremierePro"> - <parameterid>1</parameterid> - <name>Source Text</name> - <hash>20ca71dc-1161-1ec9-6ee7-ca2f00000b30</hash> - <value>HAsAAAAAAAB7ACIAbQBUAGUAeAB0AFAAYQByAGEAbQAiADoAewAiAG0AQQBsAGkAZwBuAG0AZQBuAHQAIgA6ADIALAAiAG0AQgBhAGMAawBGAGkAbABsAEMAbwBsAG8AcgAiADoANAAxADQANAA5ADUAOQAsACIAbQBCAGEAYwBrAEYAaQBsAGwATwBwAGEAYwBpAHQAeQAiADoANwA1ACwAIgBtAEIAYQBjAGsARgBpAGwAbABTAGkAegBlACIAOgAwACwAIgBtAEIAYQBjAGsARgBpAGwAbABWAGkAcwBpAGIAbABlACIAOgBmAGEAbABzAGUALAAiAG0ARABlAGYAYQB1AGwAdABSAHUAbgAiADoAWwBdACwAIgBtAEgAZQBpAGcAaAB0ACIAOgA0ADcAOQAsACIAbQBIAGkAbgBkAGkARABpAGcAaQB0AHMAIgA6AGYAYQBsAHMAZQAsACIAbQBJAG4AZABpAGMAIgA6AGYAYQBsAHMAZQAsACIAbQBJAHMATQBhAHMAawAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBNAGEAcwBrAEkAbgB2AGUAcgB0AGUAZAAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBWAGUAcgB0AGkAYwBhAGwAVABlAHgAdAAiADoAZgBhAGwAcwBlACwAIgBtAEwAZQBhAGQAaQBuAGcAIgA6ADAALAAiAG0ATABpAGcAYQB0AHUAcgBlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBMAGkAbgBlAEMAYQBwAFQAeQBwAGUAIgA6ADAALAAiAG0ATABpAG4AZQBKAG8AaQBuAFQAeQBwAGUAIgA6ADAALAAiAG0ATQBpAHQAZQByAEwAaQBtAGkAdAAiADoAMgAuADUALAAiAG0ATgB1AG0AUwB0AHIAbwBrAGUAcwAiADoAMQAsACIAbQBSAFQATAAiADoAZgBhAGwAcwBlACwAIgBtAFMAaABhAGQAbwB3AEEAbgBnAGwAZQAiADoAMQAzADUALAAiAG0AUwBoAGEAZABvAHcAQgBsAHUAcgAiADoANAAwACwAIgBtAFMAaABhAGQAbwB3AEMAbwBsAG8AcgAiADoANAAxADQANAA5ADUAOQAsACIAbQBTAGgAYQBkAG8AdwBPAGYAZgBzAGUAdAAiADoANwAsACIAbQBTAGgAYQBkAG8AdwBPAHAAYQBjAGkAdAB5ACIAOgA3ADUALAAiAG0AUwBoAGEAZABvAHcAUwBpAHoAZQAiADoAMAAsACIAbQBTAGgAYQBkAG8AdwBWAGkAcwBpAGIAbABlACIAOgBmAGEAbABzAGUALAAiAG0AUwB0AHkAbABlAFMAaABlAGUAdAAiADoAewAiAG0AQQBkAGQAaQB0AGkAbwBuAGEAbABTAHQAcgBvAGsAZQBDAG8AbABvAHIAIgA6AFsAXQAsACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAFYAaQBzAGkAYgBsAGUAIgA6AFsAXQAsACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAFcAaQBkAHQAaAAiADoAWwBdACwAIgBtAEIAYQBzAGUAbABpAG4AZQBPAHAAdABpAG8AbgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AQgBhAHMAZQBsAGkAbgBlAFMAaABpAGYAdAAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AQwBhAHAAcwBPAHAAdABpAG8AbgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0ARgBhAHUAeABCAG8AbABkACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAZgBhAGwAcwBlAF0AXQB9ACwAIgBtAEYAYQB1AHgASQB0AGEAbABpAGMAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALABmAGEAbABzAGUAXQBdAH0ALAAiAG0ARgBpAGwAbABDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxADYANwA3ADcAMgAxADUAXQBdAH0ALAAiAG0ARgBpAGwAbABPAHYAZQByAFMAdAByAG8AawBlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAdAByAHUAZQBdAF0AfQAsACIAbQBGAGkAbABsAFYAaQBzAGkAYgBsAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAB0AHIAdQBlAF0AXQB9ACwAIgBtAEYAbwBuAHQATgBhAG0AZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsACIATQBpAG4AaQBvAG4AUAByAG8ALQBSAGUAZwB1AGwAYQByACIAXQBdAH0ALAAiAG0ARgBvAG4AdABTAGkAegBlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwANQA3AC4ANQAzADgANAA1ADkANwA3ADcAOAAzADIAMAAzADEAXQBdAH0ALAAiAG0ASwBlAHIAbgBpAG4AZwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AUwB0AHIAbwBrAGUAQwBvAGwAbwByACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMQA2ADcANwA3ADIAMQA1AF0AXQB9ACwAIgBtAFMAdAByAG8AawBlAFYAaQBzAGkAYgBsAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALABmAGEAbABzAGUAXQBdAH0ALAAiAG0AUwB0AHIAbwBrAGUAVwBpAGQAdABoACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMQBdAF0AfQAsACIAbQBUAGUAeAB0ACIAOgAiAFIARABOAFwAcgAxADAAMgBfADAAMwAyAF8AdgAwADMAXAByAFwAcgAyADAALwAwADMALwAxADMAXAByAHIAZABuADEAMAAyAF8AcwBjADAAMwAyAF8AMgAwADIAMAAwADIAMAA1AF8AcwBuAGMANABfAFQAdQByAG4AbwB2AGUAcgBfAEMASQBOAC4AbQBvAHYAIgAsACIAbQBUAHIAYQBjAGsAaQBuAGcAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9ACwAIgBtAFQAcwB1AG0AaQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0AfQAsACIAbQBUAGEAYgBXAGkAZAB0AGgAIgA6ADQAMAAwACwAIgBtAFcAaQBkAHQAaAAiADoAMQA5ADIAMAB9ACwAIgBtAFYAZQByAHMAaQBvAG4AIgA6ADEAfQA=</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>2</parameterid> - <name>Transform</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>11</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>3</parameterid> - <name>Position</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0.15937504172325134:0.37685185670852661,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>4</parameterid> - <name>Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>5</parameterid> - <name>Horizontal Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>6</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,true,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>7</parameterid> - <name>Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>8</parameterid> - <name>Opacity</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>100</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>9</parameterid> - <name>Anchor Point</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0.16046142578125:0,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>10</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>12</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>11</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>12</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>13</parameterid> - <name>start</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,26.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>14</parameterid> - <name>end</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,26.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>15</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>16</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>17</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>18</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>19</parameterid> - <name>Parent Width</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>20</parameterid> - <name>Parent Height</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>21</parameterid> - <name>Parent Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels /> - </clipitem> - <clipitem id="clipitem-525"> - <masterclipid>masterclip-280</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>165</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>90</start> - <end>222</end> - <in>24</in> - <out>156</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1652755104000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-271"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>165</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-526"> - <masterclipid>masterclip-281</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>153</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>24</in> - <out>129</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1366701336000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-272"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>153</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-527"> - <masterclipid>masterclip-282</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>154</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>24</in> - <out>118</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1250160912000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-273"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>154</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-528"> - <masterclipid>masterclip-283</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>154</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>24</in> - <out>112</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1186593408000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-274"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>154</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-529"> - <masterclipid>masterclip-284</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>331</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>24</in> - <out>289</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>3061834776000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-275"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>331</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-530"> - <masterclipid>masterclip-285</masterclipid> - <name>Graphic</name> - <enabled>FALSE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1135</start> - <end>1229</end> - <in>86313</in> - <out>86407</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915446219688000</pproTicksOut> - <alphatype>straight</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-276"> - <name>Graphic</name> - <mediaSource>GraphicAndType</mediaSource> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00;00;00;00</string> - <frame>0</frame> - <displayformat>DF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>myshow</name> - <effectid>GraphicAndType</effectid> - <effectcategory>graphic</effectcategory> - <effecttype>filter</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <pproExpanded>true</pproExpanded> - <parameter authoringApp="PremierePro"> - <parameterid>1</parameterid> - <name>Source Text</name> - <hash>2787dca9-fa44-bab4-9a4f-948000000aa6</hash> - <value>kgoAAAAAAAB7ACIAbQBUAGUAeAB0AFAAYQByAGEAbQAiADoAewAiAG0AQQBsAGkAZwBuAG0AZQBuAHQAIgA6ADAALAAiAG0AQgBhAGMAawBGAGkAbABsAEMAbwBsAG8AcgAiADoANAAxADQANAA5ADUAOQAsACIAbQBCAGEAYwBrAEYAaQBsAGwATwBwAGEAYwBpAHQAeQAiADoANwA1ACwAIgBtAEIAYQBjAGsARgBpAGwAbABTAGkAegBlACIAOgAwACwAIgBtAEIAYQBjAGsARgBpAGwAbABWAGkAcwBpAGIAbABlACIAOgB0AHIAdQBlACwAIgBtAEQAZQBmAGEAdQBsAHQAUgB1AG4AIgA6AFsAXQAsACIAbQBIAGUAaQBnAGgAdAAiADoAMAAsACIAbQBIAGkAbgBkAGkARABpAGcAaQB0AHMAIgA6AGYAYQBsAHMAZQAsACIAbQBJAG4AZABpAGMAIgA6AGYAYQBsAHMAZQAsACIAbQBJAHMATQBhAHMAawAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBNAGEAcwBrAEkAbgB2AGUAcgB0AGUAZAAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBWAGUAcgB0AGkAYwBhAGwAVABlAHgAdAAiADoAZgBhAGwAcwBlACwAIgBtAEwAZQBhAGQAaQBuAGcAIgA6ADAALAAiAG0ATABpAGcAYQB0AHUAcgBlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBMAGkAbgBlAEMAYQBwAFQAeQBwAGUAIgA6ADAALAAiAG0ATABpAG4AZQBKAG8AaQBuAFQAeQBwAGUAIgA6ADAALAAiAG0ATQBpAHQAZQByAEwAaQBtAGkAdAAiADoAMgAuADUALAAiAG0ATgB1AG0AUwB0AHIAbwBrAGUAcwAiADoAMQAsACIAbQBSAFQATAAiADoAZgBhAGwAcwBlACwAIgBtAFMAaABhAGQAbwB3AEEAbgBnAGwAZQAiADoAMQAzADUALAAiAG0AUwBoAGEAZABvAHcAQgBsAHUAcgAiADoANAAwACwAIgBtAFMAaABhAGQAbwB3AEMAbwBsAG8AcgAiADoANAAxADQANAA5ADUAOQAsACIAbQBTAGgAYQBkAG8AdwBPAGYAZgBzAGUAdAAiADoANwAsACIAbQBTAGgAYQBkAG8AdwBPAHAAYQBjAGkAdAB5ACIAOgA3ADUALAAiAG0AUwBoAGEAZABvAHcAUwBpAHoAZQAiADoAMAAsACIAbQBTAGgAYQBkAG8AdwBWAGkAcwBpAGIAbABlACIAOgBmAGEAbABzAGUALAAiAG0AUwB0AHkAbABlAFMAaABlAGUAdAAiADoAewAiAG0AQQBkAGQAaQB0AGkAbwBuAGEAbABTAHQAcgBvAGsAZQBDAG8AbABvAHIAIgA6AFsAXQAsACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAFYAaQBzAGkAYgBsAGUAIgA6AFsAXQAsACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAFcAaQBkAHQAaAAiADoAWwBdACwAIgBtAEIAYQBzAGUAbABpAG4AZQBPAHAAdABpAG8AbgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AQgBhAHMAZQBsAGkAbgBlAFMAaABpAGYAdAAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AQwBhAHAAcwBPAHAAdABpAG8AbgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0ARgBhAHUAeABCAG8AbABkACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAZgBhAGwAcwBlAF0AXQB9ACwAIgBtAEYAYQB1AHgASQB0AGEAbABpAGMAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALABmAGEAbABzAGUAXQBdAH0ALAAiAG0ARgBpAGwAbABDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxADYANwA3ADcAMgAxADUAXQBdAH0ALAAiAG0ARgBpAGwAbABPAHYAZQByAFMAdAByAG8AawBlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAdAByAHUAZQBdAF0AfQAsACIAbQBGAGkAbABsAFYAaQBzAGkAYgBsAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAB0AHIAdQBlAF0AXQB9ACwAIgBtAEYAbwBuAHQATgBhAG0AZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsACIATAB1AGMAaQBkAGEARwByAGEAbgBkAGUAIgBdAF0AfQAsACIAbQBGAG8AbgB0AFMAaQB6AGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAyADgALgA0ADYAMQA1ADMANgA0ADAANwA0ADcAMAA3ADAAMwBdAF0AfQAsACIAbQBLAGUAcgBuAGkAbgBnACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxADYANwA3ADcAMgAxADUAXQBdAH0ALAAiAG0AUwB0AHIAbwBrAGUAVgBpAHMAaQBiAGwAZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAGYAYQBsAHMAZQBdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBXAGkAZAB0AGgAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxAF0AXQB9ACwAIgBtAFQAZQB4AHQAIgA6ACIAUgBEAE4AMQAwADIAXwAwADMAMgBfADAANAA1ADAAIgAsACIAbQBUAHIAYQBjAGsAaQBuAGcAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9ACwAIgBtAFQAcwB1AG0AaQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0AfQAsACIAbQBUAGEAYgBXAGkAZAB0AGgAIgA6ADQAMAAwACwAIgBtAFcAaQBkAHQAaAAiADoAMAB9ACwAIgBtAFYAZQByAHMAaQBvAG4AIgA6ADEAfQA=</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>2</parameterid> - <name>Transform</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>11</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>3</parameterid> - <name>Position</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0.02187499962747097:0.83703702688217163,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>4</parameterid> - <name>Vertical Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>5</parameterid> - <name>Horizontal Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,95.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>6</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>7</parameterid> - <name>Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>8</parameterid> - <name>Opacity</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>100</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>9</parameterid> - <name>Anchor Point</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0:0,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>10</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>12</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>11</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>12</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>13</parameterid> - <name>start</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,15.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>14</parameterid> - <name>end</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,15.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>15</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>16</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>17</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>18</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>19</parameterid> - <name>Parent Width</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>20</parameterid> - <name>Parent Height</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>21</parameterid> - <name>Parent Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - </effect> - </filter> - <filter> - <effect> - <name /> - <effectid>GraphicAndType</effectid> - <effectcategory>graphic</effectcategory> - <effecttype>filter</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>1</parameterid> - <name>Source Text</name> - <hash>86c1a2b5-72d0-d084-5430-aaa900000c8c</hash> - <value>eAwAAAAAAAB7ACIAbQBUAGUAeAB0AFAAYQByAGEAbQAiADoAewAiAG0AQQBsAGkAZwBuAG0AZQBuAHQAIgA6ADAALAAiAG0AQgBhAGMAawBGAGkAbABsAEMAbwBsAG8AcgAiADoANAAxADQANAA5ADUAOQAsACIAbQBCAGEAYwBrAEYAaQBsAGwATwBwAGEAYwBpAHQAeQAiADoANwA1ACwAIgBtAEIAYQBjAGsARgBpAGwAbABTAGkAegBlACIAOgAwACwAIgBtAEIAYQBjAGsARgBpAGwAbABWAGkAcwBpAGIAbABlACIAOgBmAGEAbABzAGUALAAiAG0ARABlAGYAYQB1AGwAdABSAHUAbgAiADoAWwB7ACIAbQBTAHQAeQBsAGUAUABhAHIAYQBtACIAOgB7ACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAHMAIgA6AFsAXQAsACIAbQBCAGEAcwBlAGwAaQBuAGUATwBwAHQAaQBvAG4AIgA6ADAALAAiAG0AQgBhAHMAZQBsAGkAbgBlAFMAaABpAGYAdAAiADoAMAAsACIAbQBDAGEAcABzAE8AcAB0AGkAbwBuACIAOgAwACwAIgBtAEYAYQB1AHgAQgBvAGwAZAAiADoAZgBhAGwAcwBlACwAIgBtAEYAYQB1AHgASQB0AGEAbABpAGMAIgA6AGYAYQBsAHMAZQAsACIAbQBGAGkAbABsAEIAbAB1AGUAIgA6ADEALAAiAG0ARgBpAGwAbABHAHIAZQBlAG4AIgA6ADEALAAiAG0ARgBpAGwAbABPAHYAZQByAFMAdAByAG8AawBlACIAOgB0AHIAdQBlACwAIgBtAEYAaQBsAGwAUgBlAGQAIgA6ADEALAAiAG0ARgBpAGwAbABWAGkAcwBpAGIAbABlACIAOgB0AHIAdQBlACwAIgBtAEYAbwBuAHQATgBhAG0AZQAiADoAIgBMAHUAYwBpAGQAYQBHAHIAYQBuAGQAZQAiACwAIgBtAEYAbwBuAHQAUwBpAHoAZQAiADoAMQAwADAALAAiAG0ASwBlAHIAbgBpAG4AZwAiADoAMAAsACIAbQBTAHQAcgBvAGsAZQBCAGwAdQBlACIAOgAxACwAIgBtAFMAdAByAG8AawBlAEcAcgBlAGUAbgAiADoAMQAsACIAbQBTAHQAcgBvAGsAZQBSAGUAZAAiADoAMQAsACIAbQBTAHQAcgBvAGsAZQBWAGkAcwBpAGIAbABlACIAOgBmAGEAbABzAGUALAAiAG0AUwB0AHIAbwBrAGUAVwBpAGQAdABoACIAOgAxACwAIgBtAFQAcgBhAGMAawBpAG4AZwAiADoAMAAsACIAbQBUAHMAdQBtAGkAIgA6ADAAfQAsACIAbQBUAGUAeAB0ACIAOgAiACIAfQBdACwAIgBtAEgAZQBpAGcAaAB0ACIAOgAwACwAIgBtAEgAaQBuAGQAaQBEAGkAZwBpAHQAcwAiADoAZgBhAGwAcwBlACwAIgBtAEkAbgBkAGkAYwAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBNAGEAcwBrACIAOgBmAGEAbABzAGUALAAiAG0ASQBzAE0AYQBzAGsASQBuAHYAZQByAHQAZQBkACIAOgBmAGEAbABzAGUALAAiAG0ASQBzAFYAZQByAHQAaQBjAGEAbABUAGUAeAB0ACIAOgBmAGEAbABzAGUALAAiAG0ATABlAGEAZABpAG4AZwAiADoAMAAsACIAbQBMAGkAZwBhAHQAdQByAGUAcwAiADoAZgBhAGwAcwBlACwAIgBtAEwAaQBuAGUAQwBhAHAAVAB5AHAAZQAiADoAMAAsACIAbQBMAGkAbgBlAEoAbwBpAG4AVAB5AHAAZQAiADoAMAAsACIAbQBNAGkAdABlAHIATABpAG0AaQB0ACIAOgAyAC4ANQAsACIAbQBOAHUAbQBTAHQAcgBvAGsAZQBzACIAOgAxACwAIgBtAFIAVABMACIAOgBmAGEAbABzAGUALAAiAG0AUwBoAGEAZABvAHcAQQBuAGcAbABlACIAOgAxADMANQAsACIAbQBTAGgAYQBkAG8AdwBCAGwAdQByACIAOgA0ADAALAAiAG0AUwBoAGEAZABvAHcAQwBvAGwAbwByACIAOgA0ADEANAA0ADkANQA5ACwAIgBtAFMAaABhAGQAbwB3AE8AZgBmAHMAZQB0ACIAOgA3ACwAIgBtAFMAaABhAGQAbwB3AE8AcABhAGMAaQB0AHkAIgA6ADcANQAsACIAbQBTAGgAYQBkAG8AdwBTAGkAegBlACIAOgAwACwAIgBtAFMAaABhAGQAbwB3AFYAaQBzAGkAYgBsAGUAIgA6AGYAYQBsAHMAZQAsACIAbQBTAHQAeQBsAGUAUwBoAGUAZQB0ACIAOgB7ACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAEMAbwBsAG8AcgAiADoAWwBdACwAIgBtAEEAZABkAGkAdABpAG8AbgBhAGwAUwB0AHIAbwBrAGUAVgBpAHMAaQBiAGwAZQAiADoAWwBdACwAIgBtAEEAZABkAGkAdABpAG8AbgBhAGwAUwB0AHIAbwBrAGUAVwBpAGQAdABoACIAOgBbAF0ALAAiAG0AQgBhAHMAZQBsAGkAbgBlAE8AcAB0AGkAbwBuACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAXQB9ACwAIgBtAEIAYQBzAGUAbABpAG4AZQBTAGgAaQBmAHQAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBdAH0ALAAiAG0AQwBhAHAAcwBPAHAAdABpAG8AbgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAF0AfQAsACIAbQBGAGEAdQB4AEIAbwBsAGQAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBdAH0ALAAiAG0ARgBhAHUAeABJAHQAYQBsAGkAYwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAF0AfQAsACIAbQBGAGkAbABsAEMAbwBsAG8AcgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAF0AfQAsACIAbQBGAGkAbABsAE8AdgBlAHIAUwB0AHIAbwBrAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBdAH0ALAAiAG0ARgBpAGwAbABWAGkAcwBpAGIAbABlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAXQB9ACwAIgBtAEYAbwBuAHQATgBhAG0AZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAF0AfQAsACIAbQBGAG8AbgB0AFMAaQB6AGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBdAH0ALAAiAG0ASwBlAHIAbgBpAG4AZwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBdAH0ALAAiAG0AUwB0AHIAbwBrAGUAVgBpAHMAaQBiAGwAZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBXAGkAZAB0AGgAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBdAH0ALAAiAG0AVABlAHgAdAAiADoAIgAiACwAIgBtAFQAcgBhAGMAawBpAG4AZwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAF0AfQAsACIAbQBUAHMAdQBtAGkAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBdAH0AfQAsACIAbQBUAGEAYgBXAGkAZAB0AGgAIgA6ADQAMAAwACwAIgBtAFcAaQBkAHQAaAAiADoAMAB9ACwAIgBtAFYAZQByAHMAaQBvAG4AIgA6ADEAfQA=</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>2</parameterid> - <name>Transform</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>11</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>3</parameterid> - <name>Position</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0.045454546809196472:0.79940122365951538,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>4</parameterid> - <name>Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>5</parameterid> - <name>Horizontal Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>6</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,true,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>7</parameterid> - <name>Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>8</parameterid> - <name>Opacity</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>100</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>9</parameterid> - <name>Anchor Point</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0:0,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>10</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>12</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>11</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>12</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>13</parameterid> - <name>start</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>14</parameterid> - <name>end</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>15</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>16</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>17</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>18</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>19</parameterid> - <name>Parent Width</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>20</parameterid> - <name>Parent Height</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>21</parameterid> - <name>Parent Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels /> - </clipitem> - <clipitem id="clipitem-531"> - <masterclipid>masterclip-286</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>203</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>51</in> - <out>179</out> - <pproTicksIn>540323784000</pproTicksIn> - <pproTicksOut>1896430536000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-277"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>203</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-532"> - <masterclipid>masterclip-287</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>99</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>24</in> - <out>75</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>794593800000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-278"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>99</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-533"> - <masterclipid>masterclip-288</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>122</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>24</in> - <out>98</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1038269232000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-279"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>122</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-534"> - <masterclipid>masterclip-289</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>103</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>24</in> - <out>79</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>836972136000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-280"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>103</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-535"> - <masterclipid>masterclip-290</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>186</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>24</in> - <out>162</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1716322608000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-281"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>186</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-536"> - <masterclipid>masterclip-291</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>107</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1675</start> - <end>1734</end> - <in>24</in> - <out>83</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>879350472000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-282"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>107</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-537"> - <masterclipid>masterclip-292</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>116</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1734</start> - <end>1802</end> - <in>24</in> - <out>92</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>974701728000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-283"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>116</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-538"> - <masterclipid>masterclip-293</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>161</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1862</start> - <end>1975</end> - <in>24</in> - <out>137</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1451458008000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-284"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>161</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-539"> - <masterclipid>masterclip-294</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>119</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1975</start> - <end>2046</end> - <in>24</in> - <out>95</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1006485480000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-285"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>119</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-540"> - <masterclipid>masterclip-295</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>109</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>24</in> - <out>85</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>900539640000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-286"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>109</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-541"> - <masterclipid>masterclip-285</masterclipid> - <name>Graphic</name> - <enabled>FALSE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>86313</in> - <out>86365</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915001247160000</pproTicksOut> - <alphatype>straight</alphatype> - <file id="file-276" /> - <filter> - <effect> - <name>myshow</name> - <effectid>GraphicAndType</effectid> - <effectcategory>graphic</effectcategory> - <effecttype>filter</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <pproExpanded>true</pproExpanded> - <parameter authoringApp="PremierePro"> - <parameterid>1</parameterid> - <name>Source Text</name> - <hash>d9583803-df20-1858-9e0f-504b00000aa6</hash> - <value>kgoAAAAAAAB7ACIAbQBUAGUAeAB0AFAAYQByAGEAbQAiADoAewAiAG0AQQBsAGkAZwBuAG0AZQBuAHQAIgA6ADAALAAiAG0AQgBhAGMAawBGAGkAbABsAEMAbwBsAG8AcgAiADoANAAxADQANAA5ADUAOQAsACIAbQBCAGEAYwBrAEYAaQBsAGwATwBwAGEAYwBpAHQAeQAiADoANwA1ACwAIgBtAEIAYQBjAGsARgBpAGwAbABTAGkAegBlACIAOgAwACwAIgBtAEIAYQBjAGsARgBpAGwAbABWAGkAcwBpAGIAbABlACIAOgB0AHIAdQBlACwAIgBtAEQAZQBmAGEAdQBsAHQAUgB1AG4AIgA6AFsAXQAsACIAbQBIAGUAaQBnAGgAdAAiADoAMAAsACIAbQBIAGkAbgBkAGkARABpAGcAaQB0AHMAIgA6AGYAYQBsAHMAZQAsACIAbQBJAG4AZABpAGMAIgA6AGYAYQBsAHMAZQAsACIAbQBJAHMATQBhAHMAawAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBNAGEAcwBrAEkAbgB2AGUAcgB0AGUAZAAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBWAGUAcgB0AGkAYwBhAGwAVABlAHgAdAAiADoAZgBhAGwAcwBlACwAIgBtAEwAZQBhAGQAaQBuAGcAIgA6ADAALAAiAG0ATABpAGcAYQB0AHUAcgBlAHMAIgA6AGYAYQBsAHMAZQAsACIAbQBMAGkAbgBlAEMAYQBwAFQAeQBwAGUAIgA6ADAALAAiAG0ATABpAG4AZQBKAG8AaQBuAFQAeQBwAGUAIgA6ADAALAAiAG0ATQBpAHQAZQByAEwAaQBtAGkAdAAiADoAMgAuADUALAAiAG0ATgB1AG0AUwB0AHIAbwBrAGUAcwAiADoAMQAsACIAbQBSAFQATAAiADoAZgBhAGwAcwBlACwAIgBtAFMAaABhAGQAbwB3AEEAbgBnAGwAZQAiADoAMQAzADUALAAiAG0AUwBoAGEAZABvAHcAQgBsAHUAcgAiADoANAAwACwAIgBtAFMAaABhAGQAbwB3AEMAbwBsAG8AcgAiADoANAAxADQANAA5ADUAOQAsACIAbQBTAGgAYQBkAG8AdwBPAGYAZgBzAGUAdAAiADoANwAsACIAbQBTAGgAYQBkAG8AdwBPAHAAYQBjAGkAdAB5ACIAOgA3ADUALAAiAG0AUwBoAGEAZABvAHcAUwBpAHoAZQAiADoAMAAsACIAbQBTAGgAYQBkAG8AdwBWAGkAcwBpAGIAbABlACIAOgBmAGEAbABzAGUALAAiAG0AUwB0AHkAbABlAFMAaABlAGUAdAAiADoAewAiAG0AQQBkAGQAaQB0AGkAbwBuAGEAbABTAHQAcgBvAGsAZQBDAG8AbABvAHIAIgA6AFsAXQAsACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAFYAaQBzAGkAYgBsAGUAIgA6AFsAXQAsACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAFcAaQBkAHQAaAAiADoAWwBdACwAIgBtAEIAYQBzAGUAbABpAG4AZQBPAHAAdABpAG8AbgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AQgBhAHMAZQBsAGkAbgBlAFMAaABpAGYAdAAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AQwBhAHAAcwBPAHAAdABpAG8AbgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0ARgBhAHUAeABCAG8AbABkACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAZgBhAGwAcwBlAF0AXQB9ACwAIgBtAEYAYQB1AHgASQB0AGEAbABpAGMAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALABmAGEAbABzAGUAXQBdAH0ALAAiAG0ARgBpAGwAbABDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxADYANwA3ADcAMgAxADUAXQBdAH0ALAAiAG0ARgBpAGwAbABPAHYAZQByAFMAdAByAG8AawBlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAdAByAHUAZQBdAF0AfQAsACIAbQBGAGkAbABsAFYAaQBzAGkAYgBsAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAB0AHIAdQBlAF0AXQB9ACwAIgBtAEYAbwBuAHQATgBhAG0AZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsACIATAB1AGMAaQBkAGEARwByAGEAbgBkAGUAIgBdAF0AfQAsACIAbQBGAG8AbgB0AFMAaQB6AGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAyADgALgA0ADYAMQA1ADMANgA0ADAANwA0ADcAMAA3ADAAMwBdAF0AfQAsACIAbQBLAGUAcgBuAGkAbgBnACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBDAG8AbABvAHIAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxADYANwA3ADcAMgAxADUAXQBdAH0ALAAiAG0AUwB0AHIAbwBrAGUAVgBpAHMAaQBiAGwAZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAGYAYQBsAHMAZQBdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBXAGkAZAB0AGgAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAxAF0AXQB9ACwAIgBtAFQAZQB4AHQAIgA6ACIAUgBEAE4AMQAwADIAXwAwADMAMgBfADEANgA1ADAAIgAsACIAbQBUAHIAYQBjAGsAaQBuAGcAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9ACwAIgBtAFQAcwB1AG0AaQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0AfQAsACIAbQBUAGEAYgBXAGkAZAB0AGgAIgA6ADQAMAAwACwAIgBtAFcAaQBkAHQAaAAiADoAMAB9ACwAIgBtAFYAZQByAHMAaQBvAG4AIgA6ADEAfQA=</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>2</parameterid> - <name>Transform</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>11</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>3</parameterid> - <name>Position</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0.02187499962747097:0.83703702688217163,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>4</parameterid> - <name>Vertical Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>5</parameterid> - <name>Horizontal Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,95.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>6</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>7</parameterid> - <name>Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>8</parameterid> - <name>Opacity</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>100</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>9</parameterid> - <name>Anchor Point</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0:0,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>10</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>12</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>11</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>12</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>13</parameterid> - <name>start</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,15.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>14</parameterid> - <name>end</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,15.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>15</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>16</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>17</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>18</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>19</parameterid> - <name>Parent Width</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>20</parameterid> - <name>Parent Height</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>21</parameterid> - <name>Parent Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - </effect> - </filter> - <filter> - <effect> - <name /> - <effectid>GraphicAndType</effectid> - <effectcategory>graphic</effectcategory> - <effecttype>filter</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>1</parameterid> - <name>Source Text</name> - <hash>86c1a2b5-72d0-d084-5430-aaa900000c8c</hash> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>2</parameterid> - <name>Transform</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>11</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>3</parameterid> - <name>Position</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0.045454546809196472:0.79940122365951538,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>4</parameterid> - <name>Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>5</parameterid> - <name>Horizontal Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>6</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,true,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>7</parameterid> - <name>Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>8</parameterid> - <name>Opacity</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>100</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>9</parameterid> - <name>Anchor Point</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0:0,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>10</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>12</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>11</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>12</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>13</parameterid> - <name>start</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>14</parameterid> - <name>end</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>15</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>16</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>17</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>18</parameterid> - <name /> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>19</parameterid> - <name>Parent Width</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>20</parameterid> - <name>Parent Height</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>21</parameterid> - <name>Parent Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels /> - </clipitem> - <clipitem id="clipitem-542"> - <masterclipid>masterclip-296</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>100</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>24</in> - <out>76</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>805188384000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-287"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>100</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-543"> - <masterclipid>masterclip-297</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>130</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>24</in> - <out>106</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1123025904000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-288"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>130</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-544"> - <masterclipid>masterclip-298</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>155</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2585</start> - <end>2692</end> - <in>24</in> - <out>131</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1387890504000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-289"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>155</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-545"> - <masterclipid>masterclip-299</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>167</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>24</in> - <out>143</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1515025512000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-290"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>167</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-546"> - <masterclipid>masterclip-300</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>168</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>24</in> - <out>144</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1525620096000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-291"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>168</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-547"> - <masterclipid>masterclip-301</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>297</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>24</in> - <out>273</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>2892321432000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-292"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>297</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="15" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-548"> - <masterclipid>masterclip-302</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>166</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>90</start> - <end>222</end> - <in>25</in> - <out>157</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1663349688000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-293"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>166</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:24:12:19</string> - <frame>1417267</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-549"> - <masterclipid>masterclip-303</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>223</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>222</start> - <end>396</end> - <in>25</in> - <out>199</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>2108322216000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-294"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>223</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:31:36:05</string> - <frame>1341509</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-550"> - <masterclipid>masterclip-304</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>154</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>25</in> - <out>130</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1377295920000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-295"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>154</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:52:04:11</string> - <frame>1457387</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-551"> - <masterclipid>masterclip-305</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>155</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>25</in> - <out>119</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1260755496000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-296"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>155</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:52:20:08</string> - <frame>1457768</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-552"> - <masterclipid>masterclip-306</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>155</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>25</in> - <out>113</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1197187992000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-297"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>155</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:36:55:12</string> - <frame>1349172</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-553"> - <masterclipid>masterclip-307</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>332</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>25</in> - <out>290</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>3072429360000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-298"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>332</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:32:23:20</string> - <frame>1342652</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-554"> - <masterclipid>masterclip-308</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>142</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1135</start> - <end>1229</end> - <in>24</in> - <out>118</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1250160912000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-299"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>142</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:47:48:03</string> - <frame>1278435</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-555"> - <masterclipid>masterclip-309</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>204</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>52</in> - <out>180</out> - <pproTicksIn>550918368000</pproTicksIn> - <pproTicksOut>1907025120000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-300"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>204</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:42:39:11</string> - <frame>1443827</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-556"> - <masterclipid>masterclip-310</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>25</in> - <out>76</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>805188384000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-301"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>100</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:38:14:04</string> - <frame>1351060</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-557"> - <masterclipid>masterclip-311</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>123</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>25</in> - <out>99</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1048863816000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-302"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>123</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:26:08</string> - <frame>1208792</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-558"> - <masterclipid>masterclip-312</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>104</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>25</in> - <out>80</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>847566720000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-303"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>104</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:48:14:05</string> - <frame>1279061</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-559"> - <masterclipid>masterclip-313</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>187</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>25</in> - <out>163</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1726917192000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-304"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>187</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:31:22</string> - <frame>1208926</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-560"> - <masterclipid>masterclip-314</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>108</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1675</start> - <end>1734</end> - <in>25</in> - <out>84</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>889945056000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-305"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>108</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:48:27:01</string> - <frame>1279369</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-561"> - <masterclipid>masterclip-315</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>117</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1734</start> - <end>1802</end> - <in>25</in> - <out>93</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>985296312000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-306"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>117</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:36:23</string> - <frame>1209047</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-562"> - <masterclipid>masterclip-316</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>162</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1862</start> - <end>1975</end> - <in>25</in> - <out>138</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1462052592000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-307"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>162</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:50:12:00</string> - <frame>1195488</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-563"> - <masterclipid>masterclip-317</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>120</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1975</start> - <end>2046</end> - <in>25</in> - <out>96</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1017080064000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-308"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>120</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:40:57:10</string> - <frame>1268578</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-564"> - <masterclipid>masterclip-318</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>110</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>25</in> - <out>86</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>911134224000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-309"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>110</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:53:46:01</string> - <frame>1200625</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-565"> - <masterclipid>masterclip-319</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>100</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>24</in> - <out>76</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>805188384000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-310"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>100</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:41:05:14</string> - <frame>1268774</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-566"> - <masterclipid>masterclip-320</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>101</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>25</in> - <out>77</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>815782968000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-311"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>101</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:58:04</string> - <frame>1209556</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-567"> - <masterclipid>masterclip-321</masterclipid> - <name>mymovie.mov</name> - <enabled>FALSE</enabled> - <duration>130</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>24</in> - <out>106</out> - <pproTicksIn>254270016000</pproTicksIn> - <pproTicksOut>1123025904000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-312"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>130</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name>reel_name</name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Magenta</label2> - </labels> - </clipitem> - <clipitem id="clipitem-568"> - <masterclipid>masterclip-322</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>156</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2585</start> - <end>2692</end> - <in>25</in> - <out>132</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1398485088000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-313"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>156</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:00:18:14</string> - <frame>1210046</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-569"> - <masterclipid>masterclip-323</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>168</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>25</in> - <out>144</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1525620096000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-314"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>168</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:55:07:08</string> - <frame>1461776</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-570"> - <masterclipid>masterclip-324</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>169</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>25</in> - <out>145</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1536214680000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-315"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>169</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:14:52:18</string> - <frame>1403826</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-571"> - <masterclipid>masterclip-325</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>298</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>25</in> - <out>274</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>2902916016000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-316"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>298</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>07:22:13:07</string> - <frame>636799</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-572"> - <masterclipid>masterclip-326</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>149</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>90</start> - <end>222</end> - <in>9</in> - <out>141</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1493836344000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-317"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>149</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:24:09:19</string> - <frame>1417195</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-573"> - <masterclipid>masterclip-327</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>191</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>222</start> - <end>396</end> - <in>9</in> - <out>183</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1938808872000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-318"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>191</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:31:39:21</string> - <frame>1341597</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-574"> - <masterclipid>masterclip-328</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>122</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>9</in> - <out>114</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1207782576000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-319"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>122</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:52:01:22</string> - <frame>1457326</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-575"> - <masterclipid>masterclip-329</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>123</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>9</in> - <out>103</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1091242152000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-320"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>123</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:52:17:13</string> - <frame>1457701</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-576"> - <masterclipid>masterclip-330</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>123</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>9</in> - <out>97</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1027674648000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-321"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>123</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:36:57:18</string> - <frame>1349226</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-577"> - <masterclipid>masterclip-331</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>172</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>36</in> - <out>164</out> - <pproTicksIn>381405024000</pproTicksIn> - <pproTicksOut>1737511776000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-322"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>172</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:42:35:21</string> - <frame>1443741</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-578"> - <masterclipid>masterclip-332</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>68</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>9</in> - <out>60</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>635675040000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-323"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>68</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:38:12:13</string> - <frame>1351021</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-579"> - <masterclipid>masterclip-333</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>91</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>9</in> - <out>83</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>879350472000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-324"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>91</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:24:10</string> - <frame>1208746</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-580"> - <masterclipid>masterclip-334</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>72</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>9</in> - <out>64</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>678053376000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-325"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>72</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:48:12:12</string> - <frame>1279020</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-581"> - <masterclipid>masterclip-335</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>155</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>9</in> - <out>147</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1557403848000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-326"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>155</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:28:16</string> - <frame>1208848</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-582"> - <masterclipid>masterclip-336</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>85</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1734</start> - <end>1802</end> - <in>9</in> - <out>77</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>815782968000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-327"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>85</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:35:04</string> - <frame>1209004</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-583"> - <masterclipid>masterclip-337</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>131</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>25</in> - <out>107</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1133620488000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-328"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>131</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:00:06:16</string> - <frame>1209760</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-584"> - <masterclipid>masterclip-338</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>131</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>25</in> - <out>107</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1133620488000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-329"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>131</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:00:10:03</string> - <frame>1209843</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-585"> - <masterclipid>masterclip-339</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>191</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>222</start> - <end>396</end> - <in>9</in> - <out>183</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1938808872000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-330"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>191</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:31:39:21</string> - <frame>1341597</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-586"> - <masterclipid>masterclip-340</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>122</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>9</in> - <out>114</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1207782576000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-331"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>122</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:52:01:17</string> - <frame>1457321</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-587"> - <masterclipid>masterclip-341</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>123</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>9</in> - <out>103</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1091242152000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-332"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>123</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:52:17:13</string> - <frame>1457701</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-588"> - <masterclipid>masterclip-342</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>123</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>9</in> - <out>97</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1027674648000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-333"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>123</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:36:57:18</string> - <frame>1349226</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-589"> - <masterclipid>masterclip-343</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>300</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>9</in> - <out>274</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>2902916016000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-334"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>300</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:32:17:09</string> - <frame>1342497</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-590"> - <masterclipid>masterclip-344</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>143</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1135</start> - <end>1229</end> - <in>25</in> - <out>119</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>1260755496000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-335"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>143</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:47:48:02</string> - <frame>1278434</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-591"> - <masterclipid>masterclip-345</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>172</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>36</in> - <out>164</out> - <pproTicksIn>381405024000</pproTicksIn> - <pproTicksOut>1737511776000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-336"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>172</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:42:35:16</string> - <frame>1443736</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-592"> - <masterclipid>masterclip-346</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>68</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>9</in> - <out>60</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>635675040000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-337"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>68</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:38:12:13</string> - <frame>1351021</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-593"> - <masterclipid>masterclip-347</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>91</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>9</in> - <out>83</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>879350472000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-338"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>91</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:24:05</string> - <frame>1208741</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-594"> - <masterclipid>masterclip-348</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>72</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>9</in> - <out>64</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>678053376000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-339"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>72</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:48:12:12</string> - <frame>1279020</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-595"> - <masterclipid>masterclip-349</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>155</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>9</in> - <out>147</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1557403848000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-340"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>155</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:28:11</string> - <frame>1208843</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-596"> - <masterclipid>masterclip-350</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>76</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1675</start> - <end>1734</end> - <in>9</in> - <out>68</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>720431712000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-341"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>76</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:48:28:08</string> - <frame>1279400</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-597"> - <masterclipid>masterclip-351</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>130</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1862</start> - <end>1975</end> - <in>9</in> - <out>122</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1292539248000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-342"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>130</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:50:09:02</string> - <frame>1195418</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-598"> - <masterclipid>masterclip-352</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>88</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1975</start> - <end>2046</end> - <in>9</in> - <out>80</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>847566720000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-343"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>88</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:40:55:09</string> - <frame>1268529</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-599"> - <masterclipid>masterclip-353</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>78</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>9</in> - <out>70</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>741620880000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-344"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>78</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:53:44:10</string> - <frame>1200586</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-600"> - <masterclipid>masterclip-354</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>101</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>25</in> - <out>77</out> - <pproTicksIn>264864600000</pproTicksIn> - <pproTicksOut>815782968000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-345"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>101</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:41:05:13</string> - <frame>1268773</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-601"> - <masterclipid>masterclip-355</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>69</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>9</in> - <out>61</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>646269624000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-346"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>69</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:56:17</string> - <frame>1209521</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-602"> - <masterclipid>masterclip-356</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>99</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>9</in> - <out>91</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>964107144000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-347"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>99</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:00:04:14</string> - <frame>1209710</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-603"> - <masterclipid>masterclip-357</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>124</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2585</start> - <end>2692</end> - <in>9</in> - <out>116</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1228971744000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-348"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>124</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:00:16:00</string> - <frame>1209984</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-604"> - <masterclipid>masterclip-358</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>136</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>9</in> - <out>128</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1356106752000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-349"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>136</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:55:04:12</string> - <frame>1461708</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-605"> - <masterclipid>masterclip-359</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>137</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>9</in> - <out>129</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1366701336000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-350"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>137</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:14:49:16</string> - <frame>1403752</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-606"> - <masterclipid>masterclip-360</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>266</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>9</in> - <out>258</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>2733402672000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-351"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>266</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>07:22:07:18</string> - <frame>636666</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-607"> - <masterclipid>masterclip-361</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>123</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>9</in> - <out>103</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1091242152000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-352"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>123</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:52:17:13</string> - <frame>1457701</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-608"> - <masterclipid>masterclip-362</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>300</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>9</in> - <out>274</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>2902916016000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-353"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>300</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>15:32:17:09</string> - <frame>1342497</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-609"> - <masterclipid>masterclip-363</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>78</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>9</in> - <out>70</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>741620880000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-354"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>78</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:53:44:10</string> - <frame>1200586</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-610"> - <masterclipid>masterclip-364</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>69</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>9</in> - <out>61</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>646269624000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-355"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>69</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:41:06:00</string> - <frame>1268784</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-611"> - <masterclipid>masterclip-365</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>69</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>9</in> - <out>61</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>646269624000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-356"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>69</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:59:56:17</string> - <frame>1209521</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-612"> - <masterclipid>masterclip-366</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>99</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>9</in> - <out>91</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>964107144000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-357"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>99</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>14:00:04:14</string> - <frame>1209710</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-613"> - <masterclipid>masterclip-367</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>136</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>9</in> - <out>128</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1356106752000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-358"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>136</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:55:04:07</string> - <frame>1461703</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-614"> - <masterclipid>masterclip-368</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>137</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>9</in> - <out>129</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>1366701336000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-359"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>137</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>16:14:49:16</string> - <frame>1403752</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-615"> - <masterclipid>masterclip-369</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>266</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>9</in> - <out>258</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>2733402672000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-360"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>266</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>07:22:07:18</string> - <frame>636666</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-616"> - <masterclipid>masterclip-370</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>78</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>9</in> - <out>70</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>741620880000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-361"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>78</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>13:53:44:05</string> - <frame>1200581</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <clipitem id="clipitem-617"> - <masterclipid>masterclip-371</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>266</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>9</in> - <out>258</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>2733402672000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-362"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>266</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>07:22:07:18</string> - <frame>636666</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.75</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-618"> - <masterclipid>masterclip-372</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>266</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>9</in> - <out>258</out> - <pproTicksIn>95351256000</pproTicksIn> - <pproTicksOut>2733402672000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-363"> - <name>mymovie.mov</name> - <pathurl>file://localhost/Volumes/mydisk/mymovie.mov</pathurl> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>266</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>07:22:07:18</string> - <frame>636666</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>2048</width> - <height>858</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>Basic Motion</name> - <effectid>basic</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>scale</parameterid> - <name>Scale</name> - <valuemin>0</valuemin> - <valuemax>1000</valuemax> - <value>93.8</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>rotation</parameterid> - <name>Rotation</name> - <valuemin>-8640</valuemin> - <valuemax>8640</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>center</parameterid> - <name>Center</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>centerOffset</parameterid> - <name>Anchor Point</name> - <value> - <horiz>0</horiz> - <vert>0</vert> - </value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>antiflicker</parameterid> - <name>Anti-flicker Filter</name> - <valuemin>0.0</valuemin> - <valuemax>1.0</valuemax> - <value>0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Violet</label2> - </labels> - </clipitem> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>FALSE</enabled> - <locked>FALSE</locked> - </track> - </video> - <audio> - <numOutputChannels>2</numOutputChannels> - <format> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - </format> - <outputs> - <group> - <index>1</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>1</index> - </channel> - </group> - <group> - <index>2</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>2</index> - </channel> - </group> - </outputs> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-619" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>15</start> - <end>90</end> - <in>0</in> - <out>75</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>794593800000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-458</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - </link> - <link> - <linkclipref>clipitem-619</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-652</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-620" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>90</start> - <end>222</end> - <in>75</in> - <out>207</out> - <pproTicksIn>794593800000</pproTicksIn> - <pproTicksOut>2193078888000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-459</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>3</clipindex> - </link> - <link> - <linkclipref>clipitem-620</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-653</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-621" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>222</start> - <end>396</end> - <in>207</in> - <out>381</out> - <pproTicksIn>2193078888000</pproTicksIn> - <pproTicksOut>4036536504000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-460</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - </link> - <link> - <linkclipref>clipitem-621</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>3</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-654</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>3</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-622" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>396</start> - <end>493</end> - <in>381</in> - <out>478</out> - <pproTicksIn>4036536504000</pproTicksIn> - <pproTicksOut>5064211152000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-461</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>5</clipindex> - </link> - <link> - <linkclipref>clipitem-622</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-655</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>4</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-623" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>478</in> - <out>583</out> - <pproTicksIn>5064211152000</pproTicksIn> - <pproTicksOut>6176642472000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-462</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>6</clipindex> - </link> - <link> - <linkclipref>clipitem-623</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>5</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-656</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>5</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-624" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>583</in> - <out>677</out> - <pproTicksIn>6176642472000</pproTicksIn> - <pproTicksOut>7172533368000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-463</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>7</clipindex> - </link> - <link> - <linkclipref>clipitem-624</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>6</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-657</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>6</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-625" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>677</in> - <out>765</out> - <pproTicksIn>7172533368000</pproTicksIn> - <pproTicksOut>8104856760000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-464</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>8</clipindex> - </link> - <link> - <linkclipref>clipitem-625</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>7</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-658</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>7</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-626" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>780</start> - <end>870</end> - <in>765</in> - <out>855</out> - <pproTicksIn>8104856760000</pproTicksIn> - <pproTicksOut>9058369320000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-465</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>9</clipindex> - </link> - <link> - <linkclipref>clipitem-626</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>8</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-659</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>8</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-627" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>855</in> - <out>1120</out> - <pproTicksIn>9058369320000</pproTicksIn> - <pproTicksOut>11865934080000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-466</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>10</clipindex> - </link> - <link> - <linkclipref>clipitem-627</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>9</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-660</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>9</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-628" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1135</start> - <end>1229</end> - <in>1120</in> - <out>1214</out> - <pproTicksIn>11865934080000</pproTicksIn> - <pproTicksOut>12861824976000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-467</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>11</clipindex> - </link> - <link> - <linkclipref>clipitem-628</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>10</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-661</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>10</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-629" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>1214</in> - <out>1342</out> - <pproTicksIn>12861824976000</pproTicksIn> - <pproTicksOut>14217931728000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-468</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>12</clipindex> - </link> - <link> - <linkclipref>clipitem-629</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>11</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-662</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>11</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-630" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>1342</in> - <out>1393</out> - <pproTicksIn>14217931728000</pproTicksIn> - <pproTicksOut>14758255512000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-469</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>13</clipindex> - </link> - <link> - <linkclipref>clipitem-630</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>12</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-663</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>12</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-631" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>1393</in> - <out>1467</out> - <pproTicksIn>14758255512000</pproTicksIn> - <pproTicksOut>15542254728000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-470</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>14</clipindex> - </link> - <link> - <linkclipref>clipitem-631</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>13</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-664</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>13</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-632" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>1467</in> - <out>1522</out> - <pproTicksIn>15542254728000</pproTicksIn> - <pproTicksOut>16124956848000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-471</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>15</clipindex> - </link> - <link> - <linkclipref>clipitem-632</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>14</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-665</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>14</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-633" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>1522</in> - <out>1660</out> - <pproTicksIn>16124956848000</pproTicksIn> - <pproTicksOut>17587009440000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-472</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>16</clipindex> - </link> - <link> - <linkclipref>clipitem-633</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>15</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-666</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>15</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-634" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1675</start> - <end>1734</end> - <in>1660</in> - <out>1719</out> - <pproTicksIn>17587009440000</pproTicksIn> - <pproTicksOut>18212089896000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-473</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>17</clipindex> - </link> - <link> - <linkclipref>clipitem-634</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>16</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-667</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>16</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-635" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1734</start> - <end>1802</end> - <in>1719</in> - <out>1787</out> - <pproTicksIn>18212089896000</pproTicksIn> - <pproTicksOut>18932521608000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-474</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>18</clipindex> - </link> - <link> - <linkclipref>clipitem-635</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>17</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-668</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>17</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-636" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1802</start> - <end>1862</end> - <in>1787</in> - <out>1847</out> - <pproTicksIn>18932521608000</pproTicksIn> - <pproTicksOut>19568196648000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-475</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>19</clipindex> - </link> - <link> - <linkclipref>clipitem-636</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>18</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-669</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>18</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-637" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1862</start> - <end>1975</end> - <in>1847</in> - <out>1960</out> - <pproTicksIn>19568196648000</pproTicksIn> - <pproTicksOut>20765384640000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-476</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>20</clipindex> - </link> - <link> - <linkclipref>clipitem-637</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>19</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-670</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>19</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-638" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1975</start> - <end>2046</end> - <in>1960</in> - <out>2031</out> - <pproTicksIn>20765384640000</pproTicksIn> - <pproTicksOut>21517600104000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-477</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>21</clipindex> - </link> - <link> - <linkclipref>clipitem-638</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>20</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-671</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>20</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-639" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2046</start> - <end>2094</end> - <in>2031</in> - <out>2079</out> - <pproTicksIn>21517600104000</pproTicksIn> - <pproTicksOut>22026140136000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-478</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>22</clipindex> - </link> - <link> - <linkclipref>clipitem-639</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>21</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-672</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>21</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-640" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>2079</in> - <out>2140</out> - <pproTicksIn>22026140136000</pproTicksIn> - <pproTicksOut>22672409760000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-479</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>23</clipindex> - </link> - <link> - <linkclipref>clipitem-640</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>22</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-673</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>22</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-641" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>2140</in> - <out>2192</out> - <pproTicksIn>22672409760000</pproTicksIn> - <pproTicksOut>23223328128000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-480</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>24</clipindex> - </link> - <link> - <linkclipref>clipitem-641</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>23</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-674</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>23</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-642" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>2192</in> - <out>2244</out> - <pproTicksIn>23223328128000</pproTicksIn> - <pproTicksOut>23774246496000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-481</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>25</clipindex> - </link> - <link> - <linkclipref>clipitem-642</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>24</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-675</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>24</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-643" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2259</start> - <end>2306</end> - <in>2244</in> - <out>2291</out> - <pproTicksIn>23774246496000</pproTicksIn> - <pproTicksOut>24272191944000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-482</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>26</clipindex> - </link> - <link> - <linkclipref>clipitem-643</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>25</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-676</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>25</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-644" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>2291</in> - <out>2373</out> - <pproTicksIn>24272191944000</pproTicksIn> - <pproTicksOut>25140947832000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-483</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>27</clipindex> - </link> - <link> - <linkclipref>clipitem-644</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>26</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-677</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>26</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-645" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2388</start> - <end>2585</end> - <in>2373</in> - <out>2570</out> - <pproTicksIn>25140947832000</pproTicksIn> - <pproTicksOut>27228080880000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-484</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>28</clipindex> - </link> - <link> - <linkclipref>clipitem-645</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>27</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-678</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>27</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-646" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2585</start> - <end>2692</end> - <in>2570</in> - <out>2677</out> - <pproTicksIn>27228080880000</pproTicksIn> - <pproTicksOut>28361701368000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-485</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>29</clipindex> - </link> - <link> - <linkclipref>clipitem-646</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>28</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-679</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>28</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-647" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2692</start> - <end>2819</end> - <in>2677</in> - <out>2804</out> - <pproTicksIn>28361701368000</pproTicksIn> - <pproTicksOut>29707213536000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-486</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>30</clipindex> - </link> - <link> - <linkclipref>clipitem-647</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>29</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-680</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>29</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-648" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>2804</in> - <out>2923</out> - <pproTicksIn>29707213536000</pproTicksIn> - <pproTicksOut>30967969032000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-487</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>31</clipindex> - </link> - <link> - <linkclipref>clipitem-648</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>30</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-681</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>30</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-649" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>2923</in> - <out>3043</out> - <pproTicksIn>30967969032000</pproTicksIn> - <pproTicksOut>32239319112000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-488</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>32</clipindex> - </link> - <link> - <linkclipref>clipitem-649</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>31</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-682</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>31</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-650" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>3043</in> - <out>3292</out> - <pproTicksIn>32239319112000</pproTicksIn> - <pproTicksOut>34877370528000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-489</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>33</clipindex> - </link> - <link> - <linkclipref>clipitem-650</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>32</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-683</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>32</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-651" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3307</start> - <end>3517</end> - <in>3292</in> - <out>3502</out> - <pproTicksIn>34877370528000</pproTicksIn> - <pproTicksOut>37102233168000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-490</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>34</clipindex> - </link> - <link> - <linkclipref>clipitem-651</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>33</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-684</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>33</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-652" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>15</start> - <end>90</end> - <in>0</in> - <out>75</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>794593800000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-458</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - </link> - <link> - <linkclipref>clipitem-619</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-652</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-653" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>90</start> - <end>222</end> - <in>75</in> - <out>207</out> - <pproTicksIn>794593800000</pproTicksIn> - <pproTicksOut>2193078888000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-459</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>3</clipindex> - </link> - <link> - <linkclipref>clipitem-620</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-653</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-654" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>222</start> - <end>396</end> - <in>207</in> - <out>381</out> - <pproTicksIn>2193078888000</pproTicksIn> - <pproTicksOut>4036536504000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-460</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - </link> - <link> - <linkclipref>clipitem-621</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>3</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-654</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>3</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-655" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>396</start> - <end>493</end> - <in>381</in> - <out>478</out> - <pproTicksIn>4036536504000</pproTicksIn> - <pproTicksOut>5064211152000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-461</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>5</clipindex> - </link> - <link> - <linkclipref>clipitem-622</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-655</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>4</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-656" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>493</start> - <end>598</end> - <in>478</in> - <out>583</out> - <pproTicksIn>5064211152000</pproTicksIn> - <pproTicksOut>6176642472000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-462</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>6</clipindex> - </link> - <link> - <linkclipref>clipitem-623</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>5</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-656</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>5</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-657" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>598</start> - <end>692</end> - <in>583</in> - <out>677</out> - <pproTicksIn>6176642472000</pproTicksIn> - <pproTicksOut>7172533368000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-463</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>7</clipindex> - </link> - <link> - <linkclipref>clipitem-624</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>6</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-657</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>6</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-658" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>692</start> - <end>780</end> - <in>677</in> - <out>765</out> - <pproTicksIn>7172533368000</pproTicksIn> - <pproTicksOut>8104856760000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-464</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>8</clipindex> - </link> - <link> - <linkclipref>clipitem-625</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>7</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-658</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>7</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-659" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>780</start> - <end>870</end> - <in>765</in> - <out>855</out> - <pproTicksIn>8104856760000</pproTicksIn> - <pproTicksOut>9058369320000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-465</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>9</clipindex> - </link> - <link> - <linkclipref>clipitem-626</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>8</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-659</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>8</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-660" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>870</start> - <end>1135</end> - <in>855</in> - <out>1120</out> - <pproTicksIn>9058369320000</pproTicksIn> - <pproTicksOut>11865934080000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-466</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>10</clipindex> - </link> - <link> - <linkclipref>clipitem-627</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>9</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-660</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>9</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-661" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1135</start> - <end>1229</end> - <in>1120</in> - <out>1214</out> - <pproTicksIn>11865934080000</pproTicksIn> - <pproTicksOut>12861824976000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-467</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>11</clipindex> - </link> - <link> - <linkclipref>clipitem-628</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>10</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-661</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>10</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-662" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1229</start> - <end>1357</end> - <in>1214</in> - <out>1342</out> - <pproTicksIn>12861824976000</pproTicksIn> - <pproTicksOut>14217931728000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-468</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>12</clipindex> - </link> - <link> - <linkclipref>clipitem-629</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>11</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-662</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>11</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-663" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1357</start> - <end>1408</end> - <in>1342</in> - <out>1393</out> - <pproTicksIn>14217931728000</pproTicksIn> - <pproTicksOut>14758255512000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-469</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>13</clipindex> - </link> - <link> - <linkclipref>clipitem-630</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>12</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-663</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>12</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-664" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1408</start> - <end>1482</end> - <in>1393</in> - <out>1467</out> - <pproTicksIn>14758255512000</pproTicksIn> - <pproTicksOut>15542254728000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-470</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>14</clipindex> - </link> - <link> - <linkclipref>clipitem-631</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>13</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-664</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>13</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-665" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1482</start> - <end>1537</end> - <in>1467</in> - <out>1522</out> - <pproTicksIn>15542254728000</pproTicksIn> - <pproTicksOut>16124956848000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-471</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>15</clipindex> - </link> - <link> - <linkclipref>clipitem-632</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>14</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-665</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>14</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-666" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1537</start> - <end>1675</end> - <in>1522</in> - <out>1660</out> - <pproTicksIn>16124956848000</pproTicksIn> - <pproTicksOut>17587009440000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-472</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>16</clipindex> - </link> - <link> - <linkclipref>clipitem-633</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>15</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-666</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>15</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-667" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1675</start> - <end>1734</end> - <in>1660</in> - <out>1719</out> - <pproTicksIn>17587009440000</pproTicksIn> - <pproTicksOut>18212089896000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-473</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>17</clipindex> - </link> - <link> - <linkclipref>clipitem-634</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>16</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-667</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>16</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-668" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1734</start> - <end>1802</end> - <in>1719</in> - <out>1787</out> - <pproTicksIn>18212089896000</pproTicksIn> - <pproTicksOut>18932521608000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-474</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>18</clipindex> - </link> - <link> - <linkclipref>clipitem-635</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>17</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-668</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>17</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-669" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1802</start> - <end>1862</end> - <in>1787</in> - <out>1847</out> - <pproTicksIn>18932521608000</pproTicksIn> - <pproTicksOut>19568196648000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-475</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>19</clipindex> - </link> - <link> - <linkclipref>clipitem-636</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>18</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-669</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>18</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-670" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1862</start> - <end>1975</end> - <in>1847</in> - <out>1960</out> - <pproTicksIn>19568196648000</pproTicksIn> - <pproTicksOut>20765384640000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-476</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>20</clipindex> - </link> - <link> - <linkclipref>clipitem-637</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>19</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-670</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>19</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-671" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>1975</start> - <end>2046</end> - <in>1960</in> - <out>2031</out> - <pproTicksIn>20765384640000</pproTicksIn> - <pproTicksOut>21517600104000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-477</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>21</clipindex> - </link> - <link> - <linkclipref>clipitem-638</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>20</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-671</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>20</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-672" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2046</start> - <end>2094</end> - <in>2031</in> - <out>2079</out> - <pproTicksIn>21517600104000</pproTicksIn> - <pproTicksOut>22026140136000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-478</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>22</clipindex> - </link> - <link> - <linkclipref>clipitem-639</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>21</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-672</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>21</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-673" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2094</start> - <end>2155</end> - <in>2079</in> - <out>2140</out> - <pproTicksIn>22026140136000</pproTicksIn> - <pproTicksOut>22672409760000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-479</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>23</clipindex> - </link> - <link> - <linkclipref>clipitem-640</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>22</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-673</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>22</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-674" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2155</start> - <end>2207</end> - <in>2140</in> - <out>2192</out> - <pproTicksIn>22672409760000</pproTicksIn> - <pproTicksOut>23223328128000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-480</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>24</clipindex> - </link> - <link> - <linkclipref>clipitem-641</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>23</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-674</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>23</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-675" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2207</start> - <end>2259</end> - <in>2192</in> - <out>2244</out> - <pproTicksIn>23223328128000</pproTicksIn> - <pproTicksOut>23774246496000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-481</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>25</clipindex> - </link> - <link> - <linkclipref>clipitem-642</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>24</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-675</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>24</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-676" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2259</start> - <end>2306</end> - <in>2244</in> - <out>2291</out> - <pproTicksIn>23774246496000</pproTicksIn> - <pproTicksOut>24272191944000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-482</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>26</clipindex> - </link> - <link> - <linkclipref>clipitem-643</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>25</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-676</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>25</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-677" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2306</start> - <end>2388</end> - <in>2291</in> - <out>2373</out> - <pproTicksIn>24272191944000</pproTicksIn> - <pproTicksOut>25140947832000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-483</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>27</clipindex> - </link> - <link> - <linkclipref>clipitem-644</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>26</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-677</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>26</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-678" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2388</start> - <end>2585</end> - <in>2373</in> - <out>2570</out> - <pproTicksIn>25140947832000</pproTicksIn> - <pproTicksOut>27228080880000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-484</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>28</clipindex> - </link> - <link> - <linkclipref>clipitem-645</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>27</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-678</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>27</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-679" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2585</start> - <end>2692</end> - <in>2570</in> - <out>2677</out> - <pproTicksIn>27228080880000</pproTicksIn> - <pproTicksOut>28361701368000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-485</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>29</clipindex> - </link> - <link> - <linkclipref>clipitem-646</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>28</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-679</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>28</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-680" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2692</start> - <end>2819</end> - <in>2677</in> - <out>2804</out> - <pproTicksIn>28361701368000</pproTicksIn> - <pproTicksOut>29707213536000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-486</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>30</clipindex> - </link> - <link> - <linkclipref>clipitem-647</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>29</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-680</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>29</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-681" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2819</start> - <end>2938</end> - <in>2804</in> - <out>2923</out> - <pproTicksIn>29707213536000</pproTicksIn> - <pproTicksOut>30967969032000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-487</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>31</clipindex> - </link> - <link> - <linkclipref>clipitem-648</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>30</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-681</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>30</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-682" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>2938</start> - <end>3058</end> - <in>2923</in> - <out>3043</out> - <pproTicksIn>30967969032000</pproTicksIn> - <pproTicksOut>32239319112000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-488</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>32</clipindex> - </link> - <link> - <linkclipref>clipitem-649</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>31</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-682</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>31</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-683" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3058</start> - <end>3307</end> - <in>3043</in> - <out>3292</out> - <pproTicksIn>32239319112000</pproTicksIn> - <pproTicksOut>34877370528000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-489</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>33</clipindex> - </link> - <link> - <linkclipref>clipitem-650</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>32</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-683</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>32</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-684" premiereChannelType="stereo"> - <masterclipid>masterclip-250</masterclipid> - <name>mymovie.mov</name> - <enabled>TRUE</enabled> - <duration>3502</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>3307</start> - <end>3517</end> - <in>3292</in> - <out>3502</out> - <pproTicksIn>34877370528000</pproTicksIn> - <pproTicksOut>37102233168000</pproTicksOut> - <file id="file-243" /> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-490</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>34</clipindex> - </link> - <link> - <linkclipref>clipitem-651</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>33</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-684</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>33</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - <colorinfo> - <lut /> - <lut1 /> - <asc_sop /> - <asc_sat /> - <lut2 /> - </colorinfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - </audio> - </media> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - <labels> - <label2>Lavender</label2> - </labels> - <logginginfo> - <description /> - <scene /> - <shottake /> - <lognote /> - <good /> - <originalvideofilename /> - <originalaudiofilename /> - </logginginfo> - </sequence> -</xmeml> 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/hiero_xml_export.xml b/tests/sample_data/hiero_xml_export.xml deleted file mode 100644 index 8e80d8c5f..000000000 --- a/tests/sample_data/hiero_xml_export.xml +++ /dev/null @@ -1,132 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE xmeml> -<xmeml version="5"> - <sequence id="hiero_xml_export"> - <name>hiero_xml_export</name> - <duration>1324</duration> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <timecode> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <frame>86400</frame> - <displayformat>NDF</displayformat> - <string>01:00:00:00</string> - </timecode> - <media> - <video> - <format> - <samplecharacteristics> - <width>1920</width> - <height>1080</height> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - </samplecharacteristics> - </format> - <track> - <name>Video 1</name> - <clipitem> - <name>A160C005_171213_R0MN</name> - <duration>1055.0</duration> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <enabled>TRUE</enabled> - <in>0.0</in> - <out>1055.0</out> - <start>14</start> - <end>1069</end> - <file id="A160C005_171213_R0MN"> - <name>A160C005_171213_R0MN</name> - <pathurl>file://localhost/A160R0MN/A160R0MN/A160C005_171213_R0MN.mxf</pathurl> - <duration>1055</duration> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <width>3424</width> - <height>2202</height> - <media> - <video> - <duration>1055</duration> - <samplecharacteristics> - <width>3424</width> - <height>2202</height> - </samplecharacteristics> - </video> - </media> - <timecode> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <frame>1101071</frame> - <displayformat>NDF</displayformat> - <string>12:44:37:23</string> - </timecode> - </file> - </clipitem> - <clipitem> - <name>/</name> - <duration>400.0</duration> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <enabled>TRUE</enabled> - <in>326400.0</in> - <out>326639.0</out> - <start>1085</start> - <end>1324</end> - <file id="/"> - <name>/</name> - <duration>1</duration> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <timecode> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <frame>0</frame> - <displayformat>NDF</displayformat> - <string>00:00:00:00</string> - </timecode> - </file> - <filter> - <effect> - <name>Time Remap</name> - <effectid>timeremap</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <parameter> - <name>speed</name> - <parameterid>speed</parameterid> - <value>0.25</value> - </parameter> - </effect> - </filter> - </clipitem> - </track> - </video> - <audio> - <format> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - </format> - </audio> - </media> - </sequence> -</xmeml> \ No newline at end of file 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/multiple_track.svg b/tests/sample_data/multiple_track.svg deleted file mode 100644 index 38cd9866b..000000000 --- a/tests/sample_data/multiple_track.svg +++ /dev/null @@ -1,340 +0,0 @@ -<?xml version="1.0" ?> -<svg height="1054.00000000" version="4.0" width="2406.00000000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <rect fill="white" height="100%" width="100%"/> - <g transform="translate(342.63636364,20.00000000)"> - <rect height="39.36000000" style="fill:rgb(255.00000000,255.00000000,255.00000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="2043.36363636"/> - <svg height="39.36000000" width="2043.36363636"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Timeline</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="59.36000000" y2="53.45600000"/> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1364.31818182" x2="1364.31818182" y1="69.36000000" y2="79.72000000"/> - <polygon points="1364.31818182,88.72000000 1359.81818182,79.72000000 1368.81818182,79.72000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1369.31818182" y="79.04000000">tracks</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="74.36000000">global_start_time: 0.0</text> - <g transform="translate(342.63636364,98.72000000)"> - <rect height="39.36000000" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;" width="2043.36363636"/> - <svg height="39.36000000" width="2043.36363636"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Stack</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="138.08000000" y2="132.17600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="138.08000000" y2="132.17600000"/> - <g transform="translate(342.63636364,177.44000000)"> - <rect height="39.36000000" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;" width="2043.36363636"/> - <svg height="39.36000000" width="2043.36363636"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Track-001</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="216.80000000" y2="210.89600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="216.80000000" y2="210.89600000"/> - <g transform="translate(342.63636364,256.16000000)"> - <rect height="39.36000000" style="fill:rgb(37.14566005,116.00638615,196.54987044);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="322.63636364"/> - <svg height="39.36000000" width="322.63636364"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-001</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="342.63636364" x2="342.63636364" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="295.52000000" y2="289.61600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="248.66000000">trimmed_range() -> 3.0, 3.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="310.52000000">source_range: 3.0, 3.0</text> - <rect height="39.36000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="860.36363636" x="20.00000000" y="334.88000000"/> - <g transform="translate(342.63636364,334.88000000)"> - <rect height="39.36000000" style="fill:rgb(37.14566005,116.00638615,196.54987044);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="322.63636364"/> - <svg height="39.36000000" width="322.63636364"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">triangle.mp4</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="20.00000000" x2="20.00000000" y1="374.24000000" y2="368.33600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="127.54545455" x2="127.54545455" y1="374.24000000" y2="368.33600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="235.09090909" x2="235.09090909" y1="374.24000000" y2="368.33600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="342.63636364" x2="342.63636364" y1="374.24000000" y2="368.33600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="374.24000000" y2="368.33600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="374.24000000" y2="368.33600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="374.24000000" y2="368.33600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="374.24000000" y2="368.33600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="35.00000000" y="389.24000000">available_range: 0.0, 8.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="35.00000000" y="404.24000000">target_url: file:///folder/titles.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="503.95454545" x2="503.95454545" y1="305.52000000" y2="315.88000000"/> - <polygon points="503.95454545,324.88000000 499.45454545,315.88000000 508.45454545,315.88000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="508.95454545" y="325.20000000">media_reference</text> - <g transform="translate(665.27272727,256.16000000)"> - <rect height="39.36000000" style="fill:rgb(251.56164182,2.79089346,56.80018692);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="39.36000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-002</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="295.52000000" y2="289.61600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="680.27272727" y="248.66000000">trimmed_range() -> 2.0, 6.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="680.27272727" y="310.52000000">source_range: 2.0, 6.0</text> - <rect height="39.36000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="967.90909091" x="450.18181818" y="413.60000000"/> - <g transform="translate(665.27272727,413.60000000)"> - <rect height="39.36000000" style="fill:rgb(251.56164182,2.79089346,56.80018692);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="39.36000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-002</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="452.96000000" y2="447.05600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="452.96000000" y2="447.05600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="465.18181818" y="467.96000000">available_range: 0.0, 9.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="465.18181818" y="482.96000000">target_url: file:///folder/wind-up.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="305.52000000" y2="394.60000000"/> - <polygon points="987.90909091,403.60000000 983.40909091,394.60000000 992.40909091,394.60000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="992.90909091" y="325.20000000">media_reference</text> - <g transform="translate(1310.54545455,256.16000000)"> - <rect height="39.36000000" stroke-dasharray="5" style="fill:rgb(255.00000000,255.00000000,255.00000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="430.18181818"/> - <svg height="39.36000000" width="430.18181818"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Gap</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="295.52000000" y2="289.61600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1325.54545455" y="248.66000000">trimmed_range() -> 0.0, 4.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1325.54545455" y="310.52000000">source_range: 0.0, 4.0</text> - <g transform="translate(1740.72727273,256.16000000)"> - <rect height="39.36000000" style="fill:rgb(141.00332152,222.50135064,10.90311309);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="39.36000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-004</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="295.52000000" y2="289.61600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="295.52000000" y2="289.61600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="248.66000000">trimmed_range() -> 100.0, 6.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="310.52000000">source_range: 100.0, 6.0</text> - <rect height="39.36000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="645.27272727" x="1740.72727273" y="492.32000000"/> - <g transform="translate(1740.72727273,492.32000000)"> - <rect height="39.36000000" style="fill:rgb(141.00332152,222.50135064,10.90311309);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="39.36000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-004</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="531.68000000" y2="525.77600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="531.68000000" y2="525.77600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="531.68000000" y2="525.77600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="531.68000000" y2="525.77600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="531.68000000" y2="525.77600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="531.68000000" y2="525.77600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="546.68000000">available_range: 100.0, 6.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="561.68000000">target_url: file:///folder/credits.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="305.52000000" y2="473.32000000"/> - <polygon points="2063.36363636,482.32000000 2058.86363636,473.32000000 2067.86363636,473.32000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="2068.36363636" y="325.20000000">media_reference</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1364.31818182" x2="1364.31818182" y1="226.80000000" y2="237.16000000"/> - <polygon points="1364.31818182,246.16000000 1359.81818182,237.16000000 1368.81818182,237.16000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1369.31818182" y="236.48000000">children[4]</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="169.94000000">trimmed_range() -> 0.0, 19.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="231.80000000">source_range: None</text> - <g transform="translate(342.63636364,571.04000000)"> - <rect height="39.36000000" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;" width="1720.72727273"/> - <svg height="39.36000000" width="1720.72727273"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Track-002</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="610.40000000" y2="604.49600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="610.40000000" y2="604.49600000"/> - <g transform="translate(342.63636364,649.76000000)"> - <rect height="39.36000000" stroke-dasharray="5" style="fill:rgb(255.00000000,255.00000000,255.00000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="752.81818182"/> - <svg height="39.36000000" width="752.81818182"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Gap</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="342.63636364" x2="342.63636364" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="689.12000000" y2="683.21600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="642.26000000">trimmed_range() -> 0.0, 7.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="704.12000000">source_range: 0.0, 7.0</text> - <g transform="translate(1095.45454545,649.76000000)"> - <rect height="39.36000000" style="fill:rgb(242.45228108,154.07255826,245.06556888);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="967.90909091"/> - <svg height="39.36000000" width="967.90909091"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-003</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="689.12000000" y2="683.21600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="689.12000000" y2="683.21600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1110.45454545" y="642.26000000">trimmed_range() -> 100.0, 9.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1110.45454545" y="704.12000000">source_range: 100.0, 9.0</text> - <rect height="39.36000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="967.90909091" x="1095.45454545" y="728.48000000"/> - <g transform="translate(1095.45454545,728.48000000)"> - <rect height="39.36000000" style="fill:rgb(242.45228108,154.07255826,245.06556888);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="967.90909091"/> - <svg height="39.36000000" width="967.90909091"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-003</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="767.84000000" y2="761.93600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="767.84000000" y2="761.93600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1110.45454545" y="782.84000000">available_range: 100.0, 9.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1110.45454545" y="797.84000000">target_url: file:///folder/punchline.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1579.40909091" x2="1579.40909091" y1="699.12000000" y2="709.48000000"/> - <polygon points="1579.40909091,718.48000000 1574.90909091,709.48000000 1583.90909091,709.48000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1584.40909091" y="718.80000000">media_reference</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="620.40000000" y2="630.76000000"/> - <polygon points="1203.00000000,639.76000000 1198.50000000,630.76000000 1207.50000000,630.76000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1208.00000000" y="630.08000000">children[2]</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="563.54000000">trimmed_range() -> 0.0, 16.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="625.40000000">source_range: None</text> - <g transform="translate(342.63636364,807.20000000)"> - <rect height="39.36000000" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;" width="967.90909091"/> - <svg height="39.36000000" width="967.90909091"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Track-003</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="846.56000000" y2="840.65600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="846.56000000" y2="840.65600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="846.56000000" y2="840.65600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="846.56000000" y2="840.65600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="846.56000000" y2="840.65600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="846.56000000" y2="840.65600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="846.56000000" y2="840.65600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="846.56000000" y2="840.65600000"/> - <g transform="translate(342.63636364,885.92000000)"> - <rect height="39.36000000" style="fill:rgb(56.63319228,54.77944906,28.74246926);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="967.90909091"/> - <svg height="39.36000000" width="967.90909091"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-005</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="342.63636364" x2="342.63636364" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="925.28000000" y2="919.37600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="925.28000000" y2="919.37600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="878.42000000">trimmed_range() -> 100.0, 9.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="940.28000000">source_range: 100.0, 9.0</text> - <rect height="39.36000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="967.90909091" x="342.63636364" y="964.64000000"/> - <g transform="translate(342.63636364,964.64000000)"> - <rect height="39.36000000" style="fill:rgb(56.63319228,54.77944906,28.74246926);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="967.90909091"/> - <svg height="39.36000000" width="967.90909091"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="15.74400000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-003</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="342.63636364" x2="342.63636364" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="1004.00000000" y2="998.09600000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="1004.00000000" y2="998.09600000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="1019.00000000">available_range: 100.0, 9.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="1034.00000000">target_url: file:///folder/punchline.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="826.59090909" x2="826.59090909" y1="935.28000000" y2="945.64000000"/> - <polygon points="826.59090909,954.64000000 822.09090909,945.64000000 831.09090909,945.64000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="831.59090909" y="954.96000000">media_reference</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="826.59090909" x2="826.59090909" y1="856.56000000" y2="866.92000000"/> - <polygon points="826.59090909,875.92000000 822.09090909,866.92000000 831.09090909,866.92000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="831.59090909" y="866.24000000">children[1]</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="799.70000000">trimmed_range() -> -7.0, 16.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="861.56000000">source_range: -7.0, 16.0</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1364.31818182" x2="1364.31818182" y1="148.08000000" y2="158.44000000"/> - <polygon points="1364.31818182,167.44000000 1359.81818182,158.44000000 1368.81818182,158.44000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1374.31818182" x2="1374.31818182" y1="148.08000000" y2="552.04000000"/> - <polygon points="1374.31818182,561.04000000 1369.81818182,552.04000000 1378.81818182,552.04000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1384.31818182" x2="1384.31818182" y1="148.08000000" y2="788.20000000"/> - <polygon points="1384.31818182,797.20000000 1379.81818182,788.20000000 1388.81818182,788.20000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1389.31818182" y="157.76000000">children[3]</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="91.22000000">trimmed_range() -> 0.0, 19.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="153.08000000">source_range: None</text> -</svg> 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/premiere_example.otio b/tests/sample_data/premiere_example.otio new file mode 100644 index 000000000..17f96ee78 --- /dev/null +++ b/tests/sample_data/premiere_example.otio @@ -0,0 +1,2369 @@ +{ + "OTIO_SCHEMA": "Timeline.1", + "metadata": { + "fcp_xml": { + "@MZ.EditLine": "0", + "@MZ.Sequence.AudioTimeDisplayFormat": "200", + "@MZ.Sequence.EditingModeGUID": "9678af98-a7b7-4bdb-b477-7ac9c8df4a4e", + "@MZ.Sequence.PreviewFrameSizeHeight": "720", + "@MZ.Sequence.PreviewFrameSizeWidth": "1280", + "@MZ.Sequence.PreviewRenderingClassID": "1297106761", + "@MZ.Sequence.PreviewRenderingPresetCodec": "1297107278", + "@MZ.Sequence.PreviewRenderingPresetPath": "EncoderPresets\\SequencePreview\\9678af98-a7b7-4bdb-b477-7ac9c8df4a4e\\I-Frame Only MPEG.epr", + "@MZ.Sequence.PreviewUseMaxBitDepth": "false", + "@MZ.Sequence.PreviewUseMaxRenderQuality": "false", + "@MZ.Sequence.VideoTimeDisplayFormat": "104", + "@MZ.WorkInPoint": "0", + "@MZ.WorkOutPoint": "10550131200000", + "@Monitor.ProgramZoomIn": "0", + "@Monitor.ProgramZoomOut": "10550131200000", + "@TL.SQAVDividerPosition": "0.5", + "@TL.SQAudioVisibleBase": "0", + "@TL.SQHeaderWidth": "184", + "@TL.SQHideShyTracks": "0", + "@TL.SQTimePerPixel": "0.033806825568230996", + "@TL.SQVideoVisibleBase": "0", + "@TL.SQVisibleBaseTime": "0", + "@explodedTracks": "true", + "@id": "sequence-1", + "labels": { + "label2": "Forest" + }, + "media": { + "audio": { + "format": { + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "numOutputChannels": "2", + "outputs": { + "group": [ + { + "channel": { + "index": "1" + }, + "downmix": "0", + "index": "1", + "numchannels": "1" + }, + { + "channel": { + "index": "2" + }, + "downmix": "0", + "index": "2", + "numchannels": "1" + } + ] + } + }, + "video": { + "format": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "codec": { + "appspecificdata": { + "appmanufacturer": "Apple Inc.", + "appname": "Final Cut Pro", + "appversion": "7.0", + "data": { + "qtcodec": { + "codecname": "Apple ProRes 422", + "codectypecode": "apcn", + "codectypename": "Apple ProRes 422", + "codecvendorcode": "appl", + "datarate": "0", + "keyframerate": "0", + "spatialquality": "1024", + "temporalquality": "0" + } + } + }, + "name": "Apple ProRes 422" + }, + "colordepth": "24", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + } + }, + "uuid": "5ea30a6b-552f-4722-be92-6dfdb66c97e6" + } + }, + "name": "sc01_sh010_layerA", + "global_start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + }, + "tracks": { + "OTIO_SCHEMA": "Stack.1", + "metadata": {}, + "name": "sc01_sh010_layerA", + "source_range": null, + "effects": [], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "fcp_xml": { + "comment": "so, this happened" + } + }, + "name": "My MArker 1", + "color": "RED", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 113.0 + } + } + }, + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "fcp_xml": { + "comment": "fsfsfs" + } + }, + "name": "dsf", + "color": "RED", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 492.0 + } + } + }, + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "fcp_xml": { + "comment": null + } + }, + "name": "", + "color": "RED", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 298.0 + } + } + } + ], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "1", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "enabled": "TRUE", + "locked": "FALSE" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 536.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-1", + "alphatype": "none", + "anamorphic": "FALSE", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "1", + "linkclipref": "clipitem-1", + "mediatype": "video", + "trackindex": "1" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-14", + "mediatype": "audio", + "trackindex": "1" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-16", + "mediatype": "audio", + "trackindex": "2" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-1", + "pixelaspectratio": "square", + "pproTicksIn": "0", + "pproTicksOut": "846720000000" + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh010_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 15.0, + "value": 50.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 15.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-1", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh010_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh010_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Video" + }, + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "0", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "enabled": "TRUE", + "locked": "FALSE" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 13.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-2", + "alphatype": "none", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "1", + "linkclipref": "clipitem-2", + "mediatype": "video", + "trackindex": "2" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-13", + "mediatype": "audio", + "trackindex": "1" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-15", + "mediatype": "audio", + "trackindex": "2" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-1", + "pproTicksIn": "0", + "pproTicksOut": "846720000000" + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh010_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-1", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh010_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh010_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 52.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-3", + "alphatype": "none", + "anamorphic": "FALSE", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-2", + "pixelaspectratio": "square", + "pproTicksIn": "0", + "pproTicksOut": "1329350400000" + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh020_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 157.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-2", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh020_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 175.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh020_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-4", + "alphatype": "none", + "anamorphic": "FALSE", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-3", + "pixelaspectratio": "square", + "pproTicksIn": "0", + "pproTicksOut": "1989792000000" + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh030_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 235.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "fcp_xml": { + "comment": null + } + }, + "name": "", + "color": "RED", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 73.0 + } + } + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-3", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh030_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 400.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh030_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Transition.1", + "metadata": { + "fcp_xml": { + "alignment": "end-black", + "cutPointTicks": "160876800000" + } + }, + "name": "Cross Dissolve", + "in_offset": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 19.0 + }, + "out_offset": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + }, + "transition_type": "SMPTE_Dissolve" + }, + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 79.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Stack.1", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-5", + "enabled": "TRUE", + "labels": { + "label2": "Forest" + }, + "masterclipid": "masterclip-4", + "pproTicksIn": "0", + "pproTicksOut": "2709504000000" + } + }, + "name": "sc01_sh010_anim", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 320.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "children": [] + } + ], + "kind": "Video" + }, + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "0", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "enabled": "TRUE", + "locked": "FALSE" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 15.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-10", + "alphatype": "straight", + "anamorphic": "FALSE", + "enabled": "TRUE", + "labels": { + "label2": "Lavender" + }, + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-5", + "pixelaspectratio": "square", + "pproTicksIn": "914457600000000", + "pproTicksOut": "922425235200000" + }, + "my_hook_function_was_here": true + }, + "name": "test_title", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 941.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 108000.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "GeneratorReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-4", + "media": { + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "DF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "test_title", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "generator_kind": "Slug", + "parameters": {} + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Video" + }, + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "0", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "enabled": "TRUE", + "locked": "FALSE" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 956.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-11", + "alphatype": "none", + "anamorphic": "FALSE", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "1", + "linkclipref": "clipitem-11", + "mediatype": "video", + "trackindex": "4" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-23", + "mediatype": "audio", + "trackindex": "7" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-25", + "mediatype": "audio", + "trackindex": "8" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-6", + "pixelaspectratio": "square", + "pproTicksIn": "287884800000", + "pproTicksOut": "2159136000000" + }, + "my_hook_function_was_here": true + }, + "name": "sc01_master_layerA_sh030_temp.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 208.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 133.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-5", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_master_layerA_sh030_temp.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 400.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 99.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_master_layerA_sh030_temp.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Transition.1", + "metadata": { + "fcp_xml": { + "alignment": "center", + "cutPointTicks": "101606400000" + } + }, + "name": "Cross Dissolve", + "in_offset": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 12.0 + }, + "out_offset": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 13.0 + }, + "transition_type": "SMPTE_Dissolve" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-12", + "alphatype": "none", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "3", + "linkclipref": "clipitem-12", + "mediatype": "video", + "trackindex": "4" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-24", + "mediatype": "audio", + "trackindex": "7" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-26", + "mediatype": "audio", + "trackindex": "8" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-1", + "pproTicksIn": "50803200000", + "pproTicksOut": "846720000000" + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh010_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 82.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 18.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-1", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh010_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh010_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Video" + }, + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "1", + "@PannerCurrentValue": "0.5", + "@PannerIsInverted": "true", + "@PannerName": "Balance", + "@PannerStartKeyframe": "-91445760000000000,0.5,0,0,0,0,0,0", + "@TL.SQTrackAudioKeyframeStyle": "0", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "@currentExplodedTrackIndex": "0", + "@premiereTrackType": "Stereo", + "@totalExplodedTrackCount": "2", + "enabled": "TRUE", + "locked": "FALSE", + "outputchannelindex": "1" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 13.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-13", + "@premiereChannelType": "stereo", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "1", + "linkclipref": "clipitem-2", + "mediatype": "video", + "trackindex": "2" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-13", + "mediatype": "audio", + "trackindex": "1" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-15", + "mediatype": "audio", + "trackindex": "2" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-1", + "pproTicksIn": "0", + "pproTicksOut": "846720000000", + "sourcetrack": { + "mediatype": "audio", + "trackindex": "1" + } + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh010_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-1", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh010_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh010_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 423.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-14", + "@premiereChannelType": "stereo", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "1", + "linkclipref": "clipitem-1", + "mediatype": "video", + "trackindex": "1" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-14", + "mediatype": "audio", + "trackindex": "1" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-16", + "mediatype": "audio", + "trackindex": "2" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-1", + "pproTicksIn": "0", + "pproTicksOut": "846720000000", + "sourcetrack": { + "mediatype": "audio", + "trackindex": "1" + } + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh010_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-1", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh010_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh010_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Audio" + }, + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "1", + "@PannerCurrentValue": "0.5", + "@PannerIsInverted": "true", + "@PannerName": "Balance", + "@PannerStartKeyframe": "-91445760000000000,0.5,0,0,0,0,0,0", + "@TL.SQTrackAudioKeyframeStyle": "0", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "@currentExplodedTrackIndex": "0", + "@premiereTrackType": "Stereo", + "@totalExplodedTrackCount": "2", + "enabled": "TRUE", + "locked": "FALSE", + "outputchannelindex": "1" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 335.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-17", + "@premiereChannelType": "stereo", + "enabled": "TRUE", + "labels": { + "label2": "Caribbean" + }, + "link": [ + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-17", + "mediatype": "audio", + "trackindex": "3" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-19", + "mediatype": "audio", + "trackindex": "4" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-7", + "pproTicksIn": "0", + "pproTicksOut": "1439424000000", + "sourcetrack": { + "mediatype": "audio", + "trackindex": "1" + } + }, + "my_hook_function_was_here": true + }, + "name": "sc01_placeholder.wav", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 170.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 8497.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-6", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "DF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_placeholder.wav", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 170.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 8497.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_placeholder.wav" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 131.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Stack.1", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-18", + "@premiereChannelType": "stereo", + "enabled": "TRUE", + "labels": { + "label2": "Forest" + }, + "link": [ + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-18", + "mediatype": "audio", + "trackindex": "3" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-20", + "mediatype": "audio", + "trackindex": "4" + } + ], + "masterclipid": "masterclip-4", + "pproTicksIn": "0", + "pproTicksOut": "2489356800000" + } + }, + "name": "sc01_sh010_anim", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 294.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "children": [] + } + ], + "kind": "Audio" + }, + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "1", + "@PannerCurrentValue": "0.5", + "@PannerIsInverted": "true", + "@PannerName": "Balance", + "@PannerStartKeyframe": "-91445760000000000,0.5,0,0,0,0,0,0", + "@TL.SQTrackAudioKeyframeStyle": "0", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "@currentExplodedTrackIndex": "0", + "@premiereTrackType": "Stereo", + "@totalExplodedTrackCount": "2", + "enabled": "TRUE", + "locked": "FALSE", + "outputchannelindex": "1" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 153.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-21", + "@premiereChannelType": "stereo", + "enabled": "TRUE", + "labels": { + "label2": "Caribbean" + }, + "link": [ + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-21", + "mediatype": "audio", + "trackindex": "5" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-22", + "mediatype": "audio", + "trackindex": "6" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-8", + "pproTicksIn": "0", + "pproTicksOut": "1676505600000", + "sourcetrack": { + "mediatype": "audio", + "trackindex": "1" + } + }, + "my_hook_function_was_here": true + }, + "name": "track_08.wav", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 198.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 6896.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-7", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "DF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "track_08.wav", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 198.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 6896.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/track_08.wav" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Audio" + }, + { + "OTIO_SCHEMA": "Track.1", + "metadata": { + "fcp_xml": { + "@MZ.TrackTargeted": "0", + "@PannerCurrentValue": "0.5", + "@PannerIsInverted": "true", + "@PannerName": "Balance", + "@PannerStartKeyframe": "-91445760000000000,0.5,0,0,0,0,0,0", + "@TL.SQTrackAudioKeyframeStyle": "0", + "@TL.SQTrackExpanded": "0", + "@TL.SQTrackExpandedHeight": "25", + "@TL.SQTrackShy": "0", + "@currentExplodedTrackIndex": "0", + "@premiereTrackType": "Stereo", + "@totalExplodedTrackCount": "2", + "enabled": "TRUE", + "locked": "FALSE", + "outputchannelindex": "1" + } + }, + "name": "", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 956.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-23", + "@premiereChannelType": "stereo", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "1", + "linkclipref": "clipitem-11", + "mediatype": "video", + "trackindex": "4" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-23", + "mediatype": "audio", + "trackindex": "7" + }, + { + "clipindex": "1", + "groupindex": "1", + "linkclipref": "clipitem-25", + "mediatype": "audio", + "trackindex": "8" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-6", + "pproTicksIn": "287884800000", + "pproTicksOut": "2049062400000", + "sourcetrack": { + "mediatype": "audio", + "trackindex": "1" + } + }, + "my_hook_function_was_here": true + }, + "name": "sc01_master_layerA_sh030_temp.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 221.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 133.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-5", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_master_layerA_sh030_temp.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 400.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 99.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_master_layerA_sh030_temp.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "fcp_xml": { + "@frameBlend": "FALSE", + "@id": "clipitem-24", + "@premiereChannelType": "stereo", + "enabled": "TRUE", + "labels": { + "label2": "Iris" + }, + "link": [ + { + "clipindex": "3", + "linkclipref": "clipitem-12", + "mediatype": "video", + "trackindex": "4" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-24", + "mediatype": "audio", + "trackindex": "7" + }, + { + "clipindex": "2", + "groupindex": "1", + "linkclipref": "clipitem-26", + "mediatype": "audio", + "trackindex": "8" + } + ], + "logginginfo": { + "description": null, + "lognote": null, + "scene": null, + "shottake": null + }, + "masterclipid": "masterclip-1", + "pproTicksIn": "152409600000", + "pproTicksOut": "846720000000", + "sourcetrack": { + "mediatype": "audio", + "trackindex": "1" + } + }, + "my_hook_function_was_here": true + }, + "name": "sc01_sh010_anim.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 94.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 6.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": { + "fcp_xml": { + "@id": "file-1", + "media": { + "audio": { + "channelcount": "2", + "samplecharacteristics": { + "depth": "16", + "samplerate": "48000" + } + }, + "video": { + "samplecharacteristics": { + "anamorphic": "FALSE", + "fielddominance": "none", + "height": "720", + "pixelaspectratio": "square", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "width": "1280" + } + } + }, + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "timecode": { + "displayformat": "NDF", + "rate": { + "ntsc": "FALSE", + "timebase": "30" + }, + "reel": { + "name": null + } + } + } + }, + "name": "sc01_sh010_anim.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 30.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "file://localhost/D%3a/media/sc01_sh010_anim.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Audio" + } + ] + } +} \ No newline at end of file diff --git a/tests/sample_data/premiere_example.xml b/tests/sample_data/premiere_example.xml deleted file mode 100644 index 239548f09..000000000 --- a/tests/sample_data/premiere_example.xml +++ /dev/null @@ -1,1720 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE xmeml> -<xmeml version="4"> - <sequence id="sequence-1" TL.SQAudioVisibleBase="0" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="0" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="184" Monitor.ProgramZoomOut="10550131200000" Monitor.ProgramZoomIn="0" TL.SQTimePerPixel="0.033806825568230996" MZ.EditLine="0" MZ.Sequence.PreviewFrameSizeHeight="720" MZ.Sequence.PreviewFrameSizeWidth="1280" MZ.Sequence.AudioTimeDisplayFormat="200" MZ.Sequence.PreviewRenderingClassID="1297106761" MZ.Sequence.PreviewRenderingPresetCodec="1297107278" MZ.Sequence.PreviewRenderingPresetPath="EncoderPresets\SequencePreview\9678af98-a7b7-4bdb-b477-7ac9c8df4a4e\I-Frame Only MPEG.epr" MZ.Sequence.PreviewUseMaxRenderQuality="false" MZ.Sequence.PreviewUseMaxBitDepth="false" MZ.Sequence.EditingModeGUID="9678af98-a7b7-4bdb-b477-7ac9c8df4a4e" MZ.Sequence.VideoTimeDisplayFormat="104" MZ.WorkOutPoint="10550131200000" MZ.WorkInPoint="0" explodedTracks="true"> - <uuid>5ea30a6b-552f-4722-be92-6dfdb66c97e6</uuid> - <duration>636</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <name>sc01_sh010_layerA</name> - <media> - <video> - <format> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <codec> - <name>Apple ProRes 422</name> - <appspecificdata> - <appname>Final Cut Pro</appname> - <appmanufacturer>Apple Inc.</appmanufacturer> - <appversion>7.0</appversion> - <data> - <qtcodec> - <codecname>Apple ProRes 422</codecname> - <codectypename>Apple ProRes 422</codectypename> - <codectypecode>apcn</codectypecode> - <codecvendorcode>appl</codecvendorcode> - <spatialquality>1024</spatialquality> - <temporalquality>0</temporalquality> - <keyframerate>0</keyframerate> - <datarate>0</datarate> - </qtcodec> - </data> - </appspecificdata> - </codec> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - <colordepth>24</colordepth> - </samplecharacteristics> - </format> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-1" frameBlend="FALSE"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>50</duration> - <rate> - <timebase>15</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>536</start> - <end>636</end> - <in>0</in> - <out>50</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-1"> - <name>sc01_sh010_anim.mov</name> - <pathurl>file://localhost/D%3a/media/sc01_sh010_anim.mov</pathurl> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>100</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name></name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <link> - <linkclipref>clipitem-1</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-14</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-16</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-2" frameBlend="FALSE"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>13</start> - <end>113</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-1"/> - <link> - <linkclipref>clipitem-2</linkclipref> - <mediatype>video</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-13</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-15</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-3" frameBlend="FALSE"> - <masterclipid>masterclip-2</masterclipid> - <name>sc01_sh020_anim.mov</name> - <enabled>TRUE</enabled> - <duration>175</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>165</start> - <end>322</end> - <in>0</in> - <out>157</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1329350400000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-2"> - <name>sc01_sh020_anim.mov</name> - <pathurl>file://localhost/D%3a/media/sc01_sh020_anim.mov</pathurl> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>175</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name></name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-4" frameBlend="FALSE"> - <masterclipid>masterclip-3</masterclipid> - <name>sc01_sh030_anim.mov</name> - <enabled>TRUE</enabled> - <duration>400</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>322</start> - <end>-1</end> - <in>0</in> - <out>235</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1989792000000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-3"> - <name>sc01_sh030_anim.mov</name> - <pathurl>file://localhost/D%3a/media/sc01_sh030_anim.mov</pathurl> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>400</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - <reel> - <name></name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <marker> - <comment></comment> - <name></name> - <in>73</in> - <out>-1</out> - </marker> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <transitionitem> - <start>538</start> - <end>557</end> - <alignment>end-black</alignment> - <cutPointTicks>160876800000</cutPointTicks> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <effect> - <name>Cross Dissolve</name> - <effectid>Cross Dissolve</effectid> - <effectcategory>Dissolve</effectcategory> - <effecttype>transition</effecttype> - <mediatype>video</mediatype> - <wipecode>0</wipecode> - <wipeaccuracy>100</wipeaccuracy> - <startratio>0</startratio> - <endratio>1</endratio> - <reverse>FALSE</reverse> - </effect> - </transitionitem> - <clipitem id="clipitem-5" frameBlend="FALSE"> - <masterclipid>masterclip-4</masterclipid> - <name>sc01_sh010_anim</name> - <enabled>TRUE</enabled> - <duration>500</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>636</start> - <end>956</end> - <in>0</in> - <out>320</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>2709504000000</pproTicksOut> - <sequence id="sequence-2" TL.SQAudioVisibleBase="0" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="0" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="184" Monitor.ProgramZoomOut="2709504000000" Monitor.ProgramZoomIn="0" TL.SQTimePerPixel="0.20000000000000001" MZ.EditLine="0" MZ.Sequence.PreviewFrameSizeHeight="720" MZ.Sequence.PreviewFrameSizeWidth="1280" MZ.Sequence.AudioTimeDisplayFormat="200" MZ.Sequence.PreviewRenderingClassID="1297106761" MZ.Sequence.PreviewRenderingPresetCodec="1297107278" MZ.Sequence.PreviewRenderingPresetPath="EncoderPresets\SequencePreview\9678af98-a7b7-4bdb-b477-7ac9c8df4a4e\I-Frame Only MPEG.epr" MZ.Sequence.PreviewUseMaxRenderQuality="false" MZ.Sequence.PreviewUseMaxBitDepth="false" MZ.Sequence.EditingModeGUID="9678af98-a7b7-4bdb-b477-7ac9c8df4a4e" MZ.Sequence.VideoTimeDisplayFormat="104" MZ.WorkOutPoint="2709504000000" MZ.WorkInPoint="0"> - <duration>320</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <name>sc01_sh010_anim</name> - <media> - <video> - <format> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <codec> - <name>Apple ProRes 422</name> - <appspecificdata> - <appname>Final Cut Pro</appname> - <appmanufacturer>Apple Inc.</appmanufacturer> - <appversion>7.0</appversion> - <data> - <qtcodec> - <codecname>Apple ProRes 422</codecname> - <codectypename>Apple ProRes 422</codectypename> - <codectypecode>apcn</codectypecode> - <codecvendorcode>appl</codecvendorcode> - <spatialquality>1024</spatialquality> - <temporalquality>0</temporalquality> - <keyframerate>0</keyframerate> - <datarate>0</datarate> - </qtcodec> - </data> - </appspecificdata> - </codec> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - <colordepth>24</colordepth> - </samplecharacteristics> - </format> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-6" frameBlend="FALSE"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>0</start> - <end>100</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-1"/> - <link> - <linkclipref>clipitem-6</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-8</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-9</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-7" frameBlend="FALSE"> - <masterclipid>masterclip-3</masterclipid> - <name>sc01_sh030_anim.mov</name> - <enabled>TRUE</enabled> - <duration>400</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>100</start> - <end>320</end> - <in>0</in> - <out>220</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1862784000000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-3"/> - <marker> - <comment></comment> - <name></name> - <in>73</in> - <out>-1</out> - </marker> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - </video> - <audio> - <numOutputChannels>2</numOutputChannels> - <format> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - </format> - <outputs> - <group> - <index>1</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>1</index> - </channel> - </group> - <group> - <index>2</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>2</index> - </channel> - </group> - </outputs> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-8" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>0</start> - <end>100</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-6</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-8</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-9</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-9" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>0</start> - <end>100</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-6</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-8</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-9</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - </audio> - </media> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - </sequence> - <labels> - <label2>Forest</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-10" frameBlend="FALSE"> - <masterclipid>masterclip-5</masterclipid> - <name>test_title</name> - <enabled>TRUE</enabled> - <duration>1296000</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>15</start> - <end>956</end> - <in>108000</in> - <out>108941</out> - <pproTicksIn>914457600000000</pproTicksIn> - <pproTicksOut>922425235200000</pproTicksOut> - <alphatype>straight</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-4"> - <name>test_title</name> - <mediaSource>Slug</mediaSource> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00;00;00;00</string> - <frame>0</frame> - <displayformat>DF</displayformat> - <reel> - <name></name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Lavender</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <clipitem id="clipitem-11" frameBlend="FALSE"> - <masterclipid>masterclip-6</masterclipid> - <name>sc01_master_layerA_sh030_temp.mov</name> - <enabled>TRUE</enabled> - <duration>400</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>956</start> - <end>-1</end> - <in>34</in> - <out>255</out> - <pproTicksIn>287884800000</pproTicksIn> - <pproTicksOut>2159136000000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-5"> - <name>sc01_master_layerA_sh030_temp.mov</name> - <pathurl>file://localhost/D%3a/media/sc01_master_layerA_sh030_temp.mov</pathurl> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>400</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:03:09</string> - <frame>99</frame> - <displayformat>NDF</displayformat> - <reel> - <name></name> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <link> - <linkclipref>clipitem-11</linkclipref> - <mediatype>video</mediatype> - <trackindex>4</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-23</linkclipref> - <mediatype>audio</mediatype> - <trackindex>7</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-25</linkclipref> - <mediatype>audio</mediatype> - <trackindex>8</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <transitionitem> - <start>1152</start> - <end>1177</end> - <alignment>center</alignment> - <cutPointTicks>101606400000</cutPointTicks> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <effect> - <name>Cross Dissolve</name> - <effectid>Cross Dissolve</effectid> - <effectcategory>Dissolve</effectcategory> - <effecttype>transition</effecttype> - <mediatype>video</mediatype> - <wipecode>0</wipecode> - <wipeaccuracy>100</wipeaccuracy> - <startratio>0</startratio> - <endratio>1</endratio> - <reverse>FALSE</reverse> - </effect> - </transitionitem> - <clipitem id="clipitem-12" frameBlend="FALSE"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>-1</start> - <end>1246</end> - <in>6</in> - <out>100</out> - <pproTicksIn>50803200000</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <alphatype>none</alphatype> - <file id="file-1"/> - <link> - <linkclipref>clipitem-12</linkclipref> - <mediatype>video</mediatype> - <trackindex>4</trackindex> - <clipindex>3</clipindex> - </link> - <link> - <linkclipref>clipitem-24</linkclipref> - <mediatype>audio</mediatype> - <trackindex>7</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-26</linkclipref> - <mediatype>audio</mediatype> - <trackindex>8</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - </video> - <audio> - <numOutputChannels>2</numOutputChannels> - <format> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - </format> - <outputs> - <group> - <index>1</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>1</index> - </channel> - </group> - <group> - <index>2</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>2</index> - </channel> - </group> - </outputs> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-13" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>13</start> - <end>113</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-2</linkclipref> - <mediatype>video</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-13</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-15</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-14" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>536</start> - <end>636</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-1</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-14</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-16</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-15" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>13</start> - <end>113</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-2</linkclipref> - <mediatype>video</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-13</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-15</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-16" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>536</start> - <end>636</end> - <in>0</in> - <out>100</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-1</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-14</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-16</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-17" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-7</masterclipid> - <name>sc01_placeholder.wav</name> - <enabled>TRUE</enabled> - <duration>170</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>335</start> - <end>505</end> - <in>0</in> - <out>170</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1439424000000</pproTicksOut> - <file id="file-6"> - <name>sc01_placeholder.wav</name> - <pathurl>file://localhost/D%3a/media/sc01_placeholder.wav</pathurl> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>170</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00;04;43;15</string> - <frame>8497</frame> - <displayformat>DF</displayformat> - <reel> - <name></name> - </reel> - </timecode> - <media> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-17</linkclipref> - <mediatype>audio</mediatype> - <trackindex>3</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-19</linkclipref> - <mediatype>audio</mediatype> - <trackindex>4</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Caribbean</label2> - </labels> - </clipitem> - <clipitem id="clipitem-18" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-4</masterclipid> - <name>sc01_sh010_anim</name> - <enabled>TRUE</enabled> - <duration>500</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>636</start> - <end>930</end> - <in>0</in> - <out>294</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>2489356800000</pproTicksOut> - <sequence id="sequence-2"/> - <link> - <linkclipref>clipitem-18</linkclipref> - <mediatype>audio</mediatype> - <trackindex>3</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-20</linkclipref> - <mediatype>audio</mediatype> - <trackindex>4</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <labels> - <label2>Forest</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-19" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-7</masterclipid> - <name>sc01_placeholder.wav</name> - <enabled>TRUE</enabled> - <duration>170</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>335</start> - <end>505</end> - <in>0</in> - <out>170</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1439424000000</pproTicksOut> - <file id="file-6"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-17</linkclipref> - <mediatype>audio</mediatype> - <trackindex>3</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-19</linkclipref> - <mediatype>audio</mediatype> - <trackindex>4</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Caribbean</label2> - </labels> - </clipitem> - <clipitem id="clipitem-20" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-4</masterclipid> - <name>sc01_sh010_anim</name> - <enabled>TRUE</enabled> - <duration>500</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>636</start> - <end>930</end> - <in>0</in> - <out>294</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>2489356800000</pproTicksOut> - <sequence id="sequence-2"/> - <link> - <linkclipref>clipitem-18</linkclipref> - <mediatype>audio</mediatype> - <trackindex>3</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-20</linkclipref> - <mediatype>audio</mediatype> - <trackindex>4</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <labels> - <label2>Forest</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-21" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-8</masterclipid> - <name>track_08.wav</name> - <enabled>TRUE</enabled> - <duration>198</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>153</start> - <end>351</end> - <in>0</in> - <out>198</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1676505600000</pproTicksOut> - <file id="file-7"> - <name>track_08.wav</name> - <pathurl>file://localhost/D%3a/media/track_08.wav</pathurl> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>198</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00;03;50;02</string> - <frame>6896</frame> - <displayformat>DF</displayformat> - <reel> - <name></name> - </reel> - </timecode> - <media> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-21</linkclipref> - <mediatype>audio</mediatype> - <trackindex>5</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-22</linkclipref> - <mediatype>audio</mediatype> - <trackindex>6</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Caribbean</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-22" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-8</masterclipid> - <name>track_08.wav</name> - <enabled>TRUE</enabled> - <duration>198</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>153</start> - <end>351</end> - <in>0</in> - <out>198</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>1676505600000</pproTicksOut> - <file id="file-7"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-21</linkclipref> - <mediatype>audio</mediatype> - <trackindex>5</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-22</linkclipref> - <mediatype>audio</mediatype> - <trackindex>6</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Caribbean</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-23" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-6</masterclipid> - <name>sc01_master_layerA_sh030_temp.mov</name> - <enabled>TRUE</enabled> - <duration>400</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>956</start> - <end>1177</end> - <in>34</in> - <out>255</out> - <pproTicksIn>287884800000</pproTicksIn> - <pproTicksOut>2049062400000</pproTicksOut> - <file id="file-5"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-11</linkclipref> - <mediatype>video</mediatype> - <trackindex>4</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-23</linkclipref> - <mediatype>audio</mediatype> - <trackindex>7</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-25</linkclipref> - <mediatype>audio</mediatype> - <trackindex>8</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-24" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>1164</start> - <end>1258</end> - <in>6</in> - <out>100</out> - <pproTicksIn>152409600000</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-12</linkclipref> - <mediatype>video</mediatype> - <trackindex>4</trackindex> - <clipindex>3</clipindex> - </link> - <link> - <linkclipref>clipitem-24</linkclipref> - <mediatype>audio</mediatype> - <trackindex>7</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-26</linkclipref> - <mediatype>audio</mediatype> - <trackindex>8</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-25" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-6</masterclipid> - <name>sc01_master_layerA_sh030_temp.mov</name> - <enabled>TRUE</enabled> - <duration>400</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>956</start> - <end>1164</end> - <in>34</in> - <out>242</out> - <pproTicksIn>287884800000</pproTicksIn> - <pproTicksOut>2049062400000</pproTicksOut> - <file id="file-5"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-11</linkclipref> - <mediatype>video</mediatype> - <trackindex>4</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-23</linkclipref> - <mediatype>audio</mediatype> - <trackindex>7</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-25</linkclipref> - <mediatype>audio</mediatype> - <trackindex>8</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <clipitem id="clipitem-26" frameBlend="FALSE" premiereChannelType="stereo"> - <masterclipid>masterclip-1</masterclipid> - <name>sc01_sh010_anim.mov</name> - <enabled>TRUE</enabled> - <duration>100</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <start>1164</start> - <end>1246</end> - <in>18</in> - <out>100</out> - <pproTicksIn>152409600000</pproTicksIn> - <pproTicksOut>846720000000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-12</linkclipref> - <mediatype>video</mediatype> - <trackindex>4</trackindex> - <clipindex>3</clipindex> - </link> - <link> - <linkclipref>clipitem-24</linkclipref> - <mediatype>audio</mediatype> - <trackindex>7</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-26</linkclipref> - <mediatype>audio</mediatype> - <trackindex>8</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - </logginginfo> - <labels> - <label2>Iris</label2> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - </audio> - </media> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - <marker> - <comment>so, this happened</comment> - <name>My MArker 1</name> - <in>113</in> - <out>-1</out> - </marker> - <marker> - <comment>fsfsfs</comment> - <name>dsf</name> - <in>492</in> - <out>-1</out> - </marker> - <marker> - <comment></comment> - <name></name> - <in>298</in> - <out>-1</out> - </marker> - <labels> - <label2>Forest</label2> - </labels> - </sequence> -</xmeml> diff --git a/tests/sample_data/premiere_example_filter.json b/tests/sample_data/premiere_example_filter.json deleted file mode 100644 index c6836e916..000000000 --- a/tests/sample_data/premiere_example_filter.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "effect": { - "name": "Time Remap", - "effectid": "timeremap", - "effectcategory": "motion", - "effecttype": "motion", - "mediatype": "video", - "parameter": [ - { - "@authoringApp": "PremierePro", - "parameterid": "variablespeed", - "name": "variablespeed", - "valuemin": "0", - "valuemax": "1", - "value": "0" - }, - { - "@authoringApp": "PremierePro", - "parameterid": "speed", - "name": "speed", - "valuemin": "-100000", - "valuemax": "100000", - "value": "100" - }, - { - "@authoringApp": "PremierePro", - "parameterid": "reverse", - "name": "reverse", - "value": "TRUE" - }, - { - "@authoringApp": "PremierePro", - "parameterid": "frameblending", - "name": "frameblending", - "value": "FALSE" - }, - { - "@authoringApp": "PremierePro", - "parameterid": "graphdict", - "name": "graphdict", - "valuemin": "0", - "valuemax": "37127", - "value": "0", - "keyframe": [ - { - "when": "0", - "value": "37127", - "speedvirtualkf": "TRUE", - "speedkfstart": "TRUE" - }, - { - "when": "15299", - "value": "21828", - "speedvirtualkf": "TRUE", - "speedkfin": "TRUE" - }, - { - "when": "15305", - "value": "21822", - "speedvirtualkf": "TRUE", - "speedkfout": "TRUE" - }, - { - "when": "37127", - "value": "1", - "speedvirtualkf": "TRUE", - "speedkfend": "TRUE" - } - ], - "interpolation": { - "name": "FCPCurve" - } - } - ] - } -} diff --git a/tests/sample_data/premiere_example_filter.xml b/tests/sample_data/premiere_example_filter.xml deleted file mode 100644 index 5e3a89da4..000000000 --- a/tests/sample_data/premiere_example_filter.xml +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" ?> -<filter> - <effect> - <name>Time Remap</name> - <effectid>timeremap</effectid> - <effectcategory>motion</effectcategory> - <effecttype>motion</effecttype> - <mediatype>video</mediatype> - <parameter authoringApp="PremierePro"> - <parameterid>variablespeed</parameterid> - <name>variablespeed</name> - <valuemin>0</valuemin> - <valuemax>1</valuemax> - <value>0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>speed</parameterid> - <name>speed</name> - <valuemin>-100000</valuemin> - <valuemax>100000</valuemax> - <value>100</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>reverse</parameterid> - <name>reverse</name> - <value>TRUE</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>frameblending</parameterid> - <name>frameblending</name> - <value>FALSE</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>graphdict</parameterid> - <name>graphdict</name> - <valuemin>0</valuemin> - <valuemax>37127</valuemax> - <value>0</value> - <keyframe> - <when>0</when> - <value>37127</value> - <speedvirtualkf>TRUE</speedvirtualkf> - <speedkfstart>TRUE</speedkfstart> - </keyframe> - <keyframe> - <when>15299</when> - <value>21828</value> - <speedvirtualkf>TRUE</speedvirtualkf> - <speedkfin>TRUE</speedkfin> - </keyframe> - <keyframe> - <when>15305</when> - <value>21822</value> - <speedvirtualkf>TRUE</speedvirtualkf> - <speedkfout>TRUE</speedkfout> - </keyframe> - <keyframe> - <when>37127</when> - <value>1</value> - <speedvirtualkf>TRUE</speedvirtualkf> - <speedkfend>TRUE</speedkfend> - </keyframe> - <interpolation> - <name>FCPCurve</name> - </interpolation> - </parameter> - </effect> -</filter> diff --git a/tests/sample_data/premiere_generators.xml b/tests/sample_data/premiere_generators.xml deleted file mode 100644 index a9a452a6c..000000000 --- a/tests/sample_data/premiere_generators.xml +++ /dev/null @@ -1,929 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE xmeml> -<xmeml version="4"> - <sequence id="sequence-1" TL.SQAudioVisibleBase="0" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="0" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="236" Monitor.ProgramZoomOut="9068963904000" Monitor.ProgramZoomIn="0" TL.SQTimePerPixel="0.071968375881910282" MZ.EditLine="8793504720000" MZ.Sequence.PreviewFrameSizeHeight="1080" MZ.Sequence.PreviewFrameSizeWidth="1920" MZ.Sequence.AudioTimeDisplayFormat="200" MZ.Sequence.PreviewRenderingClassID="1297106761" MZ.Sequence.PreviewRenderingPresetCodec="1297107278" MZ.Sequence.PreviewRenderingPresetPath="EncoderPresets/SequencePreview/cc7991f5-c236-4db1-957e-2c71f924e81c/I-Frame Only MPEG.epr" MZ.Sequence.PreviewUseMaxRenderQuality="false" MZ.Sequence.PreviewUseMaxBitDepth="false" MZ.Sequence.EditingModeGUID="cc7991f5-c236-4db1-957e-2c71f924e81c" MZ.Sequence.VideoTimeDisplayFormat="110" MZ.WorkOutPoint="15235011792000" MZ.WorkInPoint="0" MZ.ZeroPoint="0" explodedTracks="true"> - <uuid>ce4dd6c6-f46e-4ec6-9191-c0da728298b2</uuid> - <duration>856</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <name>Generators</name> - <media> - <video> - <format> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <codec> - <name>Apple ProRes 422</name> - <appspecificdata> - <appname>Final Cut Pro</appname> - <appmanufacturer>Apple Inc.</appmanufacturer> - <appversion>7.0</appversion> - <data> - <qtcodec> - <codecname>Apple ProRes 422</codecname> - <codectypename>Apple ProRes 422</codectypename> - <codectypecode>apcn</codectypecode> - <codecvendorcode>appl</codecvendorcode> - <spatialquality>1024</spatialquality> - <temporalquality>0</temporalquality> - <keyframerate>0</keyframerate> - <datarate>0</datarate> - </qtcodec> - </data> - </appspecificdata> - </codec> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - <colordepth>24</colordepth> - </samplecharacteristics> - </format> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1"> - <clipitem id="clipitem-1"> - <masterclipid>masterclip-1</masterclipid> - <name>Universal Counting Leader</name> - <enabled>TRUE</enabled> - <duration>264</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>0</start> - <end>264</end> - <in>0</in> - <out>264</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>2796970176000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-1"> - <name>Universal Counting Leader</name> - <mediaSource>Slug</mediaSource> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>264</duration> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>lower</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>1</channelcount> - <audiochannel> - <sourcechannel>1</sourcechannel> - </audiochannel> - </audio> - </media> - </file> - <link> - <linkclipref>clipitem-1</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-7</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - <labels> - </labels> - </clipitem> - <clipitem id="clipitem-2"> - <masterclipid>masterclip-2</masterclipid> - <name>Black Video</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>264</start> - <end>383</end> - <in>86313</in> - <out>86432</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915711084288000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-2"> - <name>Black Video</name> - <mediaSource>Slug</mediaSource> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00;00;00;00</string> - <frame>0</frame> - <displayformat>DF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - <labels> - </labels> - </clipitem> - <generatoritem id="clipitem-3"> - <name>Blue Matte</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <start>383</start> - <end>502</end> - <in>86313</in> - <out>86432</out> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <effect> - <name>Color</name> - <effectid>Color</effectid> - <effectcategory>Matte</effectcategory> - <effecttype>generator</effecttype> - <mediatype>video</mediatype> - <parameter authoringApp="PremierePro"> - <parameterid>fillcolor</parameterid> - <name>Color</name> - <value> - <alpha>0</alpha> - <red>0</red> - <green>0</green> - <blue>255</blue> - </value> - </parameter> - </effect> - </generatoritem> - <clipitem id="clipitem-4"> - <masterclipid>masterclip-4</masterclipid> - <name>HD Bars and Tone</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>502</start> - <end>621</end> - <in>86313</in> - <out>86432</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915711084288000</pproTicksOut> - <alphatype>none</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-3"> - <name>HD Bars and Tone</name> - <mediaSource>Slug</mediaSource> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>1294705</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00;00;00;00</string> - <frame>0</frame> - <displayformat>DF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - <link> - <linkclipref>clipitem-4</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - </link> - <link> - <linkclipref>clipitem-8</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-9</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - <labels> - </labels> - </clipitem> - <clipitem id="clipitem-5"> - <masterclipid>masterclip-5</masterclipid> - <name>Transparent Video</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>621</start> - <end>737</end> - <in>86313</in> - <out>86429</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915679300536000</pproTicksOut> - <alphatype>straight</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-4"> - <name>Transparent Video</name> - <mediaSource>Slug</mediaSource> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00;00;00;00</string> - <frame>0</frame> - <displayformat>DF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - <labels> - </labels> - </clipitem> - <clipitem id="clipitem-6"> - <masterclipid>masterclip-6</masterclipid> - <name>Graphic</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>737</start> - <end>856</end> - <in>86313</in> - <out>86432</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915711084288000</pproTicksOut> - <alphatype>straight</alphatype> - <pixelaspectratio>square</pixelaspectratio> - <anamorphic>FALSE</anamorphic> - <file id="file-5"> - <name>Graphic</name> - <mediaSource>GraphicAndType</mediaSource> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00;00;00;00</string> - <frame>0</frame> - <displayformat>DF</displayformat> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <width>1920</width> - <height>1080</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - </media> - </file> - <filter> - <effect> - <name>A center align Title Card with Menlo Font and RGB values - fill: 0 0 255 stroke: 0 0 0 background: 255 0 0 shadow: 255 255 255</name> - <effectid>GraphicAndType</effectid> - <effectcategory>graphic</effectcategory> - <effecttype>filter</effecttype> - <mediatype>video</mediatype> - <pproBypass>false</pproBypass> - <parameter authoringApp="PremierePro"> - <parameterid>1</parameterid> - <name>Source Text</name> - <hash>c0272bff-4c78-dced-7d46-b45300003ba6</hash> - <value>kjsAAAAAAAB7ACIAbQBTAGgAYQBkAG8AdwBGAG8AbgB0AE0AYQBwAEgAYQBzAGgAIgA6ACIAYwA5AGIAOQBhAGEAMgBhAC0ANABiADIANAAtADkAYwA0AGEALQBhAGIAMgBkAC0ANQA2AGIAOQAwADAAMAAwADAAZABkADkAIgAsACIAbQBUAGUAeAB0AFAAYQByAGEAbQAiADoAewAiAG0AQQBsAGkAZwBuAG0AZQBuAHQAIgA6ADIALAAiAG0AQgBhAGMAawBGAGkAbABsAEMAbwBsAG8AcgAiADoAMQA2ADcAMQAxADYAOAAwACwAIgBtAEIAYQBjAGsARgBpAGwAbABPAHAAYQBjAGkAdAB5ACIAOgA3ADUALAAiAG0AQgBhAGMAawBGAGkAbABsAFMAaQB6AGUAIgA6ADAALAAiAG0AQgBhAGMAawBGAGkAbABsAFYAaQBzAGkAYgBsAGUAIgA6AHQAcgB1AGUALAAiAG0ARABlAGYAYQB1AGwAdABSAHUAbgAiADoAWwBdACwAIgBtAEgAZQBpAGcAaAB0ACIAOgAwACwAIgBtAEgAaQBuAGQAaQBEAGkAZwBpAHQAcwAiADoAZgBhAGwAcwBlACwAIgBtAEkAbgBkAGkAYwAiADoAZgBhAGwAcwBlACwAIgBtAEkAcwBNAGEAcwBrACIAOgBmAGEAbABzAGUALAAiAG0ASQBzAE0AYQBzAGsASQBuAHYAZQByAHQAZQBkACIAOgBmAGEAbABzAGUALAAiAG0ASQBzAFYAZQByAHQAaQBjAGEAbABUAGUAeAB0ACIAOgBmAGEAbABzAGUALAAiAG0ATABlAGEAZABpAG4AZwAiADoAMAAsACIAbQBMAGkAZwBhAHQAdQByAGUAcwAiADoAZgBhAGwAcwBlACwAIgBtAEwAaQBuAGUAQwBhAHAAVAB5AHAAZQAiADoAMAAsACIAbQBMAGkAbgBlAEoAbwBpAG4AVAB5AHAAZQAiADoAMAAsACIAbQBNAGkAdABlAHIATABpAG0AaQB0ACIAOgAyAC4ANQAsACIAbQBOAHUAbQBTAHQAcgBvAGsAZQBzACIAOgAxACwAIgBtAFIAVABMACIAOgBmAGEAbABzAGUALAAiAG0AUwBoAGEAZABvAHcAQQBuAGcAbABlACIAOgAxADMANQAsACIAbQBTAGgAYQBkAG8AdwBCAGwAdQByACIAOgA0ADAALAAiAG0AUwBoAGEAZABvAHcAQwBvAGwAbwByACIAOgAxADYANwA3ADcAMgAxADUALAAiAG0AUwBoAGEAZABvAHcATwBmAGYAcwBlAHQAIgA6ADcALAAiAG0AUwBoAGEAZABvAHcATwBwAGEAYwBpAHQAeQAiADoANwA1ACwAIgBtAFMAaABhAGQAbwB3AFMAaQB6AGUAIgA6ADAALAAiAG0AUwBoAGEAZABvAHcAVgBpAHMAaQBiAGwAZQAiADoAdAByAHUAZQAsACIAbQBTAHQAeQBsAGUAUwBoAGUAZQB0ACIAOgB7ACIAbQBBAGQAZABpAHQAaQBvAG4AYQBsAFMAdAByAG8AawBlAEMAbwBsAG8AcgAiADoAWwBdACwAIgBtAEEAZABkAGkAdABpAG8AbgBhAGwAUwB0AHIAbwBrAGUAVgBpAHMAaQBiAGwAZQAiADoAWwBdACwAIgBtAEEAZABkAGkAdABpAG8AbgBhAGwAUwB0AHIAbwBrAGUAVwBpAGQAdABoACIAOgBbAF0ALAAiAG0AQgBhAHMAZQBsAGkAbgBlAE8AcAB0AGkAbwBuACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBCAGEAcwBlAGwAaQBuAGUAUwBoAGkAZgB0ACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBDAGEAcABzAE8AcAB0AGkAbwBuACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBGAGEAdQB4AEIAbwBsAGQAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALABmAGEAbABzAGUAXQBdAH0ALAAiAG0ARgBhAHUAeABJAHQAYQBsAGkAYwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAGYAYQBsAHMAZQBdAF0AfQAsACIAbQBGAGkAbABsAEMAbwBsAG8AcgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADIANQA1AF0ALABbADEALAAyADUANQBdACwAWwAyACwAMgA1ADUAXQAsAFsAMwAsADIANQA1AF0ALABbADQALAAyADUANQBdACwAWwA1ACwAMgA1ADUAXQAsAFsANgAsADIANQA1AF0ALABbADcALAAyADUANQBdACwAWwA4ACwAMgA1ADUAXQAsAFsAOQAsADIANQA1AF0ALABbADEAMAAsADIANQA1AF0ALABbADEAMQAsADIANQA1AF0ALABbADEAMgAsADIANQA1AF0ALABbADEAMwAsADIANQA1AF0ALABbADEANAAsADIANQA1AF0ALABbADEANQAsADIANQA1AF0ALABbADEANgAsADIANQA1AF0ALABbADEANwAsADIANQA1AF0ALABbADEAOAAsADIANQA1AF0ALABbADEAOQAsADIANQA1AF0ALABbADIAMAAsADIANQA1AF0ALABbADIAMQAsADIANQA1AF0ALABbADIAMgAsADIANQA1AF0ALABbADIAMwAsADIANQA1AF0ALABbADIANAAsADIANQA1AF0ALABbADIANQAsADIANQA1AF0ALABbADIANgAsADIANQA1AF0ALABbADIANwAsADIANQA1AF0ALABbADIAOAAsADIANQA1AF0ALABbADIAOQAsADIANQA1AF0ALABbADMAMAAsADIANQA1AF0ALABbADMAMQAsADIANQA1AF0ALABbADMAMgAsADIANQA1AF0ALABbADMAMwAsADIANQA1AF0ALABbADMANAAsADIANQA1AF0ALABbADMANQAsADIANQA1AF0ALABbADMANgAsADIANQA1AF0ALABbADMANwAsADIANQA1AF0ALABbADMAOAAsADIANQA1AF0ALABbADMAOQAsADIANQA1AF0ALABbADQAMAAsADIANQA1AF0ALABbADQAMQAsADIANQA1AF0ALABbADQAMgAsADIANQA1AF0ALABbADQAMwAsADIANQA1AF0ALABbADQANAAsADIANQA1AF0ALABbADQANQAsADIANQA1AF0ALABbADQANgAsADIANQA1AF0ALABbADQANwAsADIANQA1AF0ALABbADQAOAAsADIANQA1AF0ALABbADQAOQAsADIANQA1AF0ALABbADUAMAAsADIANQA1AF0ALABbADUAMQAsADIANQA1AF0ALABbADUAMgAsADIANQA1AF0ALABbADUAMwAsADIANQA1AF0ALABbADUANAAsADIANQA1AF0ALABbADUANQAsADIANQA1AF0ALABbADUANgAsADIANQA1AF0ALABbADUANwAsADIANQA1AF0ALABbADUAOAAsADIANQA1AF0ALABbADUAOQAsADIANQA1AF0ALABbADYAMAAsADIANQA1AF0ALABbADYAMQAsADIANQA1AF0ALABbADYAMgAsADIANQA1AF0ALABbADYAMwAsADIANQA1AF0ALABbADYANAAsADIANQA1AF0ALABbADYANQAsADIANQA1AF0ALABbADYANgAsADIANQA1AF0ALABbADYANwAsADIANQA1AF0ALABbADYAOAAsADIANQA1AF0ALABbADYAOQAsADIANQA1AF0ALABbADcAMAAsADIANQA1AF0ALABbADcAMQAsADIANQA1AF0ALABbADcAMgAsADIANQA1AF0ALABbADcAMwAsADIANQA1AF0ALABbADcANAAsADIANQA1AF0ALABbADcANQAsADIANQA1AF0ALABbADcANgAsADIANQA1AF0ALABbADcANwAsADIANQA1AF0ALABbADcAOAAsADIANQA1AF0ALABbADcAOQAsADIANQA1AF0ALABbADgAMAAsADIANQA1AF0ALABbADgAMQAsADIANQA1AF0ALABbADgAMgAsADIANQA1AF0ALABbADgAMwAsADIANQA1AF0ALABbADgANAAsADIANQA1AF0ALABbADgANQAsADIANQA1AF0ALABbADgANgAsADIANQA1AF0ALABbADgANwAsADIANQA1AF0ALABbADgAOAAsADIANQA1AF0ALABbADgAOQAsADIANQA1AF0ALABbADkAMAAsADIANQA1AF0ALABbADkAMQAsADIANQA1AF0ALABbADkAMgAsADIANQA1AF0ALABbADkAMwAsADIANQA1AF0ALABbADkANAAsADIANQA1AF0ALABbADkANQAsADIANQA1AF0ALABbADkANgAsADIANQA1AF0ALABbADkANwAsADIANQA1AF0ALABbADkAOAAsADIANQA1AF0ALABbADkAOQAsADIANQA1AF0ALABbADEAMAAwACwAMgA1ADUAXQAsAFsAMQAwADEALAAyADUANQBdACwAWwAxADAAMgAsADIANQA1AF0ALABbADEAMAAzACwAMgA1ADUAXQAsAFsAMQAwADQALAAyADUANQBdACwAWwAxADAANQAsADIANQA1AF0ALABbADEAMAA2ACwAMgA1ADUAXQAsAFsAMQAwADcALAAyADUANQBdACwAWwAxADAAOAAsADIANQA1AF0ALABbADEAMAA5ACwAMgA1ADUAXQAsAFsAMQAxADAALAAyADUANQBdACwAWwAxADEAMQAsADIANQA1AF0ALABbADEAMQAyACwAMgA1ADUAXQAsAFsAMQAxADMALAAyADUANQBdACwAWwAxADEANAAsADIANQA1AF0ALABbADEAMQA1ACwAMgA1ADUAXQAsAFsAMQAxADYALAAyADUANQBdACwAWwAxADEANwAsADIANQA1AF0ALABbADEAMQA4ACwAMgA1ADUAXQAsAFsAMQAxADkALAAyADUANQBdACwAWwAxADIAMAAsADIANQA1AF0ALABbADEAMgAxACwAMgA1ADUAXQAsAFsAMQAyADIALAAyADUANQBdACwAWwAxADIAMwAsADIANQA1AF0ALABbADEAMgA0ACwAMgA1ADUAXQAsAFsAMQAyADUALAAyADUANQBdACwAWwAxADIANgAsADEANgA3ADcANwAyADEANQBdAF0AfQAsACIAbQBGAGkAbABsAE8AdgBlAHIAUwB0AHIAbwBrAGUAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAB0AHIAdQBlAF0AXQB9ACwAIgBtAEYAaQBsAGwAVgBpAHMAaQBiAGwAZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAHQAcgB1AGUAXQBdAH0ALAAiAG0ARgBvAG4AdABOAGEAbQBlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADIALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADUALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADgALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMgA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMwA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANAA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANQA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANgA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsANwA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOAA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQA2ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAOQA5ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAwADAALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADAAMQAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMAAyACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAwADMALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADAANAAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMAA1ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAwADYALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADAANwAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMAA4ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAwADkALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADEAMAAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMQAxACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAxADIALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADEAMwAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMQA0ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAxADUALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADEANgAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMQA3ACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAxADgALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADEAOQAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMgAwACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAyADEALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADIAMgAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMgAzACwAIgBNAGUAbgBsAG8ALQBSAGUAZwB1AGwAYQByACIAXQAsAFsAMQAyADQALAAiAE0AZQBuAGwAbwAtAFIAZQBnAHUAbABhAHIAIgBdACwAWwAxADIANQAsACIATQBlAG4AbABvAC0AUgBlAGcAdQBsAGEAcgAiAF0ALABbADEAMgA2ACwAIgA1ADgANwAyADQAMgAwADIALQBEAEQANQA4AC0ANAAyADAAQgAtAEEANgBGADAALQAyAEYAQgBCAEMAOAAxADIARgA3AEIANQAiAF0AXQB9ACwAIgBtAEYAbwBuAHQAUwBpAHoAZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADEAMAAwAF0AXQB9ACwAIgBtAEsAZQByAG4AaQBuAGcAIgA6AHsAIgBtAFAAYQByAGEAbQBWAGEAbAB1AGUAcwAiADoAWwBbADAALAAwAF0AXQB9ACwAIgBtAFMAdAByAG8AawBlAEMAbwBsAG8AcgAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQAsAFsAMQAsADAAXQAsAFsAMgAsADAAXQAsAFsAMwAsADAAXQAsAFsANAAsADAAXQAsAFsANQAsADAAXQAsAFsANgAsADAAXQAsAFsANwAsADAAXQAsAFsAOAAsADAAXQAsAFsAOQAsADAAXQAsAFsAMQAwACwAMABdACwAWwAxADEALAAwAF0ALABbADEAMgAsADAAXQAsAFsAMQAzACwAMABdACwAWwAxADQALAAwAF0ALABbADEANQAsADAAXQAsAFsAMQA2ACwAMABdACwAWwAxADcALAAwAF0ALABbADEAOAAsADAAXQAsAFsAMQA5ACwAMABdACwAWwAyADAALAAwAF0ALABbADIAMQAsADAAXQAsAFsAMgAyACwAMABdACwAWwAyADMALAAwAF0ALABbADIANAAsADAAXQAsAFsAMgA1ACwAMABdACwAWwAyADYALAAwAF0ALABbADIANwAsADAAXQAsAFsAMgA4ACwAMABdACwAWwAyADkALAAwAF0ALABbADMAMAAsADAAXQAsAFsAMwAxACwAMABdACwAWwAzADIALAAwAF0ALABbADMAMwAsADAAXQAsAFsAMwA0ACwAMABdACwAWwAzADUALAAwAF0ALABbADMANgAsADAAXQAsAFsAMwA3ACwAMABdACwAWwAzADgALAAwAF0ALABbADMAOQAsADAAXQAsAFsANAAwACwAMABdACwAWwA0ADEALAAwAF0ALABbADQAMgAsADAAXQAsAFsANAAzACwAMABdACwAWwA0ADQALAAwAF0ALABbADQANQAsADAAXQAsAFsANAA2ACwAMABdACwAWwA0ADcALAAwAF0ALABbADQAOAAsADAAXQAsAFsANAA5ACwAMABdACwAWwA1ADAALAAwAF0ALABbADUAMQAsADAAXQAsAFsANQAyACwAMABdACwAWwA1ADMALAAwAF0ALABbADUANAAsADAAXQAsAFsANQA1ACwAMABdACwAWwA1ADYALAAwAF0ALABbADUANwAsADAAXQAsAFsANQA4ACwAMABdACwAWwA1ADkALAAwAF0ALABbADYAMAAsADAAXQAsAFsANgAxACwAMABdACwAWwA2ADIALAAwAF0ALABbADYAMwAsADAAXQAsAFsANgA0ACwAMABdACwAWwA2ADUALAAwAF0ALABbADYANgAsADAAXQAsAFsANgA3ACwAMABdACwAWwA2ADgALAAwAF0ALABbADYAOQAsADAAXQAsAFsANwAwACwAMABdACwAWwA3ADEALAAwAF0ALABbADcAMgAsADAAXQAsAFsANwAzACwAMABdACwAWwA3ADQALAAwAF0ALABbADcANQAsADAAXQAsAFsANwA2ACwAMABdACwAWwA3ADcALAAwAF0ALABbADcAOAAsADAAXQAsAFsANwA5ACwAMABdACwAWwA4ADAALAAwAF0ALABbADgAMQAsADAAXQAsAFsAOAAyACwAMABdACwAWwA4ADMALAAwAF0ALABbADgANAAsADAAXQAsAFsAOAA1ACwAMABdACwAWwA4ADYALAAwAF0ALABbADgANwAsADAAXQAsAFsAOAA4ACwAMABdACwAWwA4ADkALAAwAF0ALABbADkAMAAsADAAXQAsAFsAOQAxACwAMABdACwAWwA5ADIALAAwAF0ALABbADkAMwAsADAAXQAsAFsAOQA0ACwAMABdACwAWwA5ADUALAAwAF0ALABbADkANgAsADAAXQAsAFsAOQA3ACwAMABdACwAWwA5ADgALAAwAF0ALABbADkAOQAsADAAXQAsAFsAMQAwADAALAAwAF0ALABbADEAMAAxACwAMABdACwAWwAxADAAMgAsADAAXQAsAFsAMQAwADMALAAwAF0ALABbADEAMAA0ACwAMABdACwAWwAxADAANQAsADAAXQAsAFsAMQAwADYALAAwAF0ALABbADEAMAA3ACwAMABdACwAWwAxADAAOAAsADAAXQAsAFsAMQAwADkALAAwAF0ALABbADEAMQAwACwAMABdACwAWwAxADEAMQAsADAAXQAsAFsAMQAxADIALAAwAF0ALABbADEAMQAzACwAMABdACwAWwAxADEANAAsADAAXQAsAFsAMQAxADUALAAwAF0ALABbADEAMQA2ACwAMABdACwAWwAxADEANwAsADAAXQAsAFsAMQAxADgALAAwAF0ALABbADEAMQA5ACwAMABdACwAWwAxADIAMAAsADAAXQAsAFsAMQAyADEALAAwAF0ALABbADEAMgAyACwAMABdACwAWwAxADIAMwAsADAAXQAsAFsAMQAyADQALAAwAF0ALABbADEAMgA1ACwAMABdACwAWwAxADIANgAsADEANgA3ADcANwAyADEANQBdAF0AfQAsACIAbQBTAHQAcgBvAGsAZQBWAGkAcwBpAGIAbABlACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAdAByAHUAZQBdACwAWwAxACwAdAByAHUAZQBdACwAWwAyACwAdAByAHUAZQBdACwAWwAzACwAdAByAHUAZQBdACwAWwA0ACwAdAByAHUAZQBdACwAWwA1ACwAdAByAHUAZQBdACwAWwA2ACwAdAByAHUAZQBdACwAWwA3ACwAdAByAHUAZQBdACwAWwA4ACwAdAByAHUAZQBdACwAWwA5ACwAdAByAHUAZQBdACwAWwAxADAALAB0AHIAdQBlAF0ALABbADEAMQAsAHQAcgB1AGUAXQAsAFsAMQAyACwAdAByAHUAZQBdACwAWwAxADMALAB0AHIAdQBlAF0ALABbADEANAAsAHQAcgB1AGUAXQAsAFsAMQA1ACwAdAByAHUAZQBdACwAWwAxADYALAB0AHIAdQBlAF0ALABbADEANwAsAHQAcgB1AGUAXQAsAFsAMQA4ACwAdAByAHUAZQBdACwAWwAxADkALAB0AHIAdQBlAF0ALABbADIAMAAsAHQAcgB1AGUAXQAsAFsAMgAxACwAdAByAHUAZQBdACwAWwAyADIALAB0AHIAdQBlAF0ALABbADIAMwAsAHQAcgB1AGUAXQAsAFsAMgA0ACwAdAByAHUAZQBdACwAWwAyADUALAB0AHIAdQBlAF0ALABbADIANgAsAHQAcgB1AGUAXQAsAFsAMgA3ACwAdAByAHUAZQBdACwAWwAyADgALAB0AHIAdQBlAF0ALABbADIAOQAsAHQAcgB1AGUAXQAsAFsAMwAwACwAdAByAHUAZQBdACwAWwAzADEALAB0AHIAdQBlAF0ALABbADMAMgAsAHQAcgB1AGUAXQAsAFsAMwAzACwAdAByAHUAZQBdACwAWwAzADQALAB0AHIAdQBlAF0ALABbADMANQAsAHQAcgB1AGUAXQAsAFsAMwA2ACwAdAByAHUAZQBdACwAWwAzADcALAB0AHIAdQBlAF0ALABbADMAOAAsAHQAcgB1AGUAXQAsAFsAMwA5ACwAdAByAHUAZQBdACwAWwA0ADAALAB0AHIAdQBlAF0ALABbADQAMQAsAHQAcgB1AGUAXQAsAFsANAAyACwAdAByAHUAZQBdACwAWwA0ADMALAB0AHIAdQBlAF0ALABbADQANAAsAHQAcgB1AGUAXQAsAFsANAA1ACwAdAByAHUAZQBdACwAWwA0ADYALAB0AHIAdQBlAF0ALABbADQANwAsAHQAcgB1AGUAXQAsAFsANAA4ACwAdAByAHUAZQBdACwAWwA0ADkALAB0AHIAdQBlAF0ALABbADUAMAAsAHQAcgB1AGUAXQAsAFsANQAxACwAdAByAHUAZQBdACwAWwA1ADIALAB0AHIAdQBlAF0ALABbADUAMwAsAHQAcgB1AGUAXQAsAFsANQA0ACwAdAByAHUAZQBdACwAWwA1ADUALAB0AHIAdQBlAF0ALABbADUANgAsAHQAcgB1AGUAXQAsAFsANQA3ACwAdAByAHUAZQBdACwAWwA1ADgALAB0AHIAdQBlAF0ALABbADUAOQAsAHQAcgB1AGUAXQAsAFsANgAwACwAdAByAHUAZQBdACwAWwA2ADEALAB0AHIAdQBlAF0ALABbADYAMgAsAHQAcgB1AGUAXQAsAFsANgAzACwAdAByAHUAZQBdACwAWwA2ADQALAB0AHIAdQBlAF0ALABbADYANQAsAHQAcgB1AGUAXQAsAFsANgA2ACwAdAByAHUAZQBdACwAWwA2ADcALAB0AHIAdQBlAF0ALABbADYAOAAsAHQAcgB1AGUAXQAsAFsANgA5ACwAdAByAHUAZQBdACwAWwA3ADAALAB0AHIAdQBlAF0ALABbADcAMQAsAHQAcgB1AGUAXQAsAFsANwAyACwAdAByAHUAZQBdACwAWwA3ADMALAB0AHIAdQBlAF0ALABbADcANAAsAHQAcgB1AGUAXQAsAFsANwA1ACwAdAByAHUAZQBdACwAWwA3ADYALAB0AHIAdQBlAF0ALABbADcANwAsAHQAcgB1AGUAXQAsAFsANwA4ACwAdAByAHUAZQBdACwAWwA3ADkALAB0AHIAdQBlAF0ALABbADgAMAAsAHQAcgB1AGUAXQAsAFsAOAAxACwAdAByAHUAZQBdACwAWwA4ADIALAB0AHIAdQBlAF0ALABbADgAMwAsAHQAcgB1AGUAXQAsAFsAOAA0ACwAdAByAHUAZQBdACwAWwA4ADUALAB0AHIAdQBlAF0ALABbADgANgAsAHQAcgB1AGUAXQAsAFsAOAA3ACwAdAByAHUAZQBdACwAWwA4ADgALAB0AHIAdQBlAF0ALABbADgAOQAsAHQAcgB1AGUAXQAsAFsAOQAwACwAdAByAHUAZQBdACwAWwA5ADEALAB0AHIAdQBlAF0ALABbADkAMgAsAHQAcgB1AGUAXQAsAFsAOQAzACwAdAByAHUAZQBdACwAWwA5ADQALAB0AHIAdQBlAF0ALABbADkANQAsAHQAcgB1AGUAXQAsAFsAOQA2ACwAdAByAHUAZQBdACwAWwA5ADcALAB0AHIAdQBlAF0ALABbADkAOAAsAHQAcgB1AGUAXQAsAFsAOQA5ACwAdAByAHUAZQBdACwAWwAxADAAMAAsAHQAcgB1AGUAXQAsAFsAMQAwADEALAB0AHIAdQBlAF0ALABbADEAMAAyACwAdAByAHUAZQBdACwAWwAxADAAMwAsAHQAcgB1AGUAXQAsAFsAMQAwADQALAB0AHIAdQBlAF0ALABbADEAMAA1ACwAdAByAHUAZQBdACwAWwAxADAANgAsAHQAcgB1AGUAXQAsAFsAMQAwADcALAB0AHIAdQBlAF0ALABbADEAMAA4ACwAdAByAHUAZQBdACwAWwAxADAAOQAsAHQAcgB1AGUAXQAsAFsAMQAxADAALAB0AHIAdQBlAF0ALABbADEAMQAxACwAdAByAHUAZQBdACwAWwAxADEAMgAsAHQAcgB1AGUAXQAsAFsAMQAxADMALAB0AHIAdQBlAF0ALABbADEAMQA0ACwAdAByAHUAZQBdACwAWwAxADEANQAsAHQAcgB1AGUAXQAsAFsAMQAxADYALAB0AHIAdQBlAF0ALABbADEAMQA3ACwAdAByAHUAZQBdACwAWwAxADEAOAAsAHQAcgB1AGUAXQAsAFsAMQAxADkALAB0AHIAdQBlAF0ALABbADEAMgAwACwAdAByAHUAZQBdACwAWwAxADIAMQAsAHQAcgB1AGUAXQAsAFsAMQAyADIALAB0AHIAdQBlAF0ALABbADEAMgAzACwAdAByAHUAZQBdACwAWwAxADIANAAsAHQAcgB1AGUAXQAsAFsAMQAyADUALAB0AHIAdQBlAF0ALABbADEAMgA2ACwAZgBhAGwAcwBlAF0AXQB9ACwAIgBtAFMAdAByAG8AawBlAFcAaQBkAHQAaAAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADEAXQBdAH0ALAAiAG0AVABlAHgAdAAiADoAIgBBACAAYwBlAG4AdABlAHIAIABhAGwAaQBnAG4AIABUAGkAdABsAGUAIABDAGEAcgBkAFwAcgB3AGkAdABoACAATQBlAG4AbABvACAARgBvAG4AdAAgAGEAbgBkAFwAcgBSAEcAQgAgAHYAYQBsAHUAZQBzACAALQBcAHIAZgBpAGwAbAA6ACAAMAAgADAAIAAyADUANQBcAHIAcwB0AHIAbwBrAGUAOgAgADAAIAAwACAAMABcAHIAYgBhAGMAawBnAHIAbwB1AG4AZAA6ACAAMgA1ADUAIAAwACAAMABcAHIAcwBoAGEAZABvAHcAOgAgADIANQA1ACAAMgA1ADUAIAAyADUANQAiACwAIgBtAFQAcgBhAGMAawBpAG4AZwAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsADAAXQBdAH0ALAAiAG0AVABzAHUAbQBpACIAOgB7ACIAbQBQAGEAcgBhAG0AVgBhAGwAdQBlAHMAIgA6AFsAWwAwACwAMABdAF0AfQAsACIAbQBVAG4AZABlAHIAbABpAG4AZQAiADoAewAiAG0AUABhAHIAYQBtAFYAYQBsAHUAZQBzACIAOgBbAFsAMAAsAGYAYQBsAHMAZQBdAF0AfQB9ACwAIgBtAFQAYQBiAFcAaQBkAHQAaAAiADoANAAwADAALAAiAG0AVgBlAHIAdABpAGMAYQBsAEEAbABpAGcAbgBtAGUAbgB0ACIAOgAwACwAIgBtAFcAaQBkAHQAaAAiADoAMAB9ACwAIgBtAFUAcwBlAEwAZQBnAGEAYwB5AFQAZQB4AHQAQgBvAHgAIgA6AGYAYQBsAHMAZQAsACIAbQBWAGUAcgBzAGkAbwBuACIAOgAxAH0A</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>2</parameterid> - <name>Transform</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>11</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>3</parameterid> - <name>Position</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0.4997355043888092:0.20081990957260132,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>4</parameterid> - <name>Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>5</parameterid> - <name>Horizontal Scale</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>4000</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>6</parameterid> - <name> </name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,true,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>7</parameterid> - <name>Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>8</parameterid> - <name>Opacity</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>100</UpperBound> - <value>-91445760000000000,100.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>9</parameterid> - <name>Anchor Point</name> - <IsTimeVarying>false</IsTimeVarying> - <value>-91445760000000000,0:0,0,0,0,0,0,0,5,4,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>10</parameterid> - <name></name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>12</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>false</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>11</parameterid> - <name> </name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>12</parameterid> - <name> </name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>32768</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>13</parameterid> - <name>start</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,69.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>14</parameterid> - <name>end</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>8</ParameterControlType> - <LowerBound>-100</LowerBound> - <UpperBound>1000000000</UpperBound> - <value>-91445760000000000,69.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>15</parameterid> - <name> </name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>16</parameterid> - <name> </name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>17</parameterid> - <name> </name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>18</parameterid> - <name> </name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>4</ParameterControlType> - <LowerBound>false</LowerBound> - <UpperBound>true</UpperBound> - <value>-91445760000000000,false,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>19</parameterid> - <name>Parent Width</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>20</parameterid> - <name>Parent Height</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>2</ParameterControlType> - <LowerBound>0</LowerBound> - <UpperBound>20000</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - <parameter authoringApp="PremierePro"> - <parameterid>21</parameterid> - <name>Parent Rotation</name> - <IsTimeVarying>false</IsTimeVarying> - <ParameterControlType>3</ParameterControlType> - <LowerBound>-32768</LowerBound> - <UpperBound>32767</UpperBound> - <value>-91445760000000000,0.,0,0,0,0,0,0</value> - </parameter> - </effect> - </filter> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - <labels> - </labels> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - <track TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="0"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - </track> - </video> - <audio> - <numOutputChannels>2</numOutputChannels> - <format> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - </format> - <outputs> - <group> - <index>1</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>1</index> - </channel> - </group> - <group> - <index>2</index> - <numchannels>1</numchannels> - <downmix>0</downmix> - <channel> - <index>2</index> - </channel> - </group> - </outputs> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-7" premiereChannelType="mono"> - <masterclipid>masterclip-1</masterclipid> - <name>Universal Counting Leader</name> - <enabled>TRUE</enabled> - <duration>264</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>0</start> - <end>264</end> - <in>0</in> - <out>264</out> - <pproTicksIn>0</pproTicksIn> - <pproTicksOut>2796970176000</pproTicksOut> - <file id="file-1"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-1</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - </link> - <link> - <linkclipref>clipitem-7</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - </clipitem> - <clipitem id="clipitem-8" premiereChannelType="stereo"> - <masterclipid>masterclip-4</masterclipid> - <name>HD Bars and Tone</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>502</start> - <end>621</end> - <in>86313</in> - <out>86432</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915711084288000</pproTicksOut> - <file id="file-3"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-4</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - </link> - <link> - <linkclipref>clipitem-8</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-9</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <clipitem id="clipitem-9" premiereChannelType="stereo"> - <masterclipid>masterclip-4</masterclipid> - <name>HD Bars and Tone</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <start>502</start> - <end>621</end> - <in>86313</in> - <out>86432</out> - <pproTicksIn>914450328792000</pproTicksIn> - <pproTicksOut>915711084288000</pproTicksOut> - <file id="file-3"/> - <sourcetrack> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - </sourcetrack> - <link> - <linkclipref>clipitem-4</linkclipref> - <mediatype>video</mediatype> - <trackindex>1</trackindex> - <clipindex>4</clipindex> - </link> - <link> - <linkclipref>clipitem-8</linkclipref> - <mediatype>audio</mediatype> - <trackindex>1</trackindex> - <clipindex>2</clipindex> - <groupindex>1</groupindex> - </link> - <link> - <linkclipref>clipitem-9</linkclipref> - <mediatype>audio</mediatype> - <trackindex>2</trackindex> - <clipindex>1</clipindex> - <groupindex>1</groupindex> - </link> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - <colorinfo> - <lut></lut> - <lut1></lut1> - <asc_sop></asc_sop> - <asc_sat></asc_sat> - <lut2></lut2> - </colorinfo> - </clipitem> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="0" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>1</outputchannelindex> - </track> - <track TL.SQTrackAudioKeyframeStyle="0" TL.SQTrackShy="0" TL.SQTrackExpandedHeight="25" TL.SQTrackExpanded="0" MZ.TrackTargeted="1" PannerCurrentValue="0.5" PannerIsInverted="true" PannerStartKeyframe="-91445760000000000,0.5,0,0,0,0,0,0" PannerName="Balance" currentExplodedTrackIndex="1" totalExplodedTrackCount="2" premiereTrackType="Stereo"> - <enabled>TRUE</enabled> - <locked>FALSE</locked> - <outputchannelindex>2</outputchannelindex> - </track> - </audio> - </media> - <timecode> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - <logginginfo> - <description></description> - <scene></scene> - <shottake></shottake> - <lognote></lognote> - <good></good> - <originalvideofilename></originalvideofilename> - <originalaudiofilename></originalaudiofilename> - </logginginfo> - </sequence> -</xmeml> diff --git a/tests/sample_data/sample_just_track.xml b/tests/sample_data/sample_just_track.xml deleted file mode 100644 index 51d70bc7a..000000000 --- a/tests/sample_data/sample_just_track.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE xmeml> -<xmeml version="4"> - <sequence id="sequence-1" TL.SQAudioVisibleBase="0" TL.SQVideoVisibleBase="0" TL.SQVisibleBaseTime="0" TL.SQAVDividerPosition="0.5" TL.SQHideShyTracks="0" TL.SQHeaderWidth="184" Monitor.ProgramZoomOut="9144576000000" Monitor.ProgramZoomIn="0" TL.SQTimePerPixel="0.033806825568230996" MZ.EditLine="8856691200000" MZ.Sequence.PreviewFrameSizeHeight="720" MZ.Sequence.PreviewFrameSizeWidth="1280" MZ.Sequence.AudioTimeDisplayFormat="200" MZ.Sequence.PreviewRenderingClassID="1297106761" MZ.Sequence.PreviewRenderingPresetCodec="1297107278" MZ.Sequence.PreviewRenderingPresetPath="EncoderPresets\SequencePreview\9678af98-a7b7-4bdb-b477-7ac9c8df4a4e\I-Frame Only MPEG.epr" MZ.Sequence.PreviewUseMaxRenderQuality="false" MZ.Sequence.PreviewUseMaxBitDepth="false" MZ.Sequence.EditingModeGUID="9678af98-a7b7-4bdb-b477-7ac9c8df4a4e" MZ.Sequence.VideoTimeDisplayFormat="104" MZ.WorkOutPoint="9144576000000" MZ.WorkInPoint="0" explodedTracks="true"> - <uuid>5ea30a6b-552f-4722-be92-6dfdb66c97e6</uuid> - <duration>636</duration> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <name>sc01_sh010_layerA</name> - <media> - </media> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>00:00:00:00</string> - <frame>0</frame> - <displayformat>NDF</displayformat> - </timecode> - <labels> - <label2>Forest</label2> - </labels> - </sequence> -</xmeml> 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/simple_cut.svg b/tests/sample_data/simple_cut.svg deleted file mode 100644 index 803390bb5..000000000 --- a/tests/sample_data/simple_cut.svg +++ /dev/null @@ -1,219 +0,0 @@ -<?xml version="1.0" ?> -<svg height="1054.00000000" version="4.0" width="2406.00000000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <rect fill="white" height="100%" width="100%"/> - <g transform="translate(342.63636364,20.00000000)"> - <rect height="65.60000000" style="fill:rgb(255.00000000,255.00000000,255.00000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="2043.36363636"/> - <svg height="65.60000000" width="2043.36363636"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Timeline</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="85.60000000" y2="75.76000000"/> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1364.31818182" x2="1364.31818182" y1="95.60000000" y2="132.20000000"/> - <polygon points="1364.31818182,141.20000000 1359.81818182,132.20000000 1368.81818182,132.20000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1369.31818182" y="118.40000000">tracks</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="100.60000000">global_start_time: None</text> - <g transform="translate(342.63636364,151.20000000)"> - <rect height="65.60000000" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;" width="2043.36363636"/> - <svg height="65.60000000" width="2043.36363636"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Stack</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="216.80000000" y2="206.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="216.80000000" y2="206.96000000"/> - <g transform="translate(342.63636364,282.40000000)"> - <rect height="65.60000000" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;" width="2043.36363636"/> - <svg height="65.60000000" width="2043.36363636"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Track-001</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="348.00000000" y2="338.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="348.00000000" y2="338.16000000"/> - <g transform="translate(342.63636364,413.60000000)"> - <rect height="65.60000000" style="fill:rgb(37.14566005,116.00638615,196.54987044);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="322.63636364"/> - <svg height="65.60000000" width="322.63636364"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-001</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="342.63636364" x2="342.63636364" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="479.20000000" y2="469.36000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="406.10000000">trimmed_range() -> 3.0, 3.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="494.20000000">source_range: 3.0, 3.0</text> - <rect height="65.60000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="860.36363636" x="20.00000000" y="544.80000000"/> - <g transform="translate(342.63636364,544.80000000)"> - <rect height="65.60000000" style="fill:rgb(37.14566005,116.00638615,196.54987044);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="322.63636364"/> - <svg height="65.60000000" width="322.63636364"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-001</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="20.00000000" x2="20.00000000" y1="610.40000000" y2="600.56000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="127.54545455" x2="127.54545455" y1="610.40000000" y2="600.56000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="235.09090909" x2="235.09090909" y1="610.40000000" y2="600.56000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="342.63636364" x2="342.63636364" y1="610.40000000" y2="600.56000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="610.40000000" y2="600.56000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="610.40000000" y2="600.56000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="610.40000000" y2="600.56000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="610.40000000" y2="600.56000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="35.00000000" y="625.40000000">available_range: 0.0, 8.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="35.00000000" y="640.40000000">target_url: file:///folder/titles.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="503.95454545" x2="503.95454545" y1="489.20000000" y2="525.80000000"/> - <polygon points="503.95454545,534.80000000 499.45454545,525.80000000 508.45454545,525.80000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="508.95454545" y="522.00000000">media_reference</text> - <g transform="translate(665.27272727,413.60000000)"> - <rect height="65.60000000" style="fill:rgb(251.56164182,2.79089346,56.80018692);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="65.60000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-002</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="479.20000000" y2="469.36000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="680.27272727" y="406.10000000">trimmed_range() -> 2.0, 6.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="680.27272727" y="494.20000000">source_range: 2.0, 6.0</text> - <rect height="65.60000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="860.36363636" x="450.18181818" y="676.00000000"/> - <g transform="translate(665.27272727,676.00000000)"> - <rect height="65.60000000" style="fill:rgb(251.56164182,2.79089346,56.80018692);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="65.60000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-002</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="450.18181818" x2="450.18181818" y1="741.60000000" y2="731.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="557.72727273" x2="557.72727273" y1="741.60000000" y2="731.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="665.27272727" x2="665.27272727" y1="741.60000000" y2="731.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="772.81818182" x2="772.81818182" y1="741.60000000" y2="731.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="880.36363636" x2="880.36363636" y1="741.60000000" y2="731.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="741.60000000" y2="731.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1095.45454545" x2="1095.45454545" y1="741.60000000" y2="731.76000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1203.00000000" x2="1203.00000000" y1="741.60000000" y2="731.76000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="465.18181818" y="756.60000000">available_range: 0.0, 8.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="465.18181818" y="771.60000000">target_url: file:///folder/wind-up.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="987.90909091" x2="987.90909091" y1="489.20000000" y2="657.00000000"/> - <polygon points="987.90909091,666.00000000 983.40909091,657.00000000 992.40909091,657.00000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="992.90909091" y="522.00000000">media_reference</text> - <g transform="translate(1310.54545455,413.60000000)"> - <rect height="65.60000000" style="fill:rgb(141.00332152,222.50135064,10.90311309);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="430.18181818"/> - <svg height="65.60000000" width="430.18181818"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-003</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="479.20000000" y2="469.36000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1325.54545455" y="406.10000000">trimmed_range() -> 0.0, 4.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1325.54545455" y="494.20000000">source_range: 0.0, 4.0</text> - <rect height="65.60000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="860.36363636" x="1310.54545455" y="807.20000000"/> - <g transform="translate(1310.54545455,807.20000000)"> - <rect height="65.60000000" style="fill:rgb(141.00332152,222.50135064,10.90311309);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="430.18181818"/> - <svg height="65.60000000" width="430.18181818"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-003</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1310.54545455" x2="1310.54545455" y1="872.80000000" y2="862.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1418.09090909" x2="1418.09090909" y1="872.80000000" y2="862.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="872.80000000" y2="862.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1633.18181818" x2="1633.18181818" y1="872.80000000" y2="862.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="872.80000000" y2="862.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="872.80000000" y2="862.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="872.80000000" y2="862.96000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="872.80000000" y2="862.96000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1325.54545455" y="887.80000000">available_range: 0.0, 8.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1325.54545455" y="902.80000000">target_url: file:///folder/punchline.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1525.63636364" x2="1525.63636364" y1="489.20000000" y2="788.20000000"/> - <polygon points="1525.63636364,797.20000000 1521.13636364,788.20000000 1530.13636364,788.20000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1530.63636364" y="522.00000000">media_reference</text> - <g transform="translate(1740.72727273,413.60000000)"> - <rect height="65.60000000" style="fill:rgb(242.45228108,154.07255826,245.06556888);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="65.60000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Clip-004</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="479.20000000" y2="469.36000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="479.20000000" y2="469.36000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="406.10000000">trimmed_range() -> 100.0, 6.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="494.20000000">source_range: None</text> - <rect height="65.60000000" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;" width="645.27272727" x="1740.72727273" y="938.40000000"/> - <g transform="translate(1740.72727273,938.40000000)"> - <rect height="65.60000000" style="fill:rgb(242.45228108,154.07255826,245.06556888);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" width="645.27272727"/> - <svg height="65.60000000" width="645.27272727"> - <text alignment-baseline="middle" font-family="sans-serif" font-size="26.24000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" text-anchor="middle" x="50%" y="50%">Media-004</text> - </svg> - </g> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1740.72727273" x2="1740.72727273" y1="1004.00000000" y2="994.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1848.27272727" x2="1848.27272727" y1="1004.00000000" y2="994.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1955.81818182" x2="1955.81818182" y1="1004.00000000" y2="994.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="1004.00000000" y2="994.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2170.90909091" x2="2170.90909091" y1="1004.00000000" y2="994.16000000"/> - <line style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2278.45454545" x2="2278.45454545" y1="1004.00000000" y2="994.16000000"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="1019.00000000">available_range: 100.0, 6.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1755.72727273" y="1034.00000000">target_url: file:///folder/credits.mov</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="2063.36363636" x2="2063.36363636" y1="489.20000000" y2="919.40000000"/> - <polygon points="2063.36363636,928.40000000 2058.86363636,919.40000000 2067.86363636,919.40000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="2068.36363636" y="522.00000000">media_reference</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1364.31818182" x2="1364.31818182" y1="358.00000000" y2="394.60000000"/> - <polygon points="1364.31818182,403.60000000 1359.81818182,394.60000000 1368.81818182,394.60000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1369.31818182" y="380.80000000">children[4]</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="274.90000000">trimmed_range() -> 0.0, 19.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="363.00000000">source_range: None</text> - <line style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;" x1="1364.31818182" x2="1364.31818182" y1="226.80000000" y2="263.40000000"/> - <polygon points="1364.31818182,272.40000000 1359.81818182,263.40000000 1368.81818182,263.40000000" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="1369.31818182" y="249.60000000">children[1]</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="143.70000000">trimmed_range() -> 0.0, 19.0</text> - <text font-family="sans-serif" font-size="15.00000000" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" x="357.63636364" y="231.80000000">source_range: None</text> -</svg> 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.svg b/tests/sample_data/transition.svg deleted file mode 100644 index a897ed6f4..000000000 --- a/tests/sample_data/transition.svg +++ /dev/null @@ -1,240 +0,0 @@ -<?xml version="1.0" ?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="1054.00000000" width="2406.00000000" version="4.0"> - <rect width="100%" height="100%" fill="white"/> - <g transform="translate(342.63636364,20.00000000)"> - <rect width="2043.36363636" height="57.88235294" style="fill:rgb(255.00000000,255.00000000,255.00000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="2043.36363636" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Timeline</text> - </svg> - </g> - <line x1="450.18181818" y1="77.88235294" x2="450.18181818" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="557.72727273" y1="77.88235294" x2="557.72727273" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="665.27272727" y1="77.88235294" x2="665.27272727" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="772.81818182" y1="77.88235294" x2="772.81818182" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="880.36363636" y1="77.88235294" x2="880.36363636" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="987.90909091" y1="77.88235294" x2="987.90909091" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1095.45454545" y1="77.88235294" x2="1095.45454545" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1203.00000000" y1="77.88235294" x2="1203.00000000" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1310.54545455" y1="77.88235294" x2="1310.54545455" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1418.09090909" y1="77.88235294" x2="1418.09090909" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1525.63636364" y1="77.88235294" x2="1525.63636364" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1633.18181818" y1="77.88235294" x2="1633.18181818" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1740.72727273" y1="77.88235294" x2="1740.72727273" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1848.27272727" y1="77.88235294" x2="1848.27272727" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1955.81818182" y1="77.88235294" x2="1955.81818182" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2063.36363636" y1="77.88235294" x2="2063.36363636" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2170.90909091" y1="77.88235294" x2="2170.90909091" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2278.45454545" y1="77.88235294" x2="2278.45454545" y2="69.20000000" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1364.31818182" y1="87.88235294" x2="1364.31818182" y2="116.76470588" style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <polygon points="1364.31818182,125.76470588 1359.81818182,116.76470588 1368.81818182,116.76470588" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text x="1369.31818182" y="106.82352941" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">tracks</text> - <text x="357.63636364" y="92.88235294" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">global_start_time: 0.0</text> - <g transform="translate(342.63636364,135.76470588)"> - <rect width="2043.36363636" height="57.88235294" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;"/> - <svg width="2043.36363636" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Stack</text> - </svg> - </g> - <line x1="450.18181818" y1="193.64705882" x2="450.18181818" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="557.72727273" y1="193.64705882" x2="557.72727273" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="665.27272727" y1="193.64705882" x2="665.27272727" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="772.81818182" y1="193.64705882" x2="772.81818182" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="880.36363636" y1="193.64705882" x2="880.36363636" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="987.90909091" y1="193.64705882" x2="987.90909091" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1095.45454545" y1="193.64705882" x2="1095.45454545" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1203.00000000" y1="193.64705882" x2="1203.00000000" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1310.54545455" y1="193.64705882" x2="1310.54545455" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1418.09090909" y1="193.64705882" x2="1418.09090909" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1525.63636364" y1="193.64705882" x2="1525.63636364" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1633.18181818" y1="193.64705882" x2="1633.18181818" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1740.72727273" y1="193.64705882" x2="1740.72727273" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1848.27272727" y1="193.64705882" x2="1848.27272727" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1955.81818182" y1="193.64705882" x2="1955.81818182" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2063.36363636" y1="193.64705882" x2="2063.36363636" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2170.90909091" y1="193.64705882" x2="2170.90909091" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2278.45454545" y1="193.64705882" x2="2278.45454545" y2="184.96470588" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <g transform="translate(342.63636364,251.52941176)"> - <rect width="2043.36363636" height="57.88235294" style="fill:rgb(168.30000000,168.30000000,168.30000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:0.78430000;"/> - <svg width="2043.36363636" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Track</text> - </svg> - </g> - <line x1="450.18181818" y1="309.41176471" x2="450.18181818" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="557.72727273" y1="309.41176471" x2="557.72727273" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="665.27272727" y1="309.41176471" x2="665.27272727" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="772.81818182" y1="309.41176471" x2="772.81818182" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="880.36363636" y1="309.41176471" x2="880.36363636" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="987.90909091" y1="309.41176471" x2="987.90909091" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1095.45454545" y1="309.41176471" x2="1095.45454545" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1203.00000000" y1="309.41176471" x2="1203.00000000" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1310.54545455" y1="309.41176471" x2="1310.54545455" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1418.09090909" y1="309.41176471" x2="1418.09090909" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1525.63636364" y1="309.41176471" x2="1525.63636364" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1633.18181818" y1="309.41176471" x2="1633.18181818" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1740.72727273" y1="309.41176471" x2="1740.72727273" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1848.27272727" y1="309.41176471" x2="1848.27272727" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1955.81818182" y1="309.41176471" x2="1955.81818182" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2063.36363636" y1="309.41176471" x2="2063.36363636" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2170.90909091" y1="309.41176471" x2="2170.90909091" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2278.45454545" y1="309.41176471" x2="2278.45454545" y2="300.72941176" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <g transform="translate(342.63636364,483.05882353)"> - <rect width="322.63636364" height="57.88235294" style="fill:rgb(37.14566005,116.00638615,196.54987044);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="322.63636364" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Clip-001</text> - </svg> - </g> - <line x1="342.63636364" y1="540.94117647" x2="342.63636364" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="450.18181818" y1="540.94117647" x2="450.18181818" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="557.72727273" y1="540.94117647" x2="557.72727273" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="357.63636364" y="475.55882353" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">trimmed_range() -> 3.0, 3.0</text> - <text x="357.63636364" y="555.94117647" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">source_range: 3.0, 3.0</text> - <rect x="20.00000000" y="598.82352941" width="860.36363636" height="57.88235294" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;"/> - <g transform="translate(342.63636364,598.82352941)"> - <rect width="322.63636364" height="57.88235294" style="fill:rgb(37.14566005,116.00638615,196.54987044);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="322.63636364" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Media-001</text> - </svg> - </g> - <line x1="20.00000000" y1="656.70588235" x2="20.00000000" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="127.54545455" y1="656.70588235" x2="127.54545455" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="235.09090909" y1="656.70588235" x2="235.09090909" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="342.63636364" y1="656.70588235" x2="342.63636364" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="450.18181818" y1="656.70588235" x2="450.18181818" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="557.72727273" y1="656.70588235" x2="557.72727273" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="665.27272727" y1="656.70588235" x2="665.27272727" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="772.81818182" y1="656.70588235" x2="772.81818182" y2="648.02352941" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="35.00000000" y="671.70588235" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">available_range: 0.0, 8.0</text> - <text x="35.00000000" y="686.70588235" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">target_url: file:///folder/titles.mov</text> - <line x1="503.95454545" y1="550.94117647" x2="503.95454545" y2="579.82352941" style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <polygon points="503.95454545,588.82352941 499.45454545,579.82352941 508.45454545,579.82352941" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text x="508.95454545" y="579.88235294" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">media_reference</text> - <g transform="translate(665.27272727,483.05882353)"> - <rect width="645.27272727" height="57.88235294" style="fill:rgb(251.56164182,2.79089346,56.80018692);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="645.27272727" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Clip-002</text> - </svg> - </g> - <line x1="665.27272727" y1="540.94117647" x2="665.27272727" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="772.81818182" y1="540.94117647" x2="772.81818182" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="880.36363636" y1="540.94117647" x2="880.36363636" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="987.90909091" y1="540.94117647" x2="987.90909091" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1095.45454545" y1="540.94117647" x2="1095.45454545" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1203.00000000" y1="540.94117647" x2="1203.00000000" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="680.27272727" y="475.55882353" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">trimmed_range() -> 2.0, 6.0</text> - <text x="680.27272727" y="555.94117647" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">source_range: 2.0, 6.0</text> - <rect x="450.18181818" y="714.58823529" width="967.90909091" height="57.88235294" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;"/> - <g transform="translate(665.27272727,714.58823529)"> - <rect width="645.27272727" height="57.88235294" style="fill:rgb(251.56164182,2.79089346,56.80018692);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="645.27272727" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Media-002</text> - </svg> - </g> - <line x1="450.18181818" y1="772.47058824" x2="450.18181818" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="557.72727273" y1="772.47058824" x2="557.72727273" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="665.27272727" y1="772.47058824" x2="665.27272727" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="772.81818182" y1="772.47058824" x2="772.81818182" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="880.36363636" y1="772.47058824" x2="880.36363636" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="987.90909091" y1="772.47058824" x2="987.90909091" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1095.45454545" y1="772.47058824" x2="1095.45454545" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1203.00000000" y1="772.47058824" x2="1203.00000000" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1310.54545455" y1="772.47058824" x2="1310.54545455" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="465.18181818" y="787.47058824" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">available_range: 0.0, 9.0</text> - <text x="465.18181818" y="802.47058824" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">target_url: file:///folder/wind-up.mov</text> - <line x1="987.90909091" y1="550.94117647" x2="987.90909091" y2="695.58823529" style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <polygon points="987.90909091,704.58823529 983.40909091,695.58823529 992.40909091,695.58823529" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text x="992.90909091" y="579.88235294" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">media_reference</text> - <rect x="1310.54545455" y="714.58823529" width="322.63636364" height="57.88235294" stroke-dasharray="5" style="fill:rgb(251.56164182,2.79089346,56.80018692);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0.50000000"/> - <line x1="1310.54545455" y1="772.47058824" x2="1310.54545455" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1418.09090909" y1="772.47058824" x2="1418.09090909" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1525.63636364" y1="772.47058824" x2="1525.63636364" y2="763.78823529" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <g transform="translate(1095.45454545,367.29411765)"> - <rect width="537.72727273" height="57.88235294" style="fill:rgb(255.00000000,255.00000000,255.00000000);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;"/> - <svg width="537.72727273" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Transition</text> - </svg> - </g> - <line x1="1095.45454545" y1="425.17647059" x2="1633.18181818" y2="367.29411765" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="1110.45454545" y="440.17647059" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">in_offset: 2.0</text> - <text x="1110.45454545" y="455.17647059" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">out_offset: 3.0</text> - <line x1="1310.54545455" y1="425.17647059" x2="1310.54545455" y2="540.94117647" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <g transform="translate(1310.54545455,483.05882353)"> - <rect width="430.18181818" height="57.88235294" style="fill:rgb(141.00332152,222.50135064,10.90311309);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="430.18181818" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Clip-003</text> - </svg> - </g> - <line x1="1310.54545455" y1="540.94117647" x2="1310.54545455" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1418.09090909" y1="540.94117647" x2="1418.09090909" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1525.63636364" y1="540.94117647" x2="1525.63636364" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1633.18181818" y1="540.94117647" x2="1633.18181818" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="1325.54545455" y="475.55882353" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">trimmed_range() -> 3.0, 4.0</text> - <text x="1325.54545455" y="555.94117647" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">source_range: 3.0, 4.0</text> - <rect x="1095.45454545" y="830.35294118" width="1075.45454545" height="57.88235294" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;"/> - <g transform="translate(1310.54545455,830.35294118)"> - <rect width="430.18181818" height="57.88235294" style="fill:rgb(141.00332152,222.50135064,10.90311309);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="430.18181818" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Media-003</text> - </svg> - </g> - <line x1="1095.45454545" y1="888.23529412" x2="1095.45454545" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1203.00000000" y1="888.23529412" x2="1203.00000000" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1310.54545455" y1="888.23529412" x2="1310.54545455" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1418.09090909" y1="888.23529412" x2="1418.09090909" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1525.63636364" y1="888.23529412" x2="1525.63636364" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1633.18181818" y1="888.23529412" x2="1633.18181818" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1740.72727273" y1="888.23529412" x2="1740.72727273" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1848.27272727" y1="888.23529412" x2="1848.27272727" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1955.81818182" y1="888.23529412" x2="1955.81818182" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2063.36363636" y1="888.23529412" x2="2063.36363636" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="1110.45454545" y="903.23529412" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">available_range: 1.0, 10.0</text> - <text x="1110.45454545" y="918.23529412" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">target_url: file:///folder/punchline.mov</text> - <line x1="1525.63636364" y1="550.94117647" x2="1525.63636364" y2="811.35294118" style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <polygon points="1525.63636364,820.35294118 1521.13636364,811.35294118 1530.13636364,811.35294118" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text x="1530.63636364" y="579.88235294" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">media_reference</text> - <rect x="1095.45454545" y="830.35294118" width="215.09090909" height="57.88235294" stroke-dasharray="5" style="fill:rgb(141.00332152,222.50135064,10.90311309);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0.50000000"/> - <line x1="1095.45454545" y1="888.23529412" x2="1095.45454545" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1203.00000000" y1="888.23529412" x2="1203.00000000" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1310.54545455" y1="888.23529412" x2="1310.54545455" y2="879.55294118" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <g transform="translate(1740.72727273,483.05882353)"> - <rect width="645.27272727" height="57.88235294" style="fill:rgb(242.45228108,154.07255826,245.06556888);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="645.27272727" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Clip-004</text> - </svg> - </g> - <line x1="1740.72727273" y1="540.94117647" x2="1740.72727273" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1848.27272727" y1="540.94117647" x2="1848.27272727" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1955.81818182" y1="540.94117647" x2="1955.81818182" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2063.36363636" y1="540.94117647" x2="2063.36363636" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2170.90909091" y1="540.94117647" x2="2170.90909091" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2278.45454545" y1="540.94117647" x2="2278.45454545" y2="532.25882353" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="1755.72727273" y="475.55882353" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">trimmed_range() -> 100.0, 6.0</text> - <text x="1755.72727273" y="555.94117647" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">source_range: None</text> - <rect x="1740.72727273" y="946.11764706" width="645.27272727" height="57.88235294" style="fill:rgb(255,255,255);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1;fill-opacity:0;"/> - <g transform="translate(1740.72727273,946.11764706)"> - <rect width="645.27272727" height="57.88235294" style="fill:rgb(242.45228108,154.07255826,245.06556888);stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;"/> - <svg width="645.27272727" height="57.88235294"> - <text x="50%" y="50%" font-size="23.15294118" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.50000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;" alignment-baseline="middle" text-anchor="middle">Media-004</text> - </svg> - </g> - <line x1="1740.72727273" y1="1004.00000000" x2="1740.72727273" y2="995.31764706" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1848.27272727" y1="1004.00000000" x2="1848.27272727" y2="995.31764706" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="1955.81818182" y1="1004.00000000" x2="1955.81818182" y2="995.31764706" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2063.36363636" y1="1004.00000000" x2="2063.36363636" y2="995.31764706" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2170.90909091" y1="1004.00000000" x2="2170.90909091" y2="995.31764706" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <line x1="2278.45454545" y1="1004.00000000" x2="2278.45454545" y2="995.31764706" style="stroke-width:1.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <text x="1755.72727273" y="1019.00000000" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">available_range: 100.0, 6.0</text> - <text x="1755.72727273" y="1034.00000000" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">target_url: file:///folder/credits.mov</text> - <line x1="2063.36363636" y1="550.94117647" x2="2063.36363636" y2="927.11764706" style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <polygon points="2063.36363636,936.11764706 2058.86363636,927.11764706 2067.86363636,927.11764706" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text x="2068.36363636" y="579.88235294" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">media_reference</text> - <line x1="1364.31818182" y1="319.41176471" x2="1364.31818182" y2="348.29411765" style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <polygon points="1364.31818182,357.29411765 1359.81818182,348.29411765 1368.81818182,348.29411765" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text x="1369.31818182" y="338.35294118" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">children[5]</text> - <text x="357.63636364" y="244.02941176" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">trimmed_range() -> 0.0, 19.0</text> - <text x="357.63636364" y="324.41176471" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">source_range: None</text> - <line x1="1364.31818182" y1="203.64705882" x2="1364.31818182" y2="232.52941176" style="stroke-width:2.00000000;stroke:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;stroke-linecap:butt;"/> - <polygon points="1364.31818182,241.52941176 1359.81818182,232.52941176 1368.81818182,232.52941176" style="fill:rgb(0.00000000,0.00000000,0.00000000);"/> - <text x="1369.31818182" y="222.58823529" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">children[1]</text> - <text x="357.63636364" y="128.26470588" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">trimmed_range() -> 0.0, 19.0</text> - <text x="357.63636364" y="208.64705882" font-size="15.00000000" font-family="sans-serif" style="stroke:rgb(0.00000000,0.00000000,0.00000000);stroke-width:0.25000000;fill:rgb(0.00000000,0.00000000,0.00000000);opacity:1.00000000;">source_range: None</text> -</svg> 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..faf9f46ed 100755 --- a/tests/test_builtin_adapters.py +++ b/tests/test_builtin_adapters.py @@ -13,11 +13,12 @@ otio_json, ) +import pathlib 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") +SCREENING_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "screening_example.otio") class BuiltInAdapterTest(unittest.TestCase, otio_test_utils.OTIOAssertions): @@ -90,6 +91,14 @@ def test_otio_json_default(self): test_str = otio.adapters.write_to_string(tl) self.assertJsonEqual(tl, otio.adapters.read_from_string(test_str)) + def test_otio_pathlib_filepath(self): + """Tests reading / writing with a filepath that's a Path object.""" + tl = otio.adapters.read_from_file(pathlib.Path(SCREENING_EXAMPLE_PATH)) + with tempfile.TemporaryDirectory() as temp_dir: + tmp_path = pathlib.Path(temp_dir) / "tmp_pathlib.otio" + otio.adapters.write_to_file(input_otio=tl, filepath=tmp_path) + self.assertJsonEqual(tl, otio.adapters.read_from_file(filepath=tmp_path)) + if __name__ == '__main__': unittest.main() 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..845abb720 100755 --- a/tests/test_console.py +++ b/tests/test_console.py @@ -21,10 +21,9 @@ import opentimelineio.console as otio_console SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") - 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") +PREMIERE_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "premiere_example.otio") +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 +121,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 +171,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_fcp7_xml_adapter.py b/tests/test_fcp7_xml_adapter.py deleted file mode 100644 index b355ace78..000000000 --- a/tests/test_fcp7_xml_adapter.py +++ /dev/null @@ -1,1479 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Test final cut pro xml.""" - -# python -import json -import os -import tempfile -import unittest -from xml.etree import cElementTree - -from opentimelineio import ( - adapters, - opentime, - schema, - test_utils, -) - -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -FCP7_XML_EXAMPLE_PATH = os.path.join(SAMPLE_DATA_DIR, "premiere_example.xml") -SIMPLE_XML_PATH = os.path.join(SAMPLE_DATA_DIR, "sample_just_track.xml") -EMPTY_ELEMENT_XML_PATH = os.path.join(SAMPLE_DATA_DIR, "empty_name_tags.xml") -HIERO_XML_PATH = os.path.join(SAMPLE_DATA_DIR, "hiero_xml_export.xml") -FILTER_XML_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, "premiere_example_filter.xml" -) -FILTER_JSON_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, "premiere_example_filter.json" -) -GENERATOR_XML_EXAMPLE_PATH = os.path.join( - SAMPLE_DATA_DIR, "premiere_generators.xml" -) - - -class TestFcp7XmlUtilities(unittest.TestCase, test_utils.OTIOAssertions): - adapter = adapters.from_name('fcp_xml').module() - - def test_xml_tree_to_dict(self): - self.maxDiff = None - - with open(FILTER_JSON_EXAMPLE_PATH) as f: - ref_dict = json.load(f) - - tree = cElementTree.parse(FILTER_XML_EXAMPLE_PATH) - filter_element = tree.getroot() - xml_dict = self.adapter._xml_tree_to_dict(filter_element) - - self.assertEqual(xml_dict, ref_dict) - - out_xml = self.adapter._dict_to_xml_tree(xml_dict, "filter") - out_xml_string = self.adapter._make_pretty_string(out_xml) - - with open(FILTER_XML_EXAMPLE_PATH) as f: - orig_xml_string = f.read() - - self.assertEqual(out_xml_string.strip(), orig_xml_string.strip()) - - # validate empty tag handling - empty_element = cElementTree.fromstring( - "<top><empty/></top>" - ) - empty_element_dict = self.adapter._xml_tree_to_dict(empty_element) - self.assertIsNone(empty_element_dict["empty"]) - - empty_xml = self.adapter._dict_to_xml_tree(empty_element_dict, "top") - self.assertIsNone(empty_xml.find("empty").text) - - roundtrip_dict = self.adapter._xml_tree_to_dict(empty_xml) - self.assertEqual(empty_element_dict, roundtrip_dict) - - def test_bool_value(self): - truthy_element = cElementTree.fromstring("<ntsc>TRUE</ntsc>") - self.assertTrue(self.adapter._bool_value(truthy_element)) - - falsy_element = cElementTree.fromstring("<ntsc>FALSE</ntsc>") - self.assertFalse(self.adapter._bool_value(falsy_element)) - - def test_backreference_for_id(self): - item1 = schema.Clip(name="clip1") - item1_prime = schema.Clip(name="clip1") - item2 = schema.Clip(name="clip2") - - br_map = {} - item1_id, item1_is_new = self.adapter._backreference_for_item( - item1, "clipitem", br_map - ) - self.assertEqual(item1_id, "clipitem-1") - self.assertTrue(item1_is_new) - - item2_id, item2_is_new = self.adapter._backreference_for_item( - item2, "clipitem", br_map - ) - self.assertEqual(item2_id, "clipitem-2") - self.assertTrue(item2_is_new) - - ( - item1_prime_id, item1_prime_is_new - ) = self.adapter._backreference_for_item( - item1_prime, "clipitem", br_map - ) - self.assertEqual(item1_prime_id, "clipitem-1") - self.assertFalse(item1_prime_is_new) - - def test_backreference_for_id_preserved(self): - item1 = schema.Clip( - name="clip23", - metadata={"fcp_xml": {"@id": "clipitem-23"}}, - ) - item2 = schema.Clip(name="clip2") - conflicting_item = schema.Clip( - name="conflicting_clip", - metadata={"fcp_xml": {"@id": "clipitem-1"}}, - ) - - # prepopulate the backref map with some ids - br_map = { - "clipitem": { - "bogus_hash": 1, "bogus_hash_2": 2, "bogus_hash_3": 3 - } - } - - # Make sure the id is preserved - item1_id, item1_is_new = self.adapter._backreference_for_item( - item1, "clipitem", br_map - ) - self.assertEqual(item1_id, "clipitem-23") - self.assertTrue(item1_is_new) - - # Make sure the next item continues to fill in - item2_id, item2_is_new = self.adapter._backreference_for_item( - item2, "clipitem", br_map - ) - self.assertEqual(item2_id, "clipitem-4") - self.assertTrue(item2_is_new) - - # Make sure confilcting clips don't stomp existing ones - item3_id, item3_is_new = self.adapter._backreference_for_item( - conflicting_item, "clipitem", br_map - ) - self.assertEqual(item3_id, "clipitem-5") - self.assertTrue(item3_is_new) - - def test_name_from_element(self): - sequence_element = cElementTree.fromstring( - """ - <sequence> - <name>My Sequence</name> - </sequence> - """ - ) - name = self.adapter._name_from_element(sequence_element) - self.assertEqual(name, "My Sequence") - - empty_element = cElementTree.fromstring("<sequence></sequence>") - empty_name = self.adapter._name_from_element(empty_element) - self.assertEqual(empty_name, "") - - empty_name_element = cElementTree.fromstring( - "<sequence><name></name></sequence>" - ) - empty_name_2 = self.adapter._name_from_element(empty_name_element) - self.assertEqual(empty_name_2, "") - - def test_rate_for_element_ntsc_conversion_23976(self): - rate_element = cElementTree.fromstring( - """ - <clipitem> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - </clipitem> - """ - ) - rate = self.adapter._rate_from_context( - self.adapter._Context(rate_element) - ) - - self.assertEqual(rate, (24000 / 1001.0)) - - def test_rate_for_element_ntsc_conversion_24(self): - rate_element = cElementTree.fromstring( - """ - <clipitem> - <rate> - <timebase>24</timebase> - <ntsc>FALSE</ntsc> - </rate> - </clipitem> - """ - ) - rate = self.adapter._rate_from_context( - self.adapter._Context(rate_element) - ) - - self.assertEqual(rate, 24) - - def test_rate_for_element_ntsc_conversion_2997(self): - rate_element = cElementTree.fromstring( - """ - <clipitem> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - </clipitem> - """ - ) - rate = self.adapter._rate_from_context( - self.adapter._Context(rate_element) - ) - - self.assertEqual(rate, (30000 / 1001.0)) - - def test_rate_for_element_ntsc_conversion_30(self): - rate_element = cElementTree.fromstring( - """ - <clipitem> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - </clipitem> - """ - ) - rate = self.adapter._rate_from_context( - self.adapter._Context(rate_element) - ) - - self.assertEqual(rate, 30) - - def test_rate_for_element_no_ntsc(self): - rate_element = cElementTree.fromstring( - """ - <clipitem> - <rate> - <timebase>30</timebase> - </rate> - </clipitem> - """ - ) - rate = self.adapter._rate_from_context( - self.adapter._Context(rate_element) - ) - - self.assertEqual(rate, 30) - - def test_rate_from_context(self): - sequence_elem = cElementTree.fromstring( - """ - <sequence> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - </sequence> - """ - ) - - # Fetch rate from one level of context - sequence_context = self.adapter._Context(sequence_elem) - sequence_rate = self.adapter._rate_from_context(sequence_context) - self.assertEqual(sequence_rate, (30000 / 1001.0)) - - track_elem = cElementTree.fromstring( - """ - <track> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - </track> - """ - ) - - # make sure pushing a context with a new rate overrides the old rate - track_context = sequence_context.context_pushing_element(track_elem) - track_noinherit_rate = self.adapter._rate_from_context(track_context) - self.assertEqual(track_noinherit_rate, (24000 / 1001.0)) - - clip_norate_elem = cElementTree.fromstring( - """ - <clipitem> - <name>Just soeme clip</name> - </clipitem> - """ - ) - - # Make sure pushing a context element with no rate inherits the next - # level up - clip_context = track_context.context_pushing_element(clip_norate_elem) - clip_inherit_rate = self.adapter._rate_from_context(clip_context) - self.assertEqual(clip_inherit_rate, (24000 / 1001.0)) - - def test_time_from_timecode_element(self): - tc_element = cElementTree.fromstring( - """ - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>01:00:00:00</string> - <frame>108000</frame> - <displayformat>NDF</displayformat> - </timecode> - """ - ) - time = self.adapter._time_from_timecode_element(tc_element) - - self.assertEqual(time, opentime.RationalTime(108000, 30)) - - def test_time_from_timecode_element_drop_frame(self): - tc_element = cElementTree.fromstring( - """ - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>10:03:00;05</string> - <frame>1084319</frame> - <displayformat>DF</displayformat> - </timecode> - """ - ) - time = self.adapter._time_from_timecode_element(tc_element) - - self.assertEqual( - time, opentime.RationalTime(1084319, (30000 / 1001.0)) - ) - - def test_time_from_timecode_element_ntsc_non_drop_frame(self): - tc_element = cElementTree.fromstring( - """ - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>TRUE</ntsc> - </rate> - <string>00:59:56:12</string> - <displayformat>NDF</displayformat> - </timecode> - """ - ) - - time = self.adapter._time_from_timecode_element(tc_element) - self.assertEqual( - time, opentime.RationalTime(107892, (30000 / 1001.0)) - ) - - def test_time_from_timecode_element_implicit_ntsc(self): - clipitem_element = cElementTree.fromstring( - """ - <clipitem> - <duration>767</duration> - <rate> - <ntsc>TRUE</ntsc> - <timebase>24</timebase> - </rate> - <in>447</in> - <out>477</out> - <start>264</start> - <end>294</end> - <file> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <duration>767</duration> - <timecode> - <rate> - <timebase>24</timebase> - </rate> - <string>14:11:44:09</string> - <frame>1226505</frame> - <displayformat>NDF</displayformat> - <source>source</source> - </timecode> - </file> - </clipitem> - """ - ) - context = self.adapter._Context(clipitem_element) - timecode_element = clipitem_element.find("./file/timecode") - time = self.adapter._time_from_timecode_element( - timecode_element, context - ) - self.assertEqual(time, opentime.RationalTime(1226505, 24000.0 / 1001)) - - def test_track_kind_from_element(self): - video_element = cElementTree.fromstring("<video/>") - video_kind = self.adapter._track_kind_from_element(video_element) - self.assertEqual(video_kind, schema.TrackKind.Video) - - audio_element = cElementTree.fromstring("<audio/>") - audio_kind = self.adapter._track_kind_from_element(audio_element) - self.assertEqual(audio_kind, schema.TrackKind.Audio) - - invalid_element = cElementTree.fromstring("<smell/>") - with self.assertRaises(ValueError): - self.adapter._track_kind_from_element(invalid_element) - - def test_transition_cut_point(self): - transition_element = cElementTree.fromstring( - """ - <transitionitem> - <start>538</start> - <end>557</end> - <alignment>end-black</alignment> - <cutPointTicks>160876800000</cutPointTicks> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <effect> - <name>Cross Dissolve</name> - <effectid>Cross Dissolve</effectid> - <effectcategory>Dissolve</effectcategory> - <effecttype>transition</effecttype> - <mediatype>video</mediatype> - <wipecode>0</wipecode> - <wipeaccuracy>100</wipeaccuracy> - <startratio>0</startratio> - <endratio>1</endratio> - <reverse>FALSE</reverse> - </effect> - </transitionitem> - """ - ) - alignment_element = transition_element.find("./alignment") - - track_element = cElementTree.fromstring( - """ - <track> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - </track> - """ - ) - context = self.adapter._Context(track_element) - - cut_point = self.adapter._transition_cut_point( - transition_element, context - ) - self.assertEqual(cut_point, opentime.RationalTime(557, 30)) - - alignment_element.text = "end-black" - cut_point = self.adapter._transition_cut_point( - transition_element, context - ) - self.assertEqual(cut_point, opentime.RationalTime(557, 30)) - - for alignment in ("start", "start-black"): - alignment_element.text = alignment - cut_point = self.adapter._transition_cut_point( - transition_element, context - ) - self.assertEqual(cut_point, opentime.RationalTime(538, 30)) - - # TODO: Mathematically, this cut point falls at 547.5, is the rounding - # down behavior "correct"? - alignment_element.text = "center" - cut_point = self.adapter._transition_cut_point( - transition_element, context - ) - self.assertEqual(cut_point, opentime.RationalTime(547, 30)) - - -class TestFcp7XmlElements(unittest.TestCase, test_utils.OTIOAssertions): - """ Tests for isolated element parsers. """ - adapter = adapters.from_name('fcp_xml').module() - - def test_timeline_for_sequence(self): - tree = cElementTree.parse(FCP7_XML_EXAMPLE_PATH) - - # Get the test sequence and pare out the track definitions to keep this - # test simple. - seq_elem = tree.find("sequence") - seq_elem.find("./media").clear() - seq_elem.find("./timecode/string").text = "01:00:00:00" - seq_elem.find("./timecode/frame").text = "108000" - - parser = self.adapter.FCP7XMLParser(tree) - context = self.adapter._Context() - timeline = parser.timeline_for_sequence(seq_elem, context) - - # Spot-check the sequence - self.assertEqual(timeline.name, "sc01_sh010_layerA") - self.assertEqual( - timeline.global_start_time, opentime.RationalTime(108000, 30) - ) - - # Spot check that metadata translated with a tag and a property - adapter_metadata = timeline.metadata["fcp_xml"] - self.assertEqual( - adapter_metadata["labels"]["label2"], "Forest" - ) - self.assertEqual( - adapter_metadata["@MZ.Sequence.VideoTimeDisplayFormat"], "104" - ) - - # make sure the media and name tags were not included in the metadata - for k in {"name", "media"}: - with self.assertRaises(KeyError): - adapter_metadata[k] - - def test_marker_for_element(self): - marker_element = cElementTree.fromstring( - """ - <marker> - <comment>so, this happened</comment> - <name>My MArker 1</name> - <in>113</in> - <out>-1</out> - </marker> - """ - ) - - marker = self.adapter.marker_for_element(marker_element, 30) - - self.assertEqual(marker.name, "My MArker 1") - self.assertEqual( - marker.marked_range, - opentime.TimeRange( - start_time=opentime.RationalTime(113, 30), - duration=opentime.RationalTime(0, 30), - ) - ) - self.assertEqual( - marker.metadata["fcp_xml"]["comment"], "so, this happened" - ) - with self.assertRaises(KeyError): - marker.metadata["fcp_xml"]["name"] - - def test_markers_from_element(self): - sequence_element = cElementTree.fromstring( - """ - <sequence> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <marker> - <comment>so, this happened</comment> - <name>My MArker 1</name> - <in>113</in> - <out>-1</out> - </marker> - <marker> - <comment>fsfsfs</comment> - <name>dsf</name> - <in>492</in> - <out>-1</out> - </marker> - <marker> - <comment/> - <name/> - <in>298</in> - <out>-1</out> - </marker> - <labels> - <label2>Forest</label2> - </labels> - </sequence> - """ - ) - markers = self.adapter.markers_from_element(sequence_element) - - # Note that "None" -- - expected_names = ["My MArker 1", "dsf", ""] - self.assertEqual([m.name for m in markers], expected_names) - - def test_stack_from_element(self): - tree = cElementTree.parse(FCP7_XML_EXAMPLE_PATH) - - # Get the test sequence and pare out the track definitions to keep this - # test simple. - media_elem = tree.find("./sequence/media") - - parser = self.adapter.FCP7XMLParser(tree) - context = self.adapter._Context(tree.find("./sequence")) - tracks = parser.stack_for_element(media_elem, context) - - self.assertEqual(len(tracks), 8) - - audio_tracks = [ - t for t in tracks if t.kind == schema.TrackKind.Audio - ] - self.assertEqual(len(audio_tracks), 4) - - video_tracks = [ - t for t in tracks if t.kind == schema.TrackKind.Video - ] - self.assertEqual(len(video_tracks), 4) - - def test_track_for_element(self): - tree = cElementTree.parse(FCP7_XML_EXAMPLE_PATH) - - sequence_elem = tree.find("./sequence[1]") - context = self.adapter._Context(sequence_elem) - # The track with "clipitem-2" is a decent and relatively complex - # test case - track_elem = sequence_elem.find(".//clipitem[@id='clipitem-2']/..") - - # Make a parser and prime the id cache by parsing the file - parser = self.adapter.FCP7XMLParser(tree) - parser.timeline_for_sequence(sequence_elem, self.adapter._Context()) - - track = parser.track_for_element( - track_elem, schema.TrackKind.Video, context - ) - - expected_instance_types = [ - schema.Gap, - schema.Clip, - schema.Gap, - schema.Clip, - schema.Clip, - schema.Transition, - schema.Gap, - schema.Stack, - ] - track_item_types = [i.__class__ for i in track] - self.assertEqual(track_item_types, expected_instance_types) - self.assertEqual(len(track), 8) - - def test_media_reference_from_element(self): - file_element = cElementTree.fromstring( - """ - <file id="file-3"> - <name>sc01_sh030_anim.mov</name> - <pathurl>file:///Scratch/media/sc01_sh030_anim.2.mov</pathurl> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <duration>400</duration> - <timecode> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <string>01:00:00:00</string> - <frame>108000</frame> - <displayformat>NDF</displayformat> - <reel> - <name/> - </reel> - </timecode> - <media> - <video> - <samplecharacteristics> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <width>1280</width> - <height>720</height> - <anamorphic>FALSE</anamorphic> - <pixelaspectratio>square</pixelaspectratio> - <fielddominance>none</fielddominance> - </samplecharacteristics> - </video> - <audio> - <samplecharacteristics> - <depth>16</depth> - <samplerate>48000</samplerate> - </samplecharacteristics> - <channelcount>2</channelcount> - </audio> - </media> - </file> - """ - ) - - parser = self.adapter.FCP7XMLParser(file_element) - context = self.adapter._Context() - ref = parser.media_reference_for_file_element( - file_element, - context=context, - ) - - self.assertEqual( - ref.target_url, "file:///Scratch/media/sc01_sh030_anim.2.mov" - ) - self.assertEqual(ref.name, "sc01_sh030_anim.mov") - self.assertEqual( - ref.available_range, - opentime.TimeRange( - start_time=opentime.RationalTime(108000, 30), - duration=opentime.RationalTime(400, 30), - ) - ) - - # Spot-check a metadata field - video_metadata = ref.metadata["fcp_xml"]["media"]["video"] - self.assertEqual( - video_metadata["samplecharacteristics"]["height"], "720" - ) - - def test_missing_media_reference_from_element(self): - file_element = cElementTree.fromstring( - """ - <file id="101_021_0030_FG01"> - <name>101_021_0030_FG01</name> - <duration>155</duration> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <timecode> - <rate> - <ntsc>FALSE</ntsc> - <timebase>24</timebase> - </rate> - <frame>1308828</frame> - <displayformat>NDF</displayformat> - <string>15:08:54:12</string> - <reel> - <name>A173C021_181204_R207</name> - </reel> - </timecode> - </file> - """ - ) - - parser = self.adapter.FCP7XMLParser(file_element) - context = self.adapter._Context() - ref = parser.media_reference_for_file_element( - file_element, - context=context, - ) - - self.assertTrue(isinstance(ref, schema.MissingReference)) - self.assertEqual(ref.name, "101_021_0030_FG01") - self.assertEqual( - ref.available_range, - opentime.TimeRange( - start_time=opentime.RationalTime(1308828, 24), - duration=opentime.RationalTime(155, 24), - ) - ) - - # Spot-check a metadata field - reelname = ref.metadata["fcp_xml"]["timecode"]["reel"]["name"] - self.assertEqual(reelname, "A173C021_181204_R207") - - def test_clip_for_element(self): - tree = cElementTree.parse(FCP7_XML_EXAMPLE_PATH) - - # Use clipitem-3 because it's self-contained and doesn't reference - # other elements - sequence_elem = tree.find(".//clipitem[@id='clipitem-3']/../../../..") - clip_elem = tree.find(".//clipitem[@id='clipitem-3']") - context = self.adapter._Context(sequence_elem) - - # Make a parser - parser = self.adapter.FCP7XMLParser(tree) - - clip, time_range = parser.item_and_timing_for_element( - clip_elem, - head_transition=None, - tail_transition=None, - context=context, - ) - - self.assertEqual(clip.name, "sc01_sh020_anim.mov") - - expected_range = opentime.TimeRange( - start_time=opentime.RationalTime(165, 30), - duration=opentime.RationalTime(157, 30), - ) - self.assertEqual(time_range, expected_range) - - expected_range = opentime.TimeRange( - start_time=opentime.RationalTime(0, 30), - duration=opentime.RationalTime(157, 30), - ) - self.assertEqual(clip.source_range, expected_range) - - def test_generator_for_element(self): - generator_element = cElementTree.fromstring( - """ - <generatoritem id="clipitem-29"> - <name>White</name> - <enabled>TRUE</enabled> - <duration>1035764</duration> - <start>383</start> - <end>432</end> - <in>86313</in> - <out>86362</out> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - <effect> - <name>Color</name> - <effectid>Color</effectid> - <effectcategory>Matte</effectcategory> - <effecttype>generator</effecttype> - <mediatype>video</mediatype> - <parameter authoringApp="PremierePro"> - <parameterid>fillcolor</parameterid> - <name>Color</name> - <value> - <alpha>0</alpha> - <red>255</red> - <green>255</green> - <blue>255</blue> - </value> - </parameter> - </effect> - </generatoritem> - """ - ) - parent_context_element = cElementTree.fromstring( - """ - <track> - <rate> - <timebase>24</timebase> - <ntsc>TRUE</ntsc> - </rate> - </track> - """ - ) - - context = self.adapter._Context(parent_context_element) - - # Make a parser - parser = self.adapter.FCP7XMLParser(generator_element) - - clip, time_range = parser.item_and_timing_for_element( - generator_element, - head_transition=None, - tail_transition=None, - context=context, - ) - - self.assertEqual(clip.name, "White") - - expected_range = opentime.TimeRange( - start_time=opentime.RationalTime(383, (24000 / 1001.0)), - duration=opentime.RationalTime(49, (24000 / 1001.0)), - ) - self.assertEqual(time_range, expected_range) - - expected_source_range = opentime.TimeRange( - start_time=opentime.RationalTime(86313, (24000 / 1001.0)), - duration=opentime.RationalTime(49, (24000 / 1001.0)), - ) - self.assertEqual(clip.source_range, expected_source_range) - - ref = clip.media_reference - self.assertTrue( - isinstance(ref, schema.GeneratorReference) - ) - self.assertEqual(ref.name, "Color") - self.assertEqual( - ref.metadata["fcp_xml"]["parameter"]["value"]["red"], "255" - ) - - def test_effect_from_filter_element(self): - tree = cElementTree.parse(FILTER_XML_EXAMPLE_PATH) - - # Make a parser - parser = self.adapter.FCP7XMLParser(tree) - effect = parser.effect_from_filter_element(tree) - - self.assertEqual(effect.name, "Time Remap") - - # spot-check metadata - effect_meta = effect.metadata["fcp_xml"] - self.assertEqual(effect_meta["effectid"], "timeremap") - self.assertEqual(len(effect_meta["parameter"]), 5) - - def test_transition_for_element(self): - transition_element = cElementTree.fromstring( - """ - <transitionitem> - <start>538</start> - <end>557</end> - <alignment>end-black</alignment> - <cutPointTicks>160876800000</cutPointTicks> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - <effect> - <name>Cross Dissolve</name> - <effectid>Cross Dissolve</effectid> - <effectcategory>Dissolve</effectcategory> - <effecttype>transition</effecttype> - <mediatype>video</mediatype> - <wipecode>0</wipecode> - <wipeaccuracy>100</wipeaccuracy> - <startratio>0</startratio> - <endratio>1</endratio> - <reverse>FALSE</reverse> - </effect> - </transitionitem> - """ - ) - - track_element = cElementTree.fromstring( - """ - <track> - <rate> - <timebase>30</timebase> - <ntsc>FALSE</ntsc> - </rate> - </track> - """ - ) - context = self.adapter._Context(track_element) - - parser = self.adapter.FCP7XMLParser(transition_element) - transition = parser.transition_for_element(transition_element, context) - - self.assertEqual(transition.name, "Cross Dissolve") - self.assertEqual( - transition.transition_type, - schema.TransitionTypes.SMPTE_Dissolve, - ) - - -class AdaptersFcp7XmlTest(unittest.TestCase, test_utils.OTIOAssertions): - adapter = adapters.from_name('fcp_xml').module() - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.maxDiff = None - - def test_build_empty_file(self): - media_ref = schema.MissingReference( - name="test_clip_name", - available_range=opentime.TimeRange( - opentime.RationalTime(820489, 24), - opentime.RationalTime(2087, 24), - ), - metadata={ - "fcp_xml": { - "timecode": { - "rate": {"ntsc": "FALSE", "timebase": "24"}, - "displayformat": "NDF", - "reel": { - "name": "test_reel_name", - }, - } - } - }, - ) - - file_element = self.adapter._build_empty_file( - media_ref, - media_ref.available_range.start_time, - br_map={}, - ) - - self.assertEqual(file_element.find("./name").text, "test_clip_name") - self.assertEqual(file_element.find("./duration").text, "2087") - - rate_element = file_element.find("./rate") - self.assertEqual(rate_element.find("./ntsc").text, "FALSE") - self.assertEqual(rate_element.find("./timebase").text, "24") - - tc_element = file_element.find("./timecode") - self.assertEqual(tc_element.find("./rate/ntsc").text, "FALSE") - self.assertEqual(tc_element.find("./rate/timebase").text, "24") - self.assertEqual(tc_element.find("./string").text, "09:29:47:01") - self.assertEqual(tc_element.find("./reel/name").text, "test_reel_name") - - def test_read(self): - timeline = adapters.read_from_file(FCP7_XML_EXAMPLE_PATH) - - self.assertTrue(timeline is not None) - self.assertEqual(len(timeline.tracks), 8) - - video_tracks = [ - t for t in timeline.tracks - if t.kind == schema.TrackKind.Video - ] - audio_tracks = [ - t for t in timeline.tracks - if t.kind == schema.TrackKind.Audio - ] - - self.assertEqual(len(video_tracks), 4) - self.assertEqual(len(audio_tracks), 4) - - video_clip_names = ( - ("", 'sc01_sh010_anim.mov'), - ( - "", - 'sc01_sh010_anim.mov', - "", - 'sc01_sh020_anim.mov', - 'sc01_sh030_anim.mov', - 'Cross Dissolve', - "", - 'sc01_sh010_anim' - ), - ("", 'test_title'), - ( - "", - 'sc01_master_layerA_sh030_temp.mov', - 'Cross Dissolve', - 'sc01_sh010_anim.mov' - ) - ) - - for n, track in enumerate(video_tracks): - self.assertTupleEqual( - tuple(c.name for c in track), - video_clip_names[n] - ) - - audio_clip_names = ( - ("", 'sc01_sh010_anim.mov', "", 'sc01_sh010_anim.mov'), - ("", 'sc01_placeholder.wav', "", 'sc01_sh010_anim'), - ("", 'track_08.wav'), - ("", 'sc01_master_layerA_sh030_temp.mov', 'sc01_sh010_anim.mov') - ) - - for n, track in enumerate(audio_tracks): - self.assertTupleEqual( - tuple(c.name for c in track), - audio_clip_names[n] - ) - - video_clip_durations = ( - ((536, 30.0), (100, 30.0)), - ( - (13, 30.0), - (100, 30.0), - (52, 30.0), - (157, 30.0), - (235, 30.0), - ((19, 30.0), (0, 30.0)), - (79, 30.0), - (320, 30.0) - ), - ((15, 30.0), (941, 30.0)), - ((956, 30.0), (208, 30.0), ((12, 30.0), (13, 30.0)), (82, 30.0)) - ) - - for t, track in enumerate(video_tracks): - for c, clip in enumerate(track): - if isinstance(clip, schema.Transition): - self.assertEqual( - clip.in_offset, - opentime.RationalTime( - *video_clip_durations[t][c][0] - ) - ) - self.assertEqual( - clip.out_offset, - opentime.RationalTime( - *video_clip_durations[t][c][1] - ) - ) - else: - self.assertEqual( - clip.source_range.duration, - opentime.RationalTime(*video_clip_durations[t][c]) - ) - - audio_clip_durations = ( - ((13, 30.0), (100, 30.0), (423, 30.0), (100, 30.0), (423, 30.0)), - ( - (335, 30.0), - (170, 30.0), - (131, 30.0), - (294, 30.0), - (34, 30.0), - (124, 30.0) - ), - ((153, 30.0), (198, 30.0)), - ((956, 30.0), (221, 30.0), (94, 30.0)) - ) - - for t, track in enumerate(audio_tracks): - for c, clip in enumerate(track): - self.assertEqual( - clip.source_range.duration, - opentime.RationalTime(*audio_clip_durations[t][c]) - ) - - timeline_marker_names = ('My MArker 1', 'dsf', "") - - for n, marker in enumerate(timeline.tracks.markers): - self.assertEqual(marker.name, timeline_marker_names[n]) - - timeline_marker_start_times = ((113, 30.0), (492, 30.0), (298, 30.0)) - - for n, marker in enumerate(timeline.tracks.markers): - self.assertEqual( - marker.marked_range.start_time, - opentime.RationalTime(*timeline_marker_start_times[n]) - ) - - timeline_marker_comments = ('so, this happened', 'fsfsfs', None) - - for n, marker in enumerate(timeline.tracks.markers): - self.assertEqual( - marker.metadata.get('fcp_xml', {}).get('comment'), - timeline_marker_comments[n] - ) - - clip_with_marker = video_tracks[1][4] - clip_marker = clip_with_marker.markers[0] - self.assertEqual(clip_marker.name, "") - self.assertEqual( - clip_marker.marked_range.start_time, - opentime.RationalTime(73, 30.0) - ) - self.assertEqual( - clip_marker.metadata.get('fcp_xml', {}).get('comment'), - None - ) - - def test_roundtrip_mem2disk2mem(self): - timeline = schema.Timeline('test_timeline') - - RATE = 48.0 - - video_reference = schema.ExternalReference( - target_url="/var/tmp/test1.mov", - available_range=opentime.TimeRange( - opentime.RationalTime(value=100, rate=RATE), - opentime.RationalTime(value=1000, rate=RATE) - ) - ) - video_reference.name = "test_vid_one" - audio_reference = schema.ExternalReference( - target_url="/var/tmp/test1.wav", - available_range=opentime.TimeRange( - opentime.RationalTime(value=0, rate=RATE), - opentime.RationalTime(value=1000, rate=RATE) - ), - ) - audio_reference.name = "test_wav_one" - generator_reference = schema.GeneratorReference( - name="Color", - generator_kind="Color", - metadata={ - "fcp_xml": { - "effectcategory": "Matte", - "effecttype": "generator", - "mediatype": "video", - "parameter": { - "@authoringApp": "PremierePro", - "parameterid": "fillcolor", - "name": "Color", - "value": { - "alpha": "0", - "red": "255", - "green": "255", - "blue": "255", - }, - }, - }, - }, - ) - - v0 = schema.Track(kind=schema.TrackKind.Video) - v1 = schema.Track(kind=schema.TrackKind.Video) - - timeline.tracks.extend([v0, v1]) - - a0 = schema.Track(kind=schema.TrackKind.Audio) - - timeline.tracks.append(a0) - - v0.extend( - [ - schema.Clip( - name='test_clip1', - media_reference=video_reference, - source_range=opentime.TimeRange( - opentime.RationalTime(value=112, rate=RATE), - opentime.RationalTime(value=40, rate=RATE) - ) - ), - schema.Gap( - source_range=opentime.TimeRange( - duration=opentime.RationalTime( - value=60, - rate=RATE - ) - ) - ), - schema.Clip( - name='test_clip2', - media_reference=video_reference, - source_range=opentime.TimeRange( - opentime.RationalTime(value=123, rate=RATE), - opentime.RationalTime(value=260, rate=RATE) - ) - ), - schema.Clip( - name='test_generator_clip', - media_reference=generator_reference, - source_range=opentime.TimeRange( - opentime.RationalTime(value=292, rate=24.0), - opentime.RationalTime(value=183, rate=24.0) - ) - ), - ] - ) - - v1.extend([ - schema.Gap( - source_range=opentime.TimeRange( - duration=opentime.RationalTime(value=500, rate=RATE) - ) - ), - schema.Clip( - name='test_clip3', - media_reference=video_reference, - source_range=opentime.TimeRange( - opentime.RationalTime(value=112, rate=RATE), - opentime.RationalTime(value=55, rate=RATE) - ) - ) - ]) - - a0.extend( - [ - schema.Gap( - source_range=opentime.TimeRange( - duration=opentime.RationalTime(value=10, rate=RATE) - ) - ), - schema.Clip( - name='test_clip4', - media_reference=audio_reference, - source_range=opentime.TimeRange( - opentime.RationalTime(value=152, rate=RATE), - opentime.RationalTime(value=248, rate=RATE) - ), - ) - ] - ) - - timeline.tracks.markers.append( - schema.Marker( - name='test_timeline_marker', - marked_range=opentime.TimeRange( - opentime.RationalTime(123, RATE) - ), - metadata={'fcp_xml': {'comment': 'my_comment'}} - ) - ) - - timeline.tracks.markers.append( - schema.Marker( - name='test_timeline_marker_range', - marked_range=opentime.TimeRange( - opentime.RationalTime(123, RATE), - opentime.RationalTime(11, RATE), - ), - metadata={'fcp_xml': {'comment': 'my_comment'}} - ) - ) - - v1[1].markers.append( - schema.Marker( - name='test_clip_marker', - marked_range=opentime.TimeRange( - opentime.RationalTime(125, RATE) - ), - metadata={'fcp_xml': {'comment': 'my_comment'}} - ) - ) - - v1[1].markers.append( - schema.Marker( - name='test_clip_marker_range', - marked_range=opentime.TimeRange( - opentime.RationalTime(125, RATE), - opentime.RationalTime(6, RATE) - ), - metadata={'fcp_xml': {'comment': 'my_comment'}} - ) - ) - - # make sure that global_start_time.rate survives the round trip - timeline.global_start_time = opentime.RationalTime(100, RATE) - - result = adapters.write_to_string( - timeline, - adapter_name='fcp_xml' - ) - new_timeline = adapters.read_from_string( - result, - adapter_name='fcp_xml' - ) - - # Since FCP XML's "sequence" is a marriage of the timeline and the - # main tracks stack, the tracks stack loses its name - new_timeline.tracks.name = timeline.tracks.name - - self.assertEqual(new_timeline.name, 'test_timeline') - - # Before comparing, scrub ignorable metadata introduced in - # serialization (things like unique ids minted by the adapter) - # Since we seeded metadata for the generator, keep that metadata - del new_timeline.metadata["fcp_xml"] - for child in new_timeline.tracks.find_children(): - try: - del child.metadata["fcp_xml"] - except KeyError: - pass - - try: - is_generator = isinstance( - child.media_reference, schema.GeneratorReference - ) - if not is_generator: - del child.media_reference.metadata["fcp_xml"] - except (AttributeError, KeyError): - pass - - self.assertJsonEqual(new_timeline, timeline) - - def test_roundtrip_disk2mem2disk(self): - # somefile.xml -> OTIO - timeline = adapters.read_from_file(FCP7_XML_EXAMPLE_PATH) - tmp_path = tempfile.mkstemp(suffix=".xml", text=True)[1] - - # somefile.xml -> OTIO -> tempfile.xml - adapters.write_to_file(timeline, tmp_path) - - # somefile.xml -> OTIO -> tempfile.xml -> OTIO - result = adapters.read_from_file(tmp_path) - - # TODO: OTIO doesn't support linking items for the moment, so the - # adapter reads links to the metadata, but doesn't write them. - # See _dict_to_xml_tree for more information. - def scrub_md_dicts(timeline): - def scrub_displayformat(md_dict): - for ignore_key in {"link"}: - try: - del md_dict[ignore_key] - except KeyError: - pass - - for value in list(md_dict.values()): - try: - value.items() - scrub_displayformat(value) - except AttributeError: - pass - - for child in timeline.tracks.find_children(): - scrub_displayformat(child.metadata) - try: - scrub_displayformat(child.media_reference.metadata) - except AttributeError: - pass - - # media reference bug, ensure that these match - self.assertJsonEqual( - result.tracks[0][1].media_reference, - timeline.tracks[0][1].media_reference - ) - - scrub_md_dicts(result) - scrub_md_dicts(timeline) - - self.assertJsonEqual(result, timeline) - self.assertIsOTIOEquivalentTo(result, timeline) - - # But the xml text on disk is not identical because otio has a subset - # of features to xml and we drop all the nle specific preferences. - with open(FCP7_XML_EXAMPLE_PATH) as original_file: - with open(tmp_path) as output_file: - self.assertNotEqual(original_file.read(), output_file.read()) - - def test_hiero_flavored_xml(self): - timeline = adapters.read_from_file(HIERO_XML_PATH) - self.assertTrue(len(timeline.tracks), 1) - self.assertTrue(timeline.tracks[0].name == 'Video 1') - - clips = [c for c in timeline.tracks[0].find_clips()] - self.assertTrue(len(clips), 2) - - self.assertTrue(clips[0].name == 'A160C005_171213_R0MN') - self.assertTrue(clips[1].name == '/') - - self.assertTrue( - isinstance( - clips[0].media_reference, - schema.ExternalReference - ) - ) - - self.assertTrue( - isinstance( - clips[1].media_reference, - schema.MissingReference - ) - ) - - source_range = opentime.TimeRange( - start_time=opentime.RationalTime(1101071, 24), - duration=opentime.RationalTime(1055, 24) - ) - self.assertTrue(clips[0].source_range == source_range) - - available_range = opentime.TimeRange( - start_time=opentime.RationalTime(1101071, 24), - duration=opentime.RationalTime(1055, 24) - ) - self.assertTrue(clips[0].available_range() == available_range) - - clip_1_range = clips[1].available_range() - self.assertEqual( - clip_1_range, - opentime.TimeRange( - opentime.RationalTime(), - opentime.RationalTime(1, 24), - ) - ) - - # Test serialization - tmp_path = tempfile.mkstemp(suffix=".xml", text=True)[1] - adapters.write_to_file(timeline, tmp_path) - - # Similar to the test_roundtrip_disk2mem2disk above - # the track name element among others will not be present in a new xml. - with open(HIERO_XML_PATH) as original_file: - with open(tmp_path) as output_file: - self.assertNotEqual(original_file.read(), output_file.read()) - - def test_xml_with_empty_elements(self): - timeline = adapters.read_from_file(EMPTY_ELEMENT_XML_PATH) - - # Spot-check the EDL, this one would throw exception on load before - self.assertEqual(len(timeline.video_tracks()), 12) - self.assertEqual(len(timeline.video_tracks()[0]), 34) - - def test_read_generators(self): - timeline = adapters.read_from_file(GENERATOR_XML_EXAMPLE_PATH) - - video_track = timeline.tracks[0] - audio_track = timeline.tracks[3] - self.assertEqual(len(video_track), 6) - self.assertEqual(len(audio_track), 3) - - # Check all video items are generators - self.assertTrue( - all( - isinstance(item.media_reference, schema.GeneratorReference) - for item in video_track - ) - ) - - # Check the video generator kinds - self.assertEqual( - [clip.media_reference.generator_kind for clip in video_track], - ["Slug", "Slug", "Color", "Slug", "Slug", "GraphicAndType"], - ) - - # Check all non-gap audio items are generators - self.assertTrue( - all( - isinstance(item.media_reference, schema.GeneratorReference) - for item in video_track if not isinstance(item, schema.Gap) - ) - ) - - -if __name__ == '__main__': - unittest.main() 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_plugin_detection.py b/tests/test_plugin_detection.py index e7e4688a4..b5f55c939 100644 --- a/tests/test_plugin_detection.py +++ b/tests/test_plugin_detection.py @@ -80,14 +80,14 @@ def test_detect_plugin(self): def test_override_adapter(self): - # Test that entrypoint plugins load before builtin and contrib + # Test that entrypoint plugins load before builtin man = otio.plugins.manifest.load_manifest() - # The override_adapter creates another cmx_3600 adapter + # The override_adapter creates another otiod adapter adapters = [adapter for adapter in man.adapters - if adapter.name == "cmx_3600"] + if adapter.name == "otiod"] - # More then one cmx_3600 adapter should exist. + # More then one otiod adapter should exist. self.assertTrue(len(adapters) > 1) # Override adapter should be the first adapter found diff --git a/tests/test_svg_adapter.py b/tests/test_svg_adapter.py deleted file mode 100755 index 3defe691d..000000000 --- a/tests/test_svg_adapter.py +++ /dev/null @@ -1,77 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Copyright Contributors to the OpenTimelineIO project - -"""Unit tests for the OTIO to SVG adapter""" - -import os -import unittest -import tempfile -import xml.etree.ElementTree as ET - -import opentimelineio as otio - -SAMPLE_DATA_DIR = os.path.join(os.path.dirname(__file__), "sample_data") -SIMPLE_CUT_OTIO_PATH = os.path.join(SAMPLE_DATA_DIR, 'simple_cut.otio') -SIMPLE_CUT_SVG_PATH = os.path.join(SAMPLE_DATA_DIR, 'simple_cut.svg') -MULTIPLE_TRACK_OTIO_PATH = os.path.join(SAMPLE_DATA_DIR, 'multiple_track.otio') -MULTIPLE_TRACK_SVG_PATH = os.path.join(SAMPLE_DATA_DIR, 'multiple_track.svg') -TRANSITION_OTIO_PATH = os.path.join(SAMPLE_DATA_DIR, 'transition.otio') -TRANSITION_SVG_PATH = os.path.join(SAMPLE_DATA_DIR, 'transition.svg') - - -def _svg_equal(e1, e2): - if e1.tag != e2.tag: - return False - if e1.text != e2.text: - return False - if e1.tail != e2.tail: - return False - if e1.attrib != e2.attrib: - return False - if len(e1) != len(e2): - return False - return all(_svg_equal(c1, c2) for c1, c2 in zip(e1, e2)) - - -class SVGAdapterTest(unittest.TestCase): - def test_simple_cut(self): - self.maxDiff = None - tmp_path = tempfile.mkstemp(suffix=".svg", text=True)[1] - timeline = otio.core.deserialize_json_from_file(SIMPLE_CUT_OTIO_PATH) - otio.adapters.write_to_file(input_otio=timeline, filepath=tmp_path) - - test_tree = ET.parse(SIMPLE_CUT_SVG_PATH) - test_root = test_tree.getroot() - - reference_tree = ET.parse(tmp_path) - reference_root = reference_tree.getroot() - - self.assertTrue(_svg_equal(test_root, reference_root)) - - def test_multiple_tracks(self): - self.maxDiff = None - tmp_path = tempfile.mkstemp(suffix=".svg", text=True)[1] - timeline = otio.core.deserialize_json_from_file(MULTIPLE_TRACK_OTIO_PATH) - otio.adapters.write_to_file(input_otio=timeline, filepath=tmp_path) - - test_tree = ET.parse(MULTIPLE_TRACK_SVG_PATH) - test_root = test_tree.getroot() - - reference_tree = ET.parse(tmp_path) - reference_root = reference_tree.getroot() - - self.assertTrue(_svg_equal(test_root, reference_root)) - - def test_transition(self): - self.maxDiff = None - tmp_path = tempfile.mkstemp(suffix=".svg", text=True)[1] - timeline = otio.core.deserialize_json_from_file(TRANSITION_OTIO_PATH) - otio.adapters.write_to_file(input_otio=timeline, filepath=tmp_path) - - test_tree = ET.parse(TRANSITION_SVG_PATH) - test_root = test_tree.getroot() - - reference_tree = ET.parse(tmp_path) - reference_root = reference_tree.getroot() - - self.assertTrue(_svg_equal(test_root, reference_root)) diff --git a/tests/test_track.cpp b/tests/test_track.cpp index 26820f8e0..fc5093bcc 100644 --- a/tests/test_track.cpp +++ b/tests/test_track.cpp @@ -108,6 +108,40 @@ main(int argc, char** argv) assertEqual(result[1].value, cl1.value); }); + tests.add_test( + "test_find_children_stack", [] { + using namespace otio; + SerializableObject::Retainer<Clip> video_clip = new Clip( + "video_0", + nullptr, + TimeRange(RationalTime(0.0, 30.0), RationalTime(700.0, 30.0))); + SerializableObject::Retainer<Clip> audio_clip = new Clip( + "audio_0", + nullptr, + TimeRange(RationalTime(0.0, 30.0), RationalTime(704.0, 30.0))); + SerializableObject::Retainer<Track> video_track = new Track("Video"); + SerializableObject::Retainer<Track> audio_track = new Track("Audio"); + SerializableObject::Retainer<Stack> stack = new Stack(); + video_track->append_child(video_clip); + audio_track->append_child(audio_clip); + stack->append_child(video_track); + stack->append_child(audio_track); + + RationalTime time(703.0, 30.0); + RationalTime one_frame(1.0, 30.0); + TimeRange range(time, one_frame); + otio::ErrorStatus err; + auto items = stack->find_children(&err, range); + assertFalse(is_error(err)); + assertEqual(items.size(), 2); + assertTrue( + std::find(items.begin(), items.end(), audio_clip.value) != + items.end()); + assertTrue( + std::find(items.begin(), items.end(), audio_track.value) != + items.end()); + }); + tests.run(argc, argv); return 0; } diff --git a/tests/test_track.py b/tests/test_track.py index fb2caccc7..a5db2b706 100644 --- a/tests/test_track.py +++ b/tests/test_track.py @@ -52,6 +52,31 @@ def test_find_children_shallow_search(self): self.assertEqual(result[0], cl0) self.assertEqual(result[1], cl1) + def test_find_children_stack(self): + video_clip = otio.schema.Clip() + video_clip.source_range = otio.opentime.TimeRange( + otio.opentime.RationalTime(0.0, 30.0), + otio.opentime.RationalTime(700.0, 30.0)) + audio_clip = otio.schema.Clip() + audio_clip.source_range = otio.opentime.TimeRange( + otio.opentime.RationalTime(0.0, 30.0), + otio.opentime.RationalTime(704.0, 30.0)) + video_track = otio.schema.Track() + audio_track = otio.schema.Track() + stack = otio.schema.Stack() + video_track.append(video_clip) + audio_track.append(audio_clip) + stack.append(video_track) + stack.append(audio_track) + + time = otio.opentime.RationalTime(703.0, 30.0) + one_frame = otio.opentime.RationalTime(1.0, 30.0) + range = otio.opentime.TimeRange(time, one_frame) + items = stack.find_children(search_range=range) + self.assertEqual(len(items), 2) + self.assertTrue(audio_clip in items) + self.assertTrue(audio_track in items) + if __name__ == '__main__': unittest.main() 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__),