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!
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.
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.
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?
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.
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.