2011-10-27 11 views
0

私はIDS ueye camを持っており、PBO経由でOpenGL(OpenTK)へのキャプチャを進めています。私の開発者のPCでは素晴らしい作品ですが、遅いマシンではしばらくしてからビデオがフリーズします。opengl video freeze

コードの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からテクスチャ(テクスチャが作成され、OKです)に画像をコピーするには:

// 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のものがありますか? ありがとうございます - トーマス

答えて

1

共有バッファの問題のようです。その問題を取り除くために単純なキューメカニズムを実装しようとするかもしれません。

サンプルコード(作業することを意図していない):

queue< vector<BYTE> > frames; 

...

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

...

// use frame here at GL.TexSubImage2D using frames.front() 
frames.pop(); 
+0

これは実際に私が行うことです。カムにはリングバッファがあり、新しいフレームを受け取るたびにバッファIDをopenglに渡します。現在、私はバッファに2つの要素を持っていますが、エラーはさらに多く発生します。しかし、それよりも時間がかかりました... –

+0

あなたのキューメカニズムが完全に安全であるかどうかは、私があなたに伝えることはできません(nextBufferIdがどこに割り当てられているかなど)、すべてのコードを見ることができません。私の推測では、あなたの複数のバッファの実装に何か問題があります。それほど難しくない場合は、上記のようにstd :: queueとstd :: vectorを試してみてください。 –

+0

私はこれはうまく動作するかなりshureです。 NextBufferIdはGenBufferから入手したものです... –

0

は自分で故障を発見しました。 StreamDraw上のコードをStreamReadで置き換えてください。

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