Broadcast Suite Communication Protocol

Broadcast Suite Communication Protocol

TCP/IP & XML Exchange Protocol for communication with just:connect (2.0 and later) and just:in (2.0 and later)

Copyright © 2017 ToolsOnAir Broadcast Engineering GmbH.

Software and user guides described in this document are protected by Copyright.

No reproduction, distribution or use in whole or in part of any content is permitted without prior authorization of ToolsOnAir Broadcast Engineering GmbH.

Any use, for any purpose, not allowed in the terms of the license is strictly forbidden.

ToolsOnAir Broadcast Engineering GmbH uses reasonable efforts to include accurate, complete and current information in this document, however, ToolsOnAir Broadcast Engineering GmbH does not warrant that the content herein is accurate, complete, current, or free of technical or typographical errors. ToolsOnAir Broadcast Engineering GmbH reserves the right to make changes and updates to any information contained within this document without prior notice.

ToolsOnAir Broadcast Engineering GmbH shall not be responsible for any errors or omissions contained in this document, and in particular ToolsOnAir Broadcast Engineering GmbH shall not be liable for special, indirect, consequential, or incidental damages, or damages for lost profits, loss of revenue, or loss of use, arising out of or related to the information contained in this document, whether such damages arise in contract, negligence, tort, under statute, in equity, at law or otherwise.

 

Overview

Document and protocol scope

This document is intended for 3rd party developers who may wish to integrate with ToolsOnAir’s Broadcast Suite and details the TCP/IP & XML protocol used by just:connect and just:in to exchange information. For example, in just:connect’s case a 3rd-party application can send and receive information about the schedule that is then sent on to just:out for playout. For just:in the 3rd-party application can control crash (immediate) recording, select presets and send a batch list for recording, and receive video and audio previews that can be displayed in a user interface if required. Note that this format is not that used directly by just:out and thus does not enable developers to integrate directly with just:out, bypassing just:connect. Direct communication with just:out is not currently supported by ToolsOnAir. As such, any 3rd party developer integrating with just:out will also require just:connect running on the network. For just:in there is no equivalent of just:connect, so the 3rd-party application does communicate directly with just:in.

This document is intended for developers familiar with the concepts of TCP/IP and XML, and with just:play, just:live, just:connect and/or just:in and just:in multi. It is recommended that developers first install those applications relevant to the proposed integration, read the relevant user manuals and familiarize themselves with the concepts and features of Broadcast Suite before reading this document.

The Broadcast Suite applications

There are several applications in Broadcast Suite and then can be broadly split into two classes of application:

  • Engines are generally faceless applications (although they do have minimal interfaces containing status and diagnostic information) that are the workhorses of Broadcast Suite - they do the heavy lifting of playing out and ingesting video and audio.

  • User Interfaces are the “windows” onto the engines allowing the user to controls the engine or engines running on the network. The communication between the engines and the user interfaces is network-based, meaning that the engine and the user interface must not be running on the same system - indeed, ToolsOnAir recommends generally that they do not run on the same system.

Engine applications

  • just:out is the engine responsible for compositing video and graphics and sending the resulting frames to a video output card (e.g. AJA or BMD) that will then output an SDI signal.

  • just:in is the engine responsible for ingesting one or more SDI signals attached to an input card or cards (e.g. AJA, BMD, Matrox) and writing these signals into a movie container (currently either QuickTime MOV or MXF). The frames can be written uncompressed in either 8-bit or 10-bit, or compressed by a specific codec (e.g. ProRes). A single just:in engine can, depending on the hardware available on the system, support more than one channel, where a channel is a single SDI signal that can be written to a file. The engine supports crash, batch and scheduled recording as well as VTR (Sony 9-pin) control.

User Interface applications

  • just:connect is the schedule "server" or "database" that also acts as a gateway between just:out and any 3rd-party applications transmitting schedule information. The 3rd-party application sends requests to just:connect and receives acknowledgments back depending on whether or not the request was successful. The basic unit of organization in just:connect is the channel, and a single instance of just:connect can manage several channels. As such, a 3rd-party applications does not simply establish contact with just:connect, but rather a specific channel managed by just:connect. In turn just:connect will establish connections with the just:out engine or engines assigned to the channel and forward relevant schedule information to the engines. Also any communication received just:out that is relevant for the 3rd-party application will be forwarded on to the application. The 3rd-party application will never itself communicate with just:out. Indeed, such direct communication would be complex for a 3rd-party application to manage due to the fact that each track in a channel may in fact be rendered by a different instance of just:out, and also by a redundant just:out, thus a single channel may have ten separate just:out engines running and a 3rd-party application would have to establish connections with all of them and ensure that each only received the relevant schedule information. By communicating just with just:connect, all of this complexity is removed from the 3rd-party application.

  • just:play is the user interface intended for 24/7 scheduled playout. It communicates with just:connect to retrieve schedule information, displays that information for the user and sends requests to just:connect based on the user's actions (e.g. create a new playlist, insert or delete an item in a playlist). As all communication is network-based it is not necessary for just:play and just:connect to be running on the same system, they must simply be on the same network. Additionally several instances of just:play may be viewing the same channel at the same time. Any changes made by one just:play will be instantly reflected on all other instances.

  • just:live is the user interface intended for live playout where just:out reacts as quickly as possible to user commands - generally within a few frames. Apart from the reactivity, the interface itself is organized differently to account for the different demands placed on an operator in a live situation as opposed to a pre-defined, scheduled operation. Otherwise all of the features of just:play described above hold true for just:live.

  • just:in multi is the interface intended for multi-channel ingest. It can control multiple channels coming from multiple instances of just:in on the network (e.g. two channels from one instance of just:in, two from another and a fifth channel from a 3rd instance of just:in). The user interface provides live feedback about the status of the channels (video and audio previews) and diagnostics about the systems on which the just:out engines are running (available memory, space on the storage systems and so on). The user can then start and stop recording, build and execute batch lists, control any connected video tape machines (VTR control) and view any pre-defined schedules due to be recorded.

Integration strategies

A 3rd-party application integrating with Broadcast Suite can fall into one of two broad categories:

  • As a complete replacement for one or more of the Broadcast Suite user interfaces (just:play, just:live and/or just:in multi). In this scenario it is likely that the 3rd-party application will itself provide a user interface and a means for the user to control the playout or ingest. Only just:connect and just:out (for playout) and/or just:in (for ingest) will be running on the network.

  • As a faceless backend solution providing schedule information that the user will then view and potentially edit in just:play or just:live in addition to controlling the playout. Note that this strategy is only available for integration with just:connect. Due to the architecture of just:in, it is not possible to send information from a 3rd-party application to just:in that can then be viewed with the just:in multi user interface.

Any 3rd-party application has the same "status" in the Broadcast Suite as just:play, just:live or just:in multi. As outlined above, with just:play and just:live it is perfectly possible to have both the 3rd-party application and just:play / just:live running at the same time, connected to the same channel on just:connect. And just as with two instances of just:play or just:live editing the same channel, any 3rd-party application will receive full notification of any user actions in just:play or just:live, allowing it to stay fully synchronized. However, there are some additional requirements placed on a 3rd-party application in terms of the XML that it transmits if just:play or just:live are being used to view the schedule. Please refer to the sections on the “Schedule XML Format” for details of these requirements.

In either case it is highly recommended that a 3rd-party developer should first install Broadcast Suite (just:play, just:live and/or just:in) in order to familiarize themselves with the concepts and products described above. Further, just:play in particular can be a very useful tool to produce example schedule XML. For instance, if you want to see the schedule XML for a specific playlist it is possible to build the playlist in just:play and then export the playlist as a file which will then contain exactly the XML that just:connect would expect from a 3rd-party application wishing to create such a playlist. Please refer to the just:play user guide for full details on creating and exporting playlists.

Diagram showing communication routes between 3rd-party and Broadcast Suite applications

Dotted lines indicate optional communication routes.

Communication with Broadcast Suite

Once just:connect or just:in is started it will automatically broadcast a TCP service using Bonjour. External applications can use Bonjour services to discover the IP address and port used by just:connect or just:in, as follows:

Application

Bonjour Service

Bonjour Name

Application

Bonjour Service

Bonjour Name

just:connect

_toaautomator._tcp.

The name of the channel as defined in just:connect (e.g. “My Channel”)

just:in

_toajustin._tcp.

The system host name of the machine on which just:in in running (e.g. “My-Mac-Pro”)

There will also be a domain associated with the Bonjour service. In most cases this will simply be “.local”, but may be different depending on the specific network and DNS configuration. For example, a 3rd-party application wishing to connect to a specific just:connect channel should filter for Bonjour services with the type “_toaautomator._tcp.” and then check the service’s name against the wished-for channel name. As just:connect and just:in both support more than one channel simultaneously, it is possible that one instance of just:connect or just:in will broadcast several TCP services on the same IP address but with unique ports for each individual channel. Currently it is not possible to assign a channel a fixed port number so Bonjour is the only way to discover a channel's port. This may be addressed in a future release to allow integration with systems that do not support Bonjour directly such as Windows or Linux (although Bonjour services may also be available on these systems with additional software installed).

All communication between just:connect or just:in and 3rd-party applications uses plain UTF-8 encoded text. A zero byte is sent to indicate the end of a message. Most communication involves sending an XML document with a zero terminator at the end; however some basic commands are sent as simple text strings.

When connecting to just:connect or just:in an application will immediately receive the string "handshake" with a zero byte terminator. The application should immediately send back the same "handshake" string to complete the connection. Then the application should send three null-terminated strings to identify the application, as follows:

Application

Direction

Data

Application

Direction

Data

just:connect / just:in

Sends

“handshake\0”

Application

Receives

“handshake\0”

Application

Sends

“handshake\0”

Application identification in just:connect

In addition to the handshake detailed above, applications connecting to just:connect must further identify themselves before the stream is fully available. To identify itself the application must send the following three null-terminated strings:

Application

Direction

Data

Application

Direction

Data

Application

Sends

“host xxx\0”

Application

Sends

“ipv4 a.b.c.d\0”

Application

Sends

“appID yyy\0”

Notes:

  • The “xxx” string following “host” should be the host name of the system running the application. For Mac OS X systems this should be the “Computer Name” defined in the “Sharing” System Preferences panel.

  • The “ipv4” string should be followed by the standard format IPv4 address (e.g. 192.168.0.10) of the system running the application.

  • The “yyy” string following “appID” should identify the application. This should normally be “just:play” for applications controlling a 24/7 unattended channel or “just:live” for applications controlling a live channel.

User authorisation in just:connect

In addition to the handshake just:connect also requires a basic form of user authorization. Once the handshake is complete the 3rd-party application should send a string with the format "user xxx" where "xxx" is the name of the user wishing to connect to just:connect. The user name must be one of the names defined in the channel's list of users in just:connect. If the user is recognized by just:connect it will send back the string "authorized", after which just:connect is ready to receive commands from the application. If the user name isn't recognized just:connect will send the string "notAuthorized" and any further communication from the application will be ignored by just:connect.

Assuming that the user is recognized the sequence would be as follows:

Application

Direction

Data

Application

Direction

Data

Application

Sends

“user user_name\0”

just:connect

Receives

“user user_name\0”

just:connect

Sends

“authorized\0”

Application

Receives

“authorized\0”

If the user has a password set in just:connect, then just:connect will respond with “passwordRequired”. In this case the client must respond with the SHA1 digest of the user’s password. If the password matches then just:connect will respond with “authorized”, or if the password is incorrect with “notAuthorized”. The digest should be formatted as 20 hexadecimal bytes, as shown in the following code snippet:

- (NSString *)sha1Digest { unsigned int i; unsigned char digest[SHA_DIGEST_LENGTH]; const char *string = [self UTF8String]; SHA1((const unsigned char *)string, strlen(string), digest); NSMutableArray *array = [NSMutableArray array]; for (i = 0; i < SHA_DIGEST_LENGTH; i++) { [array addObject:[NSString stringWithFormat:@"%02x", digest[i]]]; } return [array componentsJoinedByString:@""]; }

The full sequence in this case would be:

Application

Direction

Data

Application

Direction

Data

Application

Sends

“user user_name\0”

just:connect

Receives

“user user_name\0”

just:connect

Sends

“passwordRequired"

Application

Receives

“passwordRequired”

Application

Sends

“password xxxxx” (SHA1 digest)

just:connect

Receives

"password xxxxx"

just:connect

Sends

“authorized\0”

Application

Receives

“authorized\0”

As TCP/IP communication is socket based, terminating a session with just:connect is as simple as closing the underlying socket.

Channel locking in just:in engine

As opposed to just:connect, just:in engine does not have any user authorization. However, before using a channel the client must first lock it. A client can discover channels by sending the “requestChannel” message to just:in engine. From the list of available channels the client can then request locks on one or more channels by sending the “requestLock” message.

Please refer to the “Ingest communication protocol” section for a full description of these messages.

Heartbeat messages

Both just:connect and just:in will send heartbeat messages to all connected client applications (including the 3rd-party application). A heartbeat message is a plaintext message with the prefix “heartbeat”, then a space character and then the current timecode in standard SMPTE timecode format (00:00:00:00). The client application can use this timecode to synchronize its internal time with the engine’s time and optionally display this information to the user (the current timecode and/or the mere fact that the engine is sending heartbeats to the client).

Playout schedule XML format

The schedule held by just:connect is defined by a tree-structure of nodes with different “classes” of node used to represent logical structure in the schedule. In addition to a class, or type, each node has a number of attributes or metadata. For each class of node there are some mandatory attributes and some optional attributes.

In XML, the schedule is represented by three tags:

  • The <node> tag is the fundamental tag in the structure and defines a single node. A node can represent a day, a playlist, a track, an item to play out or a trigger to a stop frame on a Composition Builder or Quartz Composer graphic file.

  • The <attribute> tag defines one attribute (or property or metadata) on a node.

  • The <resource> tag defines a node’s resource, or media, such as a QuickTime movie or a Composition Builder or Quartz Composer graphic file.

Child nodes are represented by <node> tags nested in the parent's <node> tag. Each <node> tag can have any number of child <attribute> tags. This gives the following structure:

<node> <attribute>...</attribute> <attribute>...</attribute> <resource>...</resource> <node> <attribute>...</attribute> <attribute>...</attribute> ... </node> </node>

Each "node" tag contains nested <attribute> tags to define properties, <node> tags to define child nodes and, optionally, one <resource> tag to define the node's resource (movie file, Composition Builder or Quartz Composer file).

The <node> tag

The node tag is used to define a node in the tree and has three required attributes:

The "id" attribute is a string that defines a unique identifier for the node. Every node defined in the schedule must have a completely unique ID identifying it. It is the responsibility of the 3rd-party application communicating with just:connect to assign and manage node IDs.

The "class" attribute is an integer that defines the class, or type of node being defined. The following values are defined:

Class

Name

Definition

Class

Name

Definition

0

Project

Reserved for internal use, do not use.

1

Day

Defines all of the playlists for a single day in the schedule.

2

Playlist

Defines a logical block of items to play.

3

Graphic Track

A graphic track can only contain play nodes with Composition Builder or Quartz Composer files. Several graphic tracks may be defined for a given channel, and they are rendered in the order specified in just:connect.

4

Video Track

A video track can only contain play nodes with QuickTime movie files. Currently just:connect and just:out only support a single video track per channel.

5

Play

Defines a single item to play in a playlist. Depending on the parent track type can define a Composition Builder file, Quartz Composer file or QuickTime movie file as its resource.

6

Trigger

Defines a “stop frame” trigger for a Composition Builder or Quartz Composer graphic. As such, this type of node should only be a child for a play node with a graphic resource.

7

Real-time Playlist / Folder

A special type of playlist or folder used to group nodes for “live” situations. See the section on “Live Playout” for more details.

8

Real-time Play

A special type of play node used for “live” situations See the section on “Live Playout” for more details.

The “flags” attribute is a bit-mask of the following values:

Value

Definition

Value

Definition

0x00000001

Node is chained (starts immediately after the previous node ends). Is relevant for playlist and play nodes.

0x00000008

Immediate play. The node should be played as soon as possible (the earliest frame available). Is relevant in “live” situations. See the section on “Live Playout” for more details.

0x00000010

Immediate cue. The node should be cued (the first frame of the node, without playing any further frames) as soon as possible (the earliest frame available). Is relevant in “live” situations. See the section on “Live Playout” for more details.

Thus a chained container node could be defined as follows:

<node id="1234" class="2" flags="1">...</node>

Note that if the value of "flags" is zero this attribute may be omitted in the XML as the default value of flags is zero.

In addition to the three required attributes described above, all "track" nodes (with class="3" or class="4") has a further required attribute:

The "trackId" attribute is a string that defines both the content of the track and its position in the render sequence. The format is a letter followed by a number. The letter "v" defines a video track while "g" defines a graphic track. The number is a zero-based index whereby tracks with lower values are rendered first, putting them at the "back" of the composited frame.

Under normal circumstances the following tracks are defined (in render order): "v0", "g0", "g1", "g2", "g3". This gives a single video track in the background with 4 graphic tracks rendered on top.

Note that the order in which the track nodes are defined in the schedule XML is irrelevant as just:connect uses the "trackId" attribute to send the track's contents to the just:out engine assigned to the track and the render order is defined by the channel itself, not the order that the tracks appear in the schedule.

Thus a track node containing video play nodes to be rendered on the video track “v0” would be defined as:

<node id=”99” class=”4” trackId=”v0”>

The class attribute of “4” defines a video track, and the trackId of “v0” defines the actual logical video track.

Nodes of class “8” (real-time play) also have two additional attributes:

The “reference” attribute defines the ID of the play node that should be played out. This play node must have already been loaded into the real-time “workbench” or “contents” playlist.

The “trackId” defines the track on which the play node should be played out. Standard values are “v0” for the video track and “g0”, “g1”, “g2” and “g3” for the graphic tracks.

For example, in order to schedule the play node with the ID “RESOURCE” on the track “v0” the node would be defined as:

<node id=”REALTIME_PLAY” class=”8” reference=”RESOURCE” trackId=”v0”>

For full details on how play nodes are loaded, referenced and played out in a live situation please see the section on “Live Playout” later in this document.

The <attribute> tag

Not to be confused with XML tag attributes, the <attribute> tag defines an attribute, or property for a node. As with the node tag the attribute tag has three required attributes in the following format:

<attribute key="xxx" type="y" flags="z">value</attribute>

The "key" attribute is a string that defines which of the node's properties is being defined. The values are described in detail later in this section.

The "type" attribute is an integer that defines what kind of property is being defined, one of the following values:

Value

Name

Definition

Value

Name

Definition

0

String

A single UTF-8 encoded string.

1

Integer

A 32-bit integer value.

2

Double

A double (floating point) value.

3

Bool

A true / false boolean value.

4

Index

An integer value from a list of possible values.

5

Dictionary

Reserved for future use, do not use.

6

 Array

An array of double or timecode values.

7

Timecode

A timecode value, with or without date.

8

Color

An RGBA color value.

The individual attribute types are described in full detail later in this section.

The "flags" attribute is an integer bit-mask containing any of the following values:

Value

Name

Definition

Value

Name

Definition

0x00000001

Read only

The attribute will be displayed in just:play or just:live, but disabled so that the user cannot alter the value.

0x00000002

Input port

Set to indicate that the attribute represents an input port value for a Composition Builder or Quartz Composer graphic file. In this case the attribute’s key must match exactly the input port’s key as published in Composition Builder or Quartz Composer and the attribute’s type the input port’s expected data type.

0x00000004

Track Control

Set to indicate that the attribute represents an infinite graphic track control setting (whether or not an infinite graphic track is enabled or disabled while the node is playing out). In this case the attribute’s key should have the prefix “toaInfiniteTrack” with the track ID appended (e.g. “g0”, “g1” etc.) For example, assuming that the graphic track with the ID “g0” is defined in just:connect as being an infinite graphic track then an attribute with the key “toaInfiniteTrackg0” would specify whether or not the graphic on this track would be displayed or not. The attribute must be a Boolean attribute with “yes” or “true” specifying that the infinite graphic will be disabled and “no” or “false” that the infinite graphic will be enabled (this is also the default value if the attribute is omitted). This type of attribute is valid for class 2 (Playlist) and class 5 (Play) nodes.

0x00000008

Hidden

Set to indicate that the attribute should not be displayed by just:play or just:live for editing by the user.

0x00000010

Custom Interface Input Port

Used in combination with the “Input Port” flag to indicate that the input port in question is a port controlled by a “custom interface” within just:live (an HTML-based interface displayed in a separate window). Such attributes are not displayed by just:live in its inspector. Instead, a “Custom Interface” group is added to the inspector with a button that displays the custom interface when clicked by the user. Please refer to the just:live user guide for further details on custom interfaces.

0x00000020

Metadata

Set to indicate that the attribute is metadata for the node. This is simply a hint for just:play and just:live to display all metadata attributes together in a separate group.

In addition the flag bits 12-15 (0x00001000 to 0x0000F000) can be used to specify logical ordering of attributes when they are displayed by just:play or just:live. Attributes are sorted numerically according the values specified in these order bits, and then attributes with the same order bits are sorted alphabetically by name.

Note that if the value of "flags" is zero this attribute may be omitted in the XML as the default value of flags is zero.

In addition to the required attributes the tag also has two optional attributes:

The "name" attribute defines a human-readable label for the attribute (as opposed to the "key" attribute" which may not be meaningful to the user).

The "category" attribute defines a category, or group, of attributes to which the attribute belongs.

Both this attributes are only relevant if the schedule will be presented to a user in just:play or just:live, and if the attribute in question is a custom attribute (not one of the standard attribute keys described later in this section). The "name" attribute will be used when displaying the attribute's value to the user and attributes of the same category will be grouped together in the user interface (a “group” in inspector). A 3rd-party application sending custom (non-standard) attribute keys where the user is expected to view the schedule in just:play or just:live should always transmit names and categories for such attributes. It is never required to send names or categories for any of the standard attribute keys described in this document as they are pre-defined within just:play and just:live. Equally, if the 3rd-party application has its own user interface and the schedules transmitted to just:connect will not be viewed or edited with just:play or just:live then the name and categories can be safely omitted.

For example, a string attribute used to set an input port on a Quartz Composer graphic with the port key “myInputKey” would be defined as:

<attribute key=”myInputKey” type=”0” flags=”2” name=”Title” category=”Input Port”>Hello World</attribute>

Here the attribute’s key matches the input port’s key, the type is “0” for a string attribute and flags is “2” to indicate an input port attribute. If displayed in just:play or just:live the attribute will be in the “Input Port” inspector group with the label “Title” and a text entry field with the initial value “Hello World”.

String attributes

The tag's text defines the attribute's string value, as in "Hello World" in the following example:

<attribute key="xxx" type="0">Hello World</attribute>

Integer attributes

The tag's text defines the attribute's integer value, as in the value "1000" in the following example:

<attribute key="xxx" type="1">1000</attribute>

Double attributes

There are two possible formats for a double attribute. In the basic format the tag's text simply defines the attribute's double value, as in the value "3.14" in the following example:

<attribute key="xxx" type="2">3.14</attribute>

However, it is also possible to define a minimum and/or maximum value for the attribute by defining <min> and/or <max> child tags. In this case the value itself is defined as the text of a <value> tag.

For example, to define the attribute with a value of "3.14" and a maximum value of "100.0" use the following:

<attribute key="xxx" type="2"><max>100.0</max><value>3.14</value></attribute>

To additionally define a minimum value of "0.0", use the following:

<attribute key="xxx" type="2"><min>0.0</min><max>100.0</max><value>3.14</value></attribute>

Note that the minimum and maximum values are optional and are only relevant if the schedule is to be presented to the user for further editing in, for example, just:play or just:live. In this case when the attribute is displayed in the inspector the user’s entry can be validated against the given range of values to ensure that invalid values are never sent to just:out.

Boolean attributes

The tag's text defines the attribute's boolean value with "F" representing "false" or "no" and "T" representing "true" or "yes". The following example defines a "true" attribute:

<attribute key="xxx" type="3">T</attribute>

Index attributes

Index attributes define an integer value from a range of values with optional names defined for each value that may be presented to the user in the form of a list to select from. There are two possible formats for this attribute. In the basic form the tag's text simple defines the attribute's integer value, as in the value "1" in the following example:

<attribute key="xxx" type="4">1</attribute>

To define a list of values the following tags are defined:

<values> <string>Name for value 0</string> <string>Name for value 1</string> <string>Name for value 2</string> </values> <max>2</max> <value>1</value>

Where the <string> tags define a list of names for the values (note that index attributes are always zero-based), the <max> tag's text defines the maximum value allowed and the <value> tag's text defines the currently selected value for the attribute. The following example defines an index attribute with the names "Zero", "One" and "Two" where "One" is currently selected:

<attribute key="xxx" type="4"> <values> <string>Zero</string> <string>One</string> <string>Two</string> </values> <max>2</max> <value>1</value> </attribute>

Note that defining value names for an index attribute is optional and only relevant if the schedule is to be presented to the user for further editing in, for example, just:play or just:live. In this case when the attribute is displayed in the inspector a drop-down list is displayed from which the user can select the required value. Such a list with strings is obviously easier for the user than having to enter the correct number.

Dictionary attributes

Not supported in the current build of Broadcast Suite, please do not use.

Array attributes

Broadcast Suite allows arrays of either double or timecode values. The following example defines an array of 5 double values with the values [0.0, 1.0, 2.0, 3.0 and 4.0]:

<attribute key="xxx" type="6"> <array> <double>0.0</double> <double>1.0</double> <double>2.0</double> <double>3.0</double> <double>4.0</double> </array> </attribute>

The following example defines an array of timecode values with the values [00:10:00:00, 00:20:00:00 and 00:30:00:00]

<attribute key="xxx" type="6"> <array> <timecode>00:10:00:00</timecode> <timecode>00:20:00:00</timecode> <timecode>00:30:00:00</timecode> </array> </attribute>

Timecode attributes

The text of this attribute defines a time code and, optionally, a date. The basic time code only format uses the standard SMPTE "hh:mm:ss:ff" (hours, minutes, seconds and frames) format, as in the following example that defines a time code of 22:30, or 10:30 PM:

<attribute key="xxx" type="7">22:30:00:00</attribute>

When a date is also included it must be in the format "dd.mm.yyyy" without any spaces and should precede the time code followed by a space, for example:

<attribute key="xxx" type="7">1.4.2009 22:30:00:00</attribute>

Additionally, it is valid to specify the timecode part as a simple integer, which in this case is the number of frames elapsed since midnight. For example, at 25 fps there are 90000 frames per hour (25 * 60 * 60), so in order to specify a timecode of 02:00 AM the correct value would be 180000 (90000 * 2 hours elapsed since midnight). For example:

<attribute key="xxx" type="7">1.4.2009 180000</attribute>

Note that time codes are always assumed to be in the time zone "local" to the channel itself (i.e. the system time where just:out is running) and in the correct frame rate for the channel (i.e. 25 fps, 29.97 fps, 30 fps etc). Time codes are not further verified by just:connect or just:out, it is the responsibility of the sending application to verify that the time codes are correct.

Color attributes

The tag's text defines a color with RGBA components in one of two possible formats. The first format is in hexadecimal with a leading "#" character ("web" style). The second format defines the components as floating-point values between 0.0 and 1.0 separated by commas. In both cases the components are defined in the order red, green, blue and alpha. For example, both the following would define a red color with an alpha value of 1.0 (i.e. opaque):

<attribute key="xxx" type="8">#ff0000ff</attribute> <attribute key="xxx" type="8">1.0,0.0,0.0,1.0</attribute>

The <resource> tag

All class 5 (Play) nodes must define a single <resource> tag to define the type of resource or media to be played out by the node.

The tag has a single “type” attribute to indicate the type of resource with the following values:

Value

Type

Definition

Value

Type

Definition

0

QuickTime Movie

The text of the <resource> tag defines the name of movie file.

1

Composition Builder / Quartz Composer Graphic

The text of the <resource> tag defines the name of the Quartz Composer or Composition Builder file.

2

Live Input

Defines that the live SDI input signal should be displayed. Note that the output card must be correctly configured (e.g. the downstream keyer activated for an AJA card) and a valid SDI signal connected to the card’s input for this function to work correctly. The text of the <resource> tag is ignored in this case.

3

Image

A special form of Quartz Composer graphic, a still image “wrapped” in a pre-defined QTZ file. The text of the <resource> tag defines the name of the still image (JPEG, TIFF or PNG format).

4

Graphic Movie

A special form of Quartz Composer graphic, a QuickTime movie file “wrapped” in a pre-defined QTZ file and rendered on a graphic track instead of the video track. The text of the <resource> tag defines the name of movie file.

5

Gap

Intended to intentionally insert gaps into a video track if this is desired. Normally all video play nodes must be chained, and this excludes the possibility of gaps between movie files. Inserting a play node with a “gap” resource allows such a gap to be inserted between two play nodes with movie resources. The text of the <resource> tag is ignored in this case.

→ Use the sidebar to navigate.