The USB protocol
The ATEM Mini series of switchers can be controlled over USB instead of ethernet. This variant of the protocol is a simplified version of the UDP protocol used for the other ATEM hardware.
The USB protocol drops all the retransmission and framing from the UDP protocol since USB is a reliable transport and provides framing already.
The old USB protocol (until 8.5)
The initial revision of the USB protocol is very simple. The raw ATEM commands are just send over a bulk endpoint prefixed with the length of a block of commands.
The ATEM hardware uses a standard pair of bulk endpoints for all the communication except the initial handshake.
The interfaces exposed by an ATEM Mini:
Interface |
Class |
Notes |
---|---|---|
0 |
Vendor specific |
Unknown |
1 |
Vendor specific |
Unknown |
2 |
Vendor specific |
ATEM control protocol |
3 |
DFU |
Firmware updates |
4 |
Video control |
Virtual webcam settings |
5 |
Video stream |
Virtual webcam stream |
6 |
Audio control |
Virtual soundcard settings |
7 |
Audio stream |
Virtual soundcard stream |
Starting a connection
The communication is established by sending a vendor USB control transfer to the device and then atem commands are sent using regular bulk packets. The ATEM protocol is on interface 2.
Type |
Control Transfer |
|
bmRequestType |
0x21 |
host-to-device, class, interface |
bRequest |
0 |
|
wValue |
0x0000 |
|
wIndex |
0x0002 |
|
wLength |
0 |
After this initial packet it should be possible to do an URB Bulk read to get the full initial sync in one packet.
The pyatem implementation does reads with a size of 32768 bytes.
Packet protocol
The USB protocol is simplified a lot compared to the older UDP protocol. Since USB already provides a robust, ordered and framed protocol a lot of the error recovery features could be dropped.
Offset |
Length |
Note |
---|---|---|
0 |
4 |
Chunk length as int32 (n after this) |
4 |
n |
Atem messages concatinated together |
4+n |
4 |
(optional) Chunk length of the second chunk. These chunks and data blocks repeat |
The contents of the ATEM messages are what’s defined as The higher level protocol on the UDP page. All further parsing is exactly the same as the UDP protocl.
For sending commands to the ATEM the inverse can be done. Prepend a 32 bit length header to the normal ATEM command structure and write it as an USB Bulk message
The 8.6+ protocol
With the introduction of the ATEM Mini Extreme the protocol got revised for all Mini series switchers. There is no longer a control transfer to start the connection and there’s an additional header to implement some flow control and the initial handshake. The 4-byte packet length prefix from the previous protocol has been completely dropped.
Starting a connection
The connection only uses the bulk transfer endpoints on interface 2. The new header for the protocol uses 4 bytes and up to 8 bytes of extra payload.
Offset |
Length |
Note |
---|---|---|
0 |
1 |
The packet type for ATEM -> PC packets, otherwise 0 |
1 |
1 |
The packet type for PC -> ATEM packets, otherwise 0 |
2 |
1 |
Unknown, 1 for ATEM -> PC packets, 0 otherwise |
3 |
1 |
Unknown, 1 for PC -> ATEM transfers, 0 otherwise |
4 |
0-8 |
Data. Depends on packet type |
The important data that’s encoded here is the packet type. The packet types are the following:
Type |
Data |
Description |
---|---|---|
0x01 |
00 01 10 92 |
Send from PC -> ATEM to start a new connection. |
0x02 |
no data |
Send from ATEM -> to acknowledge the init packet |
0x03 0x03 |
00 00 00 00 00 00 xx xx |
Send from PC -> ATEM to signify RX buffer usage |
xx xx 00 00 00 00 00 00 |
Send from ATEM -> PC to signify RX buffer usage |
|
0x04 0x04 |
00 00 00 00 00 00 xx xx |
The next packet is PC -> ATEM data |
00 00 00 00 00 00 xx xx |
The next packet is ATEM -> PC data |
|
0x05 |
no data |
Send from PC -> ATEM |
The meaning of the 4 bytes in the 0x01 packet are still unknown.
The 0x03 packets are used for some variant of flow control between the devices. The buffer usage is described as blocks of 1024 bytes. If floor(len(buffer) // 1024) becomes more than 0 then a packet with that value are sent to signify the other end to start slowing down.
The 0x04 packets are the main packets of the protocol. This packet just signifies that the _next_ USB packet(s) are ATEM protocol buffers. The encoding for these buffers is the same as the old protocol except there’s no length prefix for the packet. The packet is simply the result of concatinating together encoded ATEM fields and commands. and are decoded using the overall packet length in this new header and the command/field size stored inside every command after the 4-byte command identifier.