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);
     }
 }
示例#2
0
 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);
示例#4
0
        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();
        }