[FFmpeg-devel] Extend/optimize RGB to RGB conversions funcs intorgb2rgb.c
Don Moir
donmoir at comcast.net
Mon Sep 10 21:48:46 CEST 2012
> void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size )
> {
> int i;
> uint8_t *psrc = src;
>
> for ( i = 0 ; i < src_size ; i += 3, psrc +=3, dst +=4 )
> {
> #if HAVE_BIGENDIAN
> /* RGB24 (= R,G,B) -> BGR32 (= 255,R,G,B) */
> dst[0] = 255;
> dst[1] = psrc[0];
> dst[2] = psrc[1];
> dst[3] = psrc[2];
> #else
> dst[0] = psrc[2];
> dst[1] = psrc[1];
> dst[2] = psrc[0];
> dst[3] = 255;
> #endif
> }
> }
You might try something like this that does 4 pixels within the loop. It
might be interesting to see if performance is better for this. I do it asm
and don't do it line by line for my own purposes.
Note: somewhat pseudo code. I do it differently so modified here.
void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size )
{
int nPixels = src_size / 3;
int pixels4 = nPixels >> 2;
int extra = nPixels % 4;
uint32_t* pDst (uint32_t*)dst;
uint32_t* pSrc (uint32_t*)src;
for (int i = 0; i < pixels4; ++i)
{
#if HAVE_BIGENDIAN
pDst[0] = 0xFF000000 | (pSrc[0] >> 8);
pDst[1] = 0xFF000000 | (pSrc[0] << 16) | (pSrc[1] >> 16);
pDst[2] = 0xFF000000 | (pSrc[1] << 8) | (pSrc[2] >> 24);
pDst[3] = 0xFF000000 | pSrc[2];
#else
pDst[0] = 0xFF000000 | pSrc[0];
pDst[1] = 0xFF000000 | (pSrc[1] << 8) | (pSrc[0] >> 24);
pDst[2] = 0xFF000000 | ((pSrc[2] << 16) | (pSrc[1] >> 16);
pDst[3] = 0xFF000000 | (pSrc[2] >> 8);
#endif
pDst +=4;
pSrc +=3;
}
uint8_t* pBytes = (uint8_t*)pDst;
for (int i = 0; i < extra; i++)
{
#if HAVE_BIGENDIAN
*pDst++ = 0xFF000000 | (pBytes[0] << 16) | (pBytes[1] << 8) |
(pBytes[2]);
#else
*pDst++ = 0xFF000000 | (pBytes[2] << 16) | (pBytes[1] << 8) |
(pBytes[0]);
#endif
pBytes += 3;
}
}
More information about the ffmpeg-devel
mailing list