/// <returns>Ticks, NO BYTES!</returns> private long WriteBlock(byte[] buffer, int offset, int count, int streamIndex, long positionInTicks, int sourceBytesPerSecond) { int bytesToWrite = count; using (MFMediaBuffer mfBuffer = new MFMediaBuffer(MediaFoundationCore.CreateMemoryBuffer(bytesToWrite))) { using (MFSample sample = new MFSample(MediaFoundationCore.CreateEmptySample())) { sample.AddBuffer(mfBuffer); int currentLength, maxLength; IntPtr bufferPtr = mfBuffer.Lock(out maxLength, out currentLength); long ticks = BytesToNanoSeconds(count, sourceBytesPerSecond); Marshal.Copy(buffer, offset, bufferPtr, count); mfBuffer.SetCurrentLength(count); mfBuffer.Unlock(); sample.SetSampleTime(positionInTicks); sample.SetSampleDuration(ticks); _sinkWriter.WriteSample(_streamIndex, sample); return(ticks); } } }
public int Read(byte[] buffer, int offset, int count) { if (buffer == null) { throw new ArgumentNullException("buffer"); } if (buffer.Length < count) { throw new ArgumentException("Length is too small.", "buffer"); } lock (_lockObj) { int read = 0; if (_reader == null || _disposed) { return(read); } if (_decoderBufferCount > 0) { read += CopyDecoderBuffer(buffer, offset + read, count - read); } while (read < count) { MFSourceReaderFlag flags; long timestamp; int actualStreamIndex; using (var sample = _reader.ReadSample(MFInterops.MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, out actualStreamIndex, out flags, out timestamp)) { if (flags != MFSourceReaderFlag.None) { break; } using (MFMediaBuffer mediaBuffer = sample.ConvertToContinousBuffer()) { int maxlength, currentlength; IntPtr pdata = mediaBuffer.Lock(out maxlength, out currentlength); _decoderBuffer = _decoderBuffer.CheckBuffer(currentlength); Marshal.Copy(pdata, _decoderBuffer, 0, currentlength); _decoderBufferCount = currentlength; _decoderBufferOffset = 0; int tmp = CopyDecoderBuffer(buffer, offset + read, count - read); read += tmp; mediaBuffer.Unlock(); } } } _position += read; return(read); } }
/// <returns>Ticks, NO BYTES!</returns> private long WriteBlock(byte[] buffer, int offset, int count, int streamIndex, long positionInTicks, int sourceBytesPerSecond) { int bytesToWrite = count; using (MFMediaBuffer mfBuffer = new MFMediaBuffer(MediaFoundationCore.CreateMemoryBuffer(bytesToWrite))) { using (MFSample sample = new MFSample(MediaFoundationCore.CreateEmptySample())) { sample.AddBuffer(mfBuffer); int currentLength, maxLength; IntPtr bufferPtr = mfBuffer.Lock(out maxLength, out currentLength); long ticks = BytesToNanoSeconds(count, sourceBytesPerSecond); Marshal.Copy(buffer, offset, bufferPtr, count); mfBuffer.SetCurrentLength(count); mfBuffer.Unlock(); sample.SetSampleTime(positionInTicks); sample.SetSampleDuration(ticks); _sinkWriter.WriteSample(_streamIndex, sample); return ticks; } } }