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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * video_text.c : text manipulation functions
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2004 VideoLAN
  5.  * $Id: video_text.c 8722 2004-09-17 14:47:01Z gbazin $
  6.  *
  7.  * Author: Sigmund Augdal <sigmunau@idi.ntnu.no>
  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. #include <vlc/vout.h>
  24. #include "vlc_block.h"
  25. #include "vlc_filter.h"
  26. #include "osd.h"
  27. /**
  28.  * brief Show text on the video for some time
  29.  * param p_vout pointer to the vout the text is to be showed on
  30.  * param i_channel Subpicture channel
  31.  * param psz_string The text to be shown
  32.  * param p_style Pointer to a struct with text style info
  33.  * param i_flags flags for alignment and such
  34.  * param i_hmargin horizontal margin in pixels
  35.  * param i_vmargin vertical margin in pixels
  36.  * param i_duration Amount of time the text is to be shown.
  37.  */
  38. int vout_ShowTextRelative( vout_thread_t *p_vout, int i_channel,
  39.                            char *psz_string, text_style_t *p_style,
  40.                            int i_flags, int i_hmargin, int i_vmargin,
  41.                            mtime_t i_duration )
  42. {
  43.     mtime_t i_now = mdate();
  44.     return vout_ShowTextAbsolute( p_vout, i_channel, psz_string,
  45.                                   p_style, i_flags, i_hmargin, i_vmargin,
  46.                                   i_now, i_now + i_duration );
  47. }
  48. /**
  49.  * brief Show text on the video from a given start date to a given end date
  50.  * param p_vout pointer to the vout the text is to be showed on
  51.  * param i_channel Subpicture channel
  52.  * param psz_string The text to be shown
  53.  * param p_style Pointer to a struct with text style info
  54.  * param i_flags flags for alignment and such
  55.  * param i_hmargin horizontal margin in pixels
  56.  * param i_vmargin vertical margin in pixels
  57.  * param i_start the time when this string is to appear on the video
  58.  * param i_stop the time when this string should stop to be displayed
  59.  *               if this is 0 the string will be shown untill the next string
  60.  *               is about to be shown
  61.  */
  62. int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel,
  63.                            char *psz_string, text_style_t *p_style,
  64.                            int i_flags, int i_hmargin, int i_vmargin,
  65.                            mtime_t i_start, mtime_t i_stop )
  66. {
  67.     subpicture_t *p_spu;
  68.     video_format_t fmt;
  69.     if( !psz_string ) return VLC_EGENERIC;
  70.     p_spu = spu_CreateSubpicture( p_vout->p_spu );
  71.     if( !p_spu ) return VLC_EGENERIC;
  72.     /* Create a new subpicture region */
  73.     memset( &fmt, 0, sizeof(video_format_t) );
  74.     fmt.i_chroma = VLC_FOURCC('T','E','X','T');
  75.     fmt.i_aspect = 0;
  76.     fmt.i_width = fmt.i_height = 0;
  77.     fmt.i_x_offset = fmt.i_y_offset = 0;
  78.     p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_vout), &fmt );
  79.     if( !p_spu->p_region )
  80.     {
  81.         msg_Err( p_vout, "cannot allocate SPU region" );
  82.         spu_DestroySubpicture( p_vout->p_spu, p_spu );
  83.         return VLC_EGENERIC;
  84.     }
  85.     p_spu->p_region->psz_text = strdup( psz_string );
  86.     p_spu->i_start = i_start;
  87.     p_spu->i_stop = i_stop;
  88.     p_spu->b_ephemer = VLC_TRUE;
  89.     p_spu->b_absolute = VLC_FALSE;
  90.     p_spu->i_x = i_hmargin;
  91.     p_spu->i_y = i_vmargin;
  92.     p_spu->i_flags = i_flags;
  93.     p_spu->i_channel = i_channel;
  94.     spu_DisplaySubpicture( p_vout->p_spu, p_spu );
  95.     return VLC_SUCCESS;
  96. }
  97. /**
  98.  * brief Write an informative message at the default location,
  99.  *        for the default duration and only if the OSD option is enabled.
  100.  * param p_caller The object that called the function.
  101.  * param i_channel Subpicture channel
  102.  * param psz_format printf style formatting
  103.  **/
  104. void __vout_OSDMessage( vlc_object_t *p_caller, int i_channel,
  105.                         char *psz_format, ... )
  106. {
  107.     vout_thread_t *p_vout;
  108.     char *psz_string;
  109.     va_list args;
  110.     if( !config_GetInt( p_caller, "osd" ) ) return;
  111.     p_vout = vlc_object_find( p_caller, VLC_OBJECT_VOUT, FIND_ANYWHERE );
  112.     if( p_vout )
  113.     {
  114.         va_start( args, psz_format );
  115.         vasprintf( &psz_string, psz_format, args );
  116.         vout_ShowTextRelative( p_vout, i_channel, psz_string, NULL,
  117.                                OSD_ALIGN_TOP|OSD_ALIGN_RIGHT, 30,20,1000000 );
  118.         vlc_object_release( p_vout );
  119.         free( psz_string );
  120.         va_end( args );
  121.     }
  122. }