private FrameData DeepClone(IntPtr data, int size)
 {
     FrameData clone = new FrameData();
     clone.Data = new IntPtr(MemoryHeap.Alloc(size));
     MemoryHeap.CopyMemory(clone.Data.ToPointer(), data.ToPointer(), size);
     clone.DataSize = size;
     return clone;
 }
 private FrameData DeepClone(FrameData frameData)
 {
     FrameData clone = DeepClone(frameData.Data, frameData.DataSize);
     clone.DTS = frameData.DTS;
     clone.PTS = frameData.PTS;
     return clone;
 }
 private FrameData DeepClone(byte[] buffer)
 {
     FrameData clone = new FrameData();
     clone.Data = new IntPtr(MemoryHeap.Alloc(buffer.Length));
     Marshal.Copy(buffer, 0, clone.Data, buffer.Length);
     clone.DataSize = buffer.Length;
     return clone;
 }
        public void AddFrame(FrameData frameData)
        {
            if (!m_initilaized)
            {
                throw new InvalidOperationException("The instance must be initialized first. Call Initialize method before adding frames");
            }

            if (frameData.Data == IntPtr.Zero)
            {
                throw new ArgumentNullException("frameData.Data");
            }

            if (frameData.DataSize == 0)
            {
                throw new ArgumentException("DataSize value must be greater than zero", "frameData.DataSize");
            }

            if (frameData.PTS < 0)
            {
                throw new ArgumentException("Pts value must be greater than zero", "frameData.PTS");
            }

            m_queue.Add(DeepClone(frameData));
        }
 public void AddFrame(int streamId, FrameData frame)
 {
     var clone = DeepClone(frame);
     _mStreamData[streamId].Queue.Add(clone);
 }
 private FrameData DeepClone(FrameData frameData)
 {
     var clone = DeepClone(frameData.Data, frameData.DataSize);
     clone.Dts = frameData.Dts;
     clone.Pts = frameData.Pts;
     return clone;
 }