diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-04-13 00:48:21 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-04-13 00:48:21 +0000 |
commit | 74d3583521de27a6c6018a647362a1974f3e2b58 (patch) | |
tree | 10d730dddd5a5ce7e01542ed83fa42c7448b556f /postproc/rgb2rgb_template.c | |
parent | 096172d435b8c1a8136fbc57845515b900f26bc0 (diff) | |
download | ffmpeg-74d3583521de27a6c6018a647362a1974f3e2b58.tar.gz |
rgb24->bgr24
Originally committed as revision 5583 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
Diffstat (limited to 'postproc/rgb2rgb_template.c')
-rw-r--r-- | postproc/rgb2rgb_template.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/postproc/rgb2rgb_template.c b/postproc/rgb2rgb_template.c index 46f36d88b9..87493ebc1c 100644 --- a/postproc/rgb2rgb_template.c +++ b/postproc/rgb2rgb_template.c @@ -571,6 +571,73 @@ static inline void RENAME(rgb32tobgr32)(const uint8_t *src, uint8_t *dst, unsign #endif } +static inline void RENAME(rgb24tobgr24)(const uint8_t *src, uint8_t *dst, unsigned int src_size) +{ + int i; +#ifdef HAVE_MMX + int mmx_size= 23 - src_size; + asm volatile ( + "movq "MANGLE(mask24r)", %%mm5 \n\t" + "movq "MANGLE(mask24g)", %%mm6 \n\t" + "movq "MANGLE(mask24b)", %%mm7 \n\t" + ".balign 16 \n\t" + "1: \n\t" + PREFETCH" 32(%1, %%eax) \n\t" + "movq (%1, %%eax), %%mm0 \n\t" // BGR BGR BG + "movq (%1, %%eax), %%mm1 \n\t" // BGR BGR BG + "movq 2(%1, %%eax), %%mm2 \n\t" // R BGR BGR B + "psllq $16, %%mm0 \n\t" // 00 BGR BGR + "pand %%mm5, %%mm0 \n\t" + "pand %%mm6, %%mm1 \n\t" + "pand %%mm7, %%mm2 \n\t" + "por %%mm0, %%mm1 \n\t" + "por %%mm2, %%mm1 \n\t" + "movq 6(%1, %%eax), %%mm0 \n\t" // BGR BGR BG + MOVNTQ" %%mm1, (%2, %%eax) \n\t" // RGB RGB RG + "movq 8(%1, %%eax), %%mm1 \n\t" // R BGR BGR B + "movq 10(%1, %%eax), %%mm2 \n\t" // GR BGR BGR + "pand %%mm7, %%mm0 \n\t" + "pand %%mm5, %%mm1 \n\t" + "pand %%mm6, %%mm2 \n\t" + "por %%mm0, %%mm1 \n\t" + "por %%mm2, %%mm1 \n\t" + "movq 14(%1, %%eax), %%mm0 \n\t" // R BGR BGR B + MOVNTQ" %%mm1, 8(%2, %%eax) \n\t" // B RGB RGB R + "movq 16(%1, %%eax), %%mm1 \n\t" // GR BGR BGR + "movq 18(%1, %%eax), %%mm2 \n\t" // BGR BGR BG + "pand %%mm6, %%mm0 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm5, %%mm2 \n\t" + "por %%mm0, %%mm1 \n\t" + "por %%mm2, %%mm1 \n\t" + MOVNTQ" %%mm1, 16(%2, %%eax) \n\t" + "addl $24, %%eax \n\t" + " js 1b \n\t" + : "+a" (mmx_size) + : "r" (src-mmx_size), "r"(dst-mmx_size) + ); + + __asm __volatile(SFENCE:::"memory"); + __asm __volatile(EMMS:::"memory"); + + if(!mmx_size) return; //finihsed, was multiple of 8 + + src+= src_size; + dst+= src_size; + src_size= 24-mmx_size; + src-= src_size; + dst-= src_size; +#endif + for(i=0; i<src_size; i+=3) + { + register int x; + x = src[i + 2]; + dst[i + 1] = src[i + 1]; + dst[i + 2] = src[i + 0]; + dst[i + 0] = x; + } +} + /** * * height should be a multiple of 2 and width should be a multiple of 16 (if this is a |