From c91a30b8b367ebb59d6040871bc0c79d70774607 Mon Sep 17 00:00:00 2001 From: Michael McCartney Date: Fri, 22 May 2020 20:15:51 -0400 Subject: [PATCH 1/5] Initial pass as a design doc for the edit interface --- docs/_static/edit/01_overwrite.png | Bin 0 -> 19725 bytes docs/_static/edit/02_insert.png | Bin 0 -> 15793 bytes docs/_static/edit/03_trim.png | Bin 0 -> 12259 bytes docs/_static/edit/04_slice.png | Bin 0 -> 13997 bytes docs/_static/edit/05_slip.png | Bin 0 -> 13632 bytes docs/_static/edit/06_slide.png | Bin 0 -> 13477 bytes docs/_static/edit/07_ripple.png | Bin 0 -> 15165 bytes docs/_static/edit/08_pointedit.png | Bin 0 -> 27665 bytes docs/_static/edit/09_roll.png | Bin 0 -> 11776 bytes docs/design/editorial_design.md | 355 +++++++++++++++++++++++++++++ 10 files changed, 355 insertions(+) create mode 100644 docs/_static/edit/01_overwrite.png create mode 100644 docs/_static/edit/02_insert.png create mode 100644 docs/_static/edit/03_trim.png create mode 100644 docs/_static/edit/04_slice.png create mode 100644 docs/_static/edit/05_slip.png create mode 100644 docs/_static/edit/06_slide.png create mode 100644 docs/_static/edit/07_ripple.png create mode 100644 docs/_static/edit/08_pointedit.png create mode 100644 docs/_static/edit/09_roll.png create mode 100644 docs/design/editorial_design.md diff --git a/docs/_static/edit/01_overwrite.png b/docs/_static/edit/01_overwrite.png new file mode 100644 index 0000000000000000000000000000000000000000..06e2f240a6309a4c321b2a158a65ecff73ee934d GIT binary patch literal 19725 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Ï_M7;Ck@ZT33jJ%M!mjLG32A9|CnWi^ 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 literal 0 HcmV?d00001 diff --git a/docs/_static/edit/02_insert.png b/docs/_static/edit/02_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..56b9a67b671cbecdc819225073e1624fb7fae681 GIT binary patch literal 15793 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 A+W-In literal 0 HcmV?d00001 diff --git a/docs/_static/edit/03_trim.png b/docs/_static/edit/03_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..a64b59e6dcb875f68bf09ca4bafe884dfb287496 GIT binary patch literal 12259 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 F`!{iz!iWF> literal 0 HcmV?d00001 diff --git a/docs/_static/edit/04_slice.png b/docs/_static/edit/04_slice.png new file mode 100644 index 0000000000000000000000000000000000000000..a3695e19b0bb11ab175bf69e9669687319a36225 GIT binary patch literal 13997 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 P0D)vBl_ZKGhVT9d2qEs; literal 0 HcmV?d00001 diff --git a/docs/_static/edit/06_slide.png b/docs/_static/edit/06_slide.png new file mode 100644 index 0000000000000000000000000000000000000000..42d974c4116b4d983480d5f2b44fbc783a49a6e4 GIT binary patch literal 13477 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 T;FoN{y&U=HDl(6CES$S)85X( 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/_static/edit/09_roll.png b/docs/_static/edit/09_roll.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8ca959032cf473999226fd2d3cffae19744b6d GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/docs/design/editorial_design.md b/docs/design/editorial_design.md new file mode 100644 index 0000000000..a20ed2bbe9 --- /dev/null +++ b/docs/design/editorial_design.md @@ -0,0 +1,355 @@ +Designing an Edit API +===================== + +# Design Overview +The industry is full of timeline management software but nearly all of them include a fundamental set of tools for manipulation. The most well known being: + +- Overwrite +- Trim +- Cut +- Slip +- Slide +- Ripple +- Roll +- Fill (3/4 Point Edit) + +OpenTimelineIO, while not seeking to become a fully realized NLE, could benefit from having a simple toolkit to help automate building/modifying timelines based on time rather than index alone. + +## Structure +The underlying implementation for these edit commands will be in C++, possibly under a new library called `openedit`. This has the benefit of connecting with other languages more simply (Python, Swift, C, etc.) and, hopefully, we only need expose the functionality to the bindings. + +``` +OpenTimelineIO/ + `- src/ + `- opentime/ + `- opentimelineio/ + `- openedit/ + `- ... +``` + +The benefit for the extra library is the edit suite will inevitably grow and will begin crowding the core model, which ultimately should be able to run without it. + +## Dependencies / Namespaces +The `openedit` library will have to communicate with both `opentime` and `openedit`. + +This will warrant either a new namespace `namespace openedit { ... }` or using `opentimelineio` again. The latter makes some of the bellow comments less challenging but again, might pollute an otherwise clean namespace. + +### ErrorStatus +This will present challenges when interfacing with the `ErrorStatus` of the different namespaces. That said, with a simple wrapper for this, we could have the instances auto convert as required. + +### Retainer +Ideally, we continue to use the `Retainer<>` where possible to make sure editing is reference counted. Namespaces might make the names a bit clunky, seeing `SerializedObject::Retainer<>` all over: + +``` +namespace openedit { OPENEDIT_VERSION { + +using namespace opentimelineio::OPENTIMELINEIO_VERSION; +auto item = SerializedObject::Retainer(...); + +} } +``` + +So perhaps establishing some common aliases early might help? +``` +using RetainedItem = SerializedObject::Retainer; +using RetainedComposition = SerializedObject::Retainer; +... +``` + +# Editing Commands +Let's go through some of the most common commands and what the possibly python API might look like: + +## Overwrite + +![Overwrite](../../_static/edit/01_overwrite.png) +- Anything overlapping is destroyed on contact. This may split an item. + +#### API +```py +""" +Args: + item: Item that we're going to place onto the track + track: Track that this item will belong to afterwards + composition_time: RationalTime in our composition to put + this item + fill_template: Optional[Item] that will be cloned where required + to fill in the event that this overwrite extends the end of the + composition's limit +""" +otio.algorithms.overwrite( + item: Item, + track: Track, + composition_time: RationalTime, + fill_template: Item = None, # Default to Gap +) +``` +- In the image, Clip `C` is `item` and `comp` is the track `A` and `B` are on. + +---- + +## Insert +![Insert](../_static/edit/02_insert.png) +- Items past the in point are shifted by the new items duration. +- Item may be split if required. + +#### API +```py +""" +Args: + +""" +otio.algorithms.insert( + item: Item, + track: Track, + composition_time: RationalTime, + fill_template: Item = None, # Default to Gap +) +``` + +--- + +## Trim +![Trim](../_static/03_trim.png) +- Adjust a single item's start time or duration. +- Do not affect other clips. +- Fill now-empty time with gap or template. +- Clamps source_range to non-gap boundary (can only overwrite gaps) + +#### API +```py +""" +Args: + item: Item to apply trim to + delta_in: RationalTime that the item's source_range().start_time() + will be adjusted by + delta_out: RationalTime that the item's + source_range().end_time_exclusive() will be adjusted by +""" +otio.algorithms.trim( + item: Item, + delta_in: RationalTime = None, #< Duration of change + delta_out: RationalTime = None, #< Duration of change + fill_template: Item = None, #< Default to Gap +) +``` +> Not convinced on the argument names for this + +--- + +## Slice +![Slice](../_static/04_slice.png) +- Slice an item, generating a clone of self and augment both item's source_range. + +#### API +```py +""" +Args: + item: otio.schema.Item - to cut + at_time: otio.schema.RationalTime - time, based on the + coordinates to slice at + coordinates: Enumerator for the variable calculations that + can be done to the at_time. + +Example: + Let item = A + let at_time = 25 @ 24fps + + 0 N + | ------------------------------------------- | + | [0 GAP 20][0 A 50] | + | ------------------------------------------- | + + if coordinates == Local: + | ------------------------------------------- | + | [0 GAP 20][0 A 25][26 A 50] | + | ------------------------------------------- | + + if coordinates == Parent: + | ------------------------------------------- | + | [0 GAP 20][0 A 5][6 A 50] | + | ------------------------------------------- | + + if coordinates == Global: + - This only matters if the parent is a track in a compound + stack, at which point we might be better off having the + user just convert from one time to the other +""" +otio.algorithms.slice( + item: Item, + at_time: RationalTime, + coordinates: otio.algorithms.Coordinates.(Local|Parent|Global*) +) +``` +> I'm not sure if we have a coordinate enumerator already? + +--- + + +## Slip +![Slip](../_static/05_slip) +- Adjust the start_time of an item's source_range. +- Do not affect surrounding items. +- Clamp to available_range of media (if available) + +#### API +```py +""" +Args: + item: Item that we're slipping + delta: RationalTime to adjust the range by. +""" +otio.algorithms.slip( + item: Item, + delta: RationalTime, +) +``` +- In the example image, `C` is `item` and `delta` is the arrow's vector. + +> Effectively this is already quite simple in the core API but would be nice to have here. + +--- + + +## Slide +![Slide](../_static/06_slide.png) +- Adjust start time of item and trim adjacent items to fill +- Do not change main item's duration, only adjacent +- Clamp to available range of adjacent items (if available) + +#### API +```py +""" +Args: + item: The item to push and pull around, which may in turn affect the + items around it. + delta: The delta that we're looking to push this item about. +""" +otio.algorithms.slide( + item: Item, + delta: RationalTime, # Relative like slide +) +``` +- In the example image, `C` is `item` and `delta` is the arrow's vector. The edit command does the rest of the item management for us. + +--- + +## Ripple +![Ripple](../_static/07_ripple.png) +- Adjust a source_range without adjusting any other items +- This effectively shifts all currently adjacent items to stay at the edges +- No items _before_ the item are moved/affected +- (Impl detail for otio, this is the same as adjusting the source_range of the item) + +#### API +```py +""" +Args: + item: The item to initiate the edit on + delta_in: see trim() + delta_out: see trim() +""" +otio.algorithms.ripple( + item: Item, + delta_in: RationalTime = None, #< Duration of change + delta_out: RationalTime = None, #< Duration of change +) +``` +- In the example image, `A` is item and `delta_out` is a negative RationalTime. The edit command shifts `B` without adjusting it's source_range. + +> Again, no crazy about the argument names + +--- + + +## Roll +![Roll](../_static/09_roll.png) +- Any trim-like action results in adjacent items source_range being adjusted to fit +- No new items are ever created +- Clamped to available media (if available) + +#### API +````py +""" +Args: + item: The item to initiate the edit on + delta_in: see trim() + delta_out: see trim() +""" +otio.algorithms.roll( + item: Item, + delta_in: RationalTime = None, #< Duration of change + delta_out: RationalTime = None, #< Duration of change +) +```` +- In the example image, `A` is the item and `delta_out` is a negative RationalTime. The edit command augments `B` without changing it's `source_range().end_time_exclusive()` +- If `delta_in` is supplied, the item to the left of `A` would be modified (if any) - otherwise we may need to add a `Gap` / fill template. + +--- + +## 3/4 Point Edit +![3_4 Point Edit](../_static/08_pointedit.png) +- The most complex - this "fills" a gap based on a source in/out point _or_ track in/out point +- Often used to patch in items as edit is built +- Note: This can be accomplished by a conjunction of commands above + +### API +```py +""" +Args: + item: The item to place onto the track + track: Track that will now own this item + replace: Item (or RT?) that we will effectively replace + reference_point: For 4 point editing, the reference point dictates what + transform to use when running the fill. + + Options: + - Source : Don't modify the source, overwrite if required + - Sequence : Don't modify the sequence, trim item if required + - Fit : Apply Time Effect +""" +otio.algorithms.fill( + item: Item, + track: Track, + replace: Item = None, # Alternatively, we could have a parent-coord + # RationalTime to find the item for us + reference_point: otio.algorithms.ReferencePoint.Source +) +``` +- This may still require some additional tinkering. + + +# Expanded Implementation + +## Proposal +For editing commands, we should strive to do all validation and assert that everything "works" before committing anything on the timeline. A simple atomic command structure will provide that level of sophistication. + +```cpp +class EditEvent { +public: + EditEventKind kind; // e.g. Insert, Append, Remove, Modify + Retainer parent; + Retainer composable; + + // ... Additional fields to execute the above as required + + bool run(ErrorStatus* error_status); + bool revert(); +}; +``` +An event is atomic in nature and does "one thing" to an `Item`. Each edit maneuver (e.g. `otio.algorithms.overwrite(...)`) would generate a vector of these events that can be played forward and, possibly, backward. The result of them collectively is the commands result. + +```cpp +for (EditEvent &event: events) { + event.run(error_status); + if (*error_status) { + for (auto it = completed_events.rbegin(); /*...*/) + (*it).revert(); + break; + } + completed_events.push_back(event); +} +``` + +## Overall +Many of the commands mentioned have common code paths and math that is required. We can streamline many of the placement commands into a single call with different options. We can then expose that as a raw edit platform while giving users the common algorithms for ease-of-use. + From e1e5c08564b3851c01fbfd925775558bd9d10c3d Mon Sep 17 00:00:00 2001 From: Michael McCartney Date: Fri, 22 May 2020 20:18:53 -0400 Subject: [PATCH 2/5] Fix broken image links --- docs/design/editorial_design.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/design/editorial_design.md b/docs/design/editorial_design.md index a20ed2bbe9..92ae7bc214 100644 --- a/docs/design/editorial_design.md +++ b/docs/design/editorial_design.md @@ -61,7 +61,7 @@ Let's go through some of the most common commands and what the possibly python A ## Overwrite -![Overwrite](../../_static/edit/01_overwrite.png) +![Overwrite](../_static/edit/01_overwrite.png) - Anything overlapping is destroyed on contact. This may split an item. #### API @@ -109,7 +109,7 @@ otio.algorithms.insert( --- ## Trim -![Trim](../_static/03_trim.png) +![Trim](../_static/edit/03_trim.png) - Adjust a single item's start time or duration. - Do not affect other clips. - Fill now-empty time with gap or template. @@ -137,7 +137,7 @@ otio.algorithms.trim( --- ## Slice -![Slice](../_static/04_slice.png) +![Slice](../_static/edit/04_slice.png) - Slice an item, generating a clone of self and augment both item's source_range. #### API @@ -186,7 +186,7 @@ otio.algorithms.slice( ## Slip -![Slip](../_static/05_slip) +![Slip](../_static/edit/05_slip) - Adjust the start_time of an item's source_range. - Do not affect surrounding items. - Clamp to available_range of media (if available) @@ -211,7 +211,7 @@ otio.algorithms.slip( ## Slide -![Slide](../_static/06_slide.png) +![Slide](../_static/edit/06_slide.png) - Adjust start time of item and trim adjacent items to fill - Do not change main item's duration, only adjacent - Clamp to available range of adjacent items (if available) @@ -234,7 +234,7 @@ otio.algorithms.slide( --- ## Ripple -![Ripple](../_static/07_ripple.png) +![Ripple](../_static/edit/07_ripple.png) - Adjust a source_range without adjusting any other items - This effectively shifts all currently adjacent items to stay at the edges - No items _before_ the item are moved/affected @@ -262,7 +262,7 @@ otio.algorithms.ripple( ## Roll -![Roll](../_static/09_roll.png) +![Roll](../_static/edit/09_roll.png) - Any trim-like action results in adjacent items source_range being adjusted to fit - No new items are ever created - Clamped to available media (if available) @@ -287,7 +287,7 @@ otio.algorithms.roll( --- ## 3/4 Point Edit -![3_4 Point Edit](../_static/08_pointedit.png) +![3_4 Point Edit](../_static/edit/08_pointedit.png) - The most complex - this "fills" a gap based on a source in/out point _or_ track in/out point - Often used to patch in items as edit is built - Note: This can be accomplished by a conjunction of commands above From eaefe8a6d7099be185fbdbb656707a6a4ebb703e Mon Sep 17 00:00:00 2001 From: Michael McCartney Date: Fri, 22 May 2020 20:44:13 -0400 Subject: [PATCH 3/5] Minor grammar --- docs/design/editorial_design.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/design/editorial_design.md b/docs/design/editorial_design.md index 92ae7bc214..d84c7b5ec3 100644 --- a/docs/design/editorial_design.md +++ b/docs/design/editorial_design.md @@ -57,7 +57,7 @@ using RetainedComposition = SerializedObject::Retainer; ``` # Editing Commands -Let's go through some of the most common commands and what the possibly python API might look like: +Let's go through some of the most common commands and what the python API might look like: ## Overwrite @@ -70,8 +70,7 @@ Let's go through some of the most common commands and what the possibly python A Args: item: Item that we're going to place onto the track track: Track that this item will belong to afterwards - composition_time: RationalTime in our composition to put - this item + track_time: RationalTime of our track to put this item at fill_template: Optional[Item] that will be cloned where required to fill in the event that this overwrite extends the end of the composition's limit @@ -79,11 +78,11 @@ Args: otio.algorithms.overwrite( item: Item, track: Track, - composition_time: RationalTime, + track_time: RationalTime, fill_template: Item = None, # Default to Gap ) ``` -- In the image, Clip `C` is `item` and `comp` is the track `A` and `B` are on. +- In the image, Clip `C` is `item` and `track` is the what `A` and `B` are on. ---- @@ -186,7 +185,7 @@ otio.algorithms.slice( ## Slip -![Slip](../_static/edit/05_slip) +![Slip](../_static/edit/05_slip.png) - Adjust the start_time of an item's source_range. - Do not affect surrounding items. - Clamp to available_range of media (if available) From e501b4d26169395ecc0d626b5a7feaf7f3c43c30 Mon Sep 17 00:00:00 2001 From: Michael McCartney Date: Thu, 28 May 2020 09:04:44 -0400 Subject: [PATCH 4/5] Additional design pass from feeback - openedit scrubbed in favor of opentimelineio/algo - better overview statement for the purpose of the project - clarification of audience - ASCII art and additional constraints for various commands (still more to do) --- docs/design/editorial_design.md | 261 ++++++++++++++++++++++++++------ 1 file changed, 217 insertions(+), 44 deletions(-) diff --git a/docs/design/editorial_design.md b/docs/design/editorial_design.md index d84c7b5ec3..56de584fc9 100644 --- a/docs/design/editorial_design.md +++ b/docs/design/editorial_design.md @@ -2,54 +2,32 @@ Designing an Edit API ===================== # Design Overview -The industry is full of timeline management software but nearly all of them include a fundamental set of tools for manipulation. The most well known being: +The industry is full of timeline management software but nearly all of them include a fundamental set of tools for manipulation. OpenTimelineIO includes a suite of tools for operating on objects as raw data structures (append, etc), but is missing a library for performing higher level operations familiar to people from the editing world (Slip, 3/4 point edit, etc). This proposal presents an API for working with OpenTimelineIO objects in those ways. -- Overwrite -- Trim -- Cut -- Slip -- Slide -- Ripple -- Roll -- Fill (3/4 Point Edit) +## Audience + +1. The implementer(s) of the API +2. Future users of the API - TDs and DCC developers +3. Future Maintainers -OpenTimelineIO, while not seeking to become a fully realized NLE, could benefit from having a simple toolkit to help automate building/modifying timelines based on time rather than index alone. ## Structure -The underlying implementation for these edit commands will be in C++, possibly under a new library called `openedit`. This has the benefit of connecting with other languages more simply (Python, Swift, C, etc.) and, hopefully, we only need expose the functionality to the bindings. +The underlying implementation for these edit commands will be in C++, under the `opentimelineio/algo` directory. ``` OpenTimelineIO/ `- src/ - `- opentime/ `- opentimelineio/ - `- openedit/ - `- ... + `- algo/ + `- ... ``` -The benefit for the extra library is the edit suite will inevitably grow and will begin crowding the core model, which ultimately should be able to run without it. - -## Dependencies / Namespaces -The `openedit` library will have to communicate with both `opentime` and `openedit`. - -This will warrant either a new namespace `namespace openedit { ... }` or using `opentimelineio` again. The latter makes some of the bellow comments less challenging but again, might pollute an otherwise clean namespace. - -### ErrorStatus -This will present challenges when interfacing with the `ErrorStatus` of the different namespaces. That said, with a simple wrapper for this, we could have the instances auto convert as required. +## Schemas +The editing toolkit will only posses the ability to modify and work with OpenTimelineIO `Schema` objects but will not host any of it's own. All core models should be defined elsewhere. ### Retainer -Ideally, we continue to use the `Retainer<>` where possible to make sure editing is reference counted. Namespaces might make the names a bit clunky, seeing `SerializedObject::Retainer<>` all over: - -``` -namespace openedit { OPENEDIT_VERSION { +Ideally, we continue to use the `Retainer<>` where possible to make sure editing is reference counted. Namespaces might make the names a bit clunky, seeing `SerializedObject::Retainer<>` all over so establishing aliases early on will be beneficial. -using namespace opentimelineio::OPENTIMELINEIO_VERSION; -auto item = SerializedObject::Retainer(...); - -} } -``` - -So perhaps establishing some common aliases early might help? ``` using RetainedItem = SerializedObject::Retainer; using RetainedComposition = SerializedObject::Retainer; @@ -62,7 +40,10 @@ Let's go through some of the most common commands and what the python API might ## Overwrite ![Overwrite](../_static/edit/01_overwrite.png) -- Anything overlapping is destroyed on contact. This may split an item. +- Augment the source range of overlapping items +- Remove items wholly contained by the new item (eclipsed) +- If current track item would contain new item, current item is split and source ranges are adjusted on both to fit +- If placing passed the duration of the track, use template to fill and no other items are affected #### API ```py @@ -73,7 +54,57 @@ Args: track_time: RationalTime of our track to put this item at fill_template: Optional[Item] that will be cloned where required to fill in the event that this overwrite extends the end of the - composition's limit + track's current duration + +Example: + let item = C + let track_item = 10 @ 24 + + --- + 1 - Item overlaps "GAP" and "A", contains "B" + + [0 C 40] + 0 | N + | ------------------------------------------- | + | [0 GAP 20][0 B 10][0 A 30] | + | ------------------------------------------- | + + RESULT + - "C" inserted after "GAP" + - "B" Removed + - "GAP" duration changed + - "A" source start + duration changed + | ------------------------------------------- | + | [GAP ][0 C 40][10 A 30] | + | ------------------------------------------- | + + --- + 2 - Item is contained by track item + + [0 C 40] + 0 | N + | ------------------------------------------- | + | [0 A 50] | + | ------------------------------------------- | + + RESULT - "A" split at track_time and after-item source start shifted + forward and duration of both "A" items augmented + | ------------------------------------------- | + | [ A 10][0 C 40][40 A ] | + | ------------------------------------------- | + + --- + 3 - Item is passed tracks current duration + [0 C 40] + 0 | N + | ------------------------------------------- | + | | + | ------------------------------------------- | + + RESUT - Fill template cloned to fill empty space + | ------------------------------------------- | + | [ FILL ][0 C 40] | + | ------------------------------------------- | """ otio.algorithms.overwrite( item: Item, @@ -88,6 +119,7 @@ otio.algorithms.overwrite( ## Insert ![Insert](../_static/edit/02_insert.png) +- Item placed on track_time - Items past the in point are shifted by the new items duration. - Item may be split if required. @@ -96,11 +128,46 @@ otio.algorithms.overwrite( """ Args: + +Example: + let item = C + let track_time = 10 @ 24 + + 1 - Item overlaps "GAP" and "A", contains "B" + + [0 C 40] + 0 | N + | ------------------------------------------- | + | [0 GAP 20][0 B 10][0 A 30] | + | ------------------------------------------- | + + RESULT + - "GAP" split at track_time + - Existing "GAP" duration reduced + - New "GAP" duration adjusted to fit the rest + - "C" inserted into track children after existing GAP + - "B" and "A" left unchanged + | ------------------------------------------- | + | [GAP ][0 C 40][10 GAP 20][0 B ... + | ------------------------------------------- | + + + 2 - Item is passed tracks current duration (eqiv to overwrite) + [0 C 40] + 0 | N + | ------------------------------------------- | + | | + | ------------------------------------------- | + + RESUT - Fill template cloned to fill empty space + | ------------------------------------------- | + | [ FILL ][0 C 40] | + | ------------------------------------------- | """ otio.algorithms.insert( item: Item, track: Track, - composition_time: RationalTime, + track_time: RationalTime, fill_template: Item = None, # Default to Gap ) ``` @@ -111,7 +178,8 @@ otio.algorithms.insert( ![Trim](../_static/edit/03_trim.png) - Adjust a single item's start time or duration. - Do not affect other clips. -- Fill now-empty time with gap or template. +- Fill now-empty time with gap or template + - Unless item is meeting a Gap, then, existing Gap's duration will be augments - Clamps source_range to non-gap boundary (can only overwrite gaps) #### API @@ -123,6 +191,47 @@ Args: will be adjusted by delta_out: RationalTime that the item's source_range().end_time_exclusive() will be adjusted by + +Example: + let item = A + + Given: + | ------------------------------------------- | + | [0 GAP 20][5 A 50][0 B 10] | + | ------------------------------------------- | + + 1. +delta_in + let delta_in = 5 @ 24 + - "A" source start and duration adjusted + - "GAP" duration augmented + | ------------------------------------------- | + | [0 GAP 25][10 A 50][0 B 10] | + | ------------------------------------------- | + + 2. -delta_in + let delta_in = -5 @ 24 + - "A" source start and duration adjusted + - "GAP" duration augmented by delta_out + | ------------------------------------------- | + | [0 GAP 15][0 A 50][0 B 10] | + | ------------------------------------------- | + + 3. +delta_out + left delta_out = 5 @ 24 + - "B", because it's not a "GAP", blocks "A" from trimming duration + - EFFECTIVELY NO CHANGES + | ------------------------------------------- | + | [0 GAP 20][5 A 50][0 B 10] | + | ------------------------------------------- | + + 4. -delta_out + left delta_out = -5 @ 24 + - "A" duration augmented by delta_out + - "FILL" inserted with duration of -delta_out + | ------------------------------------------- | + | [0 GAP 20][5 A 45][FILL][0 B 10] | + | ------------------------------------------- | + """ otio.algorithms.trim( item: Item, @@ -131,6 +240,8 @@ otio.algorithms.trim( fill_template: Item = None, #< Default to Gap ) ``` +**QUESTION:** Should there be an `overwrite=bool` parameter to allow case 3 to push through B? It is not default because that would effectively be a `Roll` edit. + > Not convinced on the argument names for this --- @@ -155,7 +266,7 @@ Example: 0 N | ------------------------------------------- | - | [0 GAP 20][0 A 50] | + | [0 GAP 20][0 A 50] | | ------------------------------------------- | if coordinates == Local: @@ -165,7 +276,7 @@ Example: if coordinates == Parent: | ------------------------------------------- | - | [0 GAP 20][0 A 5][6 A 50] | + | [0 GAP 20][0 A 5][6 A 50] | | ------------------------------------------- | if coordinates == Global: @@ -187,6 +298,7 @@ otio.algorithms.slice( ## Slip ![Slip](../_static/edit/05_slip.png) - Adjust the start_time of an item's source_range. +- Do not affect item duration. - Do not affect surrounding items. - Clamp to available_range of media (if available) @@ -196,6 +308,33 @@ otio.algorithms.slice( Args: item: Item that we're slipping delta: RationalTime to adjust the range by. + +Example: + let item = A + + Given: + | ------------------------------------------- | + | [0 GAP 20][5 A 50][0 B 10] | + | ------------------------------------------- | + + --- + 1. +delta + let delta = 10 @ 24 + - "A" source start augmented by: + min("A".source_avail.end, "A".source.start + delta) + | ------------------------------------------- | + | [0 GAP 20][15 A 60][0 B 10] | + | ------------------------------------------- | + + --- + 2. -delta + let delta = -10 @ 24 + - "A" source start augmented by: + max("A".source_avail.start, "A".source.start + delta) + - Because "A" only had 5 frames to give, the clamp occurs + | ------------------------------------------- | + | [0 GAP 20][0 A 45][0 B 10] | + | ------------------------------------------- | """ otio.algorithms.slip( item: Item, @@ -214,6 +353,7 @@ otio.algorithms.slip( - Adjust start time of item and trim adjacent items to fill - Do not change main item's duration, only adjacent - Clamp to available range of adjacent items (if available) +- Will not remove any item #### API ```py @@ -222,6 +362,32 @@ Args: item: The item to push and pull around, which may in turn affect the items around it. delta: The delta that we're looking to push this item about. + +Example: + let item = A + + Given: + | ------------------------------------------- | + | [0 GAP 20][5 A 50][5 B 20] | + | ------------------------------------------- | + + --- + 1. +delta + let delta = 5 @ 24 + - Limit +delta to min("GAP".avail.duration, "B".duration) + - Note: "GAP".avail.duration considered inf for edits + | ------------------------------------------- | + | [0 GAP 25][5 A 50][10 B 20] | + | ------------------------------------------- | + + --- + 2. -delta + let delta = -10 @ 24 + - Limit -delta to min("GAP".duration, "B".avail.duration) + - Results in A only moving -5 @ 24. + | ------------------------------------------- | + | [0 GAP 15][5 A 50][0 B 20] | + | ------------------------------------------- | """ otio.algorithms.slide( item: Item, @@ -230,6 +396,8 @@ otio.algorithms.slide( ``` - In the example image, `C` is `item` and `delta` is the arrow's vector. The edit command does the rest of the item management for us. +> **Note:** This brings up a missing piece that `overwrite` doesn't quite fill, the `move` action which will leave a gap/full template in it's wake but will effectively slide an item with the power to remove items if they are contained. This is like clicking and dragging a clip around a single track in most NLEs. + --- ## Ripple @@ -255,7 +423,7 @@ otio.algorithms.ripple( ``` - In the example image, `A` is item and `delta_out` is a negative RationalTime. The edit command shifts `B` without adjusting it's source_range. -> Again, no crazy about the argument names +> Again, not crazy about the argument names --- @@ -297,7 +465,7 @@ otio.algorithms.roll( Args: item: The item to place onto the track track: Track that will now own this item - replace: Item (or RT?) that we will effectively replace + track_time: RationalTime... reference_point: For 4 point editing, the reference point dictates what transform to use when running the fill. @@ -309,8 +477,7 @@ Args: otio.algorithms.fill( item: Item, track: Track, - replace: Item = None, # Alternatively, we could have a parent-coord - # RationalTime to find the item for us + track_time: RationalTime, reference_point: otio.algorithms.ReferencePoint.Source ) ``` @@ -320,6 +487,9 @@ otio.algorithms.fill( # Expanded Implementation ## Proposal + +> **Note:** This is currently in discussion and will most likely be removed in favor of a different system + For editing commands, we should strive to do all validation and assert that everything "works" before committing anything on the timeline. A simple atomic command structure will provide that level of sophistication. ```cpp @@ -352,3 +522,6 @@ for (EditEvent &event: events) { ## Overall Many of the commands mentioned have common code paths and math that is required. We can streamline many of the placement commands into a single call with different options. We can then expose that as a raw edit platform while giving users the common algorithms for ease-of-use. +As an example, the `overrwrite` and `insert` commands require intersection information and handle the case of placing an item passed the current track's duration in the same manner. Having a standard, atomic means of editing, allows us to cut down on duplicated code. + +> This will also take some tinkering to make sure we're not generating monolithic functions. \ No newline at end of file From 8bbb1ce8d7c6ef9a68f1790ba7c811955897da7a Mon Sep 17 00:00:00 2001 From: Michael McCartney Date: Fri, 5 Jun 2020 18:55:49 -0400 Subject: [PATCH 5/5] Addition nomenclature and ASCII art --- docs/design/editorial_design.md | 144 +++++++++++++++++++++++++++----- 1 file changed, 124 insertions(+), 20 deletions(-) diff --git a/docs/design/editorial_design.md b/docs/design/editorial_design.md index 56de584fc9..a0e2b2df50 100644 --- a/docs/design/editorial_design.md +++ b/docs/design/editorial_design.md @@ -40,10 +40,7 @@ Let's go through some of the most common commands and what the python API might ## Overwrite ![Overwrite](../_static/edit/01_overwrite.png) -- Augment the source range of overlapping items -- Remove items wholly contained by the new item (eclipsed) -- If current track item would contain new item, current item is split and source ranges are adjusted on both to fit -- If placing passed the duration of the track, use template to fill and no other items are affected +- Because this handles multiple scenarios, please refer to the ASCII art below for the various scenarios #### API ```py @@ -56,7 +53,7 @@ Args: to fill in the event that this overwrite extends the end of the track's current duration -Example: +Scenarios: let item = C let track_item = 10 @ 24 @@ -79,7 +76,7 @@ Example: | ------------------------------------------- | --- - 2 - Item is contained by track item + 2 - Item is contained by track item "A" [0 C 40] 0 | N @@ -87,10 +84,12 @@ Example: | [0 A 50] | | ------------------------------------------- | - RESULT - "A" split at track_time and after-item source start shifted - forward and duration of both "A" items augmented + RESULT + - "A" split at track_time (See documentation below for procedure) + - "A'" source_range start = "A" source_range end + "C" duration + - "C" inserted after "A" | ------------------------------------------- | - | [ A 10][0 C 40][40 A ] | + | [ A 10][0 C 40][40 A' ] | | ------------------------------------------- | --- @@ -101,7 +100,8 @@ Example: | | | ------------------------------------------- | - RESUT - Fill template cloned to fill empty space + RESUT + - Fill template cloned to fill empty space | ------------------------------------------- | | [ FILL ][0 C 40] | | ------------------------------------------- | @@ -119,7 +119,7 @@ otio.algorithms.overwrite( ## Insert ![Insert](../_static/edit/02_insert.png) -- Item placed on track_time +- Item placed at track_time - Items past the in point are shifted by the new items duration. - Item may be split if required. @@ -129,7 +129,7 @@ otio.algorithms.overwrite( Args: -Example: +Scenarios: let item = C let track_time = 10 @ 24 @@ -178,8 +178,8 @@ otio.algorithms.insert( ![Trim](../_static/edit/03_trim.png) - Adjust a single item's start time or duration. - Do not affect other clips. -- Fill now-empty time with gap or template - - Unless item is meeting a Gap, then, existing Gap's duration will be augments +- Fill now-"empty" time with gap or template + - Unless item is meeting a Gap, then, existing Gap's duration will be augmented - Clamps source_range to non-gap boundary (can only overwrite gaps) #### API @@ -192,7 +192,7 @@ Args: delta_out: RationalTime that the item's source_range().end_time_exclusive() will be adjusted by -Example: +Scenarios: let item = A Given: @@ -248,7 +248,9 @@ otio.algorithms.trim( ## Slice ![Slice](../_static/edit/04_slice.png) -- Slice an item, generating a clone of self and augment both item's source_range. +- Generate clone of input item +- Insert clone after original +- Augment both item's source_range. #### API ```py @@ -260,7 +262,7 @@ Args: coordinates: Enumerator for the variable calculations that can be done to the at_time. -Example: +Scenarios: Let item = A let at_time = 25 @ 24fps @@ -309,7 +311,7 @@ Args: item: Item that we're slipping delta: RationalTime to adjust the range by. -Example: +Scenarios: let item = A Given: @@ -363,7 +365,7 @@ Args: items around it. delta: The delta that we're looking to push this item about. -Example: +Scenarios: let item = A Given: @@ -402,7 +404,7 @@ otio.algorithms.slide( ## Ripple ![Ripple](../_static/edit/07_ripple.png) -- Adjust a source_range without adjusting any other items +- Adjust a source_range without affecting any other items - This effectively shifts all currently adjacent items to stay at the edges - No items _before_ the item are moved/affected - (Impl detail for otio, this is the same as adjusting the source_range of the item) @@ -414,6 +416,57 @@ Args: item: The item to initiate the edit on delta_in: see trim() delta_out: see trim() + +Scenarios: + let item = A + + Given: + | ------------------------------------------- | + | [0 GAP 20][5 A 30][5 B 20] | + | ------------------------------------------- | + + --- + 1. +delta_in + let delta_in = 10 @ 24 + - "A" still meets "GAP" and "B" + - Neither "GAP" nor "B" have changed duration, only "B"s + start_time_in_parent + | ------------------------------------------- | + | [0 GAP 20][15 A 30][5 B 20] | + | ------------------------------------------- | + + --- + 2. -delta_in + let delta_in = -10 @ 25 + - "A" still meets "GAP" and "B" + - Neither "GAP" nor "B" have changed duration, only "B"s + start_time_in_parent + - "A" only had 5 frames available so delta was clamped + | ------------------------------------------- | + | [0 GAP 20][0 A 30][5 B 20] | + | ------------------------------------------- | + + --- + 3. +delta_out + let delta_out = 10 @ 24 + - "A" still meets "GAP" and "B" + - Neither "GAP" nor "B" have changed duration, only "B"s + start_time_in_parent + | ------------------------------------------- | + | [0 GAP 20][5 A 40][5 B 20] | + | ------------------------------------------- | + + + --- + 3. -delta_out + let delta_out = -10 @ 24 + - "A" still meets "GAP" and "B" + - Neither "GAP" nor "B" have changed duration, only "B"s + start_time_in_parent + | ------------------------------------------- | + | [0 GAP 20][5 A 20][5 B 20] | + | ------------------------------------------- | + """ otio.algorithms.ripple( item: Item, @@ -433,6 +486,8 @@ otio.algorithms.ripple( - Any trim-like action results in adjacent items source_range being adjusted to fit - No new items are ever created - Clamped to available media (if available) +- Start time in parent of Item _before_ input item will never change +- End time in parent of Item _after_ input item will never change #### API ````py @@ -441,6 +496,55 @@ Args: item: The item to initiate the edit on delta_in: see trim() delta_out: see trim() + + +Scenarios: + let item = A + + Given: + | ------------------------------------------- | + | [0 GAP 20][5 A 30][5 B 20] | + | ------------------------------------------- | + + --- + 1. +delta_in + let delta_in = 10 @ 24 + - "GAP" duration extended to keep meeting "A" + - Same outcome as trim when item meets "GAP" + | ------------------------------------------- | + | [0 GAP 30][15 A 30][5 B 20] | + | ------------------------------------------- | + + --- + 2. -delta_in + let delta_in = -10 @ 25 + - "GAP" duration shortened to keep meeting "A" + - Same outcome as trim when item meets "GAP" + - "A" only had 5 frames available so delta clamped + | ------------------------------------------- | + | [0 GAP 15][0 A 30][5 B 20] | + | ------------------------------------------- | + + --- + 3. +delta_out + let delta_out = 10 @ 24 + - "A" still meets "GAP" and "B" + - "B" start time + delta_out + - "B" duration - delta_out + | ------------------------------------------- | + | [0 GAP 20][5 A 40][15 B 20] | + | ------------------------------------------- | + + --- + 3. -delta_out + let delta_out = -10 @ 24 + - "A" duration - delta + - "B" source_range.start - delta + - "B" source_range.duration + delta + - Note: "B" only had 5 frames available so delta clamped + | ------------------------------------------- | + | [0 GAP 20][5 A 25][0 B 20] | + | ------------------------------------------- | """ otio.algorithms.roll( item: Item,