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); }