from enum import IntEnum import UniTAP class UCDEnum: 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 # 颜色格式映射 - 支持不区分大小写的字符串匹配 @staticmethod def get_color_format(format_str): format_map = { "none": UniTAP.ColorInfo.ColorFormat.CF_NONE, "unknown": UniTAP.ColorInfo.ColorFormat.CF_UNKNOWN, "rgb": UniTAP.ColorInfo.ColorFormat.CF_RGB, "ycbcr422": UniTAP.ColorInfo.ColorFormat.CF_YCbCr_422, "ycbcr444": UniTAP.ColorInfo.ColorFormat.CF_YCbCr_444, "ycbcr420": UniTAP.ColorInfo.ColorFormat.CF_YCbCr_420, "ido_defined": UniTAP.ColorInfo.ColorFormat.CF_IDO_DEFINED, "yonly": UniTAP.ColorInfo.ColorFormat.CF_Y_ONLY, "raw": UniTAP.ColorInfo.ColorFormat.CF_RAW, "dsc": UniTAP.ColorInfo.ColorFormat.CF_DSC, } if not format_str: return None return format_map.get(format_str.lower(), None) # 色度映射 - 支持不区分大小写的字符串匹配 @staticmethod def get_colorimetry(colorimetry_str): colorimetry_map = { "none": UniTAP.ColorInfo.Colorimetry.CM_NONE, "reserved": UniTAP.ColorInfo.Colorimetry.CM_RESERVED, "srgb": UniTAP.ColorInfo.Colorimetry.CM_sRGB, "smpte170m": UniTAP.ColorInfo.Colorimetry.CM_SMPTE_170M, "bt601": UniTAP.ColorInfo.Colorimetry.CM_ITUR_BT601, "bt709": UniTAP.ColorInfo.Colorimetry.CM_ITUR_BT709, "xvycc601": UniTAP.ColorInfo.Colorimetry.CM_xvYCC601, "xvycc709": UniTAP.ColorInfo.Colorimetry.CM_xvYCC709, "sycc601": UniTAP.ColorInfo.Colorimetry.CM_sYCC601, "adobeycc601": UniTAP.ColorInfo.Colorimetry.CM_AdobeYCC601, "adobergb": UniTAP.ColorInfo.Colorimetry.CM_AdobeRGB, "bt2020yccbccrc": UniTAP.ColorInfo.Colorimetry.CM_ITUR_BT2020_YcCbcCrc, "bt2020ycbcr": UniTAP.ColorInfo.Colorimetry.CM_ITUR_BT2020_YCbCr, "bt2020rgb": UniTAP.ColorInfo.Colorimetry.CM_ITUR_BT2020_RGB, "rgbwidegamutfix": UniTAP.ColorInfo.Colorimetry.CM_RGB_WIDE_GAMUT_FIX, "rgbwidegamutflt": UniTAP.ColorInfo.Colorimetry.CM_RGB_WIDE_GAMUT_FLT, "dcip3": UniTAP.ColorInfo.Colorimetry.CM_DCI_P3, "dicom14grayscale": UniTAP.ColorInfo.Colorimetry.CM_DICOM_1_4_GRAY_SCALE, "customcolorprofile": UniTAP.ColorInfo.Colorimetry.CM_CUSTOM_COLOR_PROFILE, "opycc601": UniTAP.ColorInfo.Colorimetry.CM_opYCC601, "oprgb": UniTAP.ColorInfo.Colorimetry.CM_opRGB, } if not colorimetry_str: return None return colorimetry_map.get(colorimetry_str.lower(), None) class VideoPatternInfo: class VideoPattern(IntEnum): """ Class `VideoPattern` contains all possible variants of patterns which can be set in the function `set_pattern`. """ Disabled = 0 ColorBars = 1 Chessboard = 2 SolidColor = 3 SolidWhite = 4 SolidRed = 5 SolidGreen = 6 SolidBlue = 7 WhiteVStrips = 8 GradientRGBStripes = 9 ColorRamp = 10 ColorSquares = 11 MotionPattern = 12 SquareWindow = 15 class VideoPatternParams(IntEnum): """ Class `VideoPatternParams` contains all possible variants of parameters which can be set in the function `set_pattern_params`. """ SolidColor = 3 WhiteVStrips = 8 GradientRGBStripes = 9 MotionPattern = 12 SquareWindow = 15 @staticmethod def get_video_pattern(pattern_str): pattern_map = { "disabled": UniTAP.VideoPattern.Disabled, "colorbars": UniTAP.VideoPattern.ColorBars, "chessboard": UniTAP.VideoPattern.Chessboard, "solidcolor": UniTAP.VideoPattern.SolidColor, "solidwhite": UniTAP.VideoPattern.SolidWhite, "solidred": UniTAP.VideoPattern.SolidRed, "solidgreen": UniTAP.VideoPattern.SolidGreen, "solidblue": UniTAP.VideoPattern.SolidBlue, "whitevstrips": UniTAP.VideoPattern.WhiteVStrips, "gradientrgbstripes": UniTAP.VideoPattern.GradientRGBStripes, "colorramp": UniTAP.VideoPattern.ColorRamp, "coloursquares": UniTAP.VideoPattern.ColorSquares, "motionpattern": UniTAP.VideoPattern.MotionPattern, "squarewindow": UniTAP.VideoPattern.SquareWindow, } if not pattern_str: return None return pattern_map.get(pattern_str.lower(), None) class TimingInfo: class ResolutionType(IntEnum): """ 分辨率类型枚举,包含DMT、CTA、CVT和OVT四种类型 """ DMT = 0 # VESA Display Monitor Timing CTA = 1 # Consumer Technology Association CVT = 2 # Coordinated Video Timing OVT = 3 # Other Video Timing # 分辨率类型映射 resolution_type_map = { "dmt": ResolutionType.DMT, "cta": ResolutionType.CTA, "cvt": ResolutionType.CVT, "ovt": ResolutionType.OVT, } # DMT分辨率ID映射 dmt_resolution_map = { 9: {"width": 800, "height": 600, "refresh_rate": 60.317, "id_hex": "9h"}, 14: {"width": 848, "height": 480, "refresh_rate": 60.0, "id_hex": "Eh"}, 16: {"width": 1024, "height": 768, "refresh_rate": 60.0, "id_hex": "10h"}, 23: {"width": 1280, "height": 768, "refresh_rate": 60.0, "id_hex": "17h"}, 27: { "width": 1280, "height": 800, "refresh_rate": 60.0, "id_hex": "1Bh", "note": "RB1", }, 28: {"width": 1280, "height": 800, "refresh_rate": 60.0, "id_hex": "1Ch"}, 32: {"width": 1280, "height": 960, "refresh_rate": 60.0, "id_hex": "20h"}, 35: {"width": 1280, "height": 1024, "refresh_rate": 60.0, "id_hex": "23h"}, 39: {"width": 1360, "height": 768, "refresh_rate": 60.0, "id_hex": "27h"}, 41: { "width": 1400, "height": 1050, "refresh_rate": 60.0, "id_hex": "29h", "note": "RB1", }, 42: {"width": 1400, "height": 1050, "refresh_rate": 60.0, "id_hex": "2Ah"}, 47: {"width": 1440, "height": 900, "refresh_rate": 59.887, "id_hex": "2Fh"}, 51: {"width": 1600, "height": 1200, "refresh_rate": 60.0, "id_hex": "33h"}, 57: { "width": 1680, "height": 1050, "refresh_rate": 60.0, "id_hex": "39h", "note": "RB1", }, 58: {"width": 1680, "height": 1050, "refresh_rate": 60.0, "id_hex": "3Ah"}, 62: {"width": 1792, "height": 1344, "refresh_rate": 60.0, "id_hex": "3Eh"}, 65: {"width": 1856, "height": 1392, "refresh_rate": 60.0, "id_hex": "41h"}, 69: {"width": 1920, "height": 1200, "refresh_rate": 60.0, "id_hex": "45h"}, 73: {"width": 1920, "height": 1440, "refresh_rate": 60.0, "id_hex": "49h"}, 76: { "width": 2560, "height": 1600, "refresh_rate": 60.0, "id_hex": "4Ch", "note": "RB1", }, 77: {"width": 2560, "height": 1600, "refresh_rate": 60.0, "id_hex": "4Dh"}, 82: {"width": 1920, "height": 1080, "refresh_rate": 60.0, "id_hex": "52h"}, } # CTA分辨率ID映射 cta_resolution_map = { 1: {"width": 640, "height": 480, "refresh_rate": 59.94, "vic": 1}, 2: {"width": 720, "height": 480, "refresh_rate": 59.94, "vic": 2}, 3: {"width": 720, "height": 480, "refresh_rate": 59.94, "vic": 3}, 4: {"width": 1280, "height": 720, "refresh_rate": 60.0, "vic": 4}, 8: {"width": 1440, "height": 240, "refresh_rate": 59.826, "vic": 8}, 9: {"width": 1440, "height": 240, "refresh_rate": 60.054, "vic": 9}, 12: {"width": 2880, "height": 240, "refresh_rate": 59.826, "vic": 12}, 13: {"width": 2880, "height": 240, "refresh_rate": 59.826, "vic": 13}, 14: {"width": 1440, "height": 480, "refresh_rate": 59.94, "vic": 14}, 15: {"width": 1440, "height": 480, "refresh_rate": 59.94, "vic": 15}, 16: {"width": 1920, "height": 1080, "refresh_rate": 60.0, "vic": 16}, 17: {"width": 720, "height": 576, "refresh_rate": 50.0, "vic": 17}, 18: {"width": 720, "height": 576, "refresh_rate": 50.0, "vic": 18}, 19: {"width": 1280, "height": 720, "refresh_rate": 50.0, "vic": 19}, 23: {"width": 1440, "height": 288, "refresh_rate": 49.761, "vic": 23}, 24: {"width": 1440, "height": 288, "refresh_rate": 49.761, "vic": 24}, 27: {"width": 2880, "height": 288, "refresh_rate": 49.761, "vic": 27}, 28: {"width": 2880, "height": 288, "refresh_rate": 49.761, "vic": 28}, 29: {"width": 1440, "height": 576, "refresh_rate": 50.0, "vic": 29}, 30: {"width": 1440, "height": 576, "refresh_rate": 50.0, "vic": 30}, 31: {"width": 1920, "height": 1080, "refresh_rate": 50.0, "vic": 31}, 32: {"width": 1920, "height": 1080, "refresh_rate": 24.0, "vic": 32}, 33: {"width": 1920, "height": 1080, "refresh_rate": 25.0, "vic": 33}, 34: {"width": 1920, "height": 1080, "refresh_rate": 30.0, "vic": 34}, 35: {"width": 2880, "height": 480, "refresh_rate": 59.94, "vic": 35}, 36: {"width": 2880, "height": 480, "refresh_rate": 59.94, "vic": 36}, 37: {"width": 2880, "height": 576, "refresh_rate": 50.0, "vic": 37}, 38: {"width": 2880, "height": 576, "refresh_rate": 50.0, "vic": 38}, 41: {"width": 1280, "height": 720, "refresh_rate": 100.0, "vic": 41}, 42: {"width": 720, "height": 576, "refresh_rate": 100.0, "vic": 42}, 43: {"width": 720, "height": 576, "refresh_rate": 100.0, "vic": 43}, 47: {"width": 1280, "height": 720, "refresh_rate": 120.0, "vic": 47}, 48: {"width": 720, "height": 480, "refresh_rate": 120.0, "vic": 48}, 49: {"width": 720, "height": 480, "refresh_rate": 119.88, "vic": 49}, 52: {"width": 720, "height": 576, "refresh_rate": 200.0, "vic": 52}, 53: {"width": 720, "height": 576, "refresh_rate": 200.0, "vic": 53}, 56: {"width": 720, "height": 480, "refresh_rate": 239.76, "vic": 56}, 57: {"width": 720, "height": 480, "refresh_rate": 239.76, "vic": 57}, 60: {"width": 1280, "height": 720, "refresh_rate": 24.0, "vic": 60}, 61: {"width": 1280, "height": 720, "refresh_rate": 25.0, "vic": 61}, 62: {"width": 1280, "height": 720, "refresh_rate": 30.0, "vic": 62}, 63: {"width": 1920, "height": 1080, "refresh_rate": 120.0, "vic": 63}, 64: {"width": 1920, "height": 1080, "refresh_rate": 100.0, "vic": 64}, 65: {"width": 1280, "height": 720, "refresh_rate": 24.0, "vic": 65}, 66: {"width": 1280, "height": 720, "refresh_rate": 25.0, "vic": 66}, 67: {"width": 1280, "height": 720, "refresh_rate": 30.0, "vic": 67}, 68: {"width": 1280, "height": 720, "refresh_rate": 50.0, "vic": 68}, 69: {"width": 1280, "height": 720, "refresh_rate": 60.0, "vic": 69}, 70: {"width": 1280, "height": 720, "refresh_rate": 100.0, "vic": 70}, 71: {"width": 1280, "height": 720, "refresh_rate": 120.0, "vic": 71}, 72: {"width": 1920, "height": 1080, "refresh_rate": 24.0, "vic": 72}, 73: {"width": 1920, "height": 1080, "refresh_rate": 25.0, "vic": 73}, 74: {"width": 1920, "height": 1080, "refresh_rate": 30.0, "vic": 74}, 75: {"width": 1920, "height": 1080, "refresh_rate": 50.0, "vic": 75}, 76: {"width": 1920, "height": 1080, "refresh_rate": 60.0, "vic": 76}, 77: {"width": 1920, "height": 1080, "refresh_rate": 100.0, "vic": 77}, 78: {"width": 1920, "height": 1080, "refresh_rate": 120.0, "vic": 78}, 79: {"width": 1680, "height": 720, "refresh_rate": 24.0, "vic": 79}, 80: {"width": 1680, "height": 720, "refresh_rate": 25.0, "vic": 80}, 81: {"width": 1680, "height": 720, "refresh_rate": 30.0, "vic": 81}, 82: {"width": 1680, "height": 720, "refresh_rate": 50.0, "vic": 82}, 83: {"width": 1680, "height": 720, "refresh_rate": 60.0, "vic": 83}, 84: {"width": 1680, "height": 720, "refresh_rate": 100.0, "vic": 84}, 85: {"width": 1680, "height": 720, "refresh_rate": 120.0, "vic": 85}, 86: {"width": 2560, "height": 1080, "refresh_rate": 24.0, "vic": 86}, 87: {"width": 2560, "height": 1080, "refresh_rate": 25.0, "vic": 87}, 88: {"width": 2560, "height": 1080, "refresh_rate": 30.0, "vic": 88}, 89: {"width": 2560, "height": 1080, "refresh_rate": 50.0, "vic": 89}, 90: {"width": 2560, "height": 1080, "refresh_rate": 60.0, "vic": 90}, 91: {"width": 2560, "height": 1080, "refresh_rate": 100.0, "vic": 91}, 92: {"width": 2560, "height": 1080, "refresh_rate": 120.0, "vic": 92}, 93: {"width": 3840, "height": 2160, "refresh_rate": 24.0, "vic": 93}, 94: {"width": 3840, "height": 2160, "refresh_rate": 25.0, "vic": 94}, 95: {"width": 3840, "height": 2160, "refresh_rate": 30.0, "vic": 95}, 96: {"width": 3840, "height": 2160, "refresh_rate": 50.0, "vic": 96}, 97: {"width": 3840, "height": 2160, "refresh_rate": 60.0, "vic": 97}, 98: {"width": 4096, "height": 2160, "refresh_rate": 24.0, "vic": 98}, 99: {"width": 4096, "height": 2160, "refresh_rate": 25.0, "vic": 99}, 100: {"width": 4096, "height": 2160, "refresh_rate": 30.0, "vic": 100}, 101: {"width": 4096, "height": 2160, "refresh_rate": 50.0, "vic": 101}, 102: {"width": 4096, "height": 2160, "refresh_rate": 60.0, "vic": 102}, 103: {"width": 3840, "height": 2160, "refresh_rate": 24.0, "vic": 103}, 104: {"width": 3840, "height": 2160, "refresh_rate": 25.0, "vic": 104}, 105: {"width": 3840, "height": 2160, "refresh_rate": 30.0, "vic": 105}, 106: {"width": 3840, "height": 2160, "refresh_rate": 50.0, "vic": 106}, 107: {"width": 3840, "height": 2160, "refresh_rate": 60.0, "vic": 107}, 108: {"width": 1280, "height": 720, "refresh_rate": 48.0, "vic": 108}, 109: {"width": 1280, "height": 720, "refresh_rate": 48.0, "vic": 109}, 110: {"width": 1680, "height": 720, "refresh_rate": 48.0, "vic": 110}, 111: {"width": 1920, "height": 1080, "refresh_rate": 48.0, "vic": 111}, 112: {"width": 1920, "height": 1080, "refresh_rate": 48.0, "vic": 112}, 113: {"width": 2560, "height": 1080, "refresh_rate": 48.0, "vic": 113}, 114: {"width": 3840, "height": 2160, "refresh_rate": 48.0, "vic": 114}, 115: {"width": 4096, "height": 2160, "refresh_rate": 48.0, "vic": 115}, 116: {"width": 3840, "height": 2160, "refresh_rate": 48.0, "vic": 116}, 117: {"width": 3840, "height": 2160, "refresh_rate": 100.0, "vic": 117}, 118: {"width": 3840, "height": 2160, "refresh_rate": 120.0, "vic": 118}, 119: {"width": 3840, "height": 2160, "refresh_rate": 100.0, "vic": 119}, 120: {"width": 3840, "height": 2160, "refresh_rate": 120.0, "vic": 120}, 218: {"width": 4096, "height": 2160, "refresh_rate": 100.0, "vic": 218}, 219: {"width": 4096, "height": 2160, "refresh_rate": 120.0, "vic": 219}, } # CVT分辨率ID映射 cvt_resolution_map = { 0: [ {"width": 640, "height": 480, "refresh_rate": 60.0}, {"width": 768, "height": 480, "refresh_rate": 84.502}, {"width": 1024, "height": 640, "refresh_rate": 59.887}, {"width": 1152, "height": 720, "refresh_rate": 74.721}, {"width": 1280, "height": 768, "refresh_rate": 60.0, "note": "RB1"}, {"width": 1280, "height": 960, "refresh_rate": 59.939}, {"width": 1536, "height": 960, "refresh_rate": 84.884}, {"width": 1600, "height": 1200, "refresh_rate": 60.0, "note": "RB1"}, {"width": 1920, "height": 1080, "refresh_rate": 30.0, "note": "RB1"}, {"width": 1920, "height": 1080, "refresh_rate": 30.0, "note": "RB2"}, {"width": 1920, "height": 1080, "refresh_rate": 60.0, "note": "RB1"}, {"width": 1920, "height": 1080, "refresh_rate": 60.0, "note": "RB2"}, {"width": 1920, "height": 1080, "refresh_rate": 84.884}, {"width": 1920, "height": 1080, "refresh_rate": 120.0, "note": "RB1"}, {"width": 1920, "height": 1080, "refresh_rate": 120.0, "note": "RB2"}, {"width": 1920, "height": 1080, "refresh_rate": 144.05, "note": "RB1"}, {"width": 1920, "height": 1080, "refresh_rate": 144.05, "note": "RB2"}, {"width": 1920, "height": 1080, "refresh_rate": 144.05, "note": "RB3"}, {"width": 1920, "height": 1080, "refresh_rate": 200.07, "note": "RB3"}, {"width": 1920, "height": 1080, "refresh_rate": 239.898, "note": "RB1"}, {"width": 1920, "height": 1080, "refresh_rate": 239.898, "note": "RB2"}, {"width": 1920, "height": 1080, "refresh_rate": 239.898, "note": "RB3"}, {"width": 1920, "height": 1440, "refresh_rate": 59.974, "note": "RB1"}, {"width": 2048, "height": 1280, "refresh_rate": 59.922, "note": "RB1"}, {"width": 2048, "height": 1536, "refresh_rate": 60.0, "note": "RB1"}, {"width": 2128, "height": 1200, "refresh_rate": 59.946}, {"width": 2456, "height": 1536, "refresh_rate": 50.0}, {"width": 2456, "height": 1536, "refresh_rate": 74.935}, {"width": 2560, "height": 1080, "refresh_rate": 60.0}, {"width": 2560, "height": 1080, "refresh_rate": 60.0, "note": "RB1"}, {"width": 2560, "height": 1080, "refresh_rate": 144.051, "note": "RB3"}, {"width": 2560, "height": 1080, "refresh_rate": 200.07, "note": "RB3"}, {"width": 2560, "height": 1440, "refresh_rate": 60.0, "note": "RB1"}, {"width": 2560, "height": 1440, "refresh_rate": 60.0, "note": "RB2"}, {"width": 2560, "height": 1440, "refresh_rate": 144.05, "note": "RB3"}, {"width": 2560, "height": 1440, "refresh_rate": 200.07, "note": "RB3"}, {"width": 2560, "height": 1920, "refresh_rate": 74.979}, {"width": 2728, "height": 1536, "refresh_rate": 59.944}, {"width": 3440, "height": 1440, "refresh_rate": 60.0}, {"width": 3440, "height": 1440, "refresh_rate": 60.0, "note": "RB1"}, {"width": 3440, "height": 1440, "refresh_rate": 60.0, "note": "RB2"}, {"width": 3440, "height": 1440, "refresh_rate": 120.0}, {"width": 3440, "height": 1440, "refresh_rate": 120.0, "note": "RB1"}, {"width": 3440, "height": 1440, "refresh_rate": 120.0, "note": "RB2"}, {"width": 3440, "height": 1440, "refresh_rate": 165.0, "note": "RB1"}, {"width": 3440, "height": 1440, "refresh_rate": 165.0, "note": "RB2"}, {"width": 3440, "height": 1440, "refresh_rate": 200.0, "note": "RB1"}, {"width": 3440, "height": 1440, "refresh_rate": 200.0, "note": "RB2"}, {"width": 3840, "height": 2160, "refresh_rate": 30.0, "note": "RB1"}, {"width": 3840, "height": 2160, "refresh_rate": 30.0, "note": "RB2"}, {"width": 3840, "height": 2160, "refresh_rate": 60.0, "note": "RB1"}, {"width": 3840, "height": 2160, "refresh_rate": 60.0, "note": "RB2"}, {"width": 3840, "height": 2160, "refresh_rate": 60.021, "note": "RB3"}, {"width": 3840, "height": 2160, "refresh_rate": 120.0, "note": "RB1"}, {"width": 3840, "height": 2160, "refresh_rate": 120.0, "note": "RB2"}, {"width": 4096, "height": 2160, "refresh_rate": 60.0, "note": "RB1"}, {"width": 4096, "height": 2160, "refresh_rate": 60.0, "note": "RB2"}, {"width": 4096, "height": 2160, "refresh_rate": 60.021, "note": "RB3"}, ] } # OVT分辨率ID映射 ovt_resolution_map = { 0: [ {"width": 768, "height": 480, "refresh_rate": 85.0}, {"width": 1024, "height": 640, "refresh_rate": 60.0}, {"width": 1152, "height": 720, "refresh_rate": 75.0}, {"width": 1280, "height": 768, "refresh_rate": 60.0}, {"width": 1280, "height": 960, "refresh_rate": 60.0}, {"width": 1440, "height": 240, "refresh_rate": 60.0}, {"width": 1440, "height": 480, "refresh_rate": 60.0}, {"width": 1440, "height": 900, "refresh_rate": 60.0}, {"width": 1536, "height": 960, "refresh_rate": 85.0}, {"width": 1920, "height": 1080, "refresh_rate": 30.0}, {"width": 1920, "height": 1080, "refresh_rate": 60.0}, {"width": 1920, "height": 1080, "refresh_rate": 85.0}, {"width": 1920, "height": 1080, "refresh_rate": 100.0}, {"width": 1920, "height": 1080, "refresh_rate": 120.0}, {"width": 1920, "height": 1440, "refresh_rate": 60.0}, {"width": 2048, "height": 1280, "refresh_rate": 60.0}, {"width": 2048, "height": 1536, "refresh_rate": 60.0}, {"width": 2128, "height": 1200, "refresh_rate": 60.0}, {"width": 2456, "height": 1536, "refresh_rate": 50.0}, {"width": 2456, "height": 1536, "refresh_rate": 75.0}, {"width": 2560, "height": 1080, "refresh_rate": 30.0}, {"width": 2560, "height": 1080, "refresh_rate": 60.0}, {"width": 2560, "height": 1080, "refresh_rate": 120.0}, {"width": 2560, "height": 1600, "refresh_rate": 60.0}, {"width": 2560, "height": 1920, "refresh_rate": 75.0}, {"width": 2728, "height": 1536, "refresh_rate": 60.0}, {"width": 3840, "height": 2160, "refresh_rate": 30.0}, {"width": 3840, "height": 2160, "refresh_rate": 60.0}, {"width": 3840, "height": 2160, "refresh_rate": 120.0}, {"width": 4096, "height": 2160, "refresh_rate": 30.0}, ], 1: [ {"width": 1280, "height": 720, "refresh_rate": 24.0}, {"width": 1280, "height": 720, "refresh_rate": 120.0}, ], 4: [ {"width": 1920, "height": 1080, "refresh_rate": 144.0}, {"width": 1920, "height": 1080, "refresh_rate": 240.0}, ], } # 根据分辨率类型和ID获取分辨率信息的函数 @staticmethod def get_resolution_info(resolution_type, resolution_id): """ 根据分辨率类型和ID获取分辨率信息 Args: resolution_type: 分辨率类型,可以是DMT、CTA、CVT或OVT resolution_id: 分辨率ID Returns: 包含分辨率信息的字典,如果未找到则返回None """ if resolution_type == UCDEnum.ResolutionType.DMT: return UCDEnum.dmt_resolution_map.get(resolution_id) elif resolution_type == UCDEnum.ResolutionType.CTA: return UCDEnum.cta_resolution_map.get(resolution_id) elif resolution_type == UCDEnum.ResolutionType.CVT: resolutions = UCDEnum.cvt_resolution_map.get(resolution_id, []) return resolutions[0] if resolutions else None elif resolution_type == UCDEnum.ResolutionType.OVT: resolutions = UCDEnum.ovt_resolution_map.get(resolution_id, []) return resolutions[0] if resolutions else None return None @staticmethod def get_formatted_resolution_list(): """ 从分辨率映射中生成格式化的分辨率字符串列表,用于UI显示 格式为: "类型 宽度x 高度 @ 刷新率Hz" Returns: 包含格式化分辨率字符串的列表 """ formatted_list = [] # 添加DMT分辨率 for res_id, res_info in UCDEnum.TimingInfo.dmt_resolution_map.items(): formatted_str = f"DMT {res_info['width']}x {res_info['height']} @ {int(res_info['refresh_rate'])}Hz" formatted_list.append(formatted_str) # 添加CTA分辨率 for res_id, res_info in UCDEnum.TimingInfo.cta_resolution_map.items(): formatted_str = f"CTA {res_info['width']}x {res_info['height']} @ {int(res_info['refresh_rate'])}Hz" formatted_list.append(formatted_str) # 添加CVT分辨率 (只取每个ID的第一个) for res_id, res_list in UCDEnum.TimingInfo.cvt_resolution_map.items(): for res_info in res_list: note = f" {res_info.get('note', '')}" if "note" in res_info else "" formatted_str = f"CVT {res_info['width']}x {res_info['height']} @ {int(res_info['refresh_rate'])}Hz{note}" formatted_list.append(formatted_str) # 添加OVT分辨率 (只取每个ID的第一个) for res_id, res_list in UCDEnum.TimingInfo.ovt_resolution_map.items(): for res_info in res_list: formatted_str = f"OVT {res_info['width']}x {res_info['height']} @ {int(res_info['refresh_rate'])}Hz" formatted_list.append(formatted_str) # 排序并去重 return sorted(list(set(formatted_list))) class SignalFormat: """信号格式相关枚举""" class GammaType: """Gamma 类型枚举""" GAMMA_22 = "2.2" GAMMA_24 = "2.4" GAMMA_26 = "2.6" @staticmethod def get_list(): return [ SignalFormat.GammaType.GAMMA_22, SignalFormat.GammaType.GAMMA_24, SignalFormat.GammaType.GAMMA_26, ] @staticmethod def get_gamma_value(gamma_str): """将 Gamma 字符串转换为数值""" gamma_map = {"2.2": 2.2, "2.4": 2.4, "2.6": 2.6} return gamma_map.get(gamma_str, 2.2) class DataRange: """数据范围枚举""" FULL = "Full" LIMITED = "Limited" @staticmethod def get_list(): return [SignalFormat.DataRange.FULL, SignalFormat.DataRange.LIMITED] @staticmethod def is_full_range(range_str): """判断是否为 Full Range""" return range_str == SignalFormat.DataRange.FULL class BitDepth: """编码位深枚举""" BIT_8 = "8bit" BIT_10 = "10bit" BIT_12 = "12bit" @staticmethod def get_list(): return [ SignalFormat.BitDepth.BIT_8, SignalFormat.BitDepth.BIT_10, SignalFormat.BitDepth.BIT_12, ] @staticmethod def get_bit_value(bit_str): """将位深字符串转换为数值""" bit_map = {"8bit": 8, "10bit": 10, "12bit": 12} return bit_map.get(bit_str, 8) class HDRMetadata: """HDR Metadata 参数""" # MaxCLL (Maximum Content Light Level) - 最大内容亮度级别 MAX_CLL_DEFAULT = 1000 MAX_CLL_OPTIONS = [400, 600, 800, 1000, 1200, 1500, 2000, 4000] # MaxFALL (Maximum Frame Average Light Level) - 最大帧平均亮度级别 MAX_FALL_DEFAULT = 400 MAX_FALL_OPTIONS = [200, 300, 400, 500, 600, 800, 1000] @staticmethod def get_maxcll_list(): return SignalFormat.HDRMetadata.MAX_CLL_OPTIONS @staticmethod def get_maxfall_list(): return SignalFormat.HDRMetadata.MAX_FALL_OPTIONS