public RtspMediaSource() { _eventGenerator = new MediaEventGeneratorImpl(); _stateSubject = new BehaviorSubject <SourceState>(SourceState.Closed); _streams = new RtspMediaStream[0]; _presentationDescriptor = null; _isSampleQueueEmptySubscription = null; _bufferingStateLock = new SpinLock(); _bufferingStartedSent = false; }
public RtspMediaStream(RtspMediaSource source, StreamType type, RtspMediaSource.StreamConfig config) { _eventGenerator = new MediaEventGeneratorImpl(); _queueConsumerLock = new SpinLock(); _sampleQueue = new ConcurrentQueue <IRtspSample>(); _requestQueue = new ConcurrentQueue <ComObject>(); _isSampleQueueEmpty = new BehaviorSubject <bool>(false); MediaSource = source; Type = type; _config = config; Descriptor = (type == StreamType.Video) ? CreateVideoStreamDescriptor((int)type) : CreateAudioStreamDescriptor((int)type); IsActive = false; // Subscribe packet arrival _packetSubscription = _config.SourceStream.ObserveOn(ThreadPoolScheduler.Instance).Subscribe(HandlePacket); // Subscribe state change _stateSubscription = source.StateChanged.Subscribe(HandleStateChange); if (!string.IsNullOrEmpty(_config.DebugSaveFilename)) { _debugSaveStream = new FileStream(_config.DebugSaveFilename, FileMode.Create); } }