Mercurial > mplayer.hg
changeset 32028:9e6fdede8ece
gui: remove direct usage of rgb2rgb interface, use swscale instead
author | ramiro |
---|---|
date | Thu, 09 Sep 2010 14:52:37 +0000 |
parents | b6cfb1f15a5b |
children | b81172c6dd5c |
files | gui/win32/skinload.c gui/wm/ws.c |
diffstat | 2 files changed, 36 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/gui/win32/skinload.c Thu Sep 09 14:50:51 2010 +0000 +++ b/gui/win32/skinload.c Thu Sep 09 14:52:37 2010 +0000 @@ -28,8 +28,8 @@ #include "mp_msg.h" #include "cpudetect.h" -#include "libswscale/rgb2rgb.h" #include "libswscale/swscale.h" +#include "libavcore/imgutils.h" #include "gui.h" #include "gui/bitmap.h" @@ -104,13 +104,6 @@ return NULL; } -static inline int get_sws_cpuflags(void) -{ - return (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) | - (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 0) | - (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0); -} - /* reads a complete image as is into image buffer */ static image *pngRead(skin_t *skin, unsigned char *fname) { @@ -163,10 +156,22 @@ if (skin->desktopbpp == 32) bf->data = bmp.Image; else { + const uint8_t *src[4] = { bmp.Image, NULL, NULL, NULL}; + int src_stride[4] = { 4 * bmp.Width, 0, 0, 0 }; + uint8_t *dst[4] = { NULL, NULL, NULL, NULL }; + int dst_stride[4]; + enum PixelFormat out_pix_fmt; + struct SwsContext *sws; + if (skin->desktopbpp == 16) out_pix_fmt = PIX_FMT_RGB555; + else if (skin->desktopbpp == 24) out_pix_fmt = PIX_FMT_RGB24; + av_image_fill_linesizes(dst_stride, out_pix_fmt, bmp.Width); + sws = sws_getContext(bmp.Width, bmp.Height, PIX_FMT_RGB32, + bmp.Width, bmp.Height, out_pix_fmt, + SWS_POINT, NULL, NULL, NULL); bf->data = malloc(bf->size); - rgb32tobgr32(bmp.Image, bmp.Image, bmp.ImageSize); - if(skin->desktopbpp == 16) rgb32tobgr15(bmp.Image, bf->data, bmp.ImageSize); - else if(skin->desktopbpp == 24) rgb32tobgr24(bmp.Image, bf->data, bmp.ImageSize); + dst[0] = bf->data; + sws_scale(sws, src, src_stride, 0, bmp.Height, dst, dst_stride); + sws_freeContext(sws); free(bmp.Image); } return bf; @@ -620,8 +625,6 @@ char *desc = calloc(1, MAX_LINESIZE); window* mywindow = NULL; - /* init swscaler */ - sws_rgb2rgb_init(get_sws_cpuflags()); /* setup funcs */ skin->freeskin = freeskin; skin->pngRead = pngRead;
--- a/gui/wm/ws.c Thu Sep 09 14:50:51 2010 +0000 +++ b/gui/wm/ws.c Thu Sep 09 14:52:37 2010 +0000 @@ -38,7 +38,7 @@ #include "libvo/video_out.h" #include "cpudetect.h" #include "libswscale/swscale.h" -#include "libswscale/rgb2rgb.h" +#include "libavcore/imgutils.h" #include "libmpcodecs/vf_scale.h" #include "mp_msg.h" #include "help_mp.h" @@ -130,11 +130,8 @@ pixel<<=5;\ pixel|=(r>>3) -typedef void(*wsTConvFunc)( const unsigned char * in_pixels, unsigned char * out_pixels, unsigned num_pixels ); -wsTConvFunc wsConvFunc = NULL; - -static void rgb32torgb32( const unsigned char * src, unsigned char * dst,unsigned int src_size ) -{ memcpy( dst,src,src_size ); } +struct SwsContext *sws_ctx = NULL; +enum PixelFormat out_pix_fmt = PIX_FMT_NONE; // --- @@ -301,41 +298,31 @@ } #endif wsOutMask=wsGetOutMask(); - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[ws] Initialized converter: " ); - sws_rgb2rgb_init(get_sws_cpuflags()); switch ( wsOutMask ) { case wsRGB32: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to rgb32\n" ); - wsConvFunc=rgb32torgb32; + out_pix_fmt = PIX_FMT_RGB32; break; case wsBGR32: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to bgr32\n" ); - wsConvFunc=rgb32tobgr32; + out_pix_fmt = PIX_FMT_BGR32; break; case wsRGB24: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to rgb24\n" ); - wsConvFunc=rgb32to24; + out_pix_fmt = PIX_FMT_RGB24; break; case wsBGR24: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to bgr24\n" ); - wsConvFunc=rgb32tobgr24; + out_pix_fmt = PIX_FMT_BGR24; break; case wsRGB16: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to rgb16\n" ); - wsConvFunc=rgb32to16; + out_pix_fmt = PIX_FMT_RGB565; break; case wsBGR16: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to bgr16\n" ); - wsConvFunc=rgb32tobgr16; + out_pix_fmt = PIX_FMT_BGR565; break; case wsRGB15: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to rgb15\n" ); - wsConvFunc=rgb32to15; + out_pix_fmt = PIX_FMT_RGB555; break; case wsBGR15: - mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"rgb32 to bgr15\n" ); - wsConvFunc=rgb32tobgr15; + out_pix_fmt = PIX_FMT_BGR555; break; } } @@ -838,9 +825,16 @@ // ---------------------------------------------------------------------------------------------- void wsConvert( wsTWindow * win,unsigned char * Image,unsigned int Size ) { + const uint8_t *src[4] = { Image, NULL, NULL, NULL }; + int src_stride[4] = { 4 * win->xImage->width, 0, 0, 0 }; + uint8_t *dst[4] = { win->ImageData, NULL, NULL, NULL }; + int dst_stride[4]; int i; - if ( wsConvFunc ) - wsConvFunc( Image,win->ImageData,win->xImage->width * win->xImage->height * 4 ); + sws_ctx = sws_getCachedContext(sws_ctx, win->xImage->width, win->xImage->height, PIX_FMT_RGB32, + win->xImage->width, win->xImage->height, out_pix_fmt, + SWS_POINT, NULL, NULL, NULL); + av_image_fill_linesizes(dst_stride, out_pix_fmt, win->xImage->width); + sws_scale(sws_ctx, src, src_stride, 0, win->xImage->height, dst, dst_stride); if (!wsNonNativeOrder) return; switch (win->xImage->bits_per_pixel) { case 32: