OpenGL видео заморозить - PullRequest
       18

OpenGL видео заморозить

0 голосов
/ 27 октября 2011

У меня есть кулачок IDS ueye, и я продолжаю захват через PBO в OpenGL (OpenTK).На моем developer-pc он отлично работает, но на более медленных машинах видео через некоторое время зависает.

Код для выделения памяти через opengl и сопоставления с ueye, поэтому камера сохраняет обработанные изображения здесь:

// Generate PBO and save id
GL.GenBuffers(1, out this.frameBuffer[i].BufferID);

// Define the type of the buffer.
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, this.frameBuffer[i].BufferID);

// Define buffer size.
GL.BufferData(BufferTarget.PixelUnpackBuffer, new IntPtr(width * height * depth), IntPtr.Zero, BufferUsageHint.StreamDraw);

// Get pointer to by openGL allocated buffer and
// lock global with uEye.
this.frameBuffer[i].PointerToNormalMemory = GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly);
this.frameBuffer[i].PointerToLockedMemory = uEye.GlobalLock(this.frameBuffer[i].PointerToNormalMemory);

// Unmap PBO after use.
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer);

// Set selected PBO to none.
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);

// Register buffer to uEye
this.Succeeded("SetAllocatedImageMem", this.cam.SetAllocatedImageMem(width, height, depth, this.frameBuffer[i].PointerToLockedMemory, ref this.frameBuffer[i].MemId));

// Add buffer to uEye-Ringbuffer
this.Succeeded("AddToSequence", this.cam.AddToSequence(this.frameBuffer[i].PointerToLockedMemory, this.frameBuffer[i].MemId));

Чтобы скопировать изображение из pbo в текстуру (текстура создана и нормально):

// Select PBO with new video image
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, nextBufferId);

// Select videotexture as current
GL.BindTexture(TextureTarget.Texture2D, this.videoTextureId);

// Copy PBO to texture            
GL.TexSubImage2D(
    TextureTarget.Texture2D,
    0,
    0,
    0,
    nextBufferSize.Width,
    nextBufferSize.Height,
    OpenTK.Graphics.OpenGL.PixelFormat.Bgr,
    PixelType.UnsignedByte,
    IntPtr.Zero);

// Release Texture
GL.BindTexture(TextureTarget.Texture2D, 0);

// Release PBO
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);

Возможно, кто-то может увидеть ошибку ... Примерно через 6 секунд события ueye не доставляютсялюбые изображения больше.Когда я удаляю TexSubImage2D, он работает хорошо, но, конечно, изображение не появляется.Может быть, есть блокировка или что-то из opengl?Заранее спасибо - Томас

Ответы [ 2 ]

1 голос
/ 27 октября 2011

похоже на проблему с общим буфером. Вы можете попытаться реализовать простой механизм очереди, чтобы избавиться от этой проблемы.

пример кода (не предназначен для работы):

queue< vector<BYTE> > frames;

...

frames.push(vector<BYTE>(frameBuffer, frameBuffer + frameSize));

...

// use frame here at GL.TexSubImage2D using frames.front()
frames.pop();
0 голосов
/ 07 ноября 2011

Обнаружил ошибку самостоятельно.Просто замените код выше StreamDraw на StreamRead.

GL.BufferData(BufferTarget.PixelUnpackBuffer, new IntPtr(width * height * depth), IntPtr.Zero, BufferUsageHint.StreamRead);
...