Files

73 lines
2.7 KiB
Python

from enum import Enum
import logging
# The Colorspace Enumerated List
# Parse color data from file to provide arguments for the encoded file
class Colorspace(Enum):
def __new__(cls, colorspace, color_primaries, color_trc):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
obj.colorspace = colorspace
obj.color_primaries = color_primaries
obj.color_trc = color_trc
return obj
HD = ("bt709", "bt709", "bt709")
NTSC = ("smpte170m", "smpte170m", "smpte170m")
PAL = ("bt470bg", "bt470bg", "gamma28")
# The color data arguments for our encode
def get_args(self):
return f"-colorspace {self.colorspace} -color_primaries {self.color_primaries} -color_trc {self.color_trc}"
@staticmethod
def value_of(source_file):
# Method 1: Carry over color data from source if specified
source_colorspace = source_file.video_format["streams"][0].get(
"color_space", ""
)
source_color_primaries = source_file.video_format["streams"][0].get(
"color_primaries", ""
)
source_color_trc = source_file.video_format["streams"][0].get(
"color_transfer", ""
)
logging.debug(
f"[Colorspace.value_of] source_colorspace: {source_colorspace}, "
f"source_color_primaries: {source_color_primaries}, "
f"source_color_trc: {source_color_trc}"
)
for colorspace_candidate in Colorspace:
if (
source_colorspace == colorspace_candidate.colorspace
or source_color_primaries == colorspace_candidate.color_primaries
or source_color_trc == colorspace_candidate.color_trc
):
logging.debug(
f"[Colorspace.value_of] carryover colorspace '{colorspace_candidate.name}' from source"
)
return colorspace_candidate
# Method 2: Infer color date from source file resolution
resolution = int(source_file.video_format["streams"][0]["height"])
if resolution >= 720:
logging.debug(
f"[Colorspace.value_of] colorspace: '{Colorspace.HD.name}', resolution: '{resolution}'"
)
return Colorspace.HD
elif resolution >= 576:
logging.debug(
f"[Colorspace.value_of] colorspace: '{Colorspace.PAL.name}', resolution: '{resolution}'"
)
return Colorspace.PAL
else:
logging.debug(
f"[Colorspace.value_of] colorspace: '{Colorspace.NTSC.name}', resolution: '{resolution}'"
)
return Colorspace.NTSC