Commit bc9a8478 authored by Michael Hanselmann's avatar Michael Hanselmann Committed by Rémi Denis-Courmont

Add Remote Audio Output Protocol stream output plugin

Apple AirPort Express devices can play audio streamed over the
network. The Remote Audio Output Protocol was reverse-engineered
by Jon Lech Johansen in 2004. He also released a proof of concept
implementation named JustePort.

The control protocol is similar to interleaved RTSP record mode and
based on HTTP. It is used to negotiate details before sending music
data over an AES encrypted TCP connection. RSA is used to encrypt the
AES key before transfering it via an HTTP header. To this day, only
the public part of the RSA key has been made public while the private
part remains unknown.

VLC uses libgcrypt for encryption. Unfortunately, libgcrypt doesn't
support the OAEP standard as defined in RFC2437 and RAOP demands
OAEP padding for RSA encrypted data. OAEP has been reimplemented from
scratch based on the specification for this plugin. These functions,
MGF1 and AddOaepPadding, can be adopted for libgcrypt at a later time.

All input data must be encoded using the Apple Lossless codec with
44100 Hz and 2 channels. The "transcode" plugin can be used to
reencode input data. Updating the volume while playing is not yet
supported. Except for logging, no use is made of the audio delay
and jack type reported by the device.

Apple's RAOP-compatible devices announce themselves on the network
using Zeroconf, but discovering them is not implemented in this
plugin. The service type is "_raop._tcp".

The "raop" plugin can be used like this:
--sout='#transcode{acodec=alac,channels=2}:raop{host=hostname}'

It also supports a "volume" parameter with a range from 0 to 255.
Signed-off-by: default avatarMichael Hanselmann <public@hansmi.ch>
Signed-off-by: default avatarRémi Denis-Courmont <rdenis@simphalempin.com>
parent bf89dc16
...@@ -5299,6 +5299,21 @@ AS_IF([test "${enable_remoteosd}" != "no"], [ ...@@ -5299,6 +5299,21 @@ AS_IF([test "${enable_remoteosd}" != "no"], [
]) ])
dnl
dnl RAOP plugin
dnl
AC_MSG_CHECKING([whether to enable RAOP plugin])
AS_IF([test "${have_libgcrypt}" = "yes"], [
AC_MSG_RESULT(yes)
VLC_ADD_PLUGIN([stream_out_raop])
VLC_ADD_LIBS([stream_out_raop], [${LIBGCRYPT_LIBS}])
VLC_ADD_CFLAGS([stream_out_raop], [${LIBGCRYPT_CFLAGS}])
], [
AC_MSG_RESULT(no)
AC_MSG_WARN([libgcrypt support required for RAOP plugin])
])
dnl dnl
dnl update checking system dnl update checking system
dnl dnl
......
...@@ -12,6 +12,7 @@ SOURCES_stream_out_bridge = bridge.c ...@@ -12,6 +12,7 @@ SOURCES_stream_out_bridge = bridge.c
SOURCES_stream_out_mosaic_bridge = mosaic_bridge.c SOURCES_stream_out_mosaic_bridge = mosaic_bridge.c
SOURCES_stream_out_autodel = autodel.c SOURCES_stream_out_autodel = autodel.c
SOURCES_stream_out_record = record.c SOURCES_stream_out_record = record.c
SOURCES_stream_out_raop = raop.c
libvlc_LTLIBRARIES += \ libvlc_LTLIBRARIES += \
libstream_out_dummy_plugin.la \ libstream_out_dummy_plugin.la \
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment