예제 #1
0
 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);
 }
예제 #2
0
        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;
            }
        }