diff options
author | vitor <vitor@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2008-10-23 19:13:11 +0000 |
---|---|---|
committer | vitor <vitor@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2008-10-23 19:13:11 +0000 |
commit | f42e50f3679d7ce362d6ca5652dd90c6fd289073 (patch) | |
tree | 013eebe0ea413636db1f271eb8db18a546a20980 | |
parent | e9b43bec0944b6a0882d0520d70edb5f4c7876f3 (diff) |
Fix broken palette8to*.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27817 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libswscale/rgb2rgb.c | 71 | ||||
-rw-r--r-- | libswscale/rgb2rgb.h | 6 | ||||
-rw-r--r-- | libswscale/swscale.c | 41 |
3 files changed, 43 insertions, 75 deletions
diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c index 13388ac85a..b55141264a 100644 --- a/libswscale/rgb2rgb.c +++ b/libswscale/rgb2rgb.c @@ -213,84 +213,23 @@ void sws_rgb2rgb_init(int flags){ } /** - * Palette is assumed to contain BGR32. + * Convert the palette to the same packet 32-bit format as the palette */ -void palette8torgb32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) +void palette8topacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) { long i; -/* - for (i=0; i<num_pixels; i++) - ((unsigned *)dst)[i] = ((unsigned *)palette)[src[i]]; -*/ - - for (i=0; i<num_pixels; i++) - { - #ifdef WORDS_BIGENDIAN - dst[3]= palette[src[i]*4+2]; - dst[2]= palette[src[i]*4+1]; - dst[1]= palette[src[i]*4+0]; - #else - //FIXME slow? - dst[0]= palette[src[i]*4+2]; - dst[1]= palette[src[i]*4+1]; - dst[2]= palette[src[i]*4+0]; - //dst[3]= 0; /* do we need this cleansing? */ - #endif - dst+= 4; - } -} - -void palette8tobgr32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) -{ - long i; for (i=0; i<num_pixels; i++) - { - #ifdef WORDS_BIGENDIAN - dst[3]= palette[src[i]*4+0]; - dst[2]= palette[src[i]*4+1]; - dst[1]= palette[src[i]*4+2]; - #else - //FIXME slow? - dst[0]= palette[src[i]*4+0]; - dst[1]= palette[src[i]*4+1]; - dst[2]= palette[src[i]*4+2]; - //dst[3]= 0; /* do we need this cleansing? */ - #endif - - dst+= 4; - } + ((uint32_t *) dst)[i] = ((const uint32_t *) palette)[src[i]]; } /** - * Palette is assumed to contain BGR32. + * Palette format: ABCD -> dst format: ABC */ -void palette8torgb24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) +void palette8topacked24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) { long i; -/* - Writes 1 byte too much and might cause alignment issues on some architectures? - for (i=0; i<num_pixels; i++) - ((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[src[i]]; -*/ - for (i=0; i<num_pixels; i++) - { - //FIXME slow? - dst[0]= palette[src[i]*4+2]; - dst[1]= palette[src[i]*4+1]; - dst[2]= palette[src[i]*4+0]; - dst+= 3; - } -} -void palette8tobgr24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) -{ - long i; -/* - Writes 1 byte too much and might cause alignment issues on some architectures? - for (i=0; i<num_pixels; i++) - ((unsigned *)(&dst[i*3])) = ((unsigned *)palette)[src[i]]; -*/ for (i=0; i<num_pixels; i++) { //FIXME slow? diff --git a/libswscale/rgb2rgb.h b/libswscale/rgb2rgb.h index 11c0d8e65f..5cc6a2dc03 100644 --- a/libswscale/rgb2rgb.h +++ b/libswscale/rgb2rgb.h @@ -61,10 +61,8 @@ extern void rgb15tobgr15(const uint8_t *src, uint8_t *dst, long src_size); extern void bgr8torgb8 (const uint8_t *src, uint8_t *dst, long src_size); -extern void palette8torgb32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); -extern void palette8tobgr32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); -extern void palette8torgb24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); -extern void palette8tobgr24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); +extern void palette8topacked32(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); +extern void palette8topacked24(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); extern void palette8torgb16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); extern void palette8tobgr16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); extern void palette8torgb15(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette); diff --git a/libswscale/swscale.c b/libswscale/swscale.c index 8b899c4493..1ad488c57f 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -1729,10 +1729,12 @@ static int pal2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int sr sws_format_name(srcFormat), sws_format_name(dstFormat)); switch(dstFormat){ - case PIX_FMT_RGB32: conv = palette8torgb32; break; - case PIX_FMT_BGR32: conv = palette8tobgr32; break; - case PIX_FMT_RGB24: conv = palette8torgb24; break; - case PIX_FMT_BGR24: conv = palette8tobgr24; break; + case PIX_FMT_RGB32 : conv = palette8topacked32; break; + case PIX_FMT_BGR32 : conv = palette8topacked32; break; + case PIX_FMT_BGR32_1: conv = palette8topacked32; break; + case PIX_FMT_RGB32_1: conv = palette8topacked32; break; + case PIX_FMT_RGB24 : conv = palette8topacked24; break; + case PIX_FMT_BGR24 : conv = palette8topacked24; break; default: av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n", sws_format_name(srcFormat), sws_format_name(dstFormat)); break; } @@ -2343,8 +2345,10 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d if ((usePal(srcFormat) && ( dstFormat == PIX_FMT_RGB32 || + dstFormat == PIX_FMT_RGB32_1 || dstFormat == PIX_FMT_RGB24 || dstFormat == PIX_FMT_BGR32 || + dstFormat == PIX_FMT_BGR32_1 || dstFormat == PIX_FMT_BGR24))) c->swScale= pal2rgbWrapper; @@ -2739,7 +2743,34 @@ int sws_scale(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, u= av_clip_uint8((RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT); v= av_clip_uint8((RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT); c->pal_yuv[i]= y + (u<<8) + (v<<16); - c->pal_rgb[i]= b + (g<<8) + (r<<16); + + + switch(c->dstFormat) { + case PIX_FMT_BGR32: +#ifndef WORDS_BIGENDIAN + case PIX_FMT_RGB24: +#endif + c->pal_rgb[i]= r + (g<<8) + (b<<16); + break; + case PIX_FMT_BGR32_1: +#ifdef WORDS_BIGENDIAN + case PIX_FMT_BGR24: +#endif + c->pal_rgb[i]= (r + (g<<8) + (b<<16)) << 8; + break; + case PIX_FMT_RGB32_1: +#ifdef WORDS_BIGENDIAN + case PIX_FMT_RGB24: +#endif + c->pal_rgb[i]= (b + (g<<8) + (r<<16)) << 8; + break; + case PIX_FMT_RGB32: +#ifndef WORDS_BIGENDIAN + case PIX_FMT_BGR24: +#endif + default: + c->pal_rgb[i]= b + (g<<8) + (r<<16); + } } } |