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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * t140.c : trivial T.140 text encoder
  3.  *****************************************************************************
  4.  * Copyright © 2007 Rémi Denis-Courmont
  5.  * $Id: 2b891998941200ac70844ee0a03007eea56157c8 $
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  20.  *****************************************************************************/
  21. #ifdef HAVE_CONFIG_H
  22. # include "config.h"
  23. #endif
  24. #include <vlc_common.h>
  25. #include <vlc_plugin.h>
  26. #include <vlc_vout.h>
  27. #include <vlc_codec.h>
  28. #include <vlc_sout.h>
  29. static int  Open ( vlc_object_t * );
  30. static void Close( vlc_object_t * );
  31. vlc_module_begin ()
  32.     add_submodule ()
  33.     set_description( N_("T.140 text encoder") )
  34.     set_capability( "encoder", 100 )
  35.     set_callbacks( Open, Close )
  36. vlc_module_end ()
  37. static block_t *Encode ( encoder_t *, subpicture_t * );
  38. static int Open( vlc_object_t *p_this )
  39. {
  40.     encoder_t *p_enc = (encoder_t *)p_this;
  41.     switch( p_enc->fmt_out.i_codec )
  42.     {
  43.         case VLC_FOURCC('s','u','b','t'):
  44.             if( ( p_enc->fmt_out.subs.psz_encoding != NULL )
  45.              && strcasecmp( p_enc->fmt_out.subs.psz_encoding, "utf8" )
  46.              && strcasecmp( p_enc->fmt_out.subs.psz_encoding, "UTF-8" ) )
  47.             {
  48.                 msg_Err( p_this, "Only UTF-8 encoding supported" );
  49.                 return VLC_EGENERIC;
  50.             }
  51.         case VLC_FOURCC('t','1','4','0'):
  52.             break;
  53.         default:
  54.             if( !p_enc->b_force )
  55.                 return VLC_EGENERIC;
  56.             p_enc->fmt_out.i_codec = VLC_FOURCC('t','1','4','0');
  57.     }
  58.     p_enc->p_sys = NULL;
  59.     p_enc->pf_encode_sub = Encode;
  60.     p_enc->fmt_out.i_cat = SPU_ES;
  61.     return VLC_SUCCESS;
  62. }
  63. static void Close( vlc_object_t *p_this )
  64. {
  65.     (void)p_this;
  66. }
  67. static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu )
  68. {
  69.     subpicture_region_t *p_region;
  70.     block_t *p_block;
  71.     size_t len;
  72.     if( p_spu == NULL )
  73.         return NULL;
  74.     p_region = p_spu->p_region;
  75.     if( ( p_region == NULL )
  76.      || ( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') )
  77.      || ( p_region->psz_text == NULL ) )
  78.         return NULL;
  79.     /* This should already be UTF-8 encoded, so not much effort... */
  80.     len = strlen( p_region->psz_text );
  81.     p_block = block_New( p_enc, len );
  82.     memcpy( p_block->p_buffer, p_region->psz_text, len );
  83.     p_block->i_pts = p_block->i_dts = p_spu->i_start;
  84.     if( !p_spu->b_ephemer && ( p_spu->i_stop > p_spu->i_start ) )
  85.         p_block->i_length = p_spu->i_stop - p_spu->i_start;
  86.     return p_block;
  87. }