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: