1 /*****************************************************************************
2 * t140.c : trivial T.140 text encoder
3 *****************************************************************************
4 * Copyright © 2007 Rémi Denis-Courmont
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.
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.
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 *****************************************************************************/
26 #include <vlc_common.h>
27 #include <vlc_plugin.h>
28 #include <vlc_codec.h>
31 static int Open ( vlc_object_t
* );
32 static void Close( vlc_object_t
* );
35 set_description( N_("T.140 text encoder") )
36 set_capability( "encoder", 100 )
37 set_callbacks( Open
, Close
)
41 static block_t
*Encode ( encoder_t
*, subpicture_t
* );
44 static int Open( vlc_object_t
*p_this
)
46 encoder_t
*p_enc
= (encoder_t
*)p_this
;
48 switch( p_enc
->fmt_out
.i_codec
)
51 if( ( p_enc
->fmt_out
.subs
.psz_encoding
!= NULL
)
52 && strcasecmp( p_enc
->fmt_out
.subs
.psz_encoding
, "utf8" )
53 && strcasecmp( p_enc
->fmt_out
.subs
.psz_encoding
, "UTF-8" ) )
55 msg_Err( p_this
, "Only UTF-8 encoding supported" );
58 case VLC_CODEC_ITU_T140
:
65 p_enc
->fmt_out
.i_codec
= VLC_CODEC_ITU_T140
;
70 p_enc
->pf_encode_sub
= Encode
;
71 p_enc
->fmt_out
.i_cat
= SPU_ES
;
76 static void Close( vlc_object_t
*p_this
)
82 static block_t
*Encode( encoder_t
*p_enc
, subpicture_t
*p_spu
)
86 subpicture_region_t
*p_region
;
93 p_region
= p_spu
->p_region
;
94 if( ( p_region
== NULL
)
95 || ( p_region
->fmt
.i_chroma
!= VLC_CODEC_TEXT
)
96 || ( p_region
->psz_text
== NULL
) )
99 /* This should already be UTF-8 encoded, so not much effort... */
100 len
= strlen( p_region
->psz_text
);
101 p_block
= block_New( p_enc
, len
);
102 memcpy( p_block
->p_buffer
, p_region
->psz_text
, len
);
104 p_block
->i_pts
= p_block
->i_dts
= p_spu
->i_start
;
105 if( !p_spu
->b_ephemer
&& ( p_spu
->i_stop
> p_spu
->i_start
) )
106 p_block
->i_length
= p_spu
->i_stop
- p_spu
->i_start
;