private void DeliverSample(ComObject requestToken, IRtspSample packet) { using (var sample = MediaFactory.CreateSample()) { using (var buffer = MediaFactory.CreateMemoryBuffer(packet.Buffer.Length)) { int max, cur; var ptr = buffer.Lock(out max, out cur); Marshal.Copy(packet.Buffer, 0, ptr, packet.Buffer.Length); buffer.CurrentLength = packet.Buffer.Length; buffer.Unlock(); sample.AddBuffer(buffer); } sample.SampleTime = packet.SampleTime; if (requestToken.NativePointer != IntPtr.Zero) { sample.Set(SampleAttributeKeys.Token, requestToken); } if (packet.IsKeyFrame) { sample.Set(SampleAttributeKeys.CleanPoint, true); } if (packet.Discontinuity) { sample.Set(SampleAttributeKeys.Discontinuity, true); } if (Type == StreamType.Video) { sample.Set(NaluAttributeKeys.LengthInformation, packet.LengthInfo.Select(BitConverter.GetBytes).SelectMany(b => b).ToArray()); } //Trace.WriteLine($"RtspMediaStream<{Type}>::DeliverSample() SampleTime={packet.SampleTime / 10000}(ms) Length={packet.Buffer.Length}"); _eventGenerator.QueueEventParamUnk(MediaEventTypes.MediaSample, Guid.Empty, Result.Ok, sample); } requestToken.Dispose(); _debugSaveStream?.Write(packet.Buffer, 0, packet.Buffer.Length); }
private void HandlePacket(IRtspSample packet) { //if(!IsActive || !MediaSource.IsPlaying || packet == null) return; //Trace.WriteLine($"RtspMediaStream<{Type}>::HandlePacket(): Length={packet.Buffer.Length}"); try { if (!packet.IsKeyFrame && _sampleQueue.Count > MaxQueueLength) { // Sample queue is too long. Discard non-Key frame Debug.WriteLine($"RtspMediaStream<{Type}>::HandlePacket(): SampleQueue is too long. Discard non-Key frame."); return; } _sampleQueue.Enqueue(packet); if (!_requestQueue.IsEmpty) { DeliverSamples(); } _isSampleQueueEmpty.OnNext(_sampleQueue.IsEmpty); //if(Type == StreamType.Video) { // Debug.WriteLine($"RtspMediaStream<{Type}>::HandlePacket(): SampleQueue={_sampleQueue.Count} RequestQueue={_requestQueue.Count}"); //} } catch (Exception ex) { if (!MediaSource.IsShutdown) { _eventGenerator.QueueEventParamErr(ex.HResult); } Debug.WriteLine($"RtspMediaStream<{Type}>::HandlePacket(): Error={ex.Message}"); //throw; } }