Core idea
Make JPEG fragments survivable.
A normal JPEG assumes the stream arrives in order. SSDV makes each packet carry enough identity and MCU position information for a receiver to continue after corruption or packet loss.
Packet image format
SSDV is easiest to understand as JPEG scan data made restartable for weak links. The image is lossy because JPEG is lossy; the packet wrapper is there to make transport more recoverable with sequence numbers, MCU alignment hints, CRC32, and optional Reed-Solomon parity.
Core idea
A normal JPEG assumes the stream arrives in order. SSDV makes each packet carry enough identity and MCU position information for a receiver to continue after corruption or packet loss.
Normal packet
The 0x66 layout keeps 205 payload bytes and appends 32 parity bytes. The Reed-Solomon block protects bytes 1-223.
No-FEC packet
The 0x67 layout spends the FEC space on payload. It is useful when another frame layer already provides enough error correction.
In normal mode, the Reed-Solomon trailer can correct up to 16 byte errors when the receiver still knows where the bytes sit in the packet. CRC32 then confirms the corrected body.
FEC does not magically fix a shifted stream. If a demodulator drops bytes, it should insert padding before correction so the code sees byte errors rather than a permanently displaced packet.
The missing packets case is where the decoder uses packet ID, MCU offset, and MCU index to close an incomplete block, fill skipped MCUs, discard unusable leading data, and resume at the next known MCU boundary.
SSDV does not require one radio modulation. The UKHAS guide documents 8-bit RTTY practice and also discusses carrying packets inside AX.25. Modern experiments may put the same SSDV bytes behind Bell 202 AFSK, 9600 FSK/GFSK, KISS TCP, or a mission-specific telemetry/FEC container. Keep the layers separate when diagnosing a receive: modem lock, packet framing, SSDV CRC/FEC, and JPEG reconstruction each fail differently.
| Layer | What to check | Failure clue |
|---|---|---|
| Input JPEG | Baseline DCT, compatible dimensions, YCbCr or grayscale, fixed table profile. | Encoder rejects the image before packet output. |
| Header | Sync 0x55, type 0x66 or 0x67, Base-40 encoded callsign, image ID, dimensions, packet ID. | Packets parse but do not join the current image session. |
| Flags | Quality XOR 4, EOI only on final packet, subsampling mode carried in the low bits. | Decoder reconstructs wrong dimensions or finalizes early. |
| CRC32 | Normal CRC at 220-223; no-FEC CRC at 252-255. | Packet is discarded after demodulation or after FEC correction. |
| Reed-Solomon | Normal packets use 32 parity bytes over bytes 1-223. | Random byte errors remain uncorrected or corrected packet fails CRC. |
| Transport | Confirm RTTY/AX.25/KISS/modem profile, symbol rate, audio level, and bit ordering. | No valid packet boundary appears even though RF/audio energy is present. |