private static unsafe int AVISaveOptions(IntPtr stream, ref AVIWriterImports.AVICOMPRESSOPTIONS opts, IntPtr owner)
            {
                fixed(AVIWriterImports.AVICOMPRESSOPTIONS *_popts = &opts)
                {
                    IntPtr *pStream = &stream;

                    AVIWriterImports.AVICOMPRESSOPTIONS * popts  = _popts;
                    AVIWriterImports.AVICOMPRESSOPTIONS **ppopts = &popts;
                    return(AVIWriterImports.AVISaveOptions(owner, 0, 1, (void *)pStream, (void *)ppopts));
                }
            }
 public void AllocateToAVICOMPRESSOPTIONS(ref AVIWriterImports.AVICOMPRESSOPTIONS opts)
 {
     opts = _comprOptions;
     if (opts.cbParms != 0)
     {
         opts.lpParms = Win32Imports.HeapAlloc(Win32Imports.GetProcessHeap(), 0, opts.cbParms);
         Marshal.Copy(Parms, 0, opts.lpParms, opts.cbParms);
     }
     if (opts.cbFormat != 0)
     {
         opts.lpFormat = Win32Imports.HeapAlloc(Win32Imports.GetProcessHeap(), 0, opts.cbFormat);
         Marshal.Copy(Format, 0, opts.lpFormat, opts.cbFormat);
     }
 }
            public static void DeallocateAVICOMPRESSOPTIONS(ref AVIWriterImports.AVICOMPRESSOPTIONS opts)
            {
#if false // test: increase stability by never freeing anything, ever
                if (opts.lpParms != IntPtr.Zero)
                {
                    Win32Imports.HeapFree(Win32Imports.GetProcessHeap(), 0, opts.lpParms);
                }
                if (opts.lpFormat != IntPtr.Zero)
                {
                    Win32Imports.HeapFree(Win32Imports.GetProcessHeap(), 0, opts.lpFormat);
                }
#endif
                opts.lpParms  = IntPtr.Zero;
                opts.lpFormat = IntPtr.Zero;
            }
            private static CodecToken DeSerializeFromByteArray(byte[] data)
            {
                var m = new MemoryStream(data, false);
                var b = new BinaryReader(m);

                AVIWriterImports.AVICOMPRESSOPTIONS comprOptions = new AVIWriterImports.AVICOMPRESSOPTIONS();

                byte[] Format;
                byte[] Parms;

                try
                {
                    comprOptions.fccType          = b.ReadInt32();
                    comprOptions.fccHandler       = b.ReadInt32();
                    comprOptions.dwKeyFrameEvery  = b.ReadInt32();
                    comprOptions.dwQuality        = b.ReadInt32();
                    comprOptions.dwBytesPerSecond = b.ReadInt32();
                    comprOptions.dwFlags          = b.ReadInt32();
                    //comprOptions.lpFormat = b.ReadInt32();
                    comprOptions.cbFormat = b.ReadInt32();
                    //comprOptions.lpParms = b.ReadInt32();
                    comprOptions.cbParms           = b.ReadInt32();
                    comprOptions.dwInterleaveEvery = b.ReadInt32();

                    Format = b.ReadBytes(comprOptions.cbFormat);
                    Parms  = b.ReadBytes(comprOptions.cbParms);
                }
                catch (IOException)
                {
                    // ran off end of array most likely
                    return(null);
                }
                finally
                {
                    b.Close();
                }

                var ret = new CodecToken
                {
                    _comprOptions = comprOptions,
                    Format        = Format,
                    Parms         = Parms,
                    codec         = Decode_mmioFOURCC(comprOptions.fccHandler)
                };

                return(ret);
            }
            public static CodecToken CreateFromAVICOMPRESSOPTIONS(ref AVIWriterImports.AVICOMPRESSOPTIONS opts)
            {
                var ret = new CodecToken
                {
                    _comprOptions = opts,
                    codec         = Decode_mmioFOURCC(opts.fccHandler),
                    Format        = new byte[opts.cbFormat],
                    Parms         = new byte[opts.cbParms]
                };

                if (opts.lpFormat != IntPtr.Zero)
                {
                    Marshal.Copy(opts.lpFormat, ret.Format, 0, opts.cbFormat);
                }

                if (opts.lpParms != IntPtr.Zero)
                {
                    Marshal.Copy(opts.lpParms, ret.Parms, 0, opts.cbParms);
                }

                return(ret);
            }