UPnP Server module implementation
This MR follows discussions about implementation that can be found here: https://mailman.videolan.org/pipermail/vlc-devel/2021-March/142703.html
These changes implement a fully functional UPNP server exposing the medialibrary content on the network.
Version 3
The recent changes on the medialibrary introduced a way to whitelist media in a generic manner to all the network interface.
The UPnP server now only list media that have been explicitly marked as public
by the user. This mitigates a lot of the privacy issues talked earlier.
To be clear, this merge request is only the start of the usage of the public media sharing, I plan to port this medialibrary capability to at least the HTTP interface. The MR does not provide a way to mark media as public/private, this will be done later.
Additionally, I tried to lighten up the merge request:
- The transcoding output of the server will be submitted in a subsequent MR
- The Unit tests will also be for a subsequent merge request as I'm introducing a small C++ helper that I would like to make available across all the codebase
- The commits have been cleaned up, and re-arranged
- The submitted code has been reformatted and cleaned up and updated to C++17 capabilities.
Original Description
Extracted from the former commit message:
This is the first implementation of a vlc upnp server module.
The module behave as an interface, it works in pair with the
medialibrary API to expose most of its content.
Here is a list of the server main features:
- Very straightforward to deploy, you start vlc with `-I upnp` and it
simply exposes the medialibrary on the local network.
- The server automatically exposes downscaled versions of your videos
- While the DLNA spec is far from being fully supported, a lot of DLNA
clients are supported.
- DLNA's "time based seeking" during transcoding is supported.
- Special transcoding profiles depending on client's user-agent are
suported, for the moment only the PLAYSTATION3 has differents
profiles hardcoded in the source code but it should be extensible to
other specific clients eventually using config files.
The module is split into different parts, here's a quick overview:
- upnp_server.cpp: The core of the module, all the interactions with
libupnp are done here, this file brings all the module parts
together.
- cds/*: The "ContentDirectory Service", represents and implements the
server file hierarchy, in our case, it mostly reflect the
medialibrary content.
- sout.cpp: The access out upnp server submodule internals. Used in
media transcoding to make the connection between the vlc transcode
pipeline output and the upnp HTTP callbacks.
- xml_wrapper: Wrap the xmli library with modern c++ code to fit the
codebase better.
- test/*: Unit tests
The upnp_server module is based on Hamza Parnica's great proof of
concept.