public override OutNetRtmfpStream SubScribeStream(Peer peer, uint id, string name, FlowWriter writer, double start, double length)
{
var session = writer.Band as Session;
var outNetRtmfpStream = new OutNetRtmfpStream(session, session.Application.StreamsManager, id, name) { Writer = writer, Unbuffered = start == -3000 };
outNetRtmfpStream.Init();
var inBoundStream = session.Application.StreamsManager.FindByTypeByName(StreamTypes.ST_IN_NET, name, true, false).Select(x => x.Value).OfType<IInStream>().FirstOrDefault();
switch ((int)start)
{
case -2000:
if (inBoundStream != null)
{
inBoundStream.Link(outNetRtmfpStream);
}
else
{
goto default;
}
break;
case -1000:
if (inBoundStream != null)
{
inBoundStream.Link(outNetRtmfpStream);
}
else
{
goto case -999;
}
break;
case -999:
if (ClientApplicationManager.ClusterApplication != null)
{
ClientApplicationManager.ClusterApplication.GetProtocolHandler<BaseClusterAppProtocolHandler>().PlayStream(session.Application.Id, name);
}
break;
default:
var metadata = session.Application.StreamsManager.GetMetaData(name, true, session.Application.Configuration);
var pRtmpInFileStream = InFileRTMPStream.GetInstance(session, session.Application.StreamsManager, metadata);
if (pRtmpInFileStream == null)
{
WARN("Unable to get file stream. Metadata:\n{0}", metadata.ToString());
goto case -999;
}
if (!pRtmpInFileStream.Initialize(metadata[Defines.CONF_APPLICATION_CLIENTSIDEBUFFER]))
{
WARN("Unable to initialize file inbound stream");
pRtmpInFileStream.Dispose();
goto case -999;
}
if (!pRtmpInFileStream.Link(outNetRtmfpStream))
{
goto case -999;
}
if (!pRtmpInFileStream.Play(start, length))
{
FATAL("Unable to start the playback");
goto case -999;
}
break;
}
return outNetRtmfpStream;
}