{ "$id": "https://opentrackio.org/schema.json", "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "static": { "type": "object", "properties": { "duration": { "type": "object", "properties": { "num": { "type": "integer", "maximum": 2147483647, "minimum": 1 }, "denom": { "type": "integer", "maximum": 4294967295, "minimum": 1 } }, "required": [ "num", "denom" ], "additionalProperties": false, "description": "Duration of the clip", "units": "second" }, "camera": { "type": "object", "properties": { "captureFrameRate": { "type": "object", "properties": { "num": { "type": "integer", "maximum": 2147483647, "minimum": 1 }, "denom": { "type": "integer", "maximum": 4294967295, "minimum": 1 } }, "required": [ "num", "denom" ], "additionalProperties": false, "description": "Capture frame rate of the camera", "units": "hertz" }, "activeSensorPhysicalDimensions": { "type": "object", "properties": { "height": { "type": "number", "minimum": 0.0 }, "width": { "type": "number", "minimum": 0.0 } }, "required": [ "height", "width" ], "description": "Height and width of the active area of the camera sensor in millimeters", "additionalProperties": false, "units": "millimeter" }, "activeSensorResolution": { "type": "object", "properties": { "height": { "type": "integer", "maximum": 2147483647, "minimum": 0 }, "width": { "type": "integer", "maximum": 2147483647, "minimum": 0 } }, "required": [ "height", "width" ], "description": "Photosite resolution of the active area of the camera sensor in pixels", "additionalProperties": false, "units": "pixel" }, "make": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string naming camera manufacturer" }, "model": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string identifying camera model" }, "serialNumber": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string uniquely identifying the camera" }, "firmwareVersion": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string identifying camera firmware version" }, "label": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string containing user-determined camera identifier" }, "anamorphicSqueeze": { "type": "object", "properties": { "num": { "type": "integer", "maximum": 2147483647, "minimum": 1 }, "denom": { "type": "integer", "maximum": 4294967295, "minimum": 1 } }, "required": [ "num", "denom" ], "additionalProperties": false, "description": "Nominal ratio of height to width of the image of an axis-aligned\nsquare captured by the camera sensor. It can be used to de-squeeze\nimages but is not however an exact number over the entire captured\narea due to a lens' intrinsic analog nature.\n" }, "isoSpeed": { "type": "integer", "maximum": 4294967295, "minimum": 1, "description": "Arithmetic ISO scale as defined in ISO 12232" }, "fdlLink": { "type": "string", "pattern": "^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "description": "URN identifying the ASC Framing Decision List used by the camera." }, "shutterAngle": { "type": "number", "maximum": 360.0, "minimum": 0.0, "description": "Shutter speed as a fraction of the capture frame rate. The shutter\nspeed (in units of 1/s) is equal to the value of the parameter divided\nby 360 times the capture frame rate.\n", "units": "degree" } }, "additionalProperties": false }, "lens": { "type": "object", "properties": { "distortionOverscanMax": { "type": "number", "minimum": 1.0, "description": "Static maximum overscan factor on lens distortion. This is an\nalternative to providing dynamic overscan values each frame. Note it\nshould be the maximum of both projection-matrix-based and\nfield-of-view-based rendering as per the OpenLensIO documentation.\n" }, "undistortionOverscanMax": { "type": "number", "minimum": 1.0, "description": "Static maximum overscan factor on lens undistortion. This is an\nalternative to providing dynamic overscan values each frame. Note it\nshould be the maximum of both projection-matrix-based and\nfield-of-view-based rendering as per the OpenLensIO documentation.\n" }, "make": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string naming lens manufacturer" }, "model": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string identifying lens model" }, "serialNumber": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string uniquely identifying the lens" }, "firmwareVersion": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string identifying lens firmware version" }, "nominalFocalLength": { "type": "number", "exclusiveMinimum": 0.0, "description": "Nominal focal length of the lens. The number printed on the side\nof a prime lens, e.g. 50 mm, and undefined in the case of a zoom lens.\n", "units": "millimeter" }, "calibrationHistory": { "type": "array", "description": "List of free strings that describe the history of calibrations of the lens.", "items": { "type": "string", "minLength": 1, "maxLength": 1023 } } }, "additionalProperties": false }, "tracker": { "type": "object", "properties": { "make": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string naming tracking device manufacturer" }, "model": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string identifying tracking device model" }, "serialNumber": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string uniquely identifying the tracking device" }, "firmwareVersion": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string identifying tracking device firmware version" } }, "additionalProperties": false } }, "additionalProperties": false }, "tracker": { "type": "object", "properties": { "notes": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string containing notes about tracking system" }, "recording": { "type": "boolean", "description": "Boolean indicating whether tracking system is recording data" }, "slate": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string describing the recording slate" }, "status": { "type": "string", "minLength": 1, "maxLength": 1023, "description": "Non-blank string describing status of tracking system" } }, "additionalProperties": false }, "timing": { "type": "object", "properties": { "mode": { "enum": [ "internal", "external" ], "type": "string", "description": "Enumerated value indicating whether the sample transport mechanism\nprovides inherent ('external') timing, or whether the transport\nmechanism lacks inherent timing and so the sample must contain a PTP\ntimestamp itself ('internal') to carry timing information.\n" }, "recordedTimestamp": { "type": "object", "properties": { "seconds": { "type": "integer", "maximum": 281474976710655, "minimum": 0 }, "nanoseconds": { "type": "integer", "maximum": 4294967295, "minimum": 0 } }, "required": [ "seconds", "nanoseconds" ], "additionalProperties": false, "units": "second", "description": "PTP timestamp of the data recording instant, provided for convenience\nduring playback of e.g. pre-recorded tracking data. The timestamp\ncomprises a 48-bit unsigned integer (seconds), a 32-bit unsigned\ninteger (nanoseconds)\n" }, "sampleRate": { "type": "object", "properties": { "num": { "type": "integer", "maximum": 2147483647, "minimum": 1 }, "denom": { "type": "integer", "maximum": 4294967295, "minimum": 1 } }, "required": [ "num", "denom" ], "additionalProperties": false, "description": "Sample frame rate as a rational number. Drop frame rates such as\n29.97 should be represented as e.g. 30000/1001. In a variable rate\nsystem this should be estimated from the last sample delta time.\n" }, "sampleTimestamp": { "type": "object", "properties": { "seconds": { "type": "integer", "maximum": 281474976710655, "minimum": 0 }, "nanoseconds": { "type": "integer", "maximum": 4294967295, "minimum": 0 } }, "required": [ "seconds", "nanoseconds" ], "additionalProperties": false, "units": "second", "description": "PTP timestamp of the data capture instant. Note this may differ\nfrom the packet's transmission PTP timestamp. The timestamp\ncomprises a 48-bit unsigned integer (seconds), a 32-bit unsigned\ninteger (nanoseconds)\n" }, "sequenceNumber": { "type": "integer", "maximum": 4294967295, "minimum": 0, "description": "Integer incrementing with each sample." }, "synchronization": { "type": "object", "properties": { "locked": { "type": "boolean" }, "source": { "enum": [ "genlock", "videoIn", "ptp", "ntp" ], "type": "string" }, "frequency": { "type": "object", "properties": { "num": { "type": "integer", "maximum": 2147483647, "minimum": 1 }, "denom": { "type": "integer", "maximum": 4294967295, "minimum": 1 } }, "required": [ "num", "denom" ], "additionalProperties": false }, "offsets": { "type": "object", "properties": { "translation": { "type": "number" }, "rotation": { "type": "number" }, "lensEncoders": { "type": "number" } }, "additionalProperties": false }, "present": { "type": "boolean" }, "ptp": { "type": "object", "properties": { "profile": { "enum": [ "IEEE Std 1588-2019", "IEEE Std 802.1AS-2020", "SMPTE ST2059-2:2021" ], "type": "string" }, "domain": { "type": "integer", "maximum": 127, "minimum": 0 }, "leaderIdentity": { "type": "string", "minLength": 1, "maxLength": 1023, "pattern": "(?:^[0-9a-f]{2}(?::[0-9a-f]{2}){5}$)|(?:^[0-9a-f]{2}(?:-[0-9a-f]{2}){5}$)" }, "leaderPriorities": { "type": "object", "properties": { "priority1": { "type": "integer", "maximum": 255, "minimum": 0 }, "priority2": { "type": "integer", "maximum": 255, "minimum": 0 } }, "required": [ "priority1", "priority2" ], "description": "Data structure for PTP synchronization priorities", "additionalProperties": false }, "leaderAccuracy": { "type": "number", "minimum": 0.0 }, "leaderTimeSource": { "enum": [ "GNSS", "Atomic clock", "NTP" ], "type": "string" }, "meanPathDelay": { "type": "number", "minimum": 0.0 }, "vlan": { "type": "integer", "maximum": 4294967295, "minimum": 0 } }, "required": [ "profile", "domain", "leaderIdentity", "leaderPriorities", "leaderAccuracy", "meanPathDelay" ], "additionalProperties": false } }, "required": [ "locked", "source" ], "additionalProperties": false, "description": "Object describing how the tracking device is synchronized for this\nsample.\n\nfrequency: The frequency of a synchronization signal.This may differ from\nthe sample frame rate for example in a genlocked tracking device. This is\nnot required if the synchronization source is PTP or NTP.\nlocked: Is the tracking device locked to the synchronization source\noffsets: Offsets in seconds between sync and sample. Critical for e.g.\nframe remapping, or when using different data sources for\nposition/rotation and lens encoding\npresent: Is the synchronization source present (a synchronization\nsource can be present but not locked if frame rates differ for\nexample)\nptp: If the synchronization source is a PTP leader, then this object\ncontains:\n- \"profile\": Specifies the PTP profile in use. This defines the operational\nrules and parameters for synchronization. For example \"SMPTE ST2059-2:2021\"\nfor SMPTE 2110 based systems, or \"IEEE Std 1588-2019\" or\n\"IEEE Std 802.1AS-2020\" for industrial applications\n- \"domain\": Identifies the PTP domain the device belongs to. Devices in the\nsame domain can synchronize with each other\n- \"leaderIdentity\": The unique identifier (usually MAC address) of the\ncurrent PTP leader (grandmaster)\n- \"leaderPriorities\": The priority values of the leader used in the Best\nMaster Clock Algorithm (BMCA). Lower values indicate higher priority\n- \"priority1\": Static priority set by the administrator\n- \"priority2\": Dynamic priority based on the leader's role or clock quality\n- \"leaderAccuracy\": The timing offset in seconds from the sample timestamp\nto the PTP timestamp\n- \"meanPathDelay\": The average round-trip delay between the device and the\nPTP leader, measured in seconds\nsource: The source of synchronization must be defined as one of the\nfollowing:\n- \"vlan\": Integer representing the VLAN ID for PTP traffic (e.g., 100 for\nVLAN 100)\n- \"leaderTimeSource\": Indicates the leader's source of time, such as GNSS, atomic\nclock, or NTP\n- \"genlock\": The tracking device has an external black/burst or\ntri-level analog sync signal that is triggering the capture of\ntracking samples\n- \"videoIn\": The tracking device has an external video signal that is\ntriggering the capture of tracking samples\n- \"ptp\": The tracking device is locked to a PTP leader\n- \"ntp\": The tracking device is locked to an NTP server\n" }, "timecode": { "type": "object", "properties": { "hours": { "type": "integer", "maximum": 23, "minimum": 0 }, "minutes": { "type": "integer", "maximum": 59, "minimum": 0 }, "seconds": { "type": "integer", "maximum": 59, "minimum": 0 }, "frames": { "type": "integer", "maximum": 119, "minimum": 0 }, "frameRate": { "type": "object", "properties": { "num": { "type": "integer", "maximum": 2147483647, "minimum": 1 }, "denom": { "type": "integer", "maximum": 4294967295, "minimum": 1 } }, "required": [ "num", "denom" ], "additionalProperties": false }, "subFrame": { "type": "integer", "maximum": 4294967295, "minimum": 0 } }, "required": [ "hours", "minutes", "seconds", "frames", "frameRate" ], "description": "SMPTE timecode of the sample. Timecode is a standard for labeling\nindividual frames of data in media systems and is useful for\ninter-frame synchronization. Frame rate is a rational number, allowing\ndrop frame rates such as that colloquially called 29.97 to be\nrepresented exactly, as 30000/1001. The timecode frame rate may differ\nfrom the sample frequency. The zero-based sub-frame field allows for finer\ndivision of the frame, e.g. interlaced frames have two sub-frames,\none per field.\n", "additionalProperties": false } }, "additionalProperties": false }, "lens": { "type": "object", "properties": { "custom": { "type": "array", "items": { "type": "number" }, "description": "This list provides optional additional custom coefficients that can \nextend the existing lens model. The meaning of and how these characteristics\nare to be applied to a virtual camera would require negotiation between a\nparticular producer and consumer.\n" }, "distortion": { "type": "array", "items": { "type": "object", "properties": { "model": { "type": "string", "minLength": 1, "maxLength": 1023 }, "radial": { "type": "array", "items": { "type": "number" }, "minItems": 1 }, "tangential": { "type": "array", "items": { "type": "number" }, "minItems": 1 }, "overscan": { "type": "number", "minimum": 1.0, "description": "Overscan factor on lens [un]distortion. Overscan may be provided by the\nproducer but can also be overriden or calculated by the consumer. Note\nthis should be the maximum of both projection-matrix-based and field-of-\nview-based rendering as per the OpenLensIO documentation.\n" } }, "required": [ "radial" ], "additionalProperties": false }, "minItems": 1, "description": "A list of Distortion objects that each define the coefficients for\ncalculating the distortion characteristics of a lens comprising radial\ndistortion coefficients of the spherical distortion (k1-N) and \n(optionally) the tangential distortion (p1-N). The key 'model'\nnames the distortion model. Typical values for 'model' include \n\"Brown-Conrady D-U\" when mapping distorted to undistorted coordinates,\nand \"Brown-Conrady U-D\" when mapping undistorted to undistorted\ncoordinates. If not provided, the default model is \"Brown-Conrady D-U\".\n" }, "distortionOffset": { "type": "object", "properties": { "x": { "type": "number" }, "y": { "type": "number" } }, "required": [ "x", "y" ], "additionalProperties": false, "description": "Offset in x and y of the centre of distortion of the virtual camera", "units": "millimeter" }, "encoders": { "type": "object", "properties": { "focus": { "type": "number", "maximum": 1.0, "minimum": 0.0 }, "iris": { "type": "number", "maximum": 1.0, "minimum": 0.0 }, "zoom": { "type": "number", "maximum": 1.0, "minimum": 0.0 } }, "additionalProperties": false, "description": "Normalised real numbers (0-1) for focus, iris and zoom.\nEncoders are represented in this way (as opposed to raw integer\nvalues) to ensure values remain independent of encoder resolution,\nminimum and maximum (at an acceptable loss of precision).\nThese values are only relevant in lenses with end-stops that\ndemarcate the 0 and 1 range.\nValue should be provided in the following directions (if known):\nFocus: 0=infinite 1=closest\nIris: 0=open 1=closed\nZoom: 0=wide angle 1=telephoto\n", "anyOf": [ { "required": [ "focus" ] }, { "required": [ "iris" ] }, { "required": [ "zoom" ] } ] }, "entrancePupilOffset": { "type": "number", "description": "Offset of the entrance pupil relative to the nominal imaging plane\n(positive if the entrance pupil is located on the side of the nominal\nimaging plane that is towards the object, and negative otherwise).\nMeasured in meters as in a render engine it is often applied in the\nvirtual camera's transform chain.\n", "units": "meter" }, "exposureFalloff": { "type": "object", "properties": { "a1": { "type": "number" }, "a2": { "type": "number" }, "a3": { "type": "number" } }, "required": [ "a1" ], "additionalProperties": false, "description": "Coefficients for calculating the exposure fall-off (vignetting) of\na lens\n" }, "fStop": { "type": "number", "exclusiveMinimum": 0.0, "description": "The linear f-number of the lens, equal to the focal length divided\nby the diameter of the entrance pupil.\n" }, "pinholeFocalLength": { "type": "number", "exclusiveMinimum": 0.0, "description": "Distance between the pinhole and the image plane in the simple CGI pinhole camera model.", "units": "millimeter" }, "focusDistance": { "type": "number", "exclusiveMinimum": 0.0, "description": "Focus distance/position of the lens", "units": "meter" }, "projectionOffset": { "type": "object", "properties": { "x": { "type": "number" }, "y": { "type": "number" } }, "required": [ "x", "y" ], "additionalProperties": false, "description": "Offset in x and y of the centre of perspective projection of the\nvirtual camera\n", "units": "millimeter" }, "rawEncoders": { "type": "object", "properties": { "focus": { "type": "integer", "maximum": 4294967295, "minimum": 0 }, "iris": { "type": "integer", "maximum": 4294967295, "minimum": 0 }, "zoom": { "type": "integer", "maximum": 4294967295, "minimum": 0 } }, "additionalProperties": false, "description": "Raw encoder values for focus, iris and zoom.\nThese values are dependent on encoder resolution and before any\nhoming / ranging has taken place.\n", "anyOf": [ { "required": [ "focus" ] }, { "required": [ "iris" ] }, { "required": [ "zoom" ] } ] }, "tStop": { "type": "number", "exclusiveMinimum": 0.0, "description": "Linear t-number of the lens, equal to the F-number of the lens\ndivided by the square root of the transmittance of the lens.\n" } }, "additionalProperties": false }, "protocol": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 1023 }, "version": { "type": "array", "items": { "type": "integer", "maximum": 9, "minimum": 0 }, "minItems": 3, "maxItems": 3 } }, "required": [ "name", "version" ], "additionalProperties": false, "description": "Name of the protocol in which the sample is being employed, and\nversion of that protocol\n" }, "sampleId": { "type": "string", "pattern": "^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "description": "URN serving as unique identifier of the sample in which data is\nbeing transported.\n" }, "sourceId": { "type": "string", "pattern": "^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "description": "URN serving as unique identifier of the source from which data is\nbeing transported.\n" }, "sourceNumber": { "type": "integer", "maximum": 4294967295, "minimum": 0, "description": "Number that identifies the index of the stream from a source from which\ndata is being transported. This is most important in the case where a source\nis producing multiple streams of samples.\n" }, "relatedSampleIds": { "type": "array", "items": { "type": "string", "pattern": "^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" }, "description": "List of sampleId properties of samples related to this sample. The\nexistence of a sample with a given sampleId is not guaranteed.\n" }, "globalStage": { "type": "object", "properties": { "E": { "type": "number" }, "N": { "type": "number" }, "U": { "type": "number" }, "lat0": { "type": "number" }, "lon0": { "type": "number" }, "h0": { "type": "number" } }, "required": [ "E", "N", "U", "lat0", "lon0", "h0" ], "description": "Position of stage origin in global ENU and geodetic coordinates\n(E, N, U, lat0, lon0, h0). Note this may be dynamic if the stage is\ninside a moving vehicle.\n", "additionalProperties": false, "units": "meter" }, "transforms": { "type": "array", "items": { "type": "object", "properties": { "translation": { "type": "object", "properties": { "x": { "type": "number" }, "y": { "type": "number" }, "z": { "type": "number" } }, "additionalProperties": false, "units": "meter" }, "rotation": { "type": "object", "properties": { "pan": { "type": "number" }, "tilt": { "type": "number" }, "roll": { "type": "number" } }, "additionalProperties": false, "units": "degree" }, "scale": { "type": "object", "properties": { "x": { "type": "number" }, "y": { "type": "number" }, "z": { "type": "number" } }, "additionalProperties": false }, "id": { "type": "string", "minLength": 1, "maxLength": 1023 } }, "required": [ "translation", "rotation" ], "additionalProperties": false }, "minItems": 1, "description": "A list of transforms.\nTransforms are composed in order with the last in the list representing\nthe X,Y,Z in meters of camera sensor relative to stage origin.\nThe Z axis points upwards and the coordinate system is right-handed.\nY points in the forward camera direction (when pan, tilt and roll are\nzero).\nFor example in an LED volume Y would point towards the centre of the\nLED wall and so X would point to camera-right.\nRotation expressed as euler angles in degrees of the camera sensor\nrelative to stage origin\nRotations are intrinsic and are measured around the axes ZXY, commonly\nreferred to as [pan, tilt, roll]\nNotes on Euler angles:\nEuler angles are human readable and unlike quarternions, provide the\nability for cycles (with angles >360 or <0 degrees).\nWhere a tracking system is providing the pose of a virtual camera,\ngimbal lock does not present the physical challenges of a robotic\nsystem.\nConversion to and from quarternions is trivial with an acceptable loss\nof precision.\n", "units": "meter / degree", "uniqueItems": false } } }