]> git.sesse.net Git - vlc/commitdiff
Added blend filter helpers.
authorLaurent Aimar <fenrir@videolan.org>
Thu, 4 Jun 2009 21:44:30 +0000 (23:44 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Fri, 5 Jun 2009 18:23:38 +0000 (20:23 +0200)
include/vlc_filter.h
src/Makefile.am
src/libvlccore.sym
src/misc/filter.c [new file with mode: 0644]

index 1396008e6872d50acd5f77ae5679258f1ba3de81..cb0f7456c9be1fdce399647740a90d884a24d8bd 100644 (file)
@@ -181,6 +181,29 @@ static inline block_t *filter_NewAudioBuffer( filter_t *p_filter, int i_size )
     return p_block;
 }
 
+/**
+ * It creates a blend filter
+ */
+VLC_EXPORT( filter_t *, filter_NewBlend, ( vlc_object_t *, vlc_fourcc_t i_chroma_dst ) );
+
+/**
+ * It configures blend filter parameters that are allowed to changed
+ * after the creation.
+ */
+VLC_EXPORT( int, filter_ConfigureBlend, ( filter_t *, int i_dst_width, int i_dst_height, const video_format_t *p_src ) );
+
+/**
+ * It blends a picture into another one.
+ *
+ * The input picture is not modified and not released.
+ */
+VLC_EXPORT( int, filter_Blend, ( filter_t *, picture_t *p_dst, int i_dst_x, int i_dst_y, picture_t *p_src, int i_alpha ) );
+
+/**
+ * It destroys a blend filter created by filter_NewBlend.
+ */
+VLC_EXPORT( void, filter_DeleteBlend, ( filter_t * ) );
+
 /**
  * Create a picture_t *(*)( filter_t *, picture_t * ) compatible wrapper
  * using a void (*)( filter_t *, picture_t *, picture_t * ) function
index 5ead2ac9bc3674eb1a172bc31bdb475cd2b79343..42250bea338baf3b208afc08c4f5b953fe3e09bb 100644 (file)
@@ -409,6 +409,7 @@ SOURCES_libvlc_common = \
        misc/xml.c \
        misc/devices.c \
        extras/libc.c \
+       misc/filter.c \
        misc/filter_chain.c \
        $(NULL)
 
index 89bb140149d9e300c2f9b686387e77ce6844c99f..c2f26880c271972efb24703437212d097dbbfadc 100644 (file)
@@ -122,6 +122,7 @@ es_format_Clean
 es_format_Copy
 es_format_Init
 filename_sanitize
+filter_Blend
 filter_chain_AppendFilter
 filter_chain_AppendFromString
 filter_chain_AudioFilter
@@ -135,6 +136,9 @@ __filter_chain_New
 filter_chain_Reset
 filter_chain_SubFilter
 filter_chain_VideoFilter
+filter_ConfigureBlend
+filter_DeleteBlend
+filter_NewBlend
 FromLocale
 FromLocaleDup
 GetFallbackEncoding
diff --git a/src/misc/filter.c b/src/misc/filter.c
new file mode 100644 (file)
index 0000000..4024a12
--- /dev/null
@@ -0,0 +1,108 @@
+/*****************************************************************************
+ * filter.c : filter_t helpers.
+ *****************************************************************************
+ * Copyright (C) 2009 Laurent Aimar
+ * $Id$
+ *
+ * Author: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <libvlc.h>
+#include <vlc_filter.h>
+
+filter_t *filter_NewBlend( vlc_object_t *p_this,
+                           vlc_fourcc_t i_chroma_dst )
+{
+    filter_t *p_blend = vlc_custom_create( p_this, sizeof(*p_blend),
+                                           VLC_OBJECT_GENERIC, "blend" );
+    if( !p_blend )
+        return NULL;
+
+    es_format_Init( &p_blend->fmt_in, VIDEO_ES, 0 );
+
+    es_format_Init( &p_blend->fmt_out, VIDEO_ES, 0 );
+
+    p_blend->fmt_out.i_codec        = 
+    p_blend->fmt_out.video.i_chroma = i_chroma_dst;
+
+    /* The blend module will be loaded when needed with the real
+    * input format */
+    p_blend->p_module = NULL;
+
+    /* */
+    vlc_object_attach( p_blend, p_this );
+
+    return p_blend;
+}
+
+int filter_ConfigureBlend( filter_t *p_blend,
+                           int i_dst_width, int i_dst_height,
+                           const video_format_t *p_src )
+{
+    /* */
+    if( p_blend->p_module &&
+        p_blend->fmt_in.video.i_chroma != p_src->i_chroma )
+    {
+        /* The chroma is not the same, we need to reload the blend module */
+        module_unneed( p_blend, p_blend->p_module );
+        p_blend->p_module = NULL;
+    }
+
+    /* */
+
+    p_blend->fmt_in.i_codec = p_src->i_chroma;
+    p_blend->fmt_in.video   = *p_src;
+
+    /* */
+    p_blend->fmt_out.video.i_width          =
+    p_blend->fmt_out.video.i_visible_width  = i_dst_width;
+    p_blend->fmt_out.video.i_height         =
+    p_blend->fmt_out.video.i_visible_height = i_dst_height;
+
+    /* */
+    if( !p_blend->p_module )
+        p_blend->p_module = module_need( p_blend, "video blending", NULL, false );
+    if( !p_blend->p_module )
+        return VLC_EGENERIC;
+    return VLC_SUCCESS;
+}
+
+int filter_Blend( filter_t *p_blend,
+                  picture_t *p_dst, int i_dst_x, int i_dst_y,
+                  picture_t *p_src, int i_alpha )
+{
+    if( !p_blend->p_module )
+        return VLC_EGENERIC;
+
+    p_blend->pf_video_blend( p_blend, p_dst, p_src, i_dst_x, i_dst_y, i_alpha );
+    return VLC_SUCCESS;
+}
+
+void filter_DeleteBlend( filter_t *p_blend )
+{
+    if( p_blend->p_module )
+        module_unneed( p_blend, p_blend->p_module );
+
+    vlc_object_detach( p_blend );
+    vlc_object_release( p_blend );
+}
+