diff --git a/FFMediaToolkit/Decoding/AudioStream.cs b/FFMediaToolkit/Decoding/AudioStream.cs index 3562019..333b75a 100644 --- a/FFMediaToolkit/Decoding/AudioStream.cs +++ b/FFMediaToolkit/Decoding/AudioStream.cs @@ -13,6 +13,7 @@ public unsafe class AudioStream : MediaStream { private SwrContext* swrContext; + private bool isDisposed; /// /// Initializes a new instance of the class. @@ -132,9 +133,14 @@ public bool TryGetFrame(TimeSpan time, out AudioData data) /// public override void Dispose() { - fixed (SwrContext** ptr = &swrContext) + if (!isDisposed) { - ffmpeg.swr_free(ptr); + fixed (SwrContext** ptr = &swrContext) + { + ffmpeg.swr_free(ptr); + } + + isDisposed = true; } base.Dispose(); diff --git a/FFMediaToolkit/Decoding/MediaStream.cs b/FFMediaToolkit/Decoding/MediaStream.cs index bcb3e67..45c3c79 100644 --- a/FFMediaToolkit/Decoding/MediaStream.cs +++ b/FFMediaToolkit/Decoding/MediaStream.cs @@ -10,6 +10,8 @@ /// public class MediaStream : IDisposable { + private bool isDisposed; + /// /// Initializes a new instance of the class. /// @@ -56,8 +58,12 @@ internal MediaStream(Decoder stream, MediaOptions options) /// public virtual void Dispose() { - Stream.DiscardBufferedData(); - Stream.Dispose(); + if (!isDisposed) + { + Stream.DiscardBufferedData(); + Stream.Dispose(); + isDisposed = true; + } } /// diff --git a/FFMediaToolkit/Decoding/VideoStream.cs b/FFMediaToolkit/Decoding/VideoStream.cs index 619bff5..f59394c 100644 --- a/FFMediaToolkit/Decoding/VideoStream.cs +++ b/FFMediaToolkit/Decoding/VideoStream.cs @@ -16,6 +16,7 @@ public class VideoStream : MediaStream private readonly int outputFrameStride; private readonly int requiredBufferSize; private readonly ImageConverter converter; + private bool isDisposed; /// /// Initializes a new instance of the class. @@ -232,7 +233,12 @@ public unsafe bool TryGetFrame(TimeSpan time, IntPtr buffer, int bufferStride) /// public override void Dispose() { - converter.Dispose(); + if (!isDisposed) + { + converter.Dispose(); + isDisposed = true; + } + base.Dispose(); }