Hi Georgios,
On Tue, 2002-11-26 at 16:40, Georgios Kapetanakis wrote:
void bgr24_to_rgb24(unsigned char *bgrSrc, unsigned char *rgbDest,
unsigned int bgrSrcSize)
{
unsigned int i = 0;
for (i = 0; i < bgrSrcSize; i += 3)
{
*(rgbDest++) = *(bgrSrc + (i + 2)); // swap red
*(rgbDest++) = *(bgrSrc + (i + 1)); // green is not
swapped, just copied over
*(rgbDest++) = *(bgrSrc + i); // swap blue
}
}
Hm, this isn't that bad. ;). You're just doing byte-by-byte. You could
try grabbing 32-bit frames, so you can work with 32-bit variables
(glib's guint32, you can use sys/types.h's __u32 too). If so, here's my
try:
static void
bgr32_to_rgb32 (unsigned char *bgrSrc,
unsigned char *rgbDest,
unsigned int size)
{
while (size > 0) {
(guint32)(*bgrDest) = (((guint32)(*bgrSrc))&0xff000000)>>24 |
(((guint32)(*bgrSrc))&0x00ff0000)>>8 |
(((guint32)(*bgrSrc))&0x0000ff00)<<8 |
(((guint32)(*bgrSrc))&0x000000ff)<<24;
size -=4; bgrSrc += 4; rgbDest += 4;
}
}
Maybe this gets a bit faster if you use a temporary variable instead of
the reference to ((guint32)(*bgrSrc)) too, so:
static void
bgr32_to_rgb32 (unsigned char *bgrSrc,
unsigned char *rgbDest,
unsigned int size)
{
guint32 t;
while (size > 0) {
t = (guint32)(*bgrSrc);
(guint32)(*bgrDest) = (t&0xff000000)>>24 | (t&0x00ff0000)>>8 |
(t&0x0000ff00)<<8 | (t&0x000000ff)<<24;
size -=4; bgrSrc += 4; rgbDest += 4;
}
}
But I'm not fairly sure about that, I guess it won't really matter
(compilers will optimimize these bits out).
This is (supposed to be) faster because you don't do (expensive)
mathematical operations, but you simply do bit-operations (&, >>, << and
|). Of course, assembler would make this faster too, but I'm not a
genius there.
HTH,
--
Ronald Bultje <[EMAIL PROTECTED]>
Linux Video/Multimedia developer
--
video4linux-list mailing list
Unsubscribe mailto:[EMAIL PROTECTED]?subject=unsubscribe
https://listman.redhat.com/mailman/listinfo/video4linux-list