public DemuxPacketData(DemuxPacket demuxPacket, bool isVideo)
 {
     byte[] buffer = new byte[demuxPacket.Size];
     Marshal.Copy(demuxPacket.Data, buffer, 0, buffer.Length);
     Buffer = buffer;
     Size   = buffer.Length;
     if (isVideo)
     {
         // Set video timestamps
         Start = demuxPacket.Dts.ToDS();
         Stop  = demuxPacket.Duration.ToDS();
     }
 }
        public override DemuxPacketWrapper Read()
        {
            lock (_syncObj)
            {
                IntPtr demuxPacketPtr = Functions.DemuxRead();
                // If there is no more data, DemuxRead returns 0
                if (demuxPacketPtr == IntPtr.Zero)
                {
                    return(new DemuxPacketWrapper()); // EOS indicator
                }
                DemuxPacket demuxPacket = Marshal.PtrToStructure <DemuxPacket>(demuxPacketPtr);

                if (demuxPacket.StreamId == Constants.DMX_SPECIALID_STREAMCHANGE || demuxPacket.StreamId == Constants.DMX_SPECIALID_STREAMINFO)
                {
                    UpdateStreams();
                }

                return(new DemuxPacketWrapper(demuxPacket, demuxPacketPtr));
            }
        }
 public override void Write(DemuxPacket packet)
 {
     throw new NotImplementedException();
 }
        //This is called by a separate thread repeatedly to fill each tracks packet cache
        public override HRESULT ProcessDemuxPackets()
        {
            // Avoid streaming downloads in pause mode
            if (PauseDemux)
            {
                return(S_OK);
            }

            using (var demuxPacketWrapper = _stream.Read())
            {
                // EOS
                if (demuxPacketWrapper.IsEOS)
                {
                    return(S_FALSE);
                }

                DemuxPacket demuxPacket = demuxPacketWrapper.DemuxPacket;

                // Stream changes
                if (demuxPacket.StreamId == Constants.DMX_SPECIALID_STREAMCHANGE ||
                    demuxPacket.StreamId == Constants.DMX_SPECIALID_STREAMINFO)
                {
                    var action = StreamChanged;
                    if (action != null)
                    {
                        action();
                    }
                }

                if (demuxPacket.Data == IntPtr.Zero)
                {
                    return(S_OK);
                }

                //Create the packet and add the data
                var        isVideo = demuxPacket.StreamId == _stream.VideoStream.StreamId;
                PacketData packet  = new DemuxPacketData(demuxPacket, isVideo);

                DemuxTrack track = m_Tracks.FirstOrDefault(t => t.Type == (isVideo ? DemuxTrack.TrackType.Video : DemuxTrack.TrackType.Audio));
                if (isVideo)
                {
                    _videoPackets++;
                }
                else
                {
                    _audioPackets++;
                }

                // Queue samples
                if (track != null)
                {
                    track.AddToCache(ref packet);
                }
            }

            // Check for decoding errors, commonly the audio part is working while video decoding might fail
            if (_audioPackets > 5 && _videoPackets == 0)
            {
                DecryptError = true;
                return(S_FALSE);
            }
            return(S_OK);
        }