alphamask.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * alphamask.c : Alpha layer mask video filter for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2007 the VideoLAN team
  5.  * $Id: f6b969c075c39d0f3b731a5a1722ac99ea862ae0 $
  6.  *
  7.  * Authors: Antoine Cellerier <dionoea at videolan tod org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifdef HAVE_CONFIG_H
  27. # include "config.h"
  28. #endif
  29. #include <vlc_common.h>
  30. #include <vlc_plugin.h>
  31. #include <vlc_vout.h>
  32. #include <vlc_image.h>
  33. #include <vlc_filter.h>
  34. #define ALPHAMASK_HELP N_( 
  35.     "Use an image's alpha channel as a transparency mask." )
  36. #define MASK_TEXT N_("Transparency mask")
  37. #define MASK_LONGTEXT N_( 
  38.     "Alpha blending transparency mask. Uses a png alpha channel.")
  39. #define CFG_PREFIX "alphamask-"
  40. /*****************************************************************************
  41.  * Local prototypes
  42.  *****************************************************************************/
  43. static int  Create      ( vlc_object_t * );
  44. static void Destroy     ( vlc_object_t * );
  45. static picture_t *Filter( filter_t *, picture_t * );
  46. static void LoadMask( filter_t *, const char * );
  47. static int MaskCallback( vlc_object_t *, char const *,
  48.                          vlc_value_t, vlc_value_t, void * );
  49. /*****************************************************************************
  50.  * Module descriptor
  51.  *****************************************************************************/
  52. vlc_module_begin ()
  53.     set_description( N_("Alpha mask video filter") )
  54.     set_shortname( N_("Alpha mask" ))
  55.     set_help( ALPHAMASK_HELP )
  56.     set_category( CAT_VIDEO )
  57.     set_subcategory( SUBCAT_VIDEO_VFILTER )
  58.     set_capability( "video filter2", 0 )
  59.     add_shortcut( "alphamask" )
  60.     add_shortcut( "mask" )
  61.     set_callbacks( Create, Destroy )
  62.     add_string( CFG_PREFIX "mask", NULL, NULL, MASK_TEXT,
  63.                 MASK_LONGTEXT, false )
  64. vlc_module_end ()
  65. static const char *const ppsz_filter_options[] = {
  66.     "mask", NULL
  67. };
  68. struct filter_sys_t
  69. {
  70.     picture_t *p_mask;
  71.     vlc_mutex_t mask_lock;
  72. };
  73. static int Create( vlc_object_t *p_this )
  74. {
  75.     filter_t *p_filter = (filter_t *)p_this;
  76.     filter_sys_t *p_sys;
  77.     char *psz_string;
  78.     if( p_filter->fmt_in.video.i_chroma != VLC_FOURCC('Y','U','V','A') )
  79.     {
  80.         msg_Err( p_filter,
  81.                  "Unsupported input chroma "%4s". "
  82.                  "Alphamask can only use "YUVA".",
  83.                  (char*)&p_filter->fmt_in.video.i_chroma );
  84.         return VLC_EGENERIC;
  85.     }
  86.     /* Allocate structure */
  87.     p_filter->p_sys = malloc( sizeof( filter_sys_t ) );
  88.     if( p_filter->p_sys == NULL )
  89.         return VLC_ENOMEM;
  90.     p_sys = p_filter->p_sys;
  91.     config_ChainParse( p_filter, CFG_PREFIX, ppsz_filter_options,
  92.                        p_filter->p_cfg );
  93.     psz_string =
  94.         var_CreateGetStringCommand( p_filter, CFG_PREFIX "mask" );
  95.     if( psz_string && *psz_string )
  96.     {
  97.         LoadMask( p_filter, psz_string );
  98.         if( !p_sys->p_mask )
  99.             msg_Err( p_filter, "Error while loading mask (%s).",
  100.                      psz_string );
  101.     }
  102.     else
  103.        p_sys->p_mask = NULL;
  104.     free( psz_string );
  105.     vlc_mutex_init( &p_sys->mask_lock );
  106.     var_AddCallback( p_filter, CFG_PREFIX "mask", MaskCallback,
  107.                      p_filter );
  108.     p_filter->pf_video_filter = Filter;
  109.     return VLC_SUCCESS;
  110. }
  111. static void Destroy( vlc_object_t *p_this )
  112. {
  113.     filter_t *p_filter = (filter_t *)p_this;
  114.     filter_sys_t *p_sys = p_filter->p_sys;
  115.     var_DelCallback( p_filter, CFG_PREFIX "mask", MaskCallback,
  116.                      p_filter );
  117.     vlc_mutex_destroy( &p_sys->mask_lock );
  118.     if( p_sys->p_mask )
  119.         picture_Release( p_sys->p_mask );
  120.     free( p_sys );
  121. }
  122. static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
  123. {
  124.     filter_sys_t *p_sys = p_filter->p_sys;
  125.     vlc_mutex_lock( &p_sys->mask_lock );
  126.     plane_t *p_mask = p_sys->p_mask->p+A_PLANE;
  127.     plane_t *p_apic = p_pic->p+A_PLANE;
  128.     if(    p_mask->i_visible_pitch
  129.         != p_apic->i_visible_pitch
  130.         || p_mask->i_visible_lines
  131.         != p_apic->i_visible_lines )
  132.     {
  133.         msg_Err( p_filter,
  134.                   "Mask size (%d x %d) and image size (%d x %d) "
  135.                   "don't match. The mask will not be applied.",
  136.                   p_mask->i_visible_pitch,
  137.                   p_mask->i_visible_lines,
  138.                   p_apic->i_visible_pitch,
  139.                   p_apic->i_visible_lines );
  140.     }
  141.     else
  142.     {
  143.         plane_CopyPixels( p_apic, p_mask );
  144.     }
  145.     vlc_mutex_unlock( &p_sys->mask_lock );
  146.     return p_pic;
  147. }
  148. /* copied from video_filters/erase.c . Gruik ? */
  149. static void LoadMask( filter_t *p_filter, const char *psz_filename )
  150. {
  151.     image_handler_t *p_image;
  152.     video_format_t fmt_in, fmt_out;
  153.     memset( &fmt_in, 0, sizeof( video_format_t ) );
  154.     memset( &fmt_out, 0, sizeof( video_format_t ) );
  155.     fmt_out.i_chroma = VLC_FOURCC('Y','U','V','A');
  156.     if( p_filter->p_sys->p_mask )
  157.         picture_Release( p_filter->p_sys->p_mask );
  158.     p_image = image_HandlerCreate( p_filter );
  159.     p_filter->p_sys->p_mask =
  160.         image_ReadUrl( p_image, psz_filename, &fmt_in, &fmt_out );
  161.     image_HandlerDelete( p_image );
  162. }
  163. /*****************************************************************************
  164. * Callback to update params on the fly
  165. *****************************************************************************/
  166. static int MaskCallback( vlc_object_t *p_this, char const *psz_var,
  167.                          vlc_value_t oldval, vlc_value_t newval,
  168.                          void *p_data )
  169. {
  170.     VLC_UNUSED(p_this); VLC_UNUSED(oldval);
  171.     filter_t *p_filter = (filter_t *)p_data;
  172.     filter_sys_t *p_sys = p_filter->p_sys;
  173.     int i_ret = VLC_SUCCESS;
  174. #define VAR_IS( a ) !strcmp( psz_var, CFG_PREFIX a )
  175.     if( VAR_IS( "mask" ) )
  176.     {
  177.         vlc_mutex_lock( &p_sys->mask_lock );
  178.         if( newval.psz_string && *newval.psz_string )
  179.         {
  180.             LoadMask( p_filter, newval.psz_string );
  181.             if( !p_sys->p_mask )
  182.             {
  183.                 msg_Err( p_filter, "Error while loading mask (%s).",
  184.                          newval.psz_string );
  185.                 i_ret = VLC_EGENERIC;
  186.             }
  187.         }
  188.         else if( p_sys->p_mask )
  189.         {
  190.             picture_Release( p_sys->p_mask );
  191.             p_sys->p_mask = NULL;
  192.         }
  193.         vlc_mutex_unlock( &p_sys->mask_lock );
  194.     }
  195. #undef VAR_IS
  196.     return i_ret;
  197. }