Fast video frame drawing?
Freemanix

Hi!

I have problems to implement fast live-view from attached camera using Allegro 5. The camera streams uncompress color or grayscale images and I need to draw them inside my Allegro created fullscreen interface.

The problem is how to get frame data into bitmaps. When I use locking and filling the buffer with raw data, it is extremely slow and on a subpar graphics card (Intel 3150) I can get only about 15 FPS for 1024x768 images.

Surprisingly, when I wrote GDI application which uses SetDIBitsToDevice(), I could easily achieve 60 FPS at the same hardware. Why?

I would like to try to create offscreen bitmap, get a GDI drawing context for it and use the SetDIBitsToDevice(), but I do not know how. I found some examples for it, but these were for Allegro 4.

Thanks for help!

Edgar Reynaldo

Try using a video bitmap that is the same size as your stream buffer, and lock it in WRITE_ONLY mode. That may speed things up some for you.

Freemanix

That's exactly what I am doing. It is slow.

Is there a way how to get HDC from ALLEGRO_BITMAP? There was such a method in Allegro 4.

Edgar Reynaldo

Okay then, what if you use a memory bitmap buffer and then draw it to the backbuffer? Is that any faster? Are you also locking the bitmap in the same format as the bitmap?

Freemanix said:

Is there a way how to get HDC from ALLEGRO_BITMAP? There was such a method in Allegro 4.

Looks like the best you can get for now is al_get_d3d_video_texture. Allegro 4 only let you blit to and from an HDC, not create a new one.

Freemanix

Actually, I solved this by creating my own Direct3D texture with D3DUSAGE_DYNAMIC in D3DPOOL_DEFAULT. Locking such a texture is about 10x faster than locking the ALLEGRO_BITMAP whichever way it was created.

Of course, I had to supply my own Direct3D drawing from that texture using DrawPrimitiveUP() call, but it was worth it. Now I just hope that my D3D drawing works seamlessly with the rest of Allegro5.

I would suggest Allegro5 should add new bitmap flag indicating that the bitmap being created is dynamic or suitable for streaming. I guess SDL 1.3.x have such flag already.

Thread #607426. Printed from Allegro.cc