def create_ODTs(aces_ctl_directory, lut_directory, lut_resolution_1d, lut_resolution_3d, odt_info, shaper_name, cleanup, linear_display_space, log_display_space): """ Object description. Parameters ---------- parameter : type Parameter description. Returns ------- type Return value description. """ colorspaces = [] displays = {} # ------------------------------------------------------------------------- # *RRT / ODT* Shaper Options # ------------------------------------------------------------------------- shaper_data = {} # Defining the *Log 2* shaper. log2_shaper_name = shaper_name log2_shaper_name_aliases = ['crv_%s' % compact(log2_shaper_name)] log2_params = { 'middleGrey': 0.18, 'minExposure': -6, 'maxExposure': 6.5} log2_shaper_colorspace = create_generic_log( aces_ctl_directory, lut_directory, lut_resolution_1d, cleanup, name=log2_shaper_name, middle_grey=log2_params['middleGrey'], min_exposure=log2_params['minExposure'], max_exposure=log2_params['maxExposure'], aliases=log2_shaper_name_aliases) colorspaces.append(log2_shaper_colorspace) shaper_input_scale_generic_log2 = 1 # *Log 2* shaper name and *CTL* transforms bundled up. log2_shaper_data = [ log2_shaper_name, os.path.join('%s', 'utilities', 'ACESlib.Log2_to_Lin_param.a1.0.0.ctl'), os.path.join('%s', 'utilities', 'ACESlib.Lin_to_Log2_param.a1.0.0.ctl'), shaper_input_scale_generic_log2, log2_params] shaper_data[log2_shaper_name] = log2_shaper_data # Space with a more user-friendly name. Direct copy otherwise. log2_shaper_copy_name = 'Log2 Shaper' log2_shaper_copy_colorspace = ColorSpace(log2_shaper_copy_name) log2_shaper_copy_colorspace.description = ( 'The %s color space' % log2_shaper_copy_name) log2_shaper_copy_colorspace.aliases = [ 'crv_%s' % compact(log2_shaper_copy_name)] log2_shaper_copy_colorspace.equality_group = log2_shaper_copy_name log2_shaper_copy_colorspace.family = log2_shaper_colorspace.family log2_shaper_copy_colorspace.is_data = log2_shaper_colorspace.is_data log2_shaper_copy_colorspace.to_reference_transforms = list( log2_shaper_colorspace.to_reference_transforms) log2_shaper_copy_colorspace.from_reference_transforms = list( log2_shaper_colorspace.from_reference_transforms) colorspaces.append(log2_shaper_copy_colorspace) # Defining the *Log2 shaper that includes the AP1* primaries. log2_shaper_api1_name = '%s - AP1' % 'Log2 Shaper' log2_shaper_api1_colorspace = ColorSpace(log2_shaper_api1_name) log2_shaper_api1_colorspace.description = ( 'The %s color space' % log2_shaper_api1_name) log2_shaper_api1_colorspace.aliases = [ '%s_ap1' % compact(log2_shaper_copy_name)] log2_shaper_api1_colorspace.equality_group = log2_shaper_api1_name log2_shaper_api1_colorspace.family = log2_shaper_colorspace.family log2_shaper_api1_colorspace.is_data = log2_shaper_colorspace.is_data log2_shaper_api1_colorspace.to_reference_transforms = list( log2_shaper_colorspace.to_reference_transforms) log2_shaper_api1_colorspace.from_reference_transforms = list( log2_shaper_colorspace.from_reference_transforms) # *AP1* primaries to *AP0* primaries log2_shaper_api1_colorspace.to_reference_transforms.append({ 'type': 'matrix', 'matrix': mat44_from_mat33(ACES_AP1_TO_AP0), 'direction': 'forward' }) colorspaces.append(log2_shaper_api1_colorspace) # Defining the *Log2* shaper that includes the *AP1* primaries. # Named with `shaper_name` variable and needed for some *LUT* baking steps. shaper_api1_name = '%s - AP1' % shaper_name shaper_api1_colorspace = ColorSpace(shaper_api1_name) shaper_api1_colorspace.description = ( 'The %s color space' % shaper_api1_name) shaper_api1_colorspace.aliases = ['%s_ap1' % compact(shaper_name)] shaper_api1_colorspace.equality_group = shaper_api1_name shaper_api1_colorspace.family = log2_shaper_colorspace.family shaper_api1_colorspace.is_data = log2_shaper_colorspace.is_data shaper_api1_colorspace.to_reference_transforms = list( log2_shaper_api1_colorspace.to_reference_transforms) shaper_api1_colorspace.from_reference_transforms = list( log2_shaper_api1_colorspace.from_reference_transforms) colorspaces.append(shaper_api1_colorspace) # Define the base *Dolby PQ Shaper* # dolby_pq_shaper_name = 'Dolby PQ 10000' dolby_pq_shaper_name_aliases = ['crv_%s' % 'dolbypq_10000'] dolby_pq_shaper_colorspace = create_Dolby_PQ( aces_ctl_directory, lut_directory, lut_resolution_1d, cleanup, name=dolby_pq_shaper_name, aliases=dolby_pq_shaper_name_aliases) colorspaces.append(dolby_pq_shaper_colorspace) # *Dolby PQ* shaper name and *CTL* transforms bundled up. dolby_pq_shaper_data = [ dolby_pq_shaper_name, os.path.join('%s', 'utilities', 'ACESlib.DolbyPQ_to_Lin.a1.0.0.ctl'), os.path.join('%s', 'utilities', 'ACESlib.Lin_to_DolbyPQ.a1.0.0.ctl'), 1.0, {}] shaper_data[dolby_pq_shaper_name] = dolby_pq_shaper_data # Define the *Dolby PQ Shaper that considers a fixed linear range* dolby_pq_scaled_shaper_name = 'Dolby PQ Scaled' dolby_pq_scaled_shaper_name_aliases = ['crv_%s' % 'dolbypq_scaled'] dolby_pq_scaled_shaper_colorspace = create_Dolby_PQ_scaled( aces_ctl_directory, lut_directory, lut_resolution_1d, cleanup, name=dolby_pq_scaled_shaper_name, aliases=dolby_pq_scaled_shaper_name_aliases) colorspaces.append(dolby_pq_scaled_shaper_colorspace) # *Dolby PQ* shaper name and *CTL* transforms bundled up. dolby_pq_scaled_shaper_data = [ dolby_pq_scaled_shaper_name, os.path.join('%s', 'utilities', 'ACESlib.OCIOShaper_to_Lin_param.a1.0.0.ctl'), os.path.join('%s', 'utilities', 'ACESlib.Lin_to_OCIOShaper_param.a1.0.0.ctl'), 1.0, log2_params] shaper_data[dolby_pq_scaled_shaper_name] = dolby_pq_scaled_shaper_data rrt_shaper = log2_shaper_data # rrt_shaper = dolby_pq_scaled_shaper_data # *RRT + ODT* combinations. sorted_odts = sorted(odt_info.iteritems(), key=lambda x: x[1]) print(sorted_odts) for odt in sorted_odts: (odt_name, odt_values) = odt # Defining full range transform for *ODTs* that can generate either # *legal* or *full* output. # Uncomment these lines and the lower section and # flip the `legalRange` value to 1 to restore the old behavior, # where both *legal* or *full* range *LUTs* were generated. if odt_values['transformHasFullLegalSwitch']: # odt_name_legal = '%s - Legal' % odt_values['transformUserName'] odt_legal['legalRange'] = 0 # else: # odt_name_legal = odt_values['transformUserName'] odt_name_legal = odt_values['transformUserName'] odt_legal = odt_values.copy() odt_aliases = ['out_%s' % compact(odt_name_legal)] cs = create_ACES_RRT_plus_ODT( odt_name_legal, odt_legal, rrt_shaper, aces_ctl_directory, lut_directory, lut_resolution_3d, cleanup, odt_aliases) colorspaces.append(cs) displays[odt_name_legal] = { 'Raw': linear_display_space, 'Log': log_display_space, 'Output Transform': cs} """ # Generating full range transform for *ODTs* that can generate # either *legal* or *full* output. if odt_values['transformHasFullLegalSwitch']: print('Generating full range ODT for %s' % odt_name) odt_name_full = '%s - Full' % odt_values['transformUserName'] odt_full = odt_values.copy() odt_full['legalRange'] = 0 odt_full_aliases = ['out_%s' % compact(odt_name_full)] cs_full = create_ACES_RRT_plus_ODT( odt_name_full, odt_full, rrt_shaper, aces_ctl_directory, lut_directory, lut_resolution_1d, lut_resolution_3d, cleanup, odt_full_aliases) colorspaces.append(cs_full) displays[odt_name_full] = { 'Raw': linear_display_space, 'Log': log_display_space, 'Output Transform': cs_full} """ return colorspaces, displays
def create_LMTs(aces_ctl_directory, lut_directory, lut_resolution_1d, lut_resolution_3d, lmt_info, cleanup): """ Object description. Parameters ---------- parameter : type Parameter description. Returns ------- type Return value description. """ colorspaces = [] # ------------------------------------------------------------------------- # *LMT Shaper* # ------------------------------------------------------------------------- lmt_lut_resolution_1d = max(4096, lut_resolution_1d) lmt_lut_resolution_3d = max(65, lut_resolution_3d) # Defining the *Log 2* shaper. lmt_shaper_name = 'LMT Shaper' lmt_shaper_name_aliases = ['crv_lmtshaper'] lmt_params = { 'middleGrey': 0.18, 'minExposure': -10, 'maxExposure': 6.5} lmt_shaper = create_generic_log(aces_ctl_directory, lut_directory, lmt_lut_resolution_1d, cleanup, name=lmt_shaper_name, middle_grey=lmt_params['middleGrey'], min_exposure=lmt_params['minExposure'], max_exposure=lmt_params['maxExposure'], aliases=lmt_shaper_name_aliases) colorspaces.append(lmt_shaper) shaper_input_scale_generic_log2 = 1 # *Log 2* shaper name and *CTL* transforms bundled up. lmt_shaper_data = [ lmt_shaper_name, os.path.join('%s', 'utilities', 'ACESlib.Log2_to_Lin_param.a1.0.0.ctl'), os.path.join('%s', 'utilities', 'ACESlib.Lin_to_Log2_param.a1.0.0.ctl'), shaper_input_scale_generic_log2, lmt_params] sorted_lmts = sorted(lmt_info.iteritems(), key=lambda x: x[1]) print(sorted_lmts) for lmt in sorted_lmts: lmt_name, lmt_values = lmt lmt_aliases = ['look_%s' % compact(lmt_values['transformUserName'])] cs = create_ACES_LMT( lmt_values['transformUserName'], lmt_values, lmt_shaper_data, aces_ctl_directory, lut_directory, lmt_lut_resolution_3d, cleanup, lmt_aliases) colorspaces.append(cs) return colorspaces
def create_ODTs( aces_ctl_directory, lut_directory, lut_resolution_1d, lut_resolution_3d, odt_info, shaper_name, cleanup, linear_display_space, log_display_space, ): """ Object description. Parameters ---------- parameter : type Parameter description. Returns ------- type Return value description. """ colorspaces = [] displays = {} # ------------------------------------------------------------------------- # *RRT / ODT* Shaper Options # ------------------------------------------------------------------------- shaper_data = {} # Defining the *Log 2* shaper. log2_shaper_name = shaper_name log2_shaper_name_aliases = ["crv_%s" % compact(log2_shaper_name)] log2_params = {"middleGrey": 0.18, "minExposure": -6, "maxExposure": 6.5} log2_shaper_colorspace = create_generic_log( aces_ctl_directory, lut_directory, lut_resolution_1d, cleanup, name=log2_shaper_name, middle_grey=log2_params["middleGrey"], min_exposure=log2_params["minExposure"], max_exposure=log2_params["maxExposure"], aliases=log2_shaper_name_aliases, ) colorspaces.append(log2_shaper_colorspace) shaper_input_scale_generic_log2 = 1 # *Log 2* shaper name and *CTL* transforms bundled up. log2_shaper_data = [ log2_shaper_name, os.path.join("%s", "utilities", "ACESlib.Log2_to_Lin_param.a1.0.0.ctl"), os.path.join("%s", "utilities", "ACESlib.Lin_to_Log2_param.a1.0.0.ctl"), shaper_input_scale_generic_log2, log2_params, ] shaper_data[log2_shaper_name] = log2_shaper_data # Space with a more user-friendly name. Direct copy otherwise. log2_shaper_copy_name = "Log2 Shaper" log2_shaper_copy_colorspace = ColorSpace(log2_shaper_copy_name) log2_shaper_copy_colorspace.description = "The %s color space" % log2_shaper_copy_name log2_shaper_copy_colorspace.aliases = ["crv_%s" % compact(log2_shaper_copy_name)] log2_shaper_copy_colorspace.equality_group = log2_shaper_copy_name log2_shaper_copy_colorspace.family = log2_shaper_colorspace.family log2_shaper_copy_colorspace.is_data = log2_shaper_colorspace.is_data log2_shaper_copy_colorspace.to_reference_transforms = list(log2_shaper_colorspace.to_reference_transforms) log2_shaper_copy_colorspace.from_reference_transforms = list(log2_shaper_colorspace.from_reference_transforms) colorspaces.append(log2_shaper_copy_colorspace) # Defining the *Log2 shaper that includes the AP1* primaries. log2_shaper_api1_name = "%s - AP1" % "Log2 Shaper" log2_shaper_api1_colorspace = ColorSpace(log2_shaper_api1_name) log2_shaper_api1_colorspace.description = "The %s color space" % log2_shaper_api1_name log2_shaper_api1_colorspace.aliases = ["%s_ap1" % compact(log2_shaper_copy_name)] log2_shaper_api1_colorspace.equality_group = log2_shaper_api1_name log2_shaper_api1_colorspace.family = log2_shaper_colorspace.family log2_shaper_api1_colorspace.is_data = log2_shaper_colorspace.is_data log2_shaper_api1_colorspace.to_reference_transforms = list(log2_shaper_colorspace.to_reference_transforms) log2_shaper_api1_colorspace.from_reference_transforms = list(log2_shaper_colorspace.from_reference_transforms) # *AP1* primaries to *AP0* primaries. log2_shaper_api1_colorspace.to_reference_transforms.append( {"type": "matrix", "matrix": mat44_from_mat33(ACES_AP1_TO_AP0), "direction": "forward"} ) colorspaces.append(log2_shaper_api1_colorspace) # Defining the *Log2 shaper that includes the AP1* primaries. # Named with 'shaper_name' variable. Needed for some LUT baking steps. shaper_api1_name = "%s - AP1" % shaper_name shaper_api1_colorspace = ColorSpace(shaper_api1_name) shaper_api1_colorspace.description = "The %s color space" % shaper_api1_name shaper_api1_colorspace.aliases = ["%s_ap1" % compact(shaper_name)] shaper_api1_colorspace.equality_group = shaper_api1_name shaper_api1_colorspace.family = log2_shaper_colorspace.family shaper_api1_colorspace.is_data = log2_shaper_colorspace.is_data shaper_api1_colorspace.to_reference_transforms = list(log2_shaper_api1_colorspace.to_reference_transforms) shaper_api1_colorspace.from_reference_transforms = list(log2_shaper_api1_colorspace.from_reference_transforms) colorspaces.append(shaper_api1_colorspace) # Define the base *Dolby PQ Shaper* # dolbypq_shaper_name = "Dolby PQ 10000" dolbypq_shaper_name_aliases = ["crv_%s" % "dolbypq_10000"] dolbypq_shaper_colorspace = create_dolbypq( aces_ctl_directory, lut_directory, lut_resolution_1d, cleanup, name=dolbypq_shaper_name, aliases=dolbypq_shaper_name_aliases, ) colorspaces.append(dolbypq_shaper_colorspace) # *Dolby PQ* shaper name and *CTL* transforms bundled up. dolbypq_shaper_data = [ dolbypq_shaper_name, os.path.join("%s", "utilities", "ACESlib.DolbyPQ_to_Lin.a1.0.0.ctl"), os.path.join("%s", "utilities", "ACESlib.Lin_to_DolbyPQ.a1.0.0.ctl"), 1.0, {}, ] shaper_data[dolbypq_shaper_name] = dolbypq_shaper_data # Define the *Dolby PQ Shaper that considers a fixed linear range* # dolbypq_scaled_shaper_name = "Dolby PQ Scaled" dolbypq_scaled_shaper_name_aliases = ["crv_%s" % "dolbypq_scaled"] dolbypq_scaled_shaper_colorspace = create_dolbypq_scaled( aces_ctl_directory, lut_directory, lut_resolution_1d, cleanup, name=dolbypq_scaled_shaper_name, aliases=dolbypq_scaled_shaper_name_aliases, ) colorspaces.append(dolbypq_scaled_shaper_colorspace) # *Dolby PQ* shaper name and *CTL* transforms bundled up. dolbypq_scaled_shaper_data = [ dolbypq_scaled_shaper_name, os.path.join("%s", "utilities", "ACESlib.DolbyPQ_to_Lin_param.a1.0.0.ctl"), os.path.join("%s", "utilities", "ACESlib.Lin_to_DolbyPQ_param.a1.0.0.ctl"), 1.0, log2_params, ] shaper_data[dolbypq_scaled_shaper_name] = dolbypq_scaled_shaper_data # # Pick a specific shaper # rrt_shaper = log2_shaper_data # rrt_shaper = dolbypq_scaled_shaper_data # *RRT + ODT* combinations. sorted_odts = sorted(odt_info.iteritems(), key=lambda x: x[1]) print(sorted_odts) for odt in sorted_odts: (odt_name, odt_values) = odt # Generating only full range transform for *ODTs* that can generate # either *legal* or *full* output. # Uncomment these lines and the lower section and flip the 'legalRange' value to 1 # to recover the old behavior, where both legal and full range LUTs were generated if odt_values["transformHasFullLegalSwitch"]: # odt_name_legal = '%s - Legal' % odt_values['transformUserName'] odt_legal["legalRange"] = 0 # else: # odt_name_legal = odt_values['transformUserName'] odt_name_legal = odt_values["transformUserName"] odt_legal = odt_values.copy() odt_aliases = ["out_%s" % compact(odt_name_legal)] cs = create_ACES_RRT_plus_ODT( odt_name_legal, odt_legal, rrt_shaper, aces_ctl_directory, lut_directory, lut_resolution_1d, lut_resolution_3d, cleanup, odt_aliases, ) colorspaces.append(cs) displays[odt_name_legal] = {"Raw": linear_display_space, "Log": log_display_space, "Output Transform": cs} """ # Generating full range transform for *ODTs* that can generate # either *legal* or *full* output. if odt_values['transformHasFullLegalSwitch']: print('Generating full range ODT for %s' % odt_name) odt_name_full = '%s - Full' % odt_values['transformUserName'] odt_full = odt_values.copy() odt_full['legalRange'] = 0 odt_full_aliases = ["out_%s" % compact(odt_name_full)] cs_full = create_ACES_RRT_plus_ODT( odt_name_full, odt_full, rrt_shaper, aces_ctl_directory, lut_directory, lut_resolution_1d, lut_resolution_3d, cleanup, odt_full_aliases) colorspaces.append(cs_full) displays[odt_name_full] = { 'Raw': linear_display_space, 'Log': log_display_space, 'Output Transform': cs_full} """ return (colorspaces, displays)