mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 08:24:53 +01:00
Apply frame offset to timewarp to handle source frame offset.
This commit is contained in:
parent
43700c7f61
commit
f5bd7a9172
2 changed files with 76 additions and 44 deletions
|
|
@ -441,6 +441,15 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end):
|
||||||
in_frame += time_scalar
|
in_frame += time_scalar
|
||||||
frame_range.append(in_frame)
|
frame_range.append(in_frame)
|
||||||
|
|
||||||
|
# Different editorial DCC might have different TimeWarp logic.
|
||||||
|
# The following logic assumes that the "lookup" list values are
|
||||||
|
# frame offsets relative to the current source frame number.
|
||||||
|
#
|
||||||
|
# media_source_range |______1_____|______2______|______3______|
|
||||||
|
#
|
||||||
|
# media_retimed_range |______2_____|______2______|______3______|
|
||||||
|
#
|
||||||
|
# TimeWarp lookup +1 0 0
|
||||||
for tw_idx, tw in enumerate(time_warp_nodes):
|
for tw_idx, tw in enumerate(time_warp_nodes):
|
||||||
for idx, frame_number in enumerate(frame_range):
|
for idx, frame_number in enumerate(frame_range):
|
||||||
# First timewarp, apply on media range
|
# First timewarp, apply on media range
|
||||||
|
|
@ -467,9 +476,32 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end):
|
||||||
)
|
)
|
||||||
|
|
||||||
# adjust range if needed
|
# adjust range if needed
|
||||||
|
media_in_trimmed_before_tw = media_in_trimmed
|
||||||
media_in_trimmed = max(min(frame_range), media_in)
|
media_in_trimmed = max(min(frame_range), media_in)
|
||||||
media_out_trimmed = min(max(frame_range), media_out)
|
media_out_trimmed = min(max(frame_range), media_out)
|
||||||
|
|
||||||
|
# If TimeWarp changes the first frame of the soure range,
|
||||||
|
# we need to offset the first TimeWarp values accordingly.
|
||||||
|
#
|
||||||
|
# expected_range |______2_____|______2______|______3______|
|
||||||
|
#
|
||||||
|
# EDITORIAL
|
||||||
|
# media_source_range |______1_____|______2______|______3______|
|
||||||
|
#
|
||||||
|
# TimeWarp lookup +1 0 0
|
||||||
|
#
|
||||||
|
# EXTRACTED PLATE
|
||||||
|
# plate_range |______2_____|______3______|_ _ _ _ _ _ _|
|
||||||
|
#
|
||||||
|
# expected TimeWarp 0 -1 -1
|
||||||
|
if media_in_trimmed != media_in_trimmed_before_tw:
|
||||||
|
offset = media_in_trimmed_before_tw - media_in_trimmed
|
||||||
|
offset *= 1.0 / time_scalar
|
||||||
|
time_warp_nodes[0]["lookup"] = [
|
||||||
|
value + offset
|
||||||
|
for value in time_warp_nodes[0]["lookup"]
|
||||||
|
]
|
||||||
|
|
||||||
# adjust available handles if needed
|
# adjust available handles if needed
|
||||||
if (media_in_trimmed - media_in) < handle_start:
|
if (media_in_trimmed - media_in) < handle_start:
|
||||||
handle_start = max(0, media_in_trimmed - media_in)
|
handle_start = max(0, media_in_trimmed - media_in)
|
||||||
|
|
|
||||||
|
|
@ -231,17 +231,17 @@ def test_movie_timewarp():
|
||||||
'Class': 'TimeWarp',
|
'Class': 'TimeWarp',
|
||||||
'length': 4.0,
|
'length': 4.0,
|
||||||
'lookup': [
|
'lookup': [
|
||||||
2.0,
|
0.0,
|
||||||
1.8959999809265136,
|
-0.10400001907348644,
|
||||||
1.767999971389771,
|
-0.23200002861022906,
|
||||||
1.59199997138977,
|
-0.4080000286102301,
|
||||||
1.3439999809265135,
|
-0.6560000190734865,
|
||||||
1.0,
|
-1.0,
|
||||||
0.5440000181198119,
|
-1.455999981880188,
|
||||||
-0.007999974250793684,
|
-2.0079999742507937,
|
||||||
-0.6319999756813051,
|
-2.631999975681305,
|
||||||
-1.3039999847412114,
|
-3.3039999847412114,
|
||||||
-2.0
|
-4.0
|
||||||
],
|
],
|
||||||
'name': 'TimeWarp2'
|
'name': 'TimeWarp2'
|
||||||
}
|
}
|
||||||
|
|
@ -581,17 +581,17 @@ def test_img_sequence_timewarp_beyond_range():
|
||||||
'Class': 'TimeWarp',
|
'Class': 'TimeWarp',
|
||||||
'length': 1.0,
|
'length': 1.0,
|
||||||
'lookup': [
|
'lookup': [
|
||||||
-5.0,
|
0.0,
|
||||||
-3.9440000305175777,
|
1.0559999694824223,
|
||||||
-2.852000034332275,
|
2.147999965667725,
|
||||||
-1.6880000228881844,
|
3.3119999771118156,
|
||||||
-0.4160000076293944,
|
4.583999992370606,
|
||||||
1.0,
|
6.0,
|
||||||
2.5839999923706056,
|
7.583999992370606,
|
||||||
4.311999977111817,
|
9.311999977111817,
|
||||||
6.147999965667726,
|
11.147999965667726,
|
||||||
8.055999969482421,
|
13.055999969482421,
|
||||||
10.0
|
15.0
|
||||||
],
|
],
|
||||||
'name': 'TimeWarp3'
|
'name': 'TimeWarp3'
|
||||||
}
|
}
|
||||||
|
|
@ -632,17 +632,17 @@ def test_img_sequence_2X_speed_timewarp():
|
||||||
'Class': 'TimeWarp',
|
'Class': 'TimeWarp',
|
||||||
'length': 4.0,
|
'length': 4.0,
|
||||||
'lookup': [
|
'lookup': [
|
||||||
2.0,
|
0.0,
|
||||||
1.7039999923706055,
|
-0.2960000076293945,
|
||||||
1.431999991416931,
|
-0.568000008583069,
|
||||||
1.2079999942779531,
|
-0.7920000057220469,
|
||||||
1.055999998092652,
|
-0.944000001907348,
|
||||||
1.0,
|
-1.0,
|
||||||
1.056000007629395,
|
-0.9439999923706051,
|
||||||
1.208000022888184,
|
-0.791999977111816,
|
||||||
1.432000034332276,
|
-0.5679999656677239,
|
||||||
1.7040000305175766,
|
-0.29599996948242335,
|
||||||
2.0
|
0.0
|
||||||
],
|
],
|
||||||
'name': 'TimeWarp6'
|
'name': 'TimeWarp6'
|
||||||
}
|
}
|
||||||
|
|
@ -682,17 +682,17 @@ def test_img_sequence_multiple_timewarps():
|
||||||
'Class': 'TimeWarp',
|
'Class': 'TimeWarp',
|
||||||
'length': 1.0,
|
'length': 1.0,
|
||||||
'lookup': [
|
'lookup': [
|
||||||
-5.0,
|
0.0,
|
||||||
-3.9440000305175777,
|
1.0559999694824223,
|
||||||
-2.852000034332275,
|
2.147999965667725,
|
||||||
-1.6880000228881844,
|
3.3119999771118156,
|
||||||
-0.4160000076293944,
|
4.583999992370606,
|
||||||
1.0,
|
6.0,
|
||||||
2.5839999923706056,
|
7.583999992370606,
|
||||||
4.311999977111817,
|
9.311999977111817,
|
||||||
6.147999965667726,
|
11.147999965667726,
|
||||||
8.055999969482421,
|
13.055999969482421,
|
||||||
10.0
|
15.0
|
||||||
],
|
],
|
||||||
'name': 'TimeWarp3'
|
'name': 'TimeWarp3'
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue