Skip to content

Commit 1d3080e

Browse files
authored
Add a test case and fix for transcribing markers over a single audio AAF file (#1259)
1 parent 12abda4 commit 1d3080e

File tree

3 files changed

+104
-11
lines changed

3 files changed

+104
-11
lines changed

contrib/opentimelineio_contrib/adapters/advanced_authoring_format.py

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,22 +1246,53 @@ def _attach_markers(collection):
12461246
current_track.markers.remove(marker)
12471247

12481248
# determine new item to attach the marker to
1249-
target_item = target_track.child_at_time(marker.marked_range.start_time)
1250-
if target_item is None or not hasattr(target_item, 'markers'):
1249+
try:
1250+
target_item = target_track.child_at_time(
1251+
marker.marked_range.start_time
1252+
)
1253+
1254+
if target_item is None or not hasattr(target_item, 'markers'):
1255+
# Item found cannot have markers, for example Transition.
1256+
# See also `marker-over-transition.aaf` in test data.
1257+
#
1258+
# Leave markers on the track for now.
1259+
_transcribe_log(
1260+
'Skip target_item `{}` cannot have markers'.format(
1261+
target_item,
1262+
),
1263+
)
1264+
target_item = target_track
1265+
1266+
# transform marked range into new item range
1267+
marked_start_local = current_track.transformed_time(
1268+
marker.marked_range.start_time, target_item
1269+
)
1270+
1271+
marker.marked_range = otio.opentime.TimeRange(
1272+
start_time=marked_start_local,
1273+
duration=marker.marked_range.duration
1274+
)
1275+
1276+
except otio.exceptions.CannotComputeAvailableRangeError as e:
1277+
# For audio media AAF file (marker-over-audio.aaf),
1278+
# this exception would be triggered in:
1279+
# `target_item = target_track.child_at_time()` with error
1280+
# message:
1281+
# "No available_range set on media reference on clip".
1282+
#
1283+
# Leave markers on the track for now.
1284+
_transcribe_log(
1285+
'Cannot compute availableRange from {} to {}: {}'.format(
1286+
marker,
1287+
target_track,
1288+
e,
1289+
),
1290+
)
12511291
target_item = target_track
12521292

12531293
# attach marker to target item
12541294
target_item.markers.append(marker)
12551295

1256-
# transform marked range into new item range
1257-
marked_start_local = current_track.transformed_time(
1258-
marker.marked_range.start_time, target_item
1259-
)
1260-
1261-
marker.marked_range = otio.opentime.TimeRange(
1262-
start_time=marked_start_local, duration=marker.marked_range.duration
1263-
)
1264-
12651296
_transcribe_log(
12661297
"Marker: '{}' (time: {}), attached to item: '{}'".format(
12671298
marker.name,
1.74 MB
Binary file not shown.

contrib/opentimelineio_contrib/adapters/tests/test_aaf_adapter.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@
220220
"marker-over-transition.aaf",
221221
)
222222

223+
MARKER_OVER_AUDIO_PATH = os.path.join(
224+
SAMPLE_DATA_DIR,
225+
"marker-over-audio.aaf"
226+
)
227+
223228

224229
def safe_str(maybe_str):
225230
"""To help with testing between python 2 and 3, this function attempts to
@@ -1125,6 +1130,63 @@ def test_aaf_marker_over_transition(self):
11251130

11261131
self.assertIsNotNone(timeline)
11271132

1133+
def test_aaf_marker_over_audio_file(self):
1134+
"""
1135+
Make sure we can transcibe markers over an audio AAF file.
1136+
"""
1137+
1138+
timeline = None
1139+
1140+
try:
1141+
timeline = otio.adapters.read_from_file(
1142+
MARKER_OVER_AUDIO_PATH
1143+
)
1144+
1145+
except Exception as e:
1146+
print('[ERROR] Transcribing test sample data `{}` caused an exception: {}'.format( # noqa
1147+
os.path.basename(MARKER_OVER_AUDIO_PATH),
1148+
e)
1149+
)
1150+
1151+
self.assertIsNotNone(timeline)
1152+
1153+
# Verify markers
1154+
# We expect 1 track with 3 markers on it from the test data.
1155+
self.assertTrue(1 == len(timeline.tracks))
1156+
1157+
track = timeline.tracks[0]
1158+
self.assertEqual(3, len(track.markers))
1159+
1160+
fps = 24.0
1161+
expected_markers = [
1162+
{
1163+
'color': 'RED',
1164+
'label': 'm1',
1165+
'start_time': otio.opentime.from_frames(50.0, fps)
1166+
},
1167+
{
1168+
'color': 'GREEN',
1169+
'label': 'm2',
1170+
'start_time': otio.opentime.from_frames(103.0, fps)
1171+
},
1172+
{
1173+
'color': 'BLUE',
1174+
'label': 'm3',
1175+
'start_time': otio.opentime.from_frames(166.0, fps)
1176+
}
1177+
]
1178+
1179+
for index, marker in enumerate(track.markers):
1180+
expected_marker = expected_markers[index]
1181+
1182+
color = marker.color
1183+
label = marker.metadata.get('AAF', {}).get('CommentMarkerUSer')
1184+
start_time = marker.marked_range.start_time
1185+
1186+
self.assertEqual(color, expected_marker.get('color'))
1187+
self.assertEqual(label, expected_marker.get('label'))
1188+
self.assertEqual(start_time, expected_marker.get('start_time'))
1189+
11281190
def _verify_user_comments(self, aaf_metadata, expected_md):
11291191

11301192
self.assertTrue(aaf_metadata is not None)

0 commit comments

Comments
 (0)