Decentralized Media Linking is a protocol for streaming live data for various media. It is primarily ment for linking amateur radio stations such as repeaters, but is not limited to it. Some key properties and design goals are:
DML is a continuation of a previous idea I had years ago but never finished. For a historical background the following page might be interesting: http://sharon.pi8zaa.ampr.org/users/pe1rxq/drl/drl.html
In order to achieve those goals all data will be signed with a 256 bit elliptic curve key. By doing this each data packet can be authenticated. Identifying streams is done by calculating a SHA-256 hash of a number of constant stream properties. (such as the name, its mime type, aliases and a description) This allows streams to be identified without any central registration.
Before allowing a stream on air certificates are used to check wether the source is allowed to.
By setting up different certificate authorities different classes of sources can be defined.
For example a certificate authority which grants certificates if the person requesting it has proven to be in posession of a full license.
Another certificate authority might also grant certificates for novice licenses.
The operator of a repeater can grant access to the ether by selecting certificates.
Since anyone can setup a certificate authority no single person controls the network.
The following certificates are maintained at dmlinking.net:
|Name||Description||Certificate & revocation lists|
The DML router dmld does no checking and will pass all streams. In theory it could limit streams based on certificates, mime type or bandwidth.
dml_trx implements a simple repeater which works with audio streams encoded with the Codec2 vocoder.
A-law and u-law encoded voice is also supported.
Ethernet is used as a common interface to any such modem. This way dml_trx is not dependend on the actual on air format. It also allows multiplexing of different data streams on a single interface. A typical use case would be a multiplexed stream with both Codec2 and APRS like location data.
Freedv_eth uses the freedv library to receive and send codec2 frames via a TAP network device.
If the voice mode does not match the on air format (including analog audio) it will be transcoded.
The combination of freedv_eth and dml_trx allows the creation of a (short-wave) repeater/hotspot on the DML network.
Codec2 voice over DML
Codec2 voice over Ethernet
Encoding amateur radio callsigns in ethernet addresses
FPRS: An APRS like protocol for use with the Codec2 data channel
dml_reflector implements an audio reflector allowing more than a two repeaters to participate in conversations.
The typical stream will be named using a callsign. Since most transceivers are limited in the type of input they provide (e.g. DTMF only) a stream can not only have a name, but also an alias. This alias can be used to make a stream accessable by number. (Or other more appropriate identifying method)
dml_streamer can live stream ogg (vorbis and/or theora) and webm streams. dml_stream_client can receive any live stream and outputs it to standard output. (Which can for example be piped to mplayer)
An example is the testvideo.pe1rxq.ampr.org stream.
It uses ffmpeg to create a test pattern and an sine wave and encodes them using the VPx and Vorbis codecs.
The resulting webm stream is piped to dml_stream which will stream the header and individual data packets to any dml clients.
The following command is used:
ffmpeg -f lavfi -i testsrc=size=cif:rate=25 -f lavfi -i sine -af arealtime -c:v libvpx -c:a libvorbis -b:v 280K -g:v 25 -q:a 5 -f webm - | dml_streamer
Also a webserver is available (dml_httpd) which makes DML available via a websocket.
(Some, like webm can actually be watched in browser)
Test server: http://dmlinking.net:8800/ (might not always be available)
The DML code can be found in the following Git archive:
The freedv_eth and analog_trx code can be found in the following Git archive: http://dmlinking.net/~pe1rxq/eth_ar.git/
It will require atleast version r2709 from the codec2 SVN repository (currently only in codec2-dev)