[vlc-devel] [PATCH 03/33] chromecast: move the message sending in a separate class
Hugo Beauzée-Luyssen
hugo at beauzee.fr
Wed Dec 23 16:25:22 CET 2015
On 12/23/2015 12:58 PM, Steve Lhomme wrote:
> --
> this class will handle all the Chromecast lifecycle in the future
> ---
> modules/stream_out/Makefile.am | 1 +
> modules/stream_out/chromecast/cast.cpp | 222 +++-------------------
> modules/stream_out/chromecast/chromecast.h | 24 +++
> modules/stream_out/chromecast/chromecast_ctrl.cpp | 185 ++++++++++++++++++
> 4 files changed, 241 insertions(+), 191 deletions(-)
> create mode 100644 modules/stream_out/chromecast/chromecast_ctrl.cpp
>
> diff --git a/modules/stream_out/Makefile.am b/modules/stream_out/Makefile.am
> index ee3ed3c..3661be6 100644
> --- a/modules/stream_out/Makefile.am
> +++ b/modules/stream_out/Makefile.am
> @@ -81,6 +81,7 @@ SUFFIXES += .proto .pb.cc
> $(PROTOC) --cpp_out=. -I$(srcdir) $<
>
> libstream_out_chromecast_plugin_la_SOURCES = stream_out/chromecast/cast_channel.proto stream_out/chromecast/cast.cpp \
> + stream_out/chromecast/chromecast_ctrl.cpp \
> misc/webservices/json.h misc/webservices/json.c
> nodist_libstream_out_chromecast_plugin_la_SOURCES = stream_out/chromecast/cast_channel.pb.cc
> libstream_out_chromecast_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -Istream_out/chromecast $(CHROMECAST_CFLAGS)
> diff --git a/modules/stream_out/chromecast/cast.cpp b/modules/stream_out/chromecast/cast.cpp
> index 3879091..52b0325 100644
> --- a/modules/stream_out/chromecast/cast.cpp
> +++ b/modules/stream_out/chromecast/cast.cpp
> @@ -42,9 +42,6 @@
>
> #include <cerrno>
>
> -#include <sstream>
> -#include <queue>
> -
> #include <google/protobuf/io/zero_copy_stream_impl.h>
> #include <google/protobuf/io/coded_stream.h>
>
> @@ -55,30 +52,25 @@
>
> struct sout_stream_sys_t
> {
> - sout_stream_sys_t()
> - : p_tls(NULL), i_requestId(0),
> + sout_stream_sys_t(intf_sys_t *intf)
> + : p_tls(NULL),
> i_status(CHROMECAST_DISCONNECTED), p_out(NULL)
> + ,p_intf(intf)
> {
> }
>
> - std::string serverIP;
> -
> int i_sock_fd;
> vlc_tls_creds_t *p_creds;
> vlc_tls_t *p_tls;
>
> vlc_thread_t chromecastThread;
>
> - unsigned i_requestId;
> - std::string appTransportId;
> -
> - std::queue<castchannel::CastMessage> messagesToSend;
> -
> int i_status;
> vlc_mutex_t lock;
> vlc_cond_t loadCommandCond;
>
> sout_stream_t *p_out;
> + intf_sys_t * const p_intf;
> };
>
> // Media player Chromecast app id
> @@ -106,15 +98,6 @@ static int connectChromecast(sout_stream_t *p_stream, char *psz_ipChromecast);
> static void disconnectChromecast(sout_stream_t *p_stream);
> static int sendMessages(sout_stream_t *p_stream);
>
> -static void msgAuth(sout_stream_t *p_stream);
> -static void msgPing(sout_stream_t *p_stream);
> -static void msgPong(sout_stream_t *p_stream);
> -static void msgConnect(sout_stream_t *p_stream, std::string destinationId);
> -static void msgClose(sout_stream_t *p_stream, std::string destinationId);
> -static void msgLaunch(sout_stream_t *p_stream);
> -static void msgLoad(sout_stream_t *p_stream);
> -static void msgStatus(sout_stream_t *p_stream);
> -
> static void *chromecastThread(void *data);
>
> static const char *const ppsz_sout_options[] = {
> @@ -201,9 +184,15 @@ static int Open(vlc_object_t *p_this)
> {
> sout_stream_t *p_stream = reinterpret_cast<sout_stream_t*>(p_this);
> sout_stream_sys_t *p_sys;
> - p_sys = new(std::nothrow) sout_stream_sys_t;
> + intf_sys_t *p_intf = new(std::nothrow) intf_sys_t(p_stream);
> + if (p_intf == NULL)
> + return VLC_ENOMEM;
> + p_sys = new(std::nothrow) sout_stream_sys_t(p_intf);
> if (p_sys == NULL)
> + {
> + delete p_intf;
> return VLC_ENOMEM;
> + }
> p_stream->p_sys = p_sys;
>
> config_ChainParse(p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg);
> @@ -233,7 +222,7 @@ static int Open(vlc_object_t *p_this)
> Clean(p_stream);
> return VLC_EGENERIC;
> }
> - p_sys->serverIP = psz_localIP;
> + p_intf->serverIP = psz_localIP;
Couldn't you pass it to the constructor? It would allow the field to be
const & private
>
> char *psz_mux = var_GetNonEmptyString(p_stream, SOUT_CFG_PREFIX "mux");
> if (psz_mux == NULL)
> @@ -325,10 +314,10 @@ static void Close(vlc_object_t *p_this)
> case CHROMECAST_MEDIA_LOAD_SENT:
> case CHROMECAST_APP_STARTED:
> // Generate the close messages.
> - msgClose(p_stream, p_sys->appTransportId);
> + p_sys->p_intf->msgClose(p_sys->p_intf->appTransportId);
> // ft
> case CHROMECAST_AUTHENTICATED:
> - msgClose(p_stream, "receiver-0");
> + p_sys->p_intf->msgClose("receiver-0");
> // Send the just added close messages.
> sendMessages(p_stream);
> // ft
> @@ -447,13 +436,13 @@ static int sendMessages(sout_stream_t *p_stream)
> sout_stream_sys_t *p_sys = p_stream->p_sys;
>
> int i_ret = 0;
> - while (!p_sys->messagesToSend.empty())
> + while (!p_sys->p_intf->messagesToSend.empty())
> {
> - unsigned i_retSend = sendMessage(p_stream, p_sys->messagesToSend.front());
> + unsigned i_retSend = sendMessage(p_stream, p_sys->p_intf->messagesToSend.front());
> if (i_retSend <= 0)
> return i_retSend;
>
> - p_sys->messagesToSend.pop();
> + p_sys->p_intf->messagesToSend.pop();
> i_ret += i_retSend;
> }
>
> @@ -607,8 +596,8 @@ static int processMessage(sout_stream_t *p_stream, const castchannel::CastMessag
> {
> vlc_mutex_locker locker(&p_sys->lock);
> p_sys->i_status = CHROMECAST_AUTHENTICATED;
> - msgConnect(p_stream, "receiver-0");
> - msgLaunch(p_stream);
> + p_sys->p_intf->msgConnect("receiver-0");
> + p_sys->p_intf->msgLaunch();
> }
> }
> else if (namespace_ == "urn:x-cast:com.google.cast.tp.heartbeat")
> @@ -619,7 +608,7 @@ static int processMessage(sout_stream_t *p_stream, const castchannel::CastMessag
> if (type == "PING")
> {
> msg_Dbg(p_stream, "PING received from the Chromecast");
> - msgPong(p_stream);
> + p_sys->p_intf->msgPong();
> }
> else if (type == "PONG")
> {
> @@ -649,8 +638,8 @@ static int processMessage(sout_stream_t *p_stream, const castchannel::CastMessag
> {
> p_app = &applications[i];
> vlc_mutex_lock(&p_sys->lock);
> - if (p_sys->appTransportId.empty())
> - p_sys->appTransportId = std::string(applications[i]["transportId"]);
> + if (p_sys->p_intf->appTransportId.empty())
> + p_sys->p_intf->appTransportId = std::string(applications[i]["transportId"]);
> vlc_mutex_unlock(&p_sys->lock);
> break;
> }
> @@ -659,12 +648,12 @@ static int processMessage(sout_stream_t *p_stream, const castchannel::CastMessag
> vlc_mutex_lock(&p_sys->lock);
> if ( p_app )
> {
> - if (!p_sys->appTransportId.empty()
> + if (!p_sys->p_intf->appTransportId.empty()
> && p_sys->i_status == CHROMECAST_AUTHENTICATED)
> {
> p_sys->i_status = CHROMECAST_APP_STARTED;
> - msgConnect(p_stream, p_sys->appTransportId);
> - msgLoad(p_stream);
> + p_sys->p_intf->msgConnect(p_sys->p_intf->appTransportId);
> + p_sys->p_intf->msgLoad();
> p_sys->i_status = CHROMECAST_MEDIA_LOAD_SENT;
> vlc_cond_signal(&p_sys->loadCommandCond);
> }
> @@ -677,7 +666,7 @@ static int processMessage(sout_stream_t *p_stream, const castchannel::CastMessag
> case CHROMECAST_APP_STARTED:
> case CHROMECAST_MEDIA_LOAD_SENT:
> msg_Warn(p_stream, "app is no longer present. closing");
> - msgClose(p_stream, p_sys->appTransportId);
> + p_sys->p_intf->msgClose(p_sys->p_intf->appTransportId);
> p_sys->i_status = CHROMECAST_CONNECTION_DEAD;
> // ft
> default:
> @@ -710,7 +699,7 @@ static int processMessage(sout_stream_t *p_stream, const castchannel::CastMessag
> else if (type == "LOAD_FAILED")
> {
> msg_Err(p_stream, "Media load failed");
> - msgClose(p_stream, p_sys->appTransportId);
> + p_sys->p_intf->msgClose(p_sys->p_intf->appTransportId);
> vlc_mutex_lock(&p_sys->lock);
> p_sys->i_status = CHROMECAST_CONNECTION_DEAD;
> vlc_mutex_unlock(&p_sys->lock);
> @@ -754,155 +743,6 @@ static int processMessage(sout_stream_t *p_stream, const castchannel::CastMessag
> }
>
>
> -/**
> - * @brief Build a CastMessage to send to the Chromecast
> - * @param namespace_ the message namespace
> - * @param payloadType the payload type (CastMessage_PayloadType_STRING or
> - * CastMessage_PayloadType_BINARY
> - * @param payload the payload
> - * @param destinationId the destination idenifier
> - * @return the generated CastMessage
> - */
> -static castchannel::CastMessage buildMessage(std::string namespace_,
> - castchannel::CastMessage_PayloadType payloadType,
> - std::string payload, std::string destinationId = "receiver-0")
> -{
> - castchannel::CastMessage msg;
> -
> - msg.set_protocol_version(castchannel::CastMessage_ProtocolVersion_CASTV2_1_0);
> - msg.set_namespace_(namespace_);
> - msg.set_payload_type(payloadType);
> - msg.set_source_id("sender-vlc");
> - msg.set_destination_id(destinationId);
> - if (payloadType == castchannel::CastMessage_PayloadType_STRING)
> - msg.set_payload_utf8(payload);
> - else // CastMessage_PayloadType_BINARY
> - msg.set_payload_binary(payload);
> -
> - return msg;
> -}
> -
> -
> -/*****************************************************************************
> - * Message preparation
> - *****************************************************************************/
> -static void msgAuth(sout_stream_t *p_stream)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - castchannel::DeviceAuthMessage authMessage;
> - authMessage.mutable_challenge();
> - std::string authMessageString;
> - authMessage.SerializeToString(&authMessageString);
> -
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.deviceauth",
> - castchannel::CastMessage_PayloadType_BINARY, authMessageString);
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
> -
> -static void msgPing(sout_stream_t *p_stream)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - std::string s("{\"type\":\"PING\"}");
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
> - castchannel::CastMessage_PayloadType_STRING, s);
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
> -
> -static void msgPong(sout_stream_t *p_stream)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - std::string s("{\"type\":\"PONG\"}");
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
> - castchannel::CastMessage_PayloadType_STRING, s);
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
> -
> -static void msgConnect(sout_stream_t *p_stream, std::string destinationId)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - std::string s("{\"type\":\"CONNECT\"}");
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.connection",
> - castchannel::CastMessage_PayloadType_STRING, s, destinationId);
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
> -
> -static void msgClose(sout_stream_t *p_stream, std::string destinationId)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - std::string s("{\"type\":\"CLOSE\"}");
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.connection",
> - castchannel::CastMessage_PayloadType_STRING, s, destinationId);
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
> -static void msgStatus(sout_stream_t *p_stream)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - std::stringstream ss;
> - ss << "{\"type\":\"GET_STATUS\"}";
> -
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.receiver",
> - castchannel::CastMessage_PayloadType_STRING, ss.str());
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
> -static void msgLaunch(sout_stream_t *p_stream)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - std::stringstream ss;
> - ss << "{\"type\":\"LAUNCH\","
> - << "\"appId\":\"" << APP_ID << "\","
> - << "\"requestId\":" << p_stream->p_sys->i_requestId++ << "}";
Nitpicking (and not related to your patch at all) but I'd find it more
readable to have the requestId modification out of the payload construction.
> -
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.receiver",
> - castchannel::CastMessage_PayloadType_STRING, ss.str());
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
> -
> -static void msgLoad(sout_stream_t *p_stream)
> -{
> - sout_stream_sys_t *p_sys = p_stream->p_sys;
> -
> - char *psz_mime = var_GetNonEmptyString(p_stream, SOUT_CFG_PREFIX "mime");
> - if (psz_mime == NULL)
> - return;
> -
> - std::stringstream ss;
> - ss << "{\"type\":\"LOAD\","
> - << "\"media\":{\"contentId\":\"http://" << p_sys->serverIP << ":"
> - << var_InheritInteger(p_stream, SOUT_CFG_PREFIX"http-port")
> - << "/stream\","
> - << "\"streamType\":\"LIVE\","
> - << "\"contentType\":\"" << std::string(psz_mime) << "\"},"
> - << "\"requestId\":" << p_stream->p_sys->i_requestId++ << "}";
> -
> - free(psz_mime);
> -
> - castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.media",
> - castchannel::CastMessage_PayloadType_STRING, ss.str(), p_sys->appTransportId);
> -
> - p_sys->messagesToSend.push(msg);
> -}
> -
>
> /*****************************************************************************
> * Chromecast thread
> @@ -921,7 +761,7 @@ static void* chromecastThread(void* p_data)
> int i_waitdelay = PING_WAIT_TIME;
> int i_retries = PING_WAIT_RETRIES;
>
> - msgAuth(p_stream);
> + p_sys->p_intf->msgAuth();
> sendMessages(p_stream);
> vlc_restorecancel(canc);
>
> @@ -950,8 +790,8 @@ static void* chromecastThread(void* p_data)
>
> if (b_pingTimeout)
> {
> - msgPing(p_stream);
> - msgStatus(p_stream);
> + p_sys->p_intf->msgPing();
> + p_sys->p_intf->msgStatus();
> }
>
> if (b_msgReceived)
> @@ -962,7 +802,7 @@ static void* chromecastThread(void* p_data)
> }
>
> // Send the answer messages if there is any.
> - if (!p_sys->messagesToSend.empty())
> + if (!p_sys->p_intf->messagesToSend.empty())
> {
> i_ret = sendMessages(p_stream);
> #if defined(_WIN32)
> diff --git a/modules/stream_out/chromecast/chromecast.h b/modules/stream_out/chromecast/chromecast.h
> index f1d0a66..aaf8497 100644
> --- a/modules/stream_out/chromecast/chromecast.h
> +++ b/modules/stream_out/chromecast/chromecast.h
> @@ -32,6 +32,8 @@
> #include <vlc_common.h>
> #include <vlc_plugin.h>
>
> +#include <queue>
> +
> #include "cast_channel.pb.h"
>
> // Status
> @@ -45,4 +47,26 @@ enum
> CHROMECAST_CONNECTION_DEAD,
> };
>
> +struct intf_sys_t
I'm not sure _sys_t is the best name for a class with logic.
Also, I'd try to make more fields private to clarify the expected usage
> +{
> + intf_sys_t(sout_stream_t * const p_stream);
> + ~intf_sys_t();
> +
> + sout_stream_t * const p_stream;
> + std::string serverIP;
> + std::string appTransportId;
> +
> + void msgAuth();
> + void msgClose(std::string destinationId);
> + void msgPing();
> + void msgPong();
> + void msgConnect(std::string destinationId);
> + void msgLaunch();
> + void msgLoad();
> + void msgStatus();
> +
> + std::queue<castchannel::CastMessage> messagesToSend;
> + unsigned i_requestId;
> +};
> +
> #endif /* VLC_CHROMECAST_H */
> diff --git a/modules/stream_out/chromecast/chromecast_ctrl.cpp b/modules/stream_out/chromecast/chromecast_ctrl.cpp
> new file mode 100644
> index 0000000..5c7e3d9
> --- /dev/null
> +++ b/modules/stream_out/chromecast/chromecast_ctrl.cpp
> @@ -0,0 +1,185 @@
> +/*****************************************************************************
> + * chromecast_ctrl.cpp: Chromecast module for vlc
> + *****************************************************************************
> + * Copyright © 2014-2015 VideoLAN
> + *
> + * Authors: Adrien Maglo <magsoft at videolan.org>
> + * Jean-Baptiste Kempf <jb at videolan.org>
> + * Steve Lhomme <robux4 at videolabs.io>
> + *
> + * 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.
> + *****************************************************************************/
> +
> +/*****************************************************************************
> + * Preamble
> + *****************************************************************************/
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include "chromecast.h"
> +
> +#include <vlc_sout.h>
> +
> +#include <sstream>
> +
> +// Media player Chromecast app id
> +#define APP_ID "CC1AD845" // Default media player
> +
> +#define SOUT_CFG_PREFIX "sout-chromecast-"
> +
> +/**
> + * @brief Build a CastMessage to send to the Chromecast
> + * @param namespace_ the message namespace
> + * @param payloadType the payload type (CastMessage_PayloadType_STRING or
> + * CastMessage_PayloadType_BINARY
> + * @param payload the payload
> + * @param destinationId the destination idenifier
> + * @return the generated CastMessage
> + */
> +static castchannel::CastMessage buildMessage(std::string namespace_,
> + castchannel::CastMessage_PayloadType payloadType,
> + std::string payload, std::string destinationId = "receiver-0")
> +{
> + castchannel::CastMessage msg;
> +
> + msg.set_protocol_version(castchannel::CastMessage_ProtocolVersion_CASTV2_1_0);
> + msg.set_namespace_(namespace_);
> + msg.set_payload_type(payloadType);
> + msg.set_source_id("sender-vlc");
> + msg.set_destination_id(destinationId);
> + if (payloadType == castchannel::CastMessage_PayloadType_STRING)
> + msg.set_payload_utf8(payload);
> + else // CastMessage_PayloadType_BINARY
> + msg.set_payload_binary(payload);
> +
> + return msg;
> +}
> +
> +intf_sys_t::intf_sys_t(sout_stream_t * const p_this)
> + :p_stream(p_this)
> + ,i_requestId(0)
> +{
> +}
> +
> +intf_sys_t::~intf_sys_t()
> +{
> +}
You could omit the destructor if it's empty
> +
> +/*****************************************************************************
> + * Message preparation
> + *****************************************************************************/
> +void intf_sys_t::msgAuth()
> +{
> + castchannel::DeviceAuthMessage authMessage;
> + authMessage.mutable_challenge();
> + std::string authMessageString;
> + authMessage.SerializeToString(&authMessageString);
> +
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.deviceauth",
> + castchannel::CastMessage_PayloadType_BINARY, authMessageString);
> +
> + messagesToSend.push(msg);
> +}
> +
> +
> +void intf_sys_t::msgPing()
> +{
> + std::string s("{\"type\":\"PING\"}");
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
> + castchannel::CastMessage_PayloadType_STRING, s);
> +
> + messagesToSend.push(msg);
> +}
> +
> +
> +void intf_sys_t::msgPong()
> +{
> + std::string s("{\"type\":\"PONG\"}");
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.heartbeat",
> + castchannel::CastMessage_PayloadType_STRING, s);
> +
> + messagesToSend.push(msg);
> +}
> +
> +
> +void intf_sys_t::msgConnect(std::string destinationId)
> +{
> + std::string s("{\"type\":\"CONNECT\"}");
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.connection",
> + castchannel::CastMessage_PayloadType_STRING, s, destinationId);
> +
> + messagesToSend.push(msg);
> +}
> +
> +
> +void intf_sys_t::msgClose(std::string destinationId)
> +{
> + std::string s("{\"type\":\"CLOSE\"}");
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.tp.connection",
> + castchannel::CastMessage_PayloadType_STRING, s, destinationId);
> +
> + messagesToSend.push(msg);
> +}
> +
> +void intf_sys_t::msgStatus()
> +{
> + std::stringstream ss;
> + ss << "{\"type\":\"GET_STATUS\"}";
> +
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.receiver",
> + castchannel::CastMessage_PayloadType_STRING, ss.str());
> +
> + messagesToSend.push(msg);
> +}
> +
> +void intf_sys_t::msgLaunch()
> +{
> + std::stringstream ss;
> + ss << "{\"type\":\"LAUNCH\","
> + << "\"appId\":\"" << APP_ID << "\","
> + << "\"requestId\":" << i_requestId++ << "}";
> +
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.receiver",
> + castchannel::CastMessage_PayloadType_STRING, ss.str());
> +
> + messagesToSend.push(msg);
> +}
> +
> +
> +void intf_sys_t::msgLoad()
> +{
> + char *psz_mime = var_GetNonEmptyString(p_stream, SOUT_CFG_PREFIX "mime");
> + if (psz_mime == NULL)
> + return;
> +
> + std::stringstream ss;
> + ss << "{\"type\":\"LOAD\","
> + << "\"media\":{\"contentId\":\"http://" << serverIP << ":"
> + << var_InheritInteger(p_stream, SOUT_CFG_PREFIX"http-port")
> + << "/stream\","
> + << "\"streamType\":\"LIVE\","
> + << "\"contentType\":\"" << std::string(psz_mime) << "\"},"
> + << "\"requestId\":" << i_requestId++ << "}";
> +
> + free(psz_mime);
> +
> + castchannel::CastMessage msg = buildMessage("urn:x-cast:com.google.cast.media",
> + castchannel::CastMessage_PayloadType_STRING, ss.str(), appTransportId);
> +
> + messagesToSend.push(msg);
> +}
> +
>
Regards,
More information about the vlc-devel
mailing list