void Events_Tick(object sender, TickEventArgs e) { //There should be an easier way to get the video data to SDL timeElapsed += (e.SecondsElapsed); while (timeElapsed > 1.0 / file.Header.Fps && frameQueue.Count > 0) { timeElapsed -= (float)(1.0f / file.Header.Fps); byte[] rgbData = frameQueue.Dequeue(); if (surf == null) { surf = GuiUtil.CreateSurface(rgbData, (ushort)file.Header.Width, (ushort)file.Header.Height, 32, (int)file.Header.Width * 4, (int)0x00ff0000, (int)0x0000ff00, (int)0x000000ff, unchecked ((int)0xff000000)); } else { surf.Lock(); Marshal.Copy(rgbData, 0, surf.Pixels, rgbData.Length); surf.Unlock(); surf.Update(); } EmitFrameReady(); if (frameQueue.Count < (buffered_frames / 2) + 1) { waitEvent.Set(); } } }