public IntPtr WriteStream(IMagickImage image, MagickSettings settings, ReadWriteStreamDelegate reader, ReadWriteStreamDelegate writer, SeekStreamDelegate seeker, TellStreamDelegate teller) { using (INativeInstance settingsNative = MagickSettings.CreateInstance(settings)) { IntPtr exception = IntPtr.Zero; IntPtr result; #if PLATFORM_AnyCPU if (NativeLibrary.Is64Bit) #endif #if PLATFORM_x64 || PLATFORM_AnyCPU result = NativeMethods.X64.MagickImageCollection_WriteStream(image.GetInstance(), settingsNative.Instance, reader, writer, seeker, teller, out exception); #endif #if PLATFORM_AnyCPU else #endif #if PLATFORM_x86 || PLATFORM_AnyCPU result = NativeMethods.X86.MagickImageCollection_WriteStream(image.GetInstance(), settingsNative.Instance, reader, writer, seeker, teller, out exception); #endif MagickException magickException = MagickExceptionHelper.Create(exception); if (MagickExceptionHelper.IsError(magickException)) { if (result != IntPtr.Zero) { Dispose(result); } throw magickException; } RaiseWarning(magickException); return(result); } }
public void WriteStream(IMagickImage image, MagickSettings settings, ReadWriteStreamDelegate writer, SeekStreamDelegate seeker, TellStreamDelegate teller, ReadWriteStreamDelegate reader) { using (INativeInstance settingsNative = MagickSettings.CreateInstance(settings)) { IntPtr exception = IntPtr.Zero; #if PLATFORM_AnyCPU if (NativeLibrary.Is64Bit) #endif #if PLATFORM_x64 || PLATFORM_AnyCPU NativeMethods.X64.MagickImageCollection_WriteStream(image.GetInstance(), settingsNative.Instance, writer, seeker, teller, reader, out exception); #endif #if PLATFORM_AnyCPU else #endif #if PLATFORM_x86 || PLATFORM_AnyCPU NativeMethods.X86.MagickImageCollection_WriteStream(image.GetInstance(), settingsNative.Instance, writer, seeker, teller, reader, out exception); #endif CheckException(exception); } }
public static extern IntPtr MagickImageCollection_WriteStream(IntPtr image, IntPtr settings, ReadWriteStreamDelegate reader, ReadWriteStreamDelegate writer, SeekStreamDelegate seeker, TellStreamDelegate teller, out IntPtr exception);
private void OpenInput() { formatContext = ffmpeg.avformat_alloc_context(); fixed(AVFormatContext **formatContextPtr = &formatContext) { int error; AVInputFormat *inputFormat = null; if (stream != null) { const int bufferSize = 8192; // with delegates and anonymous functions, we can capture // the local stream variable without passing it as a argument. ReadStreamDelegate readStream = (IntPtr opaque, IntPtr buf, int buf_size) => { byte[] array = new byte[buf_size]; int read = stream.Read(array, 0, buf_size); Marshal.Copy(array, 0, buf, read); return(read); }; SeekStreamDelegate seekStream = (IntPtr opaque, Int64 offset, int whence) => { if (whence == ffmpeg.AVSEEK_SIZE) { return(stream.Length); } if (!stream.CanSeek) { return(-1); } stream.Seek(offset, (SeekOrigin)whence); return(stream.Position); }; // track the delegates, GC might remove them prematurely delegateRefs.Add(readStream); delegateRefs.Add(seekStream); // setup custom stream reader for ffmpeg to use with AVIO context sbyte *readBuffer = (sbyte *)ffmpeg.av_malloc(bufferSize + ffmpeg.FF_INPUT_BUFFER_PADDING_SIZE); avioContext = ffmpeg.avio_alloc_context(readBuffer, bufferSize, 0, null, Marshal.GetFunctionPointerForDelegate(readStream), IntPtr.Zero, Marshal.GetFunctionPointerForDelegate(seekStream)); formatContext->pb = avioContext; formatContext->flags |= ffmpeg.AVFMT_FLAG_CUSTOM_IO; if ((error = ffmpeg.av_probe_input_buffer(formatContext->pb, &inputFormat, path, null, 0, 0)) != 0) { throw new FFmpegException(error); } if (path != null && (inputFormat->flags & ffmpeg.AVFMT_NOFILE) != 0) { // Input format (image2) doesn't support custom AVIOContext, // forcefully clear the flag and hope it works. inputFormat->flags &= ~ffmpeg.AVFMT_NOFILE; //ffmpeg.avio_close(formatContext->pb); } } if ((error = ffmpeg.avformat_open_input(formatContextPtr, path, inputFormat, null)) != 0) { throw new FFmpegException(error, "Failed to open input stream for file '" + path + "'"); } } frame = ffmpeg.av_frame_alloc(); }