Hi,
I am trying to create a scene which contains a texture displaying a live video
image. The image is sent as a buffer of raw data from an attached camera. I
was able to get something working but the performance is terrible: about 1.42
frames per second. I need to get to at least 20 fps. I am dealing with an
image that is 640x480 pixels with 32 bits per pixel. I have stripped down my
scene to contain only a geode with a quad geometry, and an attached texture,
and I still see the performance problem. The texture has an attached
StateAttributeCallback, in which I fetch the buffer of data for the next video
frame, and then call setImage:
img->setImage( 640, // width
480, // height
1, // depth
GL_RGB8, // internal texture format
GL_BGRA, // pixel format
GL_UNSIGNED_INT_8_8_8_8_REV, // data type
data, // raw data pointer
osg::Image::NO_DELETE);
I also experimented with another technique that I found on another post where
someone is doing something very similar to what I’m trying to do:
> Re: Update a texture's pixels contents, using apply or glTexSubImage2D
> Robert Osfield
> Fri, 26 Sep 2008 01:33:52 -0700
> Hi Guillaume,
>
> The way to integrate a live video stream is to subclass from
> osg::ImageStream (which is subclass from osg::Image), as is done in
> the OSG's quicktime and xine-lib plugins. The ImageStream is then
> attached to Texture be it a Texture1D, 2D, 3D or TextureRectangle.
> This approach means that you don't ever subclass from the Texture
> objects as the image data is encapsulated complete by
> osg::Image/ImageStream.
>
> The way I'd tackle your task is to subclass from osg::ImageStream and
> then allocate the image data then copy over this in your background
> thread and then call dirty() on the ImageStream, this will tell the
> Texture::apply() that the image data has changed and it'll then
> automatically subload the data for you. ImageStream also by default
> provides a PixelBufferObject which means upload performance will be
> the best you can get.
>
> Robert.
To make this technique work, in my video frame producer thread I was calling
ImageStream::data() to get the pointer to the raw data, then doing a memcpy to
write the new frame, then calling dirty(). I no longer used a
StateAttributeCallback in this method. Unfortunately, I did not see any
noticeable change in performance using this technique. Do I need to use
another function in order to write directly to the pixel buffer object? Also
what thread synchronization do I need here?
My hardware specs are as follows:
Intel Celeron 550 CPU (2.0 GHz)
1.0 GB RAM
Mobile Intel GME965 Express Chipset with integrated graphics
Upgrading hardware is not an option for me. Please let me know what I can do
to maximize performance in this situation.
Thanks,
Mike
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=45922#45922
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org