Source code for cgl.plugins.otio.tools.aaf.image_to_aaf
import os
import argparse
import pathlib
from urllib import parse
import aaf2
from cgl.plugins.otio.tools.aaf import aaf_embedded_media_tool
[docs]
def update_still_length(f, mob_id, still_length = 720*2):
master_mob = f.content.mobs.get(mob_id, None)
assert master_mob
for master_slot in master_mob.slots:
master_slot.segment.length = still_length
file_mob = master_slot.segment.mob
for file_slot in file_mob.slots:
file_slot.segment.length = still_length
[docs]
def add_unc_path(f, mob_id, path):
master_mob = f.content.mobs.get(mob_id, None)
assert master_mob
path = path.replace("/", '\\')
master_mob.comments['UNC Path'] = path
[docs]
def update_import_descriptor(f, image_path):
for mob in f.content.sourcemobs():
if not isinstance(mob.descriptor, (aaf2.essence.TapeDescriptor, aaf2.essence.ImportDescriptor)):
continue
d = f.create.ImportDescriptor()
loc = f.create.NetworkLocator()
image_path = os.path.abspath(image_path).replace("\\", '/').lstrip('/')
loc['URLString'].value = f"file:///{parse.quote(image_path)}"
d["Locator"].append(loc)
mob.descriptor = d
break
[docs]
def add_network_locators(aaf_path, media_path, mob_id):
with aaf2.open(aaf_path, 'rw') as f:
add_unc_path(f, mob_id, media_path)
update_import_descriptor(f, media_path)
[docs]
def image_to_aaf(image_path, aaf_path, width = 1920, height = 1080, dnxhd_media=None):
basename = os.path.basename(image_path)
mob_name = basename
video_profile_name = "dnx_1080p_36_23.97"
mob_id = aaf_embedded_media_tool.create_aaf_file([dnxhd_media or image_path],
aaf_path,
mob_name,
mob_name,
width=width,
height=height,
frame_rate=24,
ignore_alpha = True,
copy_dnxhd_streams=True,
video_profile_name = video_profile_name,
)
if mob_id:
with aaf2.open(aaf_path, 'rw') as f:
update_still_length(f, mob_id)
add_unc_path(f, mob_id, image_path)
update_import_descriptor(f, image_path)
return mob_id
[docs]
def run_cli():
parser = argparse.ArgumentParser(
prog="convert a psd to a AAF",
)
parser.add_argument("image_path", type=pathlib.Path)
parser.add_argument("out_aaf_path", type=pathlib.Path, nargs='?', default=None)
args = parser.parse_args()
if not args.out_aaf_path:
out_aaf_path = str(args.image_path) + ".aaf"
else:
out_aaf_path = str(args.out_aaf_path)
image_to_aaf(str(args.image_path), out_aaf_path)
if __name__ == "__main__":
run_cli()