public bool Initialize()
{
if (_rtsp.Application == null)
{
FATAL("RTSP protocol not yet assigned to an application");
return false;
}
//2. Compute the bandwidthHint
uint bandwidth = 0;
if (_videoTrack != null)
{
bandwidth += _videoTrack["bandwidth"];
}
if (_audioTrack != null)
{
bandwidth += _audioTrack["bandwidth"];
}
if (bandwidth == 0)
{
bandwidth = _bandwidthHint;
}
if (_streamName == "") _streamName = $"rtsp_{_rtsp.Id}";
if (!_rtsp.Application.StreamNameAvailable(_streamName, _rtsp))
{
FATAL("Stream name {0} already taken", _streamName);
return false;
}
var streamCapabilities = new StreamCapabilities {BandwidthHint = bandwidth };
if (_videoTrack != null)
{
streamCapabilities.VideoCodecId = VideoCodec.H264;
streamCapabilities.InitVideoH264(Utils.DecodeFromBase64(_videoTrack["h264SPS"]), Utils.DecodeFromBase64(_videoTrack["h264PPS"]));
}
if (_audioTrack != null)
{
streamCapabilities.AudioCodecId = (AudioCodec) (byte) _audioTrack["codec"];
switch (streamCapabilities.AudioCodecId)
{
case AudioCodec.Aac:
var aac = Utils.DecodeFromHex(_audioTrack["codecSetup"]);
streamCapabilities.InitAudioAAC(new MemoryStream(aac), aac.Length);
streamCapabilities.Samplerate = streamCapabilities.Aac._sampleRate;
break;
default:
streamCapabilities.Samplerate = _audioTrack["rate"];
break;
}
}
_inStream = new InNetRTPStream(_rtsp, _rtsp.Application.StreamsManager,_streamName, streamCapabilities, _rtcpDetectionInterval);
var session = _rtsp.CustomParameters;
if (session["customParameters", "externalStreamConfig", "width"] != null &&
session["customParameters", "externalStreamConfig", "height"] != null)
{
StreamCapabilities cap = _inStream.Capabilities;
if(cap.VideoCodecId == VideoCodec.H264)
{
cap.Avc._widthOverride = session["customParameters", "externalStreamConfig", "width"];
cap.Avc._heightOverride = session["customParameters", "externalStreamConfig", "height"];
}
}
if (_rtpVideo != null)
{
_rtpVideo.SetStream(_inStream, false);
_rtpVideo.InboundConnectivity = this;
_rtcpVideo.SetInbboundConnectivity(this,false);
}
if (_rtpAudio != null)
{
_rtpAudio.SetStream(_inStream,true);
_rtpAudio.InboundConnectivity = this;
_rtcpAudio.SetInbboundConnectivity(this,true);
}
//7. Pickup all outbound waiting streams
var subscribedOutStreams =
_rtsp.Application.StreamsManager.GetWaitingSubscribers(
_streamName, _inStream.Type);
//FINEST("subscribedOutStreams count: %"PRIz"u", subscribedOutStreams.size());
//8. Bind the waiting subscribers
foreach (var subscribedOutStream in subscribedOutStreams)
{
subscribedOutStream.Link(_inStream);
}
return true;
}