static AviWriterSegment() { Win32.AVIFileInit(); }
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++; } } } }
public void ensureVisible(int index) { Win32.SendMessage(Handle, (int)ListViewMessages.LVM_ENSUREVISIBLE, index, 1); }