[vlc-devel] [PATCH 5/5] dlna: add GetProtocolInfo action

Thomas Guillem thomas at gllm.fr
Mon Nov 26 17:25:00 CET 2018



On Mon, Nov 26, 2018, at 16:00, Thomas Guillem wrote:
> I like the idea of this patch, and this is what VLC should do but I have 
> some concerns.
> 
> Did you test all these profiles on every OS/VLC-ports ?
> 
> I'm afraid it's quite an impossible task.
> 
> For chromecast, we decided to focus on few profile/codecs, that we 
> tested on all platforms. We had several issues:
>  - Lake of x264 on iOS/macOS (license issue)
>  - VPX encoder broken on arm (need to be fixed)
>  - Lake of AAC encoder on some OS (license issue)
> 
> For the lake of H264 encoder, we decided to plug hardware encoders via 
> mediacodec, videotoolbox and QSV. Nevertheless, these HW encoders can't 
> encode everything and sometimes, we need to fallback to VPX (on iOS, VT 
> can't handle lowres for example).
> 
> For the lake of AAC encoders, we could use HW encoders too, but it's not 
> done yet.
> 
> SO I'm afraid, we support only these codecs for encoding (on all platforms)
>  - H264
>  - VPX
>  - mp3
>  - ogg
>  - opus

OK, you can add AAC in the list, using the ffmpeg aac encoder.
We had lot of issue with AAC on chromecast but it was chromecast specific issue.

> 
> So, should you shrink your profile_list to support only those ^^ ?
> 
> On Tue, Oct 23, 2018, at 07:51, Shaleen Jain wrote:
> > Adds support for querying media formats supported
> > by a Media Renderer device. Profiles related to
> > H264/HEVC and MP3/AAC/AC-3 codecs are added.
> > 
> > We transcode to the default/mandatory DLNA audio and video profiles
> > for any non-supported formats since these are suppose
> > to be supported by every DLNA certified device.
> > ---
> >  modules/services_discovery/Makefile.am    |   1 +
> >  modules/stream_out/dlna/dlna.cpp          | 273 ++++++-
> >  modules/stream_out/dlna/dlna.hpp          |  28 +-
> >  modules/stream_out/dlna/profile_names.hpp | 833 ++++++++++++++++++++++
> >  4 files changed, 1099 insertions(+), 36 deletions(-)
> >  create mode 100644 modules/stream_out/dlna/profile_names.hpp
> > 
> > diff --git a/modules/services_discovery/Makefile.am b/modules/
> > services_discovery/Makefile.am
> > index 1b59cb1e4f..0b3dea0247 100644
> > --- a/modules/services_discovery/Makefile.am
> > +++ b/modules/services_discovery/Makefile.am
> > @@ -29,6 +29,7 @@ sd_LTLIBRARIES += $(LTLIBmtp)
> >  libupnp_plugin_la_SOURCES = services_discovery/upnp.cpp 
> > services_discovery/upnp.hpp \
> >  			    services_discovery/upnp-wrapper.hpp \
> >  			    services_discovery/upnp-wrapper.cpp \
> > +			    stream_out/dlna/profile_names.hpp \
> >  			    stream_out/dlna/dlna_common.hpp \
> >  			    stream_out/dlna/dlna.hpp \
> >  			    stream_out/dlna/dlna.cpp
> > diff --git a/modules/stream_out/dlna/dlna.cpp b/modules/stream_out/dlna/
> > dlna.cpp
> > index e0c266d8e3..39acfd0150 100644
> > --- a/modules/stream_out/dlna/dlna.cpp
> > +++ b/modules/stream_out/dlna/dlna.cpp
> > @@ -66,8 +66,9 @@ struct sout_stream_sys_t
> >      std::shared_ptr<MediaRenderer> renderer;
> >      UpnpInstanceWrapper *p_upnp;
> >  
> > -    bool canDecodeAudio( vlc_fourcc_t i_codec ) const;
> > -    bool canDecodeVideo( vlc_fourcc_t i_codec ) const;
> > +    ProtocolPtr canDecodeAudio( vlc_fourcc_t i_codec ) const;
> > +    ProtocolPtr canDecodeVideo( vlc_fourcc_t audio_codec,
> > +                         vlc_fourcc_t video_codec ) const;
> >      bool startSoutChain( sout_stream_t* p_stream,
> >                           const std::vector<sout_stream_id_sys_t*> &new_streams,
> >                           const std::string &sout );
> > @@ -84,6 +85,7 @@ struct sout_stream_sys_t
> >      int                                 http_port;
> >      std::vector<sout_stream_id_sys_t*>  streams;
> >      std::vector<sout_stream_id_sys_t*>  out_streams;
> > +    std::vector<protocol_info_t>        device_protocols;
> >  
> >  private:
> >      std::string GetVencOption( sout_stream_t *, vlc_fourcc_t *,
> > @@ -154,14 +156,66 @@ char *getServerIPAddress() {
> >      return ip;
> >  }
> >  
> > -bool sout_stream_sys_t::canDecodeAudio(vlc_fourcc_t i_codec) const
> > +std::string dlna_write_protocol_info (dlna_transport_protocol_t type,
> > +                                      dlna_org_conversion_t ci,
> > +                                      dlna_org_operation_t op,
> > +                                      dlna_org_flags_t flags,
> > +                                      dlna_profile_t p)
> >  {
> > -    return i_codec == VLC_CODEC_MP4A;
> > +    std::ostringstream protocol;
> > +    char dlna_info[448];
> > +
> > +    if (type == DLNA_TRANSPORT_PROTOCOL_HTTP)
> > +        protocol << "http-get:*:";
> > +
> > +    protocol << p.mime;
> > +    protocol << ":";
> > +
> > +    if (p.name != "*")
> > +        protocol << "DLNA.ORG_PN=" << p.name.c_str() << ";";
> > +
> > +    sprintf (dlna_info, "%s=%.2x;%s=%d;%s=%.8x%.24x",
> > +               "DLNA.ORG_OP", op, "DLNA.ORG_CI", ci,
> > +               "DLNA.ORG_FLAGS", flags, 0);
> > +    protocol << dlna_info;
> > +
> > +    return protocol.str();
> >  }
> >  
> > -bool sout_stream_sys_t::canDecodeVideo(vlc_fourcc_t i_codec) const
> > +std::vector<std::string> split(const std::string &s, char delim) {
> > +    std::stringstream ss(s);
> > +    std::string item;
> > +    std::vector<std::string> elems;
> > +    while (std::getline(ss, item, delim)) {
> > +        elems.push_back(item);
> > +    }
> > +    return elems;
> > +}
> > +
> > +ProtocolPtr sout_stream_sys_t::canDecodeAudio(vlc_fourcc_t audio_codec) const
> >  {
> > -    return i_codec == VLC_CODEC_H264;
> > +    for (protocol_info_t protocol : device_protocols) {
> > +        if (protocol.profile.media == DLNA_CLASS_AUDIO
> > +                && protocol.profile.audio_codec == audio_codec)
> > +        {
> > +            return std::make_unique<protocol_info_t>(protocol);
> > +        }
> > +    }
> > +    return nullptr;
> > +}
> > +
> > +ProtocolPtr sout_stream_sys_t::canDecodeVideo(vlc_fourcc_t audio_codec,
> > +                vlc_fourcc_t video_codec) const
> > +{
> > +    for (protocol_info_t protocol : device_protocols) {
> > +        if (protocol.profile.media == DLNA_CLASS_AV
> > +                && protocol.profile.audio_codec == audio_codec
> > +                && protocol.profile.video_codec == video_codec)
> > +        {
> > +            return std::make_unique<protocol_info_t>(protocol);
> > +        }
> > +    }
> > +    return nullptr;
> >  }
> >  
> >  bool sout_stream_sys_t::startSoutChain(sout_stream_t *p_stream,
> > @@ -495,32 +549,12 @@ int sout_stream_sys_t::UpdateOutput( sout_stream_t 
> > *p_stream )
> >          const es_format_t *p_es = &stream->fmt;
> >          if (p_es->i_cat == AUDIO_ES)
> >          {
> > -            if (!canDecodeAudio( p_es->i_codec ))
> > -            {
> > -                msg_Dbg( p_stream, "can't remux audio track %d codec 
> > %4.4s",
> > -                        p_es->i_id, (const char*)&p_es->i_codec );
> > -                p_original_audio = p_es;
> > -                canRemux = false;
> > -            }
> > -            else if (i_codec_audio == 0)
> > -            {
> > -                i_codec_audio = p_es->i_codec;
> > -            }
> > +            p_original_audio = p_es;
> >              new_streams.push_back(stream);
> >          }
> >          else if (b_supports_video && p_es->i_cat == VIDEO_ES)
> >          {
> > -            if (!canDecodeVideo( p_es->i_codec ))
> > -            {
> > -                msg_Dbg( p_stream, "can't remux video track %d codec 
> > %4.4s",
> > -                        p_es->i_id, (const char*)&p_es->i_codec );
> > -                p_original_video = p_es;
> > -                canRemux = false;
> > -            }
> > -            else if (i_codec_video == 0)
> > -            {
> > -                i_codec_video = p_es->i_codec;
> > -            }
> > +	    p_original_video = p_es;
> >              new_streams.push_back(stream);
> >          }
> >      }
> > @@ -528,6 +562,62 @@ int sout_stream_sys_t::UpdateOutput( sout_stream_t 
> > *p_stream )
> >      if (new_streams.empty())
> >          return VLC_SUCCESS;
> >  
> > +    ProtocolPtr stream_protocol;
> > +    // check if we have an audio only stream
> > +    if (!p_original_video && p_original_audio)
> > +    {
> > +        if( !(stream_protocol = canDecodeAudio(p_original_audio-
> > >i_codec)) )
> > +        {
> > +	    msg_Dbg( p_stream, "can't remux audio track %d codec %4.4s",
> > +		    p_original_audio->i_id, (const char*)&p_original_audio->i_codec );
> > +            stream_protocol = make_protocol(default_audio_protocol);
> > +            canRemux = false;
> > +        }
> > +	else
> > +	    i_codec_audio = p_original_audio->i_codec;
> > +    }
> > +    // video only stream
> > +    else if (p_original_video && !p_original_audio)
> > +    {
> > +        if( !(stream_protocol = canDecodeVideo(VLC_CODEC_NONE,
> > +                        p_original_video->i_codec)) )
> > +        {
> > +	    msg_Dbg(p_stream, "can't remux video track %d codec: %4.4s",
> > +		    p_original_video->i_id, (const char*)&p_original_video->i_codec);
> > +            stream_protocol = make_protocol(default_video_protocol);
> > +            canRemux = false;
> > +        }
> > +	else
> > +            i_codec_video = p_original_video->i_codec;
> > +    }
> > +    else
> > +    {
> > +        if( !(stream_protocol = canDecodeVideo( p_original_audio-
> > >i_codec,
> > +                        p_original_video->i_codec)) )
> > +        {
> > +	    msg_Dbg(p_stream, "can't remux video track %d with audio: %4.4s and 
> > video: %4.4s",
> > +		    p_original_video->i_id, (const char*)&p_original_audio->i_codec,
> > +                    (const char*)&p_original_video->i_codec);
> > +            stream_protocol = make_protocol(default_video_protocol);
> > +            canRemux = false;
> > +
> > +            // check which codec needs transcoding
> > +            if (stream_protocol->profile.audio_codec == 
> > p_original_audio->i_codec)
> > +	        i_codec_audio = p_original_audio->i_codec;
> > +            if (stream_protocol->profile.video_codec == 
> > p_original_video->i_codec)
> > +                i_codec_video = p_original_video->i_codec;
> > +        }
> > +	else
> > +	{
> > +            i_codec_audio = p_original_audio->i_codec;
> > +            i_codec_video = p_original_video->i_codec;
> > +	}
> > +    }
> > +
> > +    msg_Dbg( p_stream, "using DLNA profile %s:%s",
> > +                stream_protocol->profile.mime.c_str(),
> > +                stream_protocol->profile.name.c_str() );
> > +
> >      std::ostringstream ssout;
> >      if ( !canRemux )
> >      {
> > @@ -554,13 +644,13 @@ int sout_stream_sys_t::UpdateOutput( sout_stream_t 
> > *p_stream )
> >          ssout << "transcode{";
> >          if ( i_codec_audio == 0 && p_original_audio )
> >          {
> > -            i_codec_audio = VLC_CODEC_MP4A;
> > +            i_codec_audio = stream_protocol->profile.audio_codec;
> >              ssout << GetAcodecOption( p_stream, &i_codec_audio,
> >                                        &p_original_audio->audio, 
> > i_quality );
> >          }
> >          if ( i_codec_video == 0 && p_original_video )
> >          {
> > -            i_codec_video = VLC_CODEC_H264;
> > +            i_codec_video = stream_protocol->profile.video_codec;
> >              ssout << GetVcodecOption( p_stream, &i_codec_video,
> >                                        &p_original_video->video, 
> > i_quality );
> >          }
> > @@ -575,8 +665,8 @@ int sout_stream_sys_t::UpdateOutput( sout_stream_t 
> > *p_stream )
> >      std::string root_url = ss.str();
> >  
> >      ssout << "http{dst=:" << http_port << root_url
> > -          << ",mux=" << "mp4stream"
> > -          << ",access=http{mime=" << "video/mp4" << "}}";
> > +          << ",mux=" << stream_protocol->profile.mux
> > +          << ",access=http{mime=" << stream_protocol->profile.mime << "}}";
> >  
> >      char *ip = getServerIPAddress();
> >      if (ip == NULL)
> > @@ -595,7 +685,7 @@ int sout_stream_sys_t::UpdateOutput( sout_stream_t 
> > *p_stream )
> >  
> >      msg_Dbg(p_stream, "AVTransportURI: %s", uri);
> >      renderer->Stop();
> > -    renderer->SetAVTransportURI(uri);
> > +    renderer->SetAVTransportURI(uri, *stream_protocol);
> >      renderer->Play("1");
> >  
> >      free(uri);
> > @@ -713,15 +803,126 @@ int MediaRenderer::Stop()
> >      return VLC_SUCCESS;
> >  }
> >  
> > -int MediaRenderer::SetAVTransportURI(const char* uri)
> > +std::vector<protocol_info_t> MediaRenderer::GetProtocolInfo()
> >  {
> > +    std::string protocol_csv;
> > +    std::vector<protocol_info_t> supported_protocols;
> > +    std::list<std::pair<const char*, const char*>> arg_list;
> > +
> > +    IXML_Document *response = SendAction("GetProtocolInfo",
> > +                                CONNECTION_MANAGER_SERVICE_TYPE, 
> > arg_list);
> > +    if(!response)
> > +    {
> > +        return supported_protocols;
> > +    }
> > +
> > +    // Get the CSV list of protocols/profiles supported by the device
> > +    if( IXML_NodeList *protocol_list = 
> > ixmlDocument_getElementsByTagName( response , "Sink" ) )
> > +    {
> > +        if ( IXML_Node* protocol_node = 
> > ixmlNodeList_item( protocol_list, 0 ) )
> > +        {
> > +            IXML_Node* p_text_node = 
> > ixmlNode_getFirstChild( protocol_node );
> > +            if ( p_text_node )
> > +            {
> > +                
> > protocol_csv.assign(ixmlNode_getNodeValue( p_text_node ));
> > +            }
> > +        }
> > +        ixmlNodeList_free( protocol_list);
> > +    }
> > +    ixmlDocument_free(response);
> > +
> > +    msg_Dbg(parent, "Device supports protocols: %s", 
> > protocol_csv.c_str());
> > +    // parse the CSV list
> > +    // format: <transportProtocol>:<network>:<mime>:<additionalInfo>
> > +    std::vector<std::string> protocols = split(protocol_csv, ',');
> > +    for (std::string protocol : protocols ) {
> > +        std::vector<std::string> protocol_info = split(protocol, ':');
> > +
> > +        // We only support http transport for now.
> > +        if (protocol_info.size() == 4 && protocol_info.at(0) == "http-
> > get")
> > +        {
> > +            protocol_info_t proto;
> > +
> > +            // Get the DLNA profile name
> > +            std::string profile_name;
> > +            std::string tag = "DLNA.ORG_PN=";
> > +
> > +            if (protocol_info.at(3) == "*")
> > +            {
> > +               profile_name = "*";
> > +            }
> > +            else if (std::size_t index = 
> > protocol_info.at(3).find(tag) != std::string::npos)
> > +            {
> > +                std::size_t end = protocol_info.at(3).find(';', index + 
> > 1);
> > +                int start = index + tag.length() - 1;
> > +                int length = end - start;
> > +                profile_name = protocol_info.at(3).substr(start, 
> > length);
> > +            }
> > +
> > +            // Match our supported profiles to device profiles
> > +            for (dlna_profile_t profile : dlna_profile_list) {
> > +                if (protocol_info.at(2) == profile.mime
> > +                        && (profile_name == profile.name || 
> > profile_name == "*"))
> > +                {
> > +                    proto.profile = std::move(profile);
> > +                    supported_protocols.push_back(proto);
> > +                    // we do not break here to account for wildcards
> > +                    // as protocolInfo's fourth field aka 
> > <additionalInfo>
> > +                }
> > +            }
> > +        }
> > +    }
> > +
> > +    msg_Dbg( parent , "Got %zu supported profiles", 
> > supported_protocols.size() );
> > +    return supported_protocols;
> > +}
> > +
> > +int MediaRenderer::SetAVTransportURI(const char* uri, const 
> > protocol_info_t proto)
> > +{
> > +    static const char didl[] =
> > +        "<DIDL-Lite "
> > +        "xmlns:dc=\"http://purl.org/dc/elements/1.1/\" "
> > +        "xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" "
> > +        "xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\" "
> > +        "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
> > +        "<item id=\"f-0\" parentID=\"0\" restricted=\"0\">"
> > +        "<dc:title>%s</dc:title>"
> > +        "<upnp:class>%s</upnp:class>"
> > +        "<res protocolInfo=\"%s\">%s</res>"
> > +        "</item>"
> > +        "</DIDL-Lite>";
> > +
> > +    bool audio = proto.profile.media == DLNA_CLASS_AUDIO;
> > +    dlna_org_flags_t flags = DLNA_ORG_FLAG_STREAMING_TRANSFER_MODE |
> > +                             DLNA_ORG_FLAG_BACKGROUND_TRANSFERT_MODE |
> > +                             DLNA_ORG_FLAG_CONNECTION_STALL |
> > +                             DLNA_ORG_FLAG_DLNA_V15;
> > +    std::string dlna_protocol = 
> > dlna_write_protocol_info(proto.transport,
> > +                            proto.ci,
> > +                            DLNA_ORG_OPERATION_RANGE,
> > +                            flags,
> > +                            proto.profile
> > +                            );
> > +
> > +    char *meta_data;
> > +    if (asprintf(&meta_data, didl,
> > +                audio ? "Audio" : "Video",
> > +                audio ? "object.item.audioItem" : 
> > "object.item.videoItem",
> > +                dlna_protocol.c_str(),
> > +                uri) < 0) {
> > +        return VLC_ENOMEM;
> > +    }
> > +
> > +    msg_Dbg(parent, "didl: %s", meta_data);
> >      std::list<std::pair<const char*, const char*>> arg_list;
> >      arg_list.push_back(std::make_pair("InstanceID", "0"));
> >      arg_list.push_back(std::make_pair("CurrentURI", uri));
> > -    arg_list.push_back(std::make_pair("CurrentURIMetaData", "")); // 
> > NOT_IMPLEMENTED
> > +    arg_list.push_back(std::make_pair("CurrentURIMetaData", 
> > meta_data));
> >  
> >      IXML_Document *p_response = SendAction("SetAVTransportURI",
> >                                      AV_TRANSPORT_SERVICE_TYPE, arg_list);
> > +
> > +    free(meta_data);
> >      if(!p_response)
> >      {
> >          return VLC_EGENERIC;
> > @@ -855,6 +1056,8 @@ int OpenSout( vlc_object_t *p_this )
> >          goto error;
> >      }
> >  
> > +    p_sys->device_protocols = p_sys->renderer->GetProtocolInfo();
> > +
> >      p_stream->pf_add     = Add;
> >      p_stream->pf_del     = Del;
> >      p_stream->pf_send    = Send;
> > diff --git a/modules/stream_out/dlna/dlna.hpp b/modules/stream_out/dlna/dlna.hpp
> > index 59ff3d6c8d..7dcc2d7007 100644
> > --- a/modules/stream_out/dlna/dlna.hpp
> > +++ b/modules/stream_out/dlna/dlna.hpp
> > @@ -26,6 +26,31 @@
> >  
> >  #include "../../services_discovery/upnp-wrapper.hpp"
> >  #include "dlna_common.hpp"
> > +#include "profile_names.hpp"
> > +
> > +struct protocol_info_t {
> > +    dlna_transport_protocol_t transport = DLNA_TRANSPORT_PROTOCOL_HTTP;
> > +    dlna_org_conversion_t ci = DLNA_ORG_CONVERSION_NONE;
> > +    dlna_profile_t profile;
> > +};
> > +
> > +typedef std::unique_ptr<protocol_info_t> ProtocolPtr;
> > +inline ProtocolPtr make_protocol(protocol_info_t a)
> > +{
> > +    return std::make_unique<protocol_info_t>(a);
> > +}
> > +
> > +const protocol_info_t default_audio_protocol = {
> > +    DLNA_TRANSPORT_PROTOCOL_HTTP,
> > +    DLNA_ORG_CONVERSION_TRANSCODED,
> > +    default_audio_profile,
> > +};
> > +
> > +const protocol_info_t default_video_protocol = {
> > +    DLNA_TRANSPORT_PROTOCOL_HTTP,
> > +    DLNA_ORG_CONVERSION_TRANSCODED,
> > +    default_video_profile,
> > +};
> >  
> >  namespace DLNA
> >  {
> > @@ -53,7 +78,8 @@ public:
> >  
> >      int Play(const char *speed);
> >      int Stop();
> > -    int SetAVTransportURI(const char* uri);
> > +    std::vector<protocol_info_t> GetProtocolInfo();
> > +    int SetAVTransportURI(const char* uri, const protocol_info_t proto);
> >  };
> >  
> >  }
> > diff --git a/modules/stream_out/dlna/profile_names.hpp b/modules/
> > stream_out/dlna/profile_names.hpp
> > new file mode 100644
> > index 0000000000..3a00f7b41a
> > --- /dev/null
> > +++ b/modules/stream_out/dlna/profile_names.hpp
> > @@ -0,0 +1,833 @@
> > +/
> > *****************************************************************************
> > + * profile_names.hpp : DLNA media profile names
> > + 
> > *****************************************************************************
> > + * Copyright (C) 2004-2018 VLC authors and VideoLAN
> > + *
> > + * Authors: Shaleen Jain <shaleen at jain.sh>
> > + *
> > + * This program is free software; you can redistribute it and/or modify 
> > it
> > + * under the terms of the GNU Lesser General Public License as 
> > published by
> > + * the Free Software Foundation; either version 2.1 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public 
> > License
> > + * along with this program; if not, write to the Free Software 
> > Foundation,
> > + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> > + 
> > *****************************************************************************/
> > +
> > +#ifndef DLNA_PROFILES_H
> > +#define DLNA_PROFILES_H
> > +
> > +#include<string>
> > +#include<vlc_common.h>
> > +#include<vlc_fourcc.h>
> > +#include<vector>
> > +
> > +#define VLC_CODEC_NONE 0
> > +#define CODEC_PROFILE_NONE 0
> > +
> > +enum dlna_transport_protocol_t {
> > +  DLNA_TRANSPORT_PROTOCOL_UNKNOWN,
> > +  DLNA_TRANSPORT_PROTOCOL_HTTP,
> > +  DLNA_TRANSPORT_PROTOCOL_RTP,
> > +  DLNA_TRANSPORT_PROTOCOL_ANY
> > +};
> > +
> > +/**
> > + * DLNA.ORG_CI: conversion indicator parameter (integer)
> > + *     0 not transcoded
> > + *     1 transcoded
> > + */
> > +enum dlna_org_conversion_t {
> > +  DLNA_ORG_CONVERSION_NONE = 0,
> > +  DLNA_ORG_CONVERSION_TRANSCODED = 1,
> > +};
> > +
> > +/**
> > + * DLNA.ORG_OP: operations parameter (string)
> > + *     "00" (or "0") neither time seek range nor range supported
> > + *     "01" range supported
> > + *     "10" time seek range supported
> > + *     "11" both time seek range and range supported
> > + */
> > +enum dlna_org_operation_t {
> > +  DLNA_ORG_OPERATION_NONE                  = 0x00,
> > +  DLNA_ORG_OPERATION_RANGE                 = 0x01,
> > +  DLNA_ORG_OPERATION_TIMESEEK              = 0x10,
> > +};
> > +
> > +/**
> > + * DLNA.ORG_FLAGS, padded with 24 trailing 0s
> > + *     80000000  31  senderPaced
> > + *     40000000  30  lsopTimeBasedSeekSupported
> > + *     20000000  29  lsopByteBasedSeekSupported
> > + *     10000000  28  playcontainerSupported
> > + *      8000000  27  s0IncreasingSupported
> > + *      4000000  26  sNIncreasingSupported
> > + *      2000000  25  rtspPauseSupported
> > + *      1000000  24  streamingTransferModeSupported
> > + *       800000  23  interactiveTransferModeSupported
> > + *       400000  22  backgroundTransferModeSupported
> > + *       200000  21  connectionStallingSupported
> > + *       100000  20  dlnaVersion15Supported
> > + *
> > + *     Example: (1 << 24) | (1 << 22) | (1 << 21) | (1 << 20)
> > + *       DLNA.ORG_FLAGS=01700000[000000000000000000000000] // [] show 
> > padding
> > + */
> > +enum dlna_org_flags_t {
> > +  DLNA_ORG_FLAG_SENDER_PACED               = (1 << 31),
> > +  DLNA_ORG_FLAG_TIME_BASED_SEEK            = (1 << 30),
> > +  DLNA_ORG_FLAG_BYTE_BASED_SEEK            = (1 << 29),
> > +  DLNA_ORG_FLAG_PLAY_CONTAINER             = (1 << 28),
> > +  DLNA_ORG_FLAG_S0_INCREASE                = (1 << 27),
> > +  DLNA_ORG_FLAG_SN_INCREASE                = (1 << 26),
> > +  DLNA_ORG_FLAG_RTSP_PAUSE                 = (1 << 25),
> > +  DLNA_ORG_FLAG_STREAMING_TRANSFER_MODE    = (1 << 24),
> > +  DLNA_ORG_FLAG_INTERACTIVE_TRANSFERT_MODE = (1 << 23),
> > +  DLNA_ORG_FLAG_BACKGROUND_TRANSFERT_MODE  = (1 << 22),
> > +  DLNA_ORG_FLAG_CONNECTION_STALL           = (1 << 21),
> > +  DLNA_ORG_FLAG_DLNA_V15                   = (1 << 20),
> > +};
> > +
> > +inline dlna_org_flags_t operator|(dlna_org_flags_t a, dlna_org_flags_t 
> > b)
> > +{
> > +    return static_cast<dlna_org_flags_t>(static_cast<int>(a) | 
> > static_cast<int>(b));
> > +}
> > +
> > +enum dlna_media_class_t {
> > +  DLNA_CLASS_UNKNOWN,
> > +  DLNA_CLASS_IMAGE,
> > +  DLNA_CLASS_AUDIO,
> > +  DLNA_CLASS_AV,
> > +  DLNA_CLASS_COLLECTION
> > +};
> > +
> > +/**
> > + * DLNA profile.
> > + * This specifies the DLNA profile one file/stream is compatible with.
> > + */
> > +class dlna_profile_t {
> > +public:
> > +    std::string name;
> > +    std::string mux;
> > +    std::string mime;
> > +    dlna_media_class_t media;
> > +    vlc_fourcc_t video_codec;
> > +    vlc_fourcc_t audio_codec;
> > +
> > +    dlna_profile_t()
> > +        : name()
> > +        , mux()
> > +        , mime()
> > +        , video_codec(VLC_CODEC_UNKNOWN)
> > +        , audio_codec(VLC_CODEC_UNKNOWN)
> > +        {};
> > +
> > +    dlna_profile_t(std::string profile, std::string mux, std::string 
> > mime,
> > +            vlc_fourcc_t video, vlc_fourcc_t audio)
> > +        : name(profile)
> > +        , mux(mux)
> > +        , mime(mime)
> > +        , media(DLNA_CLASS_AV)
> > +        , video_codec(video)
> > +        , audio_codec(audio)
> > +        {};
> > +
> > +    dlna_profile_t(std::string profile, std::string mux, std::string 
> > mime,
> > +            dlna_media_class_t media, vlc_fourcc_t video, vlc_fourcc_t 
> > audio)
> > +        : name(profile)
> > +        , mux(mux)
> > +        , mime(mime)
> > +        , media(media)
> > +        , video_codec(video)
> > +        , audio_codec(audio)
> > +        {};
> > +};
> > +
> > +const dlna_profile_t default_audio_profile = {
> > +    "MP3",
> > +    "ts",
> > +    "audio/mpeg",
> > +    DLNA_CLASS_AUDIO,
> > +    VLC_CODEC_NONE,
> > +    VLC_CODEC_MPGA,
> > +};
> > +
> > +/**
> > + * AVC Main Profile SD video with MPEG-4 AAC audio, encapsulated in 
> > MP4.
> > + */
> > +const dlna_profile_t default_video_profile = {
> > +    "AVC_MP4_MP_SD",
> > +    "mp4stream",
> > +    "video/mp4",
> > +    DLNA_CLASS_AV,
> > +    VLC_CODEC_H264,
> > +    VLC_CODEC_MP4A,
> > +};
> > +
> > +std::vector<dlna_profile_t> dlna_profile_list = {
> > +
> > +    default_audio_profile,
> > +    default_video_profile,
> > +
> > +    //------ Audio Profiles ------//
> > +
> > +    {
> > +        "*",
> > +        "ogg",
> > +        "application/ogg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_VORBIS,
> > +    },
> > +    {
> > +        "*",
> > +        "ogg",
> > +        "application/ogg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_OPUS,
> > +    },
> > +    {
> > +        "*",
> > +        "ogg",
> > +        "audio/x-vorbis",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_VORBIS,
> > +    },
> > +    {
> > +        "*",
> > +        "ogg",
> > +        "audio/x-vorbis+ogg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_VORBIS,
> > +    },
> > +    {
> > +        "*",
> > +        "ogg",
> > +        "audio/ogg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_OPUS,
> > +    },
> > +    {
> > +        "*",
> > +        "ogg",
> > +        "audio/ogg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_VORBIS,
> > +    },
> > +    {
> > +        "MP3",
> > +        "ts",
> > +        "audio/mpeg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_MP3,
> > +    },
> > +    {
> > +        "MP3X",
> > +        "ts",
> > +        "audio/mpeg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_MPGA,
> > +    },
> > +    {
> > +        "MP3X",
> > +        "ts",
> > +        "audio/mpeg",
> > +        DLNA_CLASS_AUDIO,
> > +        VLC_CODEC_NONE,
> > +        VLC_CODEC_MP3,
> > +    },
> > +
> > +    //------ Video Profiles ------//
> > +
> > +    /**
> > +     * MPEG-2 HD/SD video wrapped in MPEG-2 transport stream as 
> > constrained by
> > +     * SCTE-43 standards, with AC-3 audio, without a timestamp field
> > +     */
> > +    {
> > +        "MPEG_TS_NA_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_MP2V,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * North America region profile for MPEG-2 HD
> > +     * 3Dframe-compatible video with AC-3 audio,
> > +     * utilizing a DLNA Transport Packet without a Timestamp field
> > +     */
> > +    {
> > +        "MPEG_TS_NA_3DFC_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_MP2V,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * MPEG-2 Video, wrapped in MPEG-2 transport stream, Main Profile,
> > +     * Standard Definition, with AC-3 audio, without a timestamp field.
> > +     */
> > +    {
> > +        "MPEG_TS_SD_EU_AC3_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_MP2V,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * MPEG-2 Video, wrapped in MPEG-2 transport stream, Main Profile
> > +     * Standard Definition, with AC-3 audio, with a valid non-zero 
> > timestamp
> > +     * field.
> > +     */
> > +    {
> > +        "MPEG_TS_SD_EU_AC3_T",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_MP2V,
> > +        VLC_CODEC_A52,

Question: do we have any A52 encoder ?


> > +    },
> > +    /**
> > +     * MPEG-2 Main Profile at Main, High-1 440 and High Level with 
> > MPEG-2 AAC
> > +     * encapsulated in MPEG-2 TS with valid timestamp
> > +     */
> > +    {
> > +        "MPEG_TS_JP_T",
> > +        "ts",
> > +        "video/vnd.dlna.mpeg-tts",
> > +        VLC_CODEC_MP2V,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * MPEG-2 Video, encapsulated in MPEG-2 transport stream, Main 
> > Profile
> > +     * at Main Level, with MPEG-1 L2 audio, with a valid non-zero 
> > timestamp
> > +     * field.
> > +     */
> > +    {
> > +        "MPEG_TS_SD_JP_MPEG1_L2_T",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_MP2V,
> > +        VLC_CODEC_MP2,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio, with a valid
> > +     * non-zero timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_T",
> > +        "ts",
> > +        "video/vnd.dlna.mpeg-tts",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio, with a valid
> > +     * non-zero timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_T",
> > +        "ts",
> > +        "video/vnd.dlna.mpeg-tts",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_EAC3,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio, with a valid
> > +     * non-zero timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_T",
> > +        "ts",
> > +        "video/vnd.dlna.mpeg-tts",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio, with a valid
> > +     * non-zero timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_T",
> > +        "ts",
> > +        "video/vnd.dlna.mpeg-tts",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP2,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio,
> > +     * without a timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio,
> > +     * without a timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_EAC3,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio,
> > +     * without a timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,

You also need a way to pass the AAC profile to the encoder (that will probably be the one from ffmpeg).

> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 transport stream, as
> > +     * constrained by SCTE standards,
> > +     * with AC-3, Enhanced AC-3, MPEG-4 HE-AAC
> > +     * v2 or MPEG-1 Layer II audio,
> > +     * without a timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP2,
> > +    },
> > +    /**
> > +     * AVC high profile, HD 3D frame-compatible video
> > +     * wrapped in MPEG-2 transport stream with AC-3,
> > +     * Enhanced AC-3 or HE AAC audio, without a Timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_3DFC_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC high profile, HD 3D frame-compatible video
> > +     * wrapped in MPEG-2 transport stream with AC-3,
> > +     * Enhanced AC-3 or HE AAC audio, without a Timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_3DFC_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_EAC3,
> > +    },
> > +    /**
> > +     * AVC high profile, HD 3D frame-compatible video
> > +     * wrapped in MPEG-2 transport stream with AC-3,
> > +     * Enhanced AC-3 or HE AAC audio, without a Timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_NA_3DFC_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 TS transport stream
> > +     * as constrained by DVB standards, with AC-3,
> > +     * Enhanced AC-3 and MPEG-4 HE-AAC v2 audio.
> > +     */
> > +    {
> > +        "AVC_TS_EU_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 TS transport stream
> > +     * as constrained by DVB standards, with AC-3,
> > +     * Enhanced AC-3 and MPEG-4 HE-AAC v2 audio.
> > +     */
> > +    {
> > +        "AVC_TS_EU_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_EAC3,
> > +    },
> > +    /**
> > +     * AVC video wrapped in MPEG-2 TS transport stream
> > +     * as constrained by DVB standards, with AC-3,
> > +     * Enhanced AC-3 and MPEG-4 HE-AAC v2 audio.
> > +     */
> > +    {
> > +        "AVC_TS_EU_ISO",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_EAC3,
> > +    },
> > +    /**
> > +     * European region profile for HD/SD resolution.
> > +     * AVC video using the Scalable High Profile (SVC)
> > +     * wrapped in MPEG-2 Transport Stream with AC-3 audio,
> > +     * with a valid non-zero timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_SHP_HD_EU_AC3_T",
> > +        "ts",
> > +        "video/vnd.dlna.mpeg-tts",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * European region profile for HD/SD resolution. AVC video using 
> > the
> > +     * Scalable High Profile (SVC) wrapped in MPEG-2 Transport Stream
> > +     * with MPEG-4 HE-AAC v2 Level 4 audio, with a valid non-zero 
> > timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_SHP_HD_EU_HEAACv2_L4_T",
> > +        "ts",
> > +        "video/vnd.dlna.mpeg-tts",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC HD/SD video with AC-3 audio including dual-mono channel 
> > mode, wrapped
> > +     * in MPEG-2 TS with valid timestamp for 24 Hz system.
> > +     */
> > +    {
> > +        "AVC_TS_HD_24_AC3_X_T",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC HD/SD video with AC-3 audio including dual-mono channel 
> > mode, wrapped
> > +     * in MPEG-2 TS with valid timestamp for 50 Hz system.
> > +     */
> > +    {
> > +        "AVC_TS_HD_50_AC3_X_T",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC HD/SD video with AC-3 audio including dual-mono channel 
> > mode,
> > +     * wrapped in MPEG-2 TS with valid timestamp for 60 Hz system.
> > +     */
> > +    {
> > +        "AVC_TS_HD_60_AC3_X_T",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC wrapped in MPEG-2 transport stream, Main/High profile, with
> > +     * MPEG-2 AAC audio, with a valid non-zero timestamp field.
> > +     */
> > +    {
> > +        "AVC_TS_JP_AAC_T",
> > +        "ts",
> > +        "video/mpeg",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC video with MPEG-4 HE-AAC v2
> > +     * and Enhanced AC-3 audio, encapsulated in MP4.
> > +     */
> > +    {
> > +        "AVC_MP4_EU",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC video with MPEG-4 HE-AAC v2
> > +     * and Enhanced AC-3 audio, encapsulated in MP4.
> > +     */
> > +    {
> > +        "AVC_MP4_EU",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_A52,
> > +    },
> > +    /**
> > +     * AVC wrapped in MP4 baseline profile CIF15 with AAC LC audio.
> > +     */
> > +    {
> > +        "AVC_MP4_BL_CIF15_AAC_520",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC wrapped in MP4 baseline profile CIF30 with AAC LC audio.
> > +     */
> > +    {
> > +        "AVC_MP4_BL_CIF30_AAC_940",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC Main Profile video with Enhanced AC-3 audio, encapsulated in 
> > MP4.
> > +     */
> > +    {
> > +        "AVC_MP4_MP_SD_EAC3",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_EAC3,
> > +    },
> > +    /**
> > +     * AVC High Profile HD video with MPEG-4 AAC audio, encapsulated in 
> > MP4.
> > +     */
> > +    {
> > +        "AVC_MP4_MP_SD",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC High Profile video with Enhanced AC-3 audio, encapsulated in 
> > MP4.
> > +     */
> > +    {
> > +        "AVC_MP4_HP_HD_EAC3",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_EAC3,
> > +    },
> > +    /**
> > +     * AVC high profile video with HE AAC v2 stereo or HE AAC 7.1-
> > channel audio,
> > +     * encapsulated in an MP4 file.
> > +     */
> > +    {
> > +        "AVC_MP4_HD_HEAACv2_L6",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC Main Profile video with MPEG-4 AAC audio, encapsulated in 
> > MKV.
> > +     */
> > +    {
> > +        "AVC_MKV_MP_HD_AAC_MULT5",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC Main Profile video with MPEG-4 HE-AAC audio, encapsulated in 
> > MKV.
> > +     */
> > +    {
> > +        "AVC_MKV_MP_HD_HEAAC_L4",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC Main Profile video with MP3 audio, encapsulated in MKV
> > +     */
> > +    {
> > +        "AVC_MKV_MP_HD_MPEG1_L3",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MPGA,
> > +    },
> > +    /**
> > +     * AVC Main Profile video with MP3 audio, encapsulated in MKV
> > +     */
> > +    {
> > +        "AVC_MKV_MP_HD_MPEG1_L3",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP3,
> > +    },
> > +    /**
> > +     * AVC High Profile video with MP3 audio, encapsulated in MKV
> > +     */
> > +    {
> > +        "AVC_MKV_HP_HD_MPEG1_L3",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MPGA,
> > +    },
> > +    /**
> > +     * AVC High Profile video with MP3 audio, encapsulated in MKV
> > +     */
> > +    {
> > +        "AVC_MKV_HP_HD_MPEG1_L3",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP3,
> > +    },
> > +    /**
> > +     * AVC High Profile video with MPEG-4 AAC audio, encapsulated in 
> > MKV.
> > +     */
> > +    {
> > +        "AVC_MKV_HP_HD_AAC_MULT5",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC High Profile video with MPEG-4 HE-AAC audio, encapsulated in 
> > MKV.
> > +     */
> > +    {
> > +        "AVC_MKV_HP_HD_HEAAC_L4",
> > +        "avformat{mux=matroska,options={live=1}}",
> > +        "video/x-matroska",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC SD video wrapped in MPEG-2 transport stream, as constrained 
> > by
> > +     * SCTE standards, with AAC audio and optional enhanced audio,
> > +     * without a timestamp field and constrained to an SD video profile
> > +     */
> > +    {
> > +        "DASH_AVC_TS_SD_ISO",
> > +        "ts",
> > +        "video/mp2t",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC HD video wrapped in MPEG-2 transport stream, as constrained 
> > by
> > +     * SCTE standards, with AAC audio and optional enhanced audio,
> > +     * without a timestamp field and constrained to an HD video profile
> > +     */
> > +    {
> > +        "DASH_AVC_TS_HD_ISO",
> > +        "ts",
> > +        "video/mp2t",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC Main Profile SD video with AAC audio and optional enhanced 
> > audio,
> > +     * encapsulated in MP4 conforming to the additional DECE CFF 
> > requirements
> > +     * including encryption and constrained to the DECE SD profile 
> > requirements.
> > +     */
> > +    {
> > +        "DASH_AVC_MP4_SD",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC Main Profile HD video with AAC audio and optional enhanced 
> > audio,
> > +     * encapsulated in MP4 conforming to the additional DECE CFF 
> > requirements
> > +     * including encryption and constrained to the DECE HD profile 
> > requirements.
> > +     */
> > +    {
> > +        "DASH_AVC_MP4_HD",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC Main Profile video with HE AACv2 L4 audio, encapsulated in 
> > MP4.
> > +     */
> > +    {
> > +        "DASH_AVC_MP4_SD_HEAACv2_L4",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC High Profile video with HE AACv2 L4 audio, encapsulated in 
> > MP4.
> > +     */
> > +    {
> > +        "DASH_AVC_MP4_HD_HEAACv2_L4",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * AVC high profile video with HE AAC v2 stereo or HE AAC 7.1-
> > channel audio,
> > +     * encapsulated in an MP4 file suitable for MPEG DASH conformant 
> > adaptive delivery
> > +     */
> > +    {
> > +        "DASH_AVC_MP4_HD_HEAACv2_L6",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_H264,
> > +        VLC_CODEC_MP4A,
> > +    },
> > +    /**
> > +     * HEVC High Profile HD and UHD video with AC-3,
> > +     * Enhanced AC-3, HE-AACv2 or MPEG-1 LII audio,
> > +     * encapsulated in MP4.
> > +     */
> > +    {
> > +        "DASH_HEVC_MP4_UHD_NA",
> > +        "mp4stream",
> > +        "video/mp4",
> > +        VLC_CODEC_HEVC,
> > +        VLC_CODEC_MP2,
> > +    },
> > +};
> > +
> > +#endif /* DLNA_PROFILES_H */
> > -- 
> > 2.19.1
> > 
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel



More information about the vlc-devel mailing list