[vlc-commits] commit: blend: find correct blender on opening not inside Blend() ( Ilkka Ollakka )

git at videolan.org git at videolan.org
Wed May 12 13:18:27 CEST 2010


vlc | branch: master | Ilkka Ollakka <ileoo at videolan.org> | Wed May 12 14:15:19 2010 +0300| [b522668d6b34f052afb9cc0a5d7d5f307abe0e5f] | committer: Ilkka Ollakka 

blend: find correct blender on opening not inside Blend()

I assume that chromas don't change while running on same filter.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b522668d6b34f052afb9cc0a5d7d5f307abe0e5f
---

 modules/video_filter/blend.c |  125 ++++++++++++++++++++++++------------------
 1 files changed, 72 insertions(+), 53 deletions(-)

diff --git a/modules/video_filter/blend.c b/modules/video_filter/blend.c
index 06d5847..530be44 100644
--- a/modules/video_filter/blend.c
+++ b/modules/video_filter/blend.c
@@ -93,17 +93,63 @@ static void BlendRGBAR16( filter_t *, picture_t *, const picture_t *,
 static void BlendRGBAR24( filter_t *, picture_t *, const picture_t *,
                           int, int, int, int, int );
 
+struct filter_sys_t
+{
+    int i_blendcfg;
+};
+
+typedef void (*BlendFunction)( filter_t *,
+                       picture_t *, const picture_t *,
+                       int , int , int , int , int );
+
+#define VLC_CODEC_PLANAR_420 { VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_YV12, 0 }
+#define VLC_CODEC_PACKED_422 { VLC_CODEC_YUYV, VLC_CODEC_UYVY, VLC_CODEC_YVYU, VLC_CODEC_VYUY, 0 }
+#define VLC_CODEC_RGB_16 { VLC_CODEC_RGB15, VLC_CODEC_RGB16, 0 }
+#define VLC_CODEC_RGB_24 { VLC_CODEC_RGB24, VLC_CODEC_RGB32, 0 }
+
+#define BLEND_CFG( fccSrc, fctPlanar, fctPacked, fctRgb16, fctRgb24  ) \
+    { .src = fccSrc, .p_dst = VLC_CODEC_PLANAR_420, .pf_blend = fctPlanar }, \
+    { .src = fccSrc, .p_dst = VLC_CODEC_PACKED_422, .pf_blend = fctPacked }, \
+    { .src = fccSrc, .p_dst = VLC_CODEC_RGB_16,     .pf_blend = fctRgb16  }, \
+    { .src = fccSrc, .p_dst = VLC_CODEC_RGB_24,     .pf_blend = fctRgb24  }
+
+static const struct
+{
+    vlc_fourcc_t src;
+    vlc_fourcc_t p_dst[16];
+    BlendFunction pf_blend;
+} p_blend_cfg[] = {
+
+    BLEND_CFG( VLC_CODEC_YUVA, BlendYUVAI420, BlendYUVAYUVPacked, BlendYUVARV16, BlendYUVARV24 ),
+
+    BLEND_CFG( VLC_CODEC_YUVP, BlendPalI420, BlendPalYUVPacked, BlendPalRV, BlendPalRV ),
+
+    BLEND_CFG( VLC_CODEC_RGBA, BlendRGBAI420, BlendRGBAYUVPacked, BlendRGBAR16, BlendRGBAR24 ),
+
+    BLEND_CFG( VLC_CODEC_I420, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ),
+
+    BLEND_CFG( VLC_CODEC_YV12, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ),
+
+    { 0, {0,}, NULL }
+};
+
 /*****************************************************************************
  * OpenFilter: probe the filter and return score
  *****************************************************************************/
 static int OpenFilter( vlc_object_t *p_this )
 {
     filter_t *p_filter = (filter_t*)p_this;
+    filter_sys_t *p_sys = (filter_sys_t *)malloc( sizeof( filter_sys_t ) );
+    if( !p_sys )
+        return VLC_ENOMEM;
+    p_filter->p_sys = p_sys;
+    p_filter->p_sys->i_blendcfg = -1;
 
     /* Check if we can handle that format.
      * We could try to use a chroma filter if we can't. */
     int in_chroma = p_filter->fmt_in.video.i_chroma;
     int out_chroma = p_filter->fmt_out.video.i_chroma;
+
     if( ( in_chroma  != VLC_CODEC_YUVA && in_chroma  != VLC_CODEC_I420 &&
           in_chroma  != VLC_CODEC_YV12 && in_chroma  != VLC_CODEC_YUVP &&
           in_chroma  != VLC_CODEC_RGBA ) ||
@@ -118,6 +164,27 @@ static int OpenFilter( vlc_object_t *p_this )
     {
         return VLC_EGENERIC;
     }
+    for( int i = 0; p_blend_cfg[i].src != 0; i++ )
+    {
+        if( p_blend_cfg[i].src != p_filter->fmt_in.video.i_chroma )
+            continue;
+        for( int j = 0; p_blend_cfg[i].p_dst[j] != 0; j++ )
+        {
+            if( p_blend_cfg[i].p_dst[j] != p_filter->fmt_out.video.i_chroma )
+                continue;
+            p_sys->i_blendcfg = i;
+        }
+    }
+
+    if( p_sys->i_blendcfg == -1 )
+    {
+       msg_Dbg( p_filter, "no matching alpha blending routine "
+             "(chroma: %4.4s -> %4.4s)",
+             (char *)&p_filter->fmt_in.video.i_chroma,
+             (char *)&p_filter->fmt_out.video.i_chroma );
+      free( p_sys );
+      return VLC_EGENERIC;
+   }
 
     /* Misc init */
     p_filter->pf_video_blend = Blend;
@@ -134,7 +201,8 @@ static int OpenFilter( vlc_object_t *p_this )
  *****************************************************************************/
 static void CloseFilter( vlc_object_t *p_this )
 {
-    (void)p_this;
+    filter_t *p_filter = (filter_t*)p_this;
+    free( p_filter->p_sys );
 }
 
 /****************************************************************************
@@ -142,40 +210,6 @@ static void CloseFilter( vlc_object_t *p_this )
  ****************************************************************************
  * This function is called just after the thread is launched.
  ****************************************************************************/
-typedef void (*BlendFunction)( filter_t *,
-                       picture_t *, const picture_t *,
-                       int , int , int , int , int );
-
-#define VLC_CODEC_PLANAR_420 { VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_YV12, 0 }
-#define VLC_CODEC_PACKED_422 { VLC_CODEC_YUYV, VLC_CODEC_UYVY, VLC_CODEC_YVYU, VLC_CODEC_VYUY, 0 }
-#define VLC_CODEC_RGB_16 { VLC_CODEC_RGB15, VLC_CODEC_RGB16, 0 }
-#define VLC_CODEC_RGB_24 { VLC_CODEC_RGB24, VLC_CODEC_RGB32, 0 }
-
-#define BLEND_CFG( fccSrc, fctPlanar, fctPacked, fctRgb16, fctRgb24  ) \
-    { .src = fccSrc, .p_dst = VLC_CODEC_PLANAR_420, .pf_blend = fctPlanar }, \
-    { .src = fccSrc, .p_dst = VLC_CODEC_PACKED_422, .pf_blend = fctPacked }, \
-    { .src = fccSrc, .p_dst = VLC_CODEC_RGB_16,     .pf_blend = fctRgb16  }, \
-    { .src = fccSrc, .p_dst = VLC_CODEC_RGB_24,     .pf_blend = fctRgb24  }
-
-static const struct
-{
-    vlc_fourcc_t src;
-    vlc_fourcc_t p_dst[16];
-    BlendFunction pf_blend;
-} p_blend_cfg[] = {
-
-    BLEND_CFG( VLC_CODEC_YUVA, BlendYUVAI420, BlendYUVAYUVPacked, BlendYUVARV16, BlendYUVARV24 ),
-
-    BLEND_CFG( VLC_CODEC_YUVP, BlendPalI420, BlendPalYUVPacked, BlendPalRV, BlendPalRV ),
-
-    BLEND_CFG( VLC_CODEC_RGBA, BlendRGBAI420, BlendRGBAYUVPacked, BlendRGBAR16, BlendRGBAR24 ),
-
-    BLEND_CFG( VLC_CODEC_I420, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ),
-
-    BLEND_CFG( VLC_CODEC_YV12, BlendI420I420, BlendI420YUVPacked, BlendI420R16, BlendI420R24 ),
-
-    { 0, {0,}, NULL }
-};
 
 static void Blend( filter_t *p_filter,
                    picture_t *p_dst, const picture_t *p_src,
@@ -204,26 +238,11 @@ static void Blend( filter_t *p_filter,
              (char *)&p_filter->fmt_out.video.i_chroma );
 #endif
 
-    for( int i = 0; p_blend_cfg[i].src != 0; i++ )
-    {
-        if( p_blend_cfg[i].src != p_filter->fmt_in.video.i_chroma )
-            continue;
-        for( int j = 0; p_blend_cfg[i].p_dst[j] != 0; j++ )
-        {
-            if( p_blend_cfg[i].p_dst[j] != p_filter->fmt_out.video.i_chroma )
-                continue;
 
-            p_blend_cfg[i].pf_blend( p_filter, p_dst, p_src,
-                                     i_x_offset, i_y_offset,
-                                     i_width, i_height, i_alpha );
-            return;
-        }
-    }
+    p_blend_cfg[p_filter->p_sys->i_blendcfg].pf_blend( p_filter, p_dst, p_src,
+                            i_x_offset, i_y_offset,
+                            i_width, i_height, i_alpha );
 
-    msg_Dbg( p_filter, "no matching alpha blending routine "
-             "(chroma: %4.4s -> %4.4s)",
-             (char *)&p_filter->fmt_in.video.i_chroma,
-             (char *)&p_filter->fmt_out.video.i_chroma );
 }
 
 /***********************************************************************



More information about the vlc-commits mailing list