mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
Merge pull request #2812 from pypeclub/feature/OP-2758_Letter-box-Ratio
This commit is contained in:
commit
ff79836704
3 changed files with 120 additions and 97 deletions
|
|
@ -19,7 +19,6 @@ from openpype.lib import (
|
|||
|
||||
should_convert_for_ffmpeg,
|
||||
convert_for_ffmpeg,
|
||||
get_transcode_temp_directory,
|
||||
get_transcode_temp_directory
|
||||
)
|
||||
import speedcopy
|
||||
|
|
@ -972,16 +971,12 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
def get_letterbox_filters(
|
||||
self,
|
||||
letter_box_def,
|
||||
input_res_ratio,
|
||||
output_res_ratio,
|
||||
pixel_aspect,
|
||||
scale_factor_by_width,
|
||||
scale_factor_by_height
|
||||
output_width,
|
||||
output_height
|
||||
):
|
||||
output = []
|
||||
|
||||
ratio = letter_box_def["ratio"]
|
||||
state = letter_box_def["state"]
|
||||
fill_color = letter_box_def["fill_color"]
|
||||
f_red, f_green, f_blue, f_alpha = fill_color
|
||||
fill_color_hex = "{0:0>2X}{1:0>2X}{2:0>2X}".format(
|
||||
|
|
@ -997,75 +992,129 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
)
|
||||
line_color_alpha = float(l_alpha) / 255
|
||||
|
||||
if input_res_ratio == output_res_ratio:
|
||||
ratio /= pixel_aspect
|
||||
elif input_res_ratio < output_res_ratio:
|
||||
ratio /= scale_factor_by_width
|
||||
else:
|
||||
ratio /= scale_factor_by_height
|
||||
# test ratios and define if pillar or letter boxes
|
||||
output_ratio = float(output_width) / float(output_height)
|
||||
self.log.debug("Output ratio: {} LetterBox ratio: {}".format(
|
||||
output_ratio, ratio
|
||||
))
|
||||
pillar = output_ratio > ratio
|
||||
need_mask = format(output_ratio, ".3f") != format(ratio, ".3f")
|
||||
if not need_mask:
|
||||
return []
|
||||
|
||||
if state == "letterbox":
|
||||
if not pillar:
|
||||
if fill_color_alpha > 0:
|
||||
top_box = (
|
||||
"drawbox=0:0:iw:round((ih-(iw*(1/{})))/2):t=fill:c={}@{}"
|
||||
).format(ratio, fill_color_hex, fill_color_alpha)
|
||||
"drawbox=0:0:{width}"
|
||||
":round(({height}-({width}/{ratio}))/2)"
|
||||
":t=fill:c={color}@{alpha}"
|
||||
).format(
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
color=fill_color_hex,
|
||||
alpha=fill_color_alpha
|
||||
)
|
||||
|
||||
bottom_box = (
|
||||
"drawbox=0:ih-round((ih-(iw*(1/{0})))/2)"
|
||||
":iw:round((ih-(iw*(1/{0})))/2):t=fill:c={1}@{2}"
|
||||
).format(ratio, fill_color_hex, fill_color_alpha)
|
||||
|
||||
"drawbox=0"
|
||||
":{height}-round(({height}-({width}/{ratio}))/2)"
|
||||
":{width}"
|
||||
":round(({height}-({width}/{ratio}))/2)"
|
||||
":t=fill:c={color}@{alpha}"
|
||||
).format(
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
color=fill_color_hex,
|
||||
alpha=fill_color_alpha
|
||||
)
|
||||
output.extend([top_box, bottom_box])
|
||||
|
||||
if line_color_alpha > 0 and line_thickness > 0:
|
||||
top_line = (
|
||||
"drawbox=0:round((ih-(iw*(1/{0})))/2)-{1}:iw:{1}:"
|
||||
"t=fill:c={2}@{3}"
|
||||
"drawbox=0"
|
||||
":round(({height}-({width}/{ratio}))/2)-{l_thick}"
|
||||
":{width}:{l_thick}:t=fill:c={l_color}@{l_alpha}"
|
||||
).format(
|
||||
ratio, line_thickness, line_color_hex, line_color_alpha
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
l_thick=line_thickness,
|
||||
l_color=line_color_hex,
|
||||
l_alpha=line_color_alpha
|
||||
)
|
||||
bottom_line = (
|
||||
"drawbox=0:ih-round((ih-(iw*(1/{})))/2)"
|
||||
":iw:{}:t=fill:c={}@{}"
|
||||
"drawbox=0"
|
||||
":{height}-round(({height}-({width}/{ratio}))/2)"
|
||||
":{width}:{l_thick}:t=fill:c={l_color}@{l_alpha}"
|
||||
).format(
|
||||
ratio, line_thickness, line_color_hex, line_color_alpha
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
l_thick=line_thickness,
|
||||
l_color=line_color_hex,
|
||||
l_alpha=line_color_alpha
|
||||
)
|
||||
output.extend([top_line, bottom_line])
|
||||
|
||||
elif state == "pillar":
|
||||
else:
|
||||
if fill_color_alpha > 0:
|
||||
left_box = (
|
||||
"drawbox=0:0:round((iw-(ih*{}))/2):ih:t=fill:c={}@{}"
|
||||
).format(ratio, fill_color_hex, fill_color_alpha)
|
||||
"drawbox=0:0"
|
||||
":round(({width}-({height}*{ratio}))/2)"
|
||||
":{height}"
|
||||
":t=fill:c={color}@{alpha}"
|
||||
).format(
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
color=fill_color_hex,
|
||||
alpha=fill_color_alpha
|
||||
)
|
||||
|
||||
right_box = (
|
||||
"drawbox=iw-round((iw-(ih*{0}))/2))"
|
||||
":0:round((iw-(ih*{0}))/2):ih:t=fill:c={1}@{2}"
|
||||
).format(ratio, fill_color_hex, fill_color_alpha)
|
||||
|
||||
"drawbox="
|
||||
"{width}-round(({width}-({height}*{ratio}))/2)"
|
||||
":0"
|
||||
":round(({width}-({height}*{ratio}))/2)"
|
||||
":{height}"
|
||||
":t=fill:c={color}@{alpha}"
|
||||
).format(
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
color=fill_color_hex,
|
||||
alpha=fill_color_alpha
|
||||
)
|
||||
output.extend([left_box, right_box])
|
||||
|
||||
if line_color_alpha > 0 and line_thickness > 0:
|
||||
left_line = (
|
||||
"drawbox=round((iw-(ih*{}))/2):0:{}:ih:t=fill:c={}@{}"
|
||||
"drawbox=round(({width}-({height}*{ratio}))/2)"
|
||||
":0:{l_thick}:{height}:t=fill:c={l_color}@{l_alpha}"
|
||||
).format(
|
||||
ratio, line_thickness, line_color_hex, line_color_alpha
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
l_thick=line_thickness,
|
||||
l_color=line_color_hex,
|
||||
l_alpha=line_color_alpha
|
||||
)
|
||||
|
||||
right_line = (
|
||||
"drawbox=iw-round((iw-(ih*{}))/2))"
|
||||
":0:{}:ih:t=fill:c={}@{}"
|
||||
"drawbox={width}-round(({width}-({height}*{ratio}))/2)"
|
||||
":0:{l_thick}:{height}:t=fill:c={l_color}@{l_alpha}"
|
||||
).format(
|
||||
ratio, line_thickness, line_color_hex, line_color_alpha
|
||||
width=output_width,
|
||||
height=output_height,
|
||||
ratio=ratio,
|
||||
l_thick=line_thickness,
|
||||
l_color=line_color_hex,
|
||||
l_alpha=line_color_alpha
|
||||
)
|
||||
|
||||
output.extend([left_line, right_line])
|
||||
|
||||
else:
|
||||
raise ValueError(
|
||||
"Letterbox state \"{}\" is not recognized".format(state)
|
||||
)
|
||||
|
||||
return output
|
||||
|
||||
def rescaling_filters(self, temp_data, output_def, new_repre):
|
||||
|
|
@ -1079,6 +1128,20 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
"""
|
||||
filters = []
|
||||
|
||||
# if reformat input video file is already reforamted from upstream
|
||||
reformat_in_baking = bool("reformated" in new_repre["tags"])
|
||||
self.log.debug("reformat_in_baking: `{}`".format(reformat_in_baking))
|
||||
|
||||
# Get instance data
|
||||
pixel_aspect = temp_data["pixel_aspect"]
|
||||
|
||||
if reformat_in_baking:
|
||||
self.log.debug((
|
||||
"Using resolution from input. It is already "
|
||||
"reformated from upstream process"
|
||||
))
|
||||
pixel_aspect = 1
|
||||
|
||||
# NOTE Skipped using instance's resolution
|
||||
full_input_path_single_file = temp_data["full_input_path_single_file"]
|
||||
try:
|
||||
|
|
@ -1141,12 +1204,6 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
output_width = input_width
|
||||
output_height = input_height
|
||||
|
||||
letter_box_def = output_def["letter_box"]
|
||||
letter_box_enabled = letter_box_def["enabled"]
|
||||
|
||||
# Get instance data
|
||||
pixel_aspect = temp_data["pixel_aspect"]
|
||||
|
||||
# Make sure input width and height is not an odd number
|
||||
input_width_is_odd = bool(input_width % 2 != 0)
|
||||
input_height_is_odd = bool(input_height % 2 != 0)
|
||||
|
|
@ -1171,9 +1228,6 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
self.log.debug("input_width: `{}`".format(input_width))
|
||||
self.log.debug("input_height: `{}`".format(input_height))
|
||||
|
||||
reformat_in_baking = bool("reformated" in new_repre["tags"])
|
||||
self.log.debug("reformat_in_baking: `{}`".format(reformat_in_baking))
|
||||
|
||||
# Use instance resolution if output definition has not set it.
|
||||
if output_width is None or output_height is None:
|
||||
output_width = temp_data["resolution_width"]
|
||||
|
|
@ -1185,17 +1239,6 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
output_width = input_width
|
||||
output_height = input_height
|
||||
|
||||
if reformat_in_baking:
|
||||
self.log.debug((
|
||||
"Using resolution from input. It is already "
|
||||
"reformated from baking process"
|
||||
))
|
||||
output_width = input_width
|
||||
output_height = input_height
|
||||
pixel_aspect = 1
|
||||
new_repre["resolutionWidth"] = input_width
|
||||
new_repre["resolutionHeight"] = input_height
|
||||
|
||||
output_width = int(output_width)
|
||||
output_height = int(output_height)
|
||||
|
||||
|
|
@ -1219,6 +1262,9 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
"Output resolution is {}x{}".format(output_width, output_height)
|
||||
)
|
||||
|
||||
letter_box_def = output_def["letter_box"]
|
||||
letter_box_enabled = letter_box_def["enabled"]
|
||||
|
||||
# Skip processing if resolution is same as input's and letterbox is
|
||||
# not set
|
||||
if (
|
||||
|
|
@ -1262,25 +1308,6 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
"scale_factor_by_height: `{}`".format(scale_factor_by_height)
|
||||
)
|
||||
|
||||
# letter_box
|
||||
if letter_box_enabled:
|
||||
filters.extend([
|
||||
"scale={}x{}:flags=lanczos".format(
|
||||
output_width, output_height
|
||||
),
|
||||
"setsar=1"
|
||||
])
|
||||
filters.extend(
|
||||
self.get_letterbox_filters(
|
||||
letter_box_def,
|
||||
input_res_ratio,
|
||||
output_res_ratio,
|
||||
pixel_aspect,
|
||||
scale_factor_by_width,
|
||||
scale_factor_by_height
|
||||
)
|
||||
)
|
||||
|
||||
# scaling none square pixels and 1920 width
|
||||
if (
|
||||
input_height != output_height
|
||||
|
|
@ -1319,6 +1346,16 @@ class ExtractReview(pyblish.api.InstancePlugin):
|
|||
"setsar=1"
|
||||
])
|
||||
|
||||
# letter_box
|
||||
if letter_box_enabled:
|
||||
filters.extend(
|
||||
self.get_letterbox_filters(
|
||||
letter_box_def,
|
||||
output_width,
|
||||
output_height
|
||||
)
|
||||
)
|
||||
|
||||
new_repre["resolutionWidth"] = output_width
|
||||
new_repre["resolutionHeight"] = output_height
|
||||
|
||||
|
|
|
|||
|
|
@ -107,7 +107,6 @@
|
|||
"letter_box": {
|
||||
"enabled": false,
|
||||
"ratio": 0.0,
|
||||
"state": "letterbox",
|
||||
"fill_color": [
|
||||
0,
|
||||
0,
|
||||
|
|
|
|||
|
|
@ -366,19 +366,6 @@
|
|||
"minimum": 0,
|
||||
"maximum": 10000
|
||||
},
|
||||
{
|
||||
"key": "state",
|
||||
"label": "Type",
|
||||
"type": "enum",
|
||||
"enum_items": [
|
||||
{
|
||||
"letterbox": "Letterbox"
|
||||
},
|
||||
{
|
||||
"pillar": "Pillar"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "color",
|
||||
"label": "Fill Color",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue