marq.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:8k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * marq.c : marquee display video plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2004 VideoLAN
  5.  * $Id: time.c 8751 2004-09-20 21:51:41Z gbazin $
  6.  *
  7.  * Authors: Mark Moriarty
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <stdlib.h>                                      /* malloc(), free() */
  27. #include <string.h>
  28. #include <vlc/vlc.h>
  29. #include <vlc/vout.h>
  30. #include "vlc_filter.h"
  31. #include "vlc_block.h"
  32. #include "osd.h"
  33. /*****************************************************************************
  34.  * Local prototypes
  35.  *****************************************************************************/
  36. static int  CreateFilter ( vlc_object_t * );
  37. static void DestroyFilter( vlc_object_t * );
  38. static subpicture_t *Filter( filter_t *, mtime_t );
  39. static int MarqueeCallback( vlc_object_t *p_this, char const *psz_var,
  40.                             vlc_value_t oldval, vlc_value_t newval,
  41.                             void *p_data );
  42. /*****************************************************************************
  43.  * filter_sys_t: marquee filter descriptor
  44.  *****************************************************************************/
  45. struct filter_sys_t
  46. {
  47.     int i_xoff, i_yoff;  /* offsets for the display string in the video window */
  48.     int i_timeout;
  49.     char *psz_marquee;    /* marquee string */
  50.     time_t last_time;
  51.     vlc_bool_t b_need_update;
  52. };
  53. #define MSG_TEXT N_("Marquee text")
  54. #define MSG_LONGTEXT N_("Marquee text to display")
  55. #define POSX_TEXT N_("X offset, from left")
  56. #define POSX_LONGTEXT N_("X offset, from the left screen edge" )
  57. #define POSY_TEXT N_("Y offset, from the top")
  58. #define POSY_LONGTEXT N_("Y offset, down from the top" )
  59. #define TIMEOUT_TEXT N_("Marquee timeout")
  60. #define TIMEOUT_LONGTEXT N_("Defines the time the marquee must remain " 
  61.                             "displayed, in milliseconds. Default value is " 
  62.                             "0 (remain forever).")
  63. /*****************************************************************************
  64.  * Module descriptor
  65.  *****************************************************************************/
  66. vlc_module_begin();
  67.     set_capability( "sub filter", 0 );
  68.     set_callbacks( CreateFilter, DestroyFilter );
  69.     add_string( "marq-marquee", "Marquee", NULL, MSG_TEXT, MSG_LONGTEXT, VLC_FALSE );
  70.     add_integer( "marq-x", 0, NULL, POSX_TEXT, POSX_LONGTEXT, VLC_FALSE );
  71.     add_integer( "marq-y", 0, NULL, POSY_TEXT, POSY_LONGTEXT, VLC_FALSE );
  72.     add_integer( "marq-timeout", 0, NULL, TIMEOUT_TEXT, TIMEOUT_LONGTEXT,
  73.                  VLC_FALSE );
  74.     set_description( _("Marquee display sub filter") );
  75.     add_shortcut( "marq" );
  76. vlc_module_end();
  77. /*****************************************************************************
  78.  * CreateFilter: allocates marquee video filter
  79.  *****************************************************************************/
  80. static int CreateFilter( vlc_object_t *p_this )
  81. {
  82.     filter_t *p_filter = (filter_t *)p_this;
  83.     filter_sys_t *p_sys;
  84.     vlc_object_t *p_pl;
  85.     /* Allocate structure */
  86.     p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) );
  87.     if( p_sys == NULL )
  88.     {
  89.         msg_Err( p_filter, "out of memory" );
  90.         return VLC_ENOMEM;
  91.     }
  92.     /* hook to the playlist */
  93.     p_pl = vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  94.     if( !p_pl )
  95.     {
  96.         return VLC_ENOOBJ;
  97.     }
  98. /* p_access->p_libvlc p_demux->p_libvlc */
  99.     p_sys->i_xoff = var_CreateGetInteger( p_pl , "marq-x" );
  100.     p_sys->i_yoff = var_CreateGetInteger( p_pl , "marq-y" );
  101.     p_sys->i_timeout = var_CreateGetInteger( p_pl , "marq-timeout" );
  102.     p_sys->psz_marquee =  var_CreateGetString( p_pl, "marq-marquee" );
  103.     var_AddCallback( p_pl, "marq-x", MarqueeCallback, p_sys );
  104.     var_AddCallback( p_pl, "marq-y", MarqueeCallback, p_sys );
  105.     var_AddCallback( p_pl, "marq-marquee", MarqueeCallback, p_sys );
  106.     var_AddCallback( p_pl, "marq-timeout", MarqueeCallback, p_sys );
  107.     vlc_object_release( p_pl );
  108.     /* Misc init */
  109.     p_filter->pf_sub_filter = Filter;
  110.     p_sys->last_time = ((time_t)-1);
  111.     p_sys->b_need_update = VLC_TRUE;
  112.     return VLC_SUCCESS;
  113. }
  114. /*****************************************************************************
  115.  * DestroyFilter: destroy marquee video filter
  116.  *****************************************************************************/
  117. static void DestroyFilter( vlc_object_t *p_this )
  118. {
  119.     filter_t *p_filter = (filter_t *)p_this;
  120.     filter_sys_t *p_sys = p_filter->p_sys;
  121.     vlc_object_t *p_pl;
  122.     if( p_sys->psz_marquee ) free( p_sys->psz_marquee );
  123.     free( p_sys );
  124.     /* Delete the marquee variables from playlist */
  125.     p_pl = vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  126.     if( !p_pl )
  127.     {
  128.         return;
  129.     }
  130.     var_Destroy( p_pl , "marq-marquee" );
  131.     var_Destroy( p_pl , "marq-x" );
  132.     var_Destroy( p_pl , "marq-y" );
  133.     var_Destroy( p_pl , "marq-timeout" );
  134.     vlc_object_release( p_pl );
  135. }
  136. /****************************************************************************
  137.  * Filter: the whole thing
  138.  ****************************************************************************
  139.  * This function outputs subpictures at regular time intervals.
  140.  ****************************************************************************/
  141. static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
  142. {
  143.     filter_sys_t *p_sys = p_filter->p_sys;
  144.     subpicture_t *p_spu;
  145.     video_format_t fmt;
  146.     time_t t;
  147.     if( p_sys->last_time == time( NULL ) )
  148.     {
  149.         return NULL;
  150.     }
  151.     if( p_sys->b_need_update == VLC_FALSE )
  152.     {
  153.         return NULL;
  154.     }
  155.     p_spu = p_filter->pf_sub_buffer_new( p_filter );
  156.     if( !p_spu ) return NULL;
  157.     memset( &fmt, 0, sizeof(video_format_t) );
  158.     fmt.i_chroma = VLC_FOURCC('T','E','X','T');
  159.     fmt.i_aspect = 0;
  160.     fmt.i_width = fmt.i_height = 0;
  161.     fmt.i_x_offset = 0;
  162.     fmt.i_y_offset = 0;
  163.     p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
  164.     if( !p_spu->p_region )
  165.     {
  166.         p_filter->pf_sub_buffer_del( p_filter, p_spu );
  167.         return NULL;
  168.     }
  169.     t = p_sys->last_time = time( NULL );
  170.     p_spu->p_region->psz_text = strdup(p_sys->psz_marquee);
  171.     p_spu->i_start = date;
  172.     p_spu->i_stop  = p_sys->i_timeout == 0 ? 0 : date + p_sys->i_timeout * 1000;
  173.     p_spu->b_ephemer = VLC_TRUE;
  174.     p_spu->b_absolute = VLC_FALSE;
  175.     p_spu->i_x = p_sys->i_xoff;
  176.     p_spu->i_y = p_sys->i_yoff;
  177.     p_spu->i_flags = OSD_ALIGN_LEFT|OSD_ALIGN_TOP ;
  178.     p_sys->b_need_update = VLC_FALSE;
  179.     return p_spu;
  180. }
  181. /**********************************************************************
  182.  * Callback to update params on the fly
  183.  **********************************************************************/
  184. static int MarqueeCallback( vlc_object_t *p_this, char const *psz_var,
  185.                             vlc_value_t oldval, vlc_value_t newval,
  186.                             void *p_data )
  187. {
  188.     filter_sys_t *p_sys = (filter_sys_t *) p_data;
  189.     if( !strncmp( psz_var, "marq-marquee", 7 ) )
  190.     {
  191.         if( p_sys->psz_marquee ) free( p_sys->psz_marquee );
  192.         p_sys->psz_marquee = strdup( newval.psz_string );
  193.     }
  194.     else if ( !strncmp( psz_var, "marq-x", 6 ) )
  195.     {
  196.         p_sys->i_xoff = newval.i_int;
  197.     }
  198.     else if ( !strncmp( psz_var, "marq-y", 6 ) )
  199.     {
  200.         p_sys->i_yoff = newval.i_int;
  201.     }
  202.     else if ( !strncmp( psz_var, "marq-timeout", 12 ) )
  203.     {
  204.         p_sys->i_timeout = newval.i_int;
  205.     }
  206.     p_sys->b_need_update = VLC_TRUE;
  207.     return VLC_SUCCESS;
  208. }