import { CpuTopology as CpuTopologyPB, DeckLinkCard as DeckLinkCardPB, DeckLinkDisplayModeId as DeckLinkDisplayModeIdPB, DeckLinkKeyingMode as DeckLinkKeyingModePB, DeckLinkPixelFormat as DeckLinkPixelFormatPB, DeckLinkProfileId as DeckLinkProfileIdPB, DeckLinkAncillaryKind as DeckLinkAncillaryKindPB, DeckLinkSubtitleKind as DeckLinkSubtitleKindPB, VancAncillaryKind as VancAncillaryKindPB, VancSubtitlesKind as VancSubtitlesKindPB, VideoConnection as VideoConnectionPB, VideoIOSupport as VideoIOSupportPB, VancPayloadFormat as VancPayloadFormatPB, MA35DCard as MA35DCardPB, Nic as NicPB, NvidiaCard as NvidiaCardPB, Nic_NicClass, Nic_NicDriver, VideoFormatInfo as VideoFormatInfoPB, VideoColorInfo as VideoColorInfoPB, AudioFormatInfo as AudioFormatInfoPB } from "@norskvideo/norsk-api/lib/media_pb"; import { exhaustiveCheck, mandatory } from "./shared/utils"; //////////////////////////////////////////////////////////////////////////////// // General /** @public */ export interface FrameRate { frames: number; seconds: number; } /** @public */ export type LogicalCpuId = number; /** @public */ export interface Core { logicalCpuIds: LogicalCpuId[]; } /** @public */ export interface Processor { cores: Core[]; } /** @public */ export interface NumaNode { processors: Processor[]; } /** @public */ export interface CpuTopology { numaNodes: NumaNode[]; } /** @internal */ export function fromCpuTopology(cpuTopology?: CpuTopologyPB): CpuTopology { return cpuTopology ? { numaNodes: cpuTopology?.numaNodes.map((numaNode) => { return { processors: numaNode.processors.map((processor) => { return { cores: processor.cores.map((core) => { return { logicalCpuIds: core.logicalCpuIds.map((logicalCpuId) => { return logicalCpuId.logicalCpuId; }), }; }), }; }), }; }), } : { numaNodes: [] }; } //////////////////////////////////////////////////////////////////////////////// // Decklink /** @public */ export type DeckLinkVideoConnection = | "sdi" | "hdmi" | "optical_sdi" | "component" | "composite" | "svideo"; /** @internal */ export function toVideoConnection( conn: DeckLinkVideoConnection ): VideoConnectionPB { switch (conn) { case "sdi": return VideoConnectionPB.SDI; case "hdmi": return VideoConnectionPB.HDMI; case "optical_sdi": return VideoConnectionPB.OPTICAL_SDI; case "component": return VideoConnectionPB.COMPONENT; case "composite": return VideoConnectionPB.COMPOSITE; case "svideo": return VideoConnectionPB.SVIDEO; default: exhaustiveCheck(conn); } } /** @internal */ export function fromVideoConnection( conn: VideoConnectionPB ): DeckLinkVideoConnection { switch (conn) { case VideoConnectionPB.SDI: return "sdi"; case VideoConnectionPB.HDMI: return "hdmi"; case VideoConnectionPB.OPTICAL_SDI: return "optical_sdi"; case VideoConnectionPB.COMPONENT: return "component"; case VideoConnectionPB.COMPOSITE: return "composite"; case VideoConnectionPB.SVIDEO: return "svideo"; default: exhaustiveCheck(conn); } } /** @public */ export type DeckLinkVideoIOSupport = "capture" | "playback"; /** @internal */ export function toVideoIOSupport( videoIO: DeckLinkVideoIOSupport ): VideoIOSupportPB { switch (videoIO) { case "capture": return VideoIOSupportPB.CAPTURE; case "playback": return VideoIOSupportPB.PLAYBACK; default: exhaustiveCheck(videoIO); } } /** @internal */ export function fromVideoIOSupport( videoIO: VideoIOSupportPB ): DeckLinkVideoIOSupport { switch (videoIO) { case VideoIOSupportPB.CAPTURE: return "capture"; case VideoIOSupportPB.PLAYBACK: return "playback"; default: exhaustiveCheck(videoIO); } } /** @public */ export type DeckLinkPixelFormat = "uyvy" | "argb"; /** @internal */ export function toDeckLinkPixelFormat( format: DeckLinkPixelFormat ): DeckLinkPixelFormatPB { switch (format) { case "uyvy": return DeckLinkPixelFormatPB.DECKLINK_UYVY; case "argb": return DeckLinkPixelFormatPB.DECKLINK_ARGB; default: exhaustiveCheck(format); } } /** @internal */ export function fromDeckLinkPixelFormat( format: DeckLinkPixelFormatPB ): DeckLinkPixelFormat { switch (format) { case DeckLinkPixelFormatPB.DECKLINK_UYVY: return "uyvy"; case DeckLinkPixelFormatPB.DECKLINK_ARGB: return "argb"; default: exhaustiveCheck(format); } } /** @public */ export type DeckLinkKeyingMode = "none" | "internal" | "external"; /** @internal */ export function toDeckLinkKeyingMode( mode: DeckLinkKeyingMode ): DeckLinkKeyingModePB { switch (mode) { case "none": return DeckLinkKeyingModePB.NO_KEYING; case "internal": return DeckLinkKeyingModePB.INTERNAL_KEYING; case "external": return DeckLinkKeyingModePB.EXTERNAL_KEYING; default: exhaustiveCheck(mode); } } /** * @public * Hardware profile for DeckLink cards that support multiple sub-device configurations. * Cards like the DeckLink Duo 2 and Quad 2 can be configured to expose different * numbers of sub-devices with different duplex modes. */ export type DeckLinkProfileId = | "one_sub_device_full_duplex" | "one_sub_device_half_duplex" | "two_sub_devices_full_duplex" | "two_sub_devices_half_duplex" | "four_sub_devices_half_duplex"; /** @internal */ export function toDeckLinkProfileId( profile: DeckLinkProfileId ): DeckLinkProfileIdPB { switch (profile) { case "one_sub_device_full_duplex": return DeckLinkProfileIdPB.ONE_SUB_DEVICE_FULL_DUPLEX; case "one_sub_device_half_duplex": return DeckLinkProfileIdPB.ONE_SUB_DEVICE_HALF_DUPLEX; case "two_sub_devices_full_duplex": return DeckLinkProfileIdPB.TWO_SUB_DEVICES_FULL_DUPLEX; case "two_sub_devices_half_duplex": return DeckLinkProfileIdPB.TWO_SUB_DEVICES_HALF_DUPLEX; case "four_sub_devices_half_duplex": return DeckLinkProfileIdPB.FOUR_SUB_DEVICES_HALF_DUPLEX; default: exhaustiveCheck(profile); } } /** @internal */ export function toDeckLinkSubtitleKind( kind: "none" | "teletext" | "cta708" | "cta608" ): DeckLinkSubtitleKindPB { switch (kind) { case "none": return DeckLinkSubtitleKindPB.NONE; case "teletext": return DeckLinkSubtitleKindPB.TELETEXT; case "cta708": return DeckLinkSubtitleKindPB.CTA708; case "cta608": return DeckLinkSubtitleKindPB.CTA608; default: exhaustiveCheck(kind); } } /** @internal */ export function toDeckLinkAncillaryKind( kind: "none" | "scte104" ): DeckLinkAncillaryKindPB { switch (kind) { case "none": return DeckLinkAncillaryKindPB.NONE; case "scte104": return DeckLinkAncillaryKindPB.SCTE104; default: exhaustiveCheck(kind); } } /** @internal */ export function toVancSubtitlesKind( kind: "none" | "teletext" | "cta708" | "cta608" ): VancSubtitlesKindPB { switch (kind) { case "none": return VancSubtitlesKindPB.NONE; case "teletext": return VancSubtitlesKindPB.TELETEXT; case "cta708": return VancSubtitlesKindPB.CTA708; case "cta608": return VancSubtitlesKindPB.CTA608; default: exhaustiveCheck(kind); } } /** @internal */ export function toVancAncillaryKind( kind: "none" | "scte104" ): VancAncillaryKindPB { switch (kind) { case "none": return VancAncillaryKindPB.NONE; case "scte104": return VancAncillaryKindPB.SCTE104; default: exhaustiveCheck(kind); } } /** @public */ export interface DeckLinkCard { index: number; displayName: string; inputConnections: DeckLinkVideoConnection[]; outputConnections: DeckLinkVideoConnection[]; ioSupport: DeckLinkVideoIOSupport[]; } /** @internal */ export function fromDeckLinkCard(deckLinkCard: DeckLinkCardPB): DeckLinkCard { return { index: deckLinkCard.index, displayName: deckLinkCard.displayName, inputConnections: deckLinkCard.inputConnections.map(fromVideoConnection), outputConnections: deckLinkCard.outputConnections.map(fromVideoConnection), ioSupport: deckLinkCard.ioSupport.map(fromVideoIOSupport), }; } /** @public */ export type DeckLinkDisplayModeId = | "auto" | "sd_ntsc" | "sd_nt23" | "sd_pal" | "sd_ntsp" | "sd_palp" | "hd1080_23ps" | "hd1080_24ps" | "hd1080_p25" | "hd1080_p29" | "hd1080_p30" | "hd1080_p47" | "hd1080_p48" | "hd1080_i50" | "hd1080_i59" | "hd1080_i60" | "hd1080_p95" | "hd1080_p96" | "hd1080_p10" | "hd1080_p11" | "hd1080_p12" | "hd1080_p50" | "hd1080_p59" | "hd1080_p60" | "hd720_p50" | "hd720_p59" | "hd720_p60" | "two_k_23" | "two_k_24" | "two_k_25" | "two_k_dci_23" | "two_k_dci_24" | "two_k_dci_25" | "two_k_dci_29" | "two_k_dci_30" | "two_k_dci_47" | "two_k_dci_48" | "two_k_dci_50" | "two_k_dci_59" | "two_k_dci_60" | "two_k_dci_95" | "two_k_dci_96" | "two_k_dci_10" | "two_k_dci_11" | "two_k_dci_12" | "four_k_23" | "four_k_24" | "four_k_25" | "four_k_29" | "four_k_30" | "four_k_47" | "four_k_48" | "four_k_50" | "four_k_59" | "four_k_60" | "four_k_95" | "four_k_96" | "four_k_10" | "four_k_11" | "four_k_12" | "four_k_dci_23" | "four_k_dci_24" | "four_k_dci_25" | "four_k_dci_29" | "four_k_dci_30" | "four_k_dci_47" | "four_k_dci_48" | "four_k_dci_50" | "four_k_dci_59" | "four_k_dci_60" | "four_k_dci_95" | "four_k_dci_96" | "four_k_dci_10" | "four_k_dci_11" | "four_k_dci_12" | "eight_k_23" | "eight_k_24" | "eight_k_25" | "eight_k_29" | "eight_k_30" | "eight_k_47" | "eight_k_48" | "eight_k_50" | "eight_k_59" | "eight_k_60" | "eight_k_dci_23" | "eight_k_dci_24" | "eight_k_dci_25" | "eight_k_dci_29" | "eight_k_dci_30" | "eight_k_dci_47" | "eight_k_dci_48" | "eight_k_dci_50" | "eight_k_dci_59" | "eight_k_dci_60" | "pc_vga6" | "pc_svg6" | "pc_wxg5" | "pc_wxg6" | "pc_sxg5" | "pc_sxg6" | "pc_uxg5" | "pc_uxg6" | "pc_wux5" | "pc_wux6" | "pc_1945" | "pc_1946" | "pc_wqh5" | "pc_wqh6" | "pc_wqx5" | "pc_wqx6" | "special_iunk"; /** @internal */ export function toDeckLinkDisplayModeId( id: DeckLinkDisplayModeId ): DeckLinkDisplayModeIdPB { switch (id) { case "auto": return DeckLinkDisplayModeIdPB.AUTO; case "sd_ntsc": return DeckLinkDisplayModeIdPB.SD_NTSC; case "sd_nt23": return DeckLinkDisplayModeIdPB.SD_NT23; case "sd_pal": return DeckLinkDisplayModeIdPB.SD_PAL; case "sd_ntsp": return DeckLinkDisplayModeIdPB.SD_NTSP; case "sd_palp": return DeckLinkDisplayModeIdPB.SD_PALP; case "hd1080_23ps": return DeckLinkDisplayModeIdPB.HD1080_23PS; case "hd1080_24ps": return DeckLinkDisplayModeIdPB.HD1080_24PS; case "hd1080_p25": return DeckLinkDisplayModeIdPB.HD1080_P25; case "hd1080_p29": return DeckLinkDisplayModeIdPB.HD1080_P29; case "hd1080_p30": return DeckLinkDisplayModeIdPB.HD1080_P30; case "hd1080_p47": return DeckLinkDisplayModeIdPB.HD1080_P47; case "hd1080_p48": return DeckLinkDisplayModeIdPB.HD1080_P48; case "hd1080_i50": return DeckLinkDisplayModeIdPB.HD1080_I50; case "hd1080_i59": return DeckLinkDisplayModeIdPB.HD1080_I59; case "hd1080_i60": return DeckLinkDisplayModeIdPB.HD1080_I60; case "hd1080_p95": return DeckLinkDisplayModeIdPB.HD1080_P95; case "hd1080_p96": return DeckLinkDisplayModeIdPB.HD1080_P96; case "hd1080_p10": return DeckLinkDisplayModeIdPB.HD1080_P10; case "hd1080_p11": return DeckLinkDisplayModeIdPB.HD1080_P11; case "hd1080_p12": return DeckLinkDisplayModeIdPB.HD1080_P12; case "hd1080_p50": return DeckLinkDisplayModeIdPB.HD1080_P50; case "hd1080_p59": return DeckLinkDisplayModeIdPB.HD1080_P59; case "hd1080_p60": return DeckLinkDisplayModeIdPB.HD1080_P60; case "hd720_p50": return DeckLinkDisplayModeIdPB.HD720_P50; case "hd720_p59": return DeckLinkDisplayModeIdPB.HD720_P59; case "hd720_p60": return DeckLinkDisplayModeIdPB.HD720_P60; case "two_k_23": return DeckLinkDisplayModeIdPB.TWO_K_23; case "two_k_24": return DeckLinkDisplayModeIdPB.TWO_K_24; case "two_k_25": return DeckLinkDisplayModeIdPB.TWO_K_25; case "two_k_dci_23": return DeckLinkDisplayModeIdPB.TWO_K_DCI_23; case "two_k_dci_24": return DeckLinkDisplayModeIdPB.TWO_K_DCI_24; case "two_k_dci_25": return DeckLinkDisplayModeIdPB.TWO_K_DCI_25; case "two_k_dci_29": return DeckLinkDisplayModeIdPB.TWO_K_DCI_29; case "two_k_dci_30": return DeckLinkDisplayModeIdPB.TWO_K_DCI_30; case "two_k_dci_47": return DeckLinkDisplayModeIdPB.TWO_K_DCI_47; case "two_k_dci_48": return DeckLinkDisplayModeIdPB.TWO_K_DCI_48; case "two_k_dci_50": return DeckLinkDisplayModeIdPB.TWO_K_DCI_50; case "two_k_dci_59": return DeckLinkDisplayModeIdPB.TWO_K_DCI_59; case "two_k_dci_60": return DeckLinkDisplayModeIdPB.TWO_K_DCI_60; case "two_k_dci_95": return DeckLinkDisplayModeIdPB.TWO_K_DCI_95; case "two_k_dci_96": return DeckLinkDisplayModeIdPB.TWO_K_DCI_96; case "two_k_dci_10": return DeckLinkDisplayModeIdPB.TWO_K_DCI_10; case "two_k_dci_11": return DeckLinkDisplayModeIdPB.TWO_K_DCI_11; case "two_k_dci_12": return DeckLinkDisplayModeIdPB.TWO_K_DCI_12; case "four_k_23": return DeckLinkDisplayModeIdPB.FOUR_K_23; case "four_k_24": return DeckLinkDisplayModeIdPB.FOUR_K_24; case "four_k_25": return DeckLinkDisplayModeIdPB.FOUR_K_25; case "four_k_29": return DeckLinkDisplayModeIdPB.FOUR_K_29; case "four_k_30": return DeckLinkDisplayModeIdPB.FOUR_K_30; case "four_k_47": return DeckLinkDisplayModeIdPB.FOUR_K_47; case "four_k_48": return DeckLinkDisplayModeIdPB.FOUR_K_48; case "four_k_50": return DeckLinkDisplayModeIdPB.FOUR_K_50; case "four_k_59": return DeckLinkDisplayModeIdPB.FOUR_K_59; case "four_k_60": return DeckLinkDisplayModeIdPB.FOUR_K_60; case "four_k_95": return DeckLinkDisplayModeIdPB.FOUR_K_95; case "four_k_96": return DeckLinkDisplayModeIdPB.FOUR_K_96; case "four_k_10": return DeckLinkDisplayModeIdPB.FOUR_K_10; case "four_k_11": return DeckLinkDisplayModeIdPB.FOUR_K_11; case "four_k_12": return DeckLinkDisplayModeIdPB.FOUR_K_12; case "four_k_dci_23": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_23; case "four_k_dci_24": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_24; case "four_k_dci_25": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_25; case "four_k_dci_29": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_29; case "four_k_dci_30": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_30; case "four_k_dci_47": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_47; case "four_k_dci_48": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_48; case "four_k_dci_50": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_50; case "four_k_dci_59": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_59; case "four_k_dci_60": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_60; case "four_k_dci_95": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_95; case "four_k_dci_96": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_96; case "four_k_dci_10": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_10; case "four_k_dci_11": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_11; case "four_k_dci_12": return DeckLinkDisplayModeIdPB.FOUR_K_DCI_12; case "eight_k_23": return DeckLinkDisplayModeIdPB.EIGHT_K_23; case "eight_k_24": return DeckLinkDisplayModeIdPB.EIGHT_K_24; case "eight_k_25": return DeckLinkDisplayModeIdPB.EIGHT_K_25; case "eight_k_29": return DeckLinkDisplayModeIdPB.EIGHT_K_29; case "eight_k_30": return DeckLinkDisplayModeIdPB.EIGHT_K_30; case "eight_k_47": return DeckLinkDisplayModeIdPB.EIGHT_K_47; case "eight_k_48": return DeckLinkDisplayModeIdPB.EIGHT_K_48; case "eight_k_50": return DeckLinkDisplayModeIdPB.EIGHT_K_50; case "eight_k_59": return DeckLinkDisplayModeIdPB.EIGHT_K_59; case "eight_k_60": return DeckLinkDisplayModeIdPB.EIGHT_K_60; case "eight_k_dci_23": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_23; case "eight_k_dci_24": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_24; case "eight_k_dci_25": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_25; case "eight_k_dci_29": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_29; case "eight_k_dci_30": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_30; case "eight_k_dci_47": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_47; case "eight_k_dci_48": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_48; case "eight_k_dci_50": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_50; case "eight_k_dci_59": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_59; case "eight_k_dci_60": return DeckLinkDisplayModeIdPB.EIGHT_K_DCI_60; case "pc_vga6": return DeckLinkDisplayModeIdPB.PC_VGA6; case "pc_svg6": return DeckLinkDisplayModeIdPB.PC_SVG6; case "pc_wxg5": return DeckLinkDisplayModeIdPB.PC_WXG5; case "pc_wxg6": return DeckLinkDisplayModeIdPB.PC_WXG6; case "pc_sxg5": return DeckLinkDisplayModeIdPB.PC_SXG5; case "pc_sxg6": return DeckLinkDisplayModeIdPB.PC_SXG6; case "pc_uxg5": return DeckLinkDisplayModeIdPB.PC_UXG5; case "pc_uxg6": return DeckLinkDisplayModeIdPB.PC_UXG6; case "pc_wux5": return DeckLinkDisplayModeIdPB.PC_WUX5; case "pc_wux6": return DeckLinkDisplayModeIdPB.PC_WUX6; case "pc_1945": return DeckLinkDisplayModeIdPB.PC_1945; case "pc_1946": return DeckLinkDisplayModeIdPB.PC_1946; case "pc_wqh5": return DeckLinkDisplayModeIdPB.PC_WQH5; case "pc_wqh6": return DeckLinkDisplayModeIdPB.PC_WQH6; case "pc_wqx5": return DeckLinkDisplayModeIdPB.PC_WQX5; case "pc_wqx6": return DeckLinkDisplayModeIdPB.PC_WQX6; case "special_iunk": return DeckLinkDisplayModeIdPB.SPECIAL_IUNK; } } /** @public */ export interface DeckLinkDisplayMode { id: DeckLinkDisplayModeId; name: string; width: number; height: number; frameRate: FrameRate; } /** @public */ export interface MA35DDeviceInfo { productName: string; serialNumber: string; } /** @public */ export interface MA35DVersionInfo { pcieCrtlPatchVersion: string; pcieFwVersion: string; pciePhyPatchAVersion: string; scVersion: string; zspVersion: string; eSecureVersion: string; } /** @public */ export interface MA35DCard { index: number; device: string; busId: string; deviceInfo: MA35DDeviceInfo; versionInfo: MA35DVersionInfo; } /** @public */ export interface Nic { ifname: string; pciBdf: string; driver: "mlx5core" | "ixgbe" | "i40e" | "ice" | "ena" | "bnxten" | "atlantic" | "cxgb4" | "sfc" | "iwlwifi" | "other"; driverName: string; macAddress: string; st2110Capable: boolean; /** IPv4 addresses bound to this interface, in operator-friendly * dotted-decimal form. Empty when no IP is bound (or when `ip` * isn't on PATH at hardware-enum time). */ ipAddresses: string[]; } /** @public */ export interface NvidiaCard { pciBdf: string; model: string; } /** @internal */ export function fromNic(nic: NicPB) : Nic { return { ifname: nic.ifname, pciBdf: nic.pciBdf, driver: (() => { const c = nic.driver.case; switch (c) { case "knownDriver": { const v = nic.driver.value; switch (v) { case Nic_NicDriver.Mlx5Core: return "mlx5core"; case Nic_NicDriver.Ixgbe: return "ixgbe"; case Nic_NicDriver.I40e: return "i40e"; case Nic_NicDriver.Ice: return "ice"; case Nic_NicDriver.Ena: return "ena"; case Nic_NicDriver.BnxtEn: return "bnxten"; case Nic_NicDriver.Atlantic: return "atlantic"; case Nic_NicDriver.Cxgb4: return "cxgb4"; case Nic_NicDriver.Sfc: return "sfc"; case Nic_NicDriver.Iwlwifi: return "iwlwifi"; default: exhaustiveCheck(v); } break; }; case "otherDriver": return "other"; case undefined: return "other"; default: exhaustiveCheck(c); } })(), driverName: nic.driverName, macAddress: nic.mac, st2110Capable: nic.class == Nic_NicClass.Nic2110Capable, ipAddresses: nic.ipAddresses, } } /** @internal */ export function fromNvidiaCard(card: NvidiaCardPB) : NvidiaCard { return { pciBdf: card.pciBdf, model: card.model, } } /** @internal */ export function fromMA35DCard(ma35dCard: MA35DCardPB): MA35DCard { const deviceInfo = mandatory(ma35dCard.deviceInfo); const versionInfo = mandatory(ma35dCard.versionInfo); return { index: ma35dCard.index, device: ma35dCard.device, busId: ma35dCard.busId, deviceInfo: { productName: deviceInfo.productName, serialNumber: deviceInfo.serialNumber }, versionInfo: { pcieCrtlPatchVersion: versionInfo.pcieCrtlPatchVersion, pcieFwVersion: versionInfo.pcieFwVersion, pciePhyPatchAVersion: versionInfo.pciePhyPatchAVersion, scVersion: versionInfo.scVersion, zspVersion: versionInfo.zspVersion, eSecureVersion: versionInfo.eSecureVersion } } } /** @public */ export interface VancType2AncillaryId { did: number; sdid: number; } /** @public */ export type VancPayloadFormat = "other" | "afd_bar" | "pan_scan" | "scte104" | "dvb_scte_vbi" | "op47_sdp" | "op47_vanc_multipacket" | "ancillary_time_code" | "eia_708" | "eia_608"; /** @internal */ export function fromVancPayloadFormat(format: VancPayloadFormatPB): VancPayloadFormat { switch (format) { case VancPayloadFormatPB.VANC_AFD_BAR: return "afd_bar"; case VancPayloadFormatPB.VANC_PAN_SCAN: return "pan_scan"; case VancPayloadFormatPB.VANC_SCTE_104: return "scte104"; case VancPayloadFormatPB.VANC_DVB_SCTE_VBI: return "dvb_scte_vbi"; case VancPayloadFormatPB.VANC_OP47_SDP: return "op47_sdp"; case VancPayloadFormatPB.VANC_OP47_VANC_MULTIPACKET: return "op47_vanc_multipacket"; case VancPayloadFormatPB.VANC_ANCILLARY_TIME_CODE: return "ancillary_time_code"; case VancPayloadFormatPB.VANC_EIA_708D: return "eia_708"; case VancPayloadFormatPB.VANC_EIA_608: return "eia_608"; case VancPayloadFormatPB.VANC_OTHER: return "other"; default: exhaustiveCheck(format); } } //////////////////////////////////////////////////////////////////////////////// // Video Format Information (H.273 Color Science, Bit Depth, Chroma) /** @public */ export type ColourPrimaries = | "bt709" // Rec. 709 (HDTV) | "bt2020" // Rec. 2020 (UHDTV, HDR) | "p3-dci" // DCI-P3 | "p3-d65" // Display P3 | "bt601-625" // PAL | "bt601-525" // NTSC | "smpte240m" | "unspecified" | "unknown"; /** @public */ export type TransferCharacteristics = | "bt709" // SDR (Rec. 709, sRGB) | "pq" // HDR10 (SMPTE ST 2084) | "hlg" // HLG (Hybrid Log-Gamma) | "linear" | "srgb" | "bt2020-10" | "bt2020-12" | "unspecified" | "unknown"; /** @public */ export type MatrixCoefficients = | "bt709" | "bt2020-ncl" // Non-constant luminance | "bt2020-cl" // Constant luminance | "bt601" | "smpte240m" | "unspecified" | "unknown"; /** @public */ export type ChromaSubsampling = | "420" // 4:2:0 | "422" // 4:2:2 | "444" // 4:4:4 | "unknown"; /** @public */ export type ChromaLocation = | "left" // MPEG-2, MPEG-4 | "center" // MPEG-1, JPEG | "top-left" // ITU-R Rec. 601 | "unspecified"; /** @public */ export interface VideoColorInfo { primaries?: ColourPrimaries; transferCharacteristics?: TransferCharacteristics; matrixCoefficients?: MatrixCoefficients; fullRange?: boolean; chromaLocation?: ChromaLocation; } /** @public */ export interface VideoFormatInfo { bitDepth?: number; chromaSubsampling?: ChromaSubsampling; colorInfo?: VideoColorInfo; pixelAspectRatio?: { numerator: number; denominator: number }; codecProfile?: { profile?: string; level?: string; tier?: string; }; } /** @internal */ export function fromColourPrimaries(val?: number): ColourPrimaries | undefined { if (val === undefined) return undefined; switch (val) { case 1: return "bt709"; case 5: return "bt601-625"; case 6: return "bt601-525"; case 7: return "smpte240m"; case 9: return "bt2020"; case 11: return "p3-dci"; case 12: return "p3-d65"; case 2: return "unspecified"; default: return "unknown"; } } /** @internal */ export function fromTransferCharacteristics(val?: number): TransferCharacteristics | undefined { if (val === undefined) return undefined; switch (val) { case 1: return "bt709"; case 8: return "linear"; case 13: return "srgb"; case 14: return "bt2020-10"; case 15: return "bt2020-12"; case 16: return "pq"; case 18: return "hlg"; case 2: return "unspecified"; default: return "unknown"; } } /** @internal */ export function fromMatrixCoefficients(val?: number): MatrixCoefficients | undefined { if (val === undefined) return undefined; switch (val) { case 1: return "bt709"; case 6: return "bt601"; case 7: return "smpte240m"; case 9: return "bt2020-ncl"; case 10: return "bt2020-cl"; case 2: return "unspecified"; default: return "unknown"; } } /** @internal */ export function fromChromaSubsampling(val: number): ChromaSubsampling { switch (val) { case 1: return "420"; case 2: return "422"; case 3: return "444"; default: return "unknown"; } } /** @internal */ export function fromChromaLocation(val?: number): ChromaLocation | undefined { if (val === undefined) return undefined; switch (val) { case 0: return "left"; case 1: return "center"; case 2: return "top-left"; default: return "unspecified"; } } /** @internal */ export function fromVideoColorInfo(pb?: VideoColorInfoPB): VideoColorInfo | undefined { if (!pb) return undefined; return { primaries: fromColourPrimaries(pb.primaries), transferCharacteristics: fromTransferCharacteristics(pb.transferCharacteristics), matrixCoefficients: fromMatrixCoefficients(pb.matrixCoefficients), fullRange: pb.fullRange, chromaLocation: fromChromaLocation(pb.chromaLocation), }; } /** @internal */ export function fromVideoFormatInfo(pb?: VideoFormatInfoPB): VideoFormatInfo | undefined { if (!pb) return undefined; return { bitDepth: pb.bitDepth, chromaSubsampling: fromChromaSubsampling(pb.chromaSubsampling), colorInfo: fromVideoColorInfo(pb.colorInfo), pixelAspectRatio: pb.pixelAspectRatio, codecProfile: pb.codecProfile, }; } /** @public */ export interface AudioFormatInfo { sampleFormat?: string; // e.g., "s16", "s16p", "flt", "fltp" bitDepth?: number; // 16, 32, etc. planar?: boolean; // true if planar format (e.g., s16p, fltp) } /** @internal */ export function fromAudioFormatInfo(pb?: AudioFormatInfoPB): AudioFormatInfo | undefined { if (!pb) return undefined; return { sampleFormat: pb.sampleFormat, bitDepth: pb.bitDepth, planar: pb.planar, }; }