コード例 #1
0
 static AviWriterSegment()
 {
     Win32.AVIFileInit();
 }
コード例 #2
0
            public unsafe void AddFrame(IVideoProvider source)
            {
                if (parameters.width != source.BufferWidth ||
                    parameters.height != source.BufferHeight)
                {
                    throw new InvalidOperationException("video buffer changed between start and now");
                }

                int pitch_add = parameters.pitch_add;

                int todo = parameters.pitch * parameters.height;
                int w    = source.BufferWidth;
                int h    = source.BufferHeight;

                if (!bit32)
                {
                    IntPtr buf = GetStaticGlobalBuf(todo);

                    // TODO - would using a byte* be faster?
                    int[] buffer = source.GetVideoBuffer();
                    fixed(int *buffer_ptr = &buffer[0])
                    {
                        byte *bytes_ptr = (byte *)buf.ToPointer();
                        {
                            byte *bp = bytes_ptr;

                            for (int idx = w * h - w, y = 0; y < h; y++)
                            {
                                for (int x = 0; x < w; x++, idx++)
                                {
                                    int r    = (buffer[idx] >> 0) & 0xFF;
                                    int g    = (buffer[idx] >> 8) & 0xFF;
                                    int b    = (buffer[idx] >> 16) & 0xFF;
                                    *   bp++ = (byte)r;
                                    *   bp++ = (byte)g;
                                    *   bp++ = (byte)b;
                                }
                                idx -= w * 2;
                                bp  += pitch_add;
                            }

                            int bytes_written;
                            int ret = Win32.AVIStreamWrite(pAviCompressedVideoStream, outStatus.video_frames, 1, new IntPtr(bytes_ptr), todo, Win32.AVIIF_KEYFRAME, IntPtr.Zero, out bytes_written);
                            outStatus.video_bytes += bytes_written;
                            outStatus.video_frames++;
                        }
                    }
                }
                else                 // 32 bit
                {
                    IntPtr buf    = GetStaticGlobalBuf(todo * 4);
                    int[]  buffer = source.GetVideoBuffer();
                    fixed(int *buffer_ptr = &buffer[0])
                    {
                        byte *bytes_ptr = (byte *)buf.ToPointer();
                        {
                            byte *bp = bytes_ptr;

                            for (int idx = w * h - w, y = 0; y < h; y++)
                            {
                                for (int x = 0; x < w; x++, idx++)
                                {
                                    int r    = (buffer[idx] >> 0) & 0xFF;
                                    int g    = (buffer[idx] >> 8) & 0xFF;
                                    int b    = (buffer[idx] >> 16) & 0xFF;
                                    *   bp++ = (byte)r;
                                    *   bp++ = (byte)g;
                                    *   bp++ = (byte)b;
                                    *   bp++ = 0;
                                }
                                idx -= w * 2;
                            }

                            int bytes_written;
                            int ret = Win32.AVIStreamWrite(pAviCompressedVideoStream, outStatus.video_frames, 1, new IntPtr(bytes_ptr), todo * 3, Win32.AVIIF_KEYFRAME, IntPtr.Zero, out bytes_written);
                            outStatus.video_bytes += bytes_written;
                            outStatus.video_frames++;
                        }
                    }
                }
            }
コード例 #3
0
ファイル: VirtualListView.cs プロジェクト: robsonfr/BizHawk
 public void ensureVisible(int index)
 {
     Win32.SendMessage(Handle, (int)ListViewMessages.LVM_ENSUREVISIBLE, index, 1);
 }