CITP Specification
CITP Specification
1.1 History
2007-09-16 Revised documentation into a single document.
2007-09-28 Added first comments for MSEX revision, highlighted in red.
2008-01-25 Cleaned up MSEX 1.1 changes for element libraries.
2008-05-28 Minor corrections and clarifications in MSEX.
2008-08-21 Completed MSEX element types 4 - 8, accompanied by the Generic Element Information packet.
2008-10-11 Added BSR E1.31 to the DMX connection strings table.
2008-11-08 Added first OMEX packet suggestions.
2009-02-14 OMEX packet suggestion update and general revision of the introduction section.
2009-02-18 Removed deprecation note of PINF/PNam as it does have its use (with clarifying comments).
2009-05-17 Added note regarding problems with MSEX/GLEI message.
2009-06-23 Clarified the note regarding contiguous element identifiers.
1.2 Introduction
The CITP (Controller Interface Transport Protocol) is a dual layer protocol suite that has been designed for
communication between lighting consoles, media servers and visualizers. This document describes how it is used
on top of an IP stack, but the packets could easily be used over other media as well, such as USB links.
The top layer, CITP, consists of a single message header with content information and support for fragmentation
and stream synchronization. This message header is used in the beginning of all CITP protocol suite packets.
The second layer of CITP consists of the PINF, SDMX, FPTC, FSEL, FINF, MSEX and OMEX protocols. Each of
these have been designed for a specific purpose, but some of them are closely related (such as FPTC, FSEL and
FINF that all operate on a given set of lighting fixtures). Any manufacturer can extend the CITP protocol at the
second layer level using a non-reserved layer identifier.
CITP
IP
The layers of CITP and surrounding layers
2.1 Cookies
The Cookie (and ContentType) fields can be found in CITP headers in both layers. The constant values of these
fields are documented using string notation, for instance “CITP” for the CITP header Cookie field. This should be
interpreted as sending ‘C’,‘I’,‘T’,‘P’ over the network.
ArtNet "ArtNet/<net>/<universe> "ArtNet/0/0/1" - The first channel of the first universe on the
/<channel>" first network.
Avab IPX "AvabIPX/<net>/<universe> "AvabIPX/0/0/1" - The first channel of the first universe on the
/<channel>" first network.
BSR E1.31 "BSRE1.31/<universe>/<channel>" "BSRE1.31/0/1" - The first channel of the first universe.
ETC Net2 "ETCNet2/<channel>" "ETCNet2/1" - The first ETCNet2 channel.
3. CITP, base layer
The base layer as such does not define any packages, it merely adds a header that encapsulate all messages.
Currently acknowledged versions of MSEX are 1.0 and 1.1. During a session messages of varying MSEX versions
may be sent and received. See the MSEX / SInf message also regarding supported version signalling.
There are currently eight recognized elements types (a library can only contain elements of one type) and when
information about elements is requested, different kinds of Element Information messages (Media, Effect or
Generic) are returned:
Example 1: two DMX channel media selection media server. A GELI message with LibraryParentId set to {0, 0, 0,
0} is sent to retrieve all libraries on the folder selection channel. This generates a response with an ELIn message
with at most 255 items with LibraryId values of {1, 0-255, 0, 0}.
Example 2: three DMX channel media selection media server. First the procedure in Example 1 is executed to
collect all Level 1 libraries (none of these will contain any elements, but up to 255 sub libraries). For each N of
these (up to 255) libraries, an additional GELI message is sent with the LibraryParentId set to {1, N, 0, 0}. This
will trigger a response with an ELin message with at mosts 255 items with LibraryId values of {2, N, 0-255, 0}.
struct CITP_MSEX_1.1_ELIn
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "ELIn" and version is 1.1.
uint8 LibraryType; // Content type requested.
uint8 LibraryCount; // Number of following element library
information blocks.
struct ElementLibraryInformation
{
MSEXLibraryId Id; // Library id.
uint8 DMXRangeMin; // DMX range start value.
uint8 DMXRangeMax; // DMX range end value.
ucs2 Name[]; // Library name.
struct CITP_MSEX_1.1_ELUp
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "ELUp" and version is 1.1.
uint8 LibraryType; // Content type of updated library.
MSEXLibraryId LibraryId; // Library that has been updated.
uint8 UpdateFlags; // Additional information flags.
// 0x01 Existing elements have been
updated
// 0x02 Elements have been added or
removed
// 0x04 Sub libraries have been updated
// 0x08 Sub libraries have been added or removed
};
struct CITP_MSEX_1.1_GEIn
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "GEIn" and version is 1.1.
uint8 LibraryType; // Content type requested.
MSEXLibraryId LibraryId; // Library for which to retrieve elements
uint8 ElementCount; // Number of elements for which information
is requested, set to 0 when requesting
all available.
uint8 ElementNumbers[]; // Numbers of the elements for which
information is requested.
};
struct CITP_MSEX_1.1_MEIn
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "MEIn" and version is 1.1.
MSEXLibraryId LibraryId; // Library containing the media elements.
uint8 ElementCount; // Number of following (media) information
blocks.
struct MediaInformation
{
uint8 Number; // 0-based number of the media.
uint8 DMXRangeMin; // DMX range start value.
uint8 DMXRangeMax; // DMX range end value.
ucs2 MediaName[]; // Media name.
uint64 MediaVersionTimestamp; // Media version in seconds since
1st January 1970.
uint16 MediaWidth; // Media width.
uint16 MediaHeight; // Media height.
uint32 MediaLength; // Media length (in frames).
uint8 MediaFPS; // Media resolution (in frames per second).
}[];
};
struct CITP_MSEX_1.1_EEIn
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "EEIn" and version is 1.1.
MSEXLibraryId LibraryId; // Library containing the effect elements.
uint8 ElementCount; // Number of following (effect) information
blocks.
struct EffectInformation
{
uint8 ElementNumber; //
0-based number of the effect.
uint8 DMXRangeMin; //
DMX range start value.
uint8 DMXRangeMax; //
DMX range end value.
ucs2 EffectName[]; //
Effect name.
uint8 EffectParameterCount; //
Number of following effect
parameter names.
ucs2 EffectParameterNames[][]; // List of effect parameter names.
}[];
};
struct CITP_MSEX_1.1_GELT
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "GELT" and version is 1.1.
uint32 ThumbnailFormat; // Format of the thumbnail.
Can be "RGB8" or "JPEG".
uint16 ThumbnailWidth; // Preferred thumbnail image width.
uint16 ThumbnailHeight; // Preferred thumbnail image height.
uint8 ThumbnailFlags // Additional information flags.
// 0x01 Preserve aspect ratio
of image (use width and height as maximum)
uint8 LibraryType; // 1 for Media, 2 for Effects.
uint8 LibraryCount; // Number of libraries requested, set to 0
when requesting all available.
MSEXLibraryId LibraryIds[]; // Ids of the libraries requested, not present if
LibraryCount is 0.
};
struct CITP_MSEX_1.1_ELTh
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "ELTh" and version is 1.1.
uint8 LibraryType; // 1 for Media, 2 for Effects.
MSEXLibraryId LibraryId; // Id of the library that the thumbnail
belongs to.
uint32 ThumbnailFormat; // Format of the thumbnail.
Can be "RGB8" or "JPEG".
uint16 ThumbnailWidth; // Thumbnail width.
uint16 ThumbnailHeight; // Thumbnail height.
uint16 ThumbnailBufferSize; // Size of the thumbnail buffer.
uint8 ThumbnailBuffer; // Thumbnail image buffer.
};
struct CITP_MSEX_1.1_GETh
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "GETh" and version is 1.1.
uint32 ThumbnailFormat; // Format of the thumbnail.
Can be "RGB8" or "JPEG".
uint16 ThumbnailWidth; // Preferred thumbnail image width.
uint16 ThumbnailHeight; // Preferred thumbnail image height.
uint8 ThumbnailFlags // Additional information flags.
// 0x01 Preserve aspect ratio of image
(use width and height as maximum)
uint8 LibraryType; // 1 for Media, 2 for Effects.
MSEXLibraryId LibraryId; // Id of the media's library.
uint8 ElementCount; // Number of medias for which information
is requested, set to 0 when requesting
all available.
uint8 ElementNumbers[]; // The numbers of the requested elements.
Not present if ElementCount = 0.
};
struct CITP_MSEX_1.1_EThn
{
CITP_MSEX_Header CITPMSEXHeader; // CITP MSEX header. MSEX ContentType
is "EThn" and version is 1.1.
uint8 LibraryType; // 1 for Media, 2 for Effects.
MSEXLibraryId LibraryId; // Id of the element's library.
uint8 ElementNumber; // Number of the element.
uint32 ThumbnailFormat; // Format of the thumbnail.
Can be "RGB8" or "JPEG".
uint16 ThumbnailWidth; // Thumbnail width.
uint16 ThumbnailHeight; // Thumbnail height.
uint16 ThumbnailBufferSize; // Size of the thumbnail buffer.
uint8 ThumbnailBuffer; // Thumbnail image buffer.
};
Prior to version 1.1 of MSEX, RGB8 data was transmitted as BGR rather then RGB. As of version 1.1, stream
frames are to be transmitted over the multicast channel only (sames as used by PINF) and never over a TCP
connection.