112 lines
3.0 KiB
Python
112 lines
3.0 KiB
Python
from enum import IntEnum
|
|
|
|
|
|
class ColorInfo:
|
|
"""
|
|
|
|
Class contains information of frame `ColorFormat`, `DynamicRange`, `Colorimetry`.
|
|
|
|
"""
|
|
class ColorFormat(IntEnum):
|
|
"""
|
|
Contains values of possible color format.
|
|
"""
|
|
CF_NONE = 0
|
|
CF_UNKNOWN = 1
|
|
CF_RGB = 2
|
|
CF_YCbCr_422 = 3
|
|
CF_YCbCr_444 = 4
|
|
CF_YCbCr_420 = 5
|
|
CF_IDO_DEFINED = 6
|
|
CF_Y_ONLY = 7
|
|
CF_RAW = 8
|
|
CF_DSC = 9
|
|
|
|
class DynamicRange(IntEnum):
|
|
"""
|
|
Contains values of possible dynamic range.
|
|
"""
|
|
DR_UNKNOWN = -1
|
|
DR_VESA = 0
|
|
DR_CTA = 1
|
|
|
|
class Colorimetry(IntEnum):
|
|
"""
|
|
Contains values of possible colorimetry.
|
|
"""
|
|
CM_NONE = 0
|
|
CM_RESERVED = 1
|
|
CM_sRGB = 2
|
|
CM_SMPTE_170M = 3
|
|
CM_ITUR_BT601 = 4
|
|
CM_ITUR_BT709 = 5
|
|
CM_xvYCC601 = 6
|
|
CM_xvYCC709 = 7
|
|
CM_sYCC601 = 8
|
|
CM_AdobeYCC601 = 9
|
|
CM_AdobeRGB = 10
|
|
CM_ITUR_BT2020_YcCbcCrc = 11
|
|
CM_ITUR_BT2020_YCbCr = 12
|
|
CM_ITUR_BT2020_RGB = 13
|
|
CM_RGB_WIDE_GAMUT_FIX = 14
|
|
CM_RGB_WIDE_GAMUT_FLT = 15
|
|
CM_DCI_P3 = 16
|
|
CM_DICOM_1_4_GRAY_SCALE = 17
|
|
CM_CUSTOM_COLOR_PROFILE = 18
|
|
|
|
CM_opYCC601 = CM_AdobeYCC601
|
|
CM_opRGB = CM_AdobeRGB
|
|
|
|
__COMPONENT_MULTIPLIER = {
|
|
ColorFormat.CF_RGB: 3,
|
|
ColorFormat.CF_YCbCr_422: 2,
|
|
ColorFormat.CF_YCbCr_444: 3,
|
|
ColorFormat.CF_YCbCr_420: 3 / 2,
|
|
ColorFormat.CF_Y_ONLY: 1,
|
|
ColorFormat.CF_RAW: 3
|
|
}
|
|
|
|
def __init__(self):
|
|
self.colorimetry = self.Colorimetry.CM_NONE
|
|
self.color_format = self.ColorFormat.CF_NONE
|
|
self.dynamic_range = self.DynamicRange.DR_VESA
|
|
self.bpc = 0
|
|
|
|
def __str__(self):
|
|
return f"Color format: {self.color_format.name}\n" \
|
|
f"Colorimetry: {self.colorimetry.name}\n" \
|
|
f"Dynamic Range: {self.dynamic_range.name}\n" \
|
|
f"BPC: {self.bpc}"
|
|
|
|
def __eq__(self, other):
|
|
return self.bpc == other.bpc and\
|
|
self.color_format == other.color_format and\
|
|
self.colorimetry == other.colorimetry and\
|
|
self.dynamic_range == other.dynamic_range
|
|
|
|
def is_valid(self) -> bool:
|
|
"""
|
|
|
|
Check that information is valid (not equal NONE state and bpc more than 0).
|
|
|
|
Returns:
|
|
object of bool type.
|
|
"""
|
|
return self.bpc > 0 and\
|
|
self.color_format != self.ColorFormat.CF_NONE and\
|
|
self.colorimetry != self.Colorimetry.CM_NONE
|
|
|
|
@property
|
|
def bpp(self) -> int:
|
|
"""
|
|
|
|
Returns calculated bits per pixel for this color info (except DSC). 0 if color info is not valid.
|
|
|
|
Returns:
|
|
object of int type.
|
|
"""
|
|
if self.is_valid() and self.color_format != self.ColorFormat.CF_DSC:
|
|
return round(self.bpc * self.__COMPONENT_MULTIPLIER.get(self.color_format, 1))
|
|
else:
|
|
return 0
|