1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2001-2004 VideoLAN
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
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.
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.
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 *****************************************************************************/
26 #define SUB_TYPE_MICRODVD 0x00
27 #define SUB_TYPE_SUBRIP 0x01
28 #define SUB_TYPE_SSA1 0x02
29 #define SUB_TYPE_SSA2_4 0x03
30 #define SUB_TYPE_VPLAYER 0x04
31 #define SUB_TYPE_SAMI 0x05
32 #define SUB_TYPE_SUBVIEWER 0x06
33 #define SUB_TYPE_VOBSUB 0x100
34 #define SUB_TYPE_UNKNOWN 0xffff
36 typedef struct subtitle_s
42 int i_vobsub_location;
46 typedef struct subtitle_demux_s
52 int (*pf_open) ( struct subtitle_demux_s *p_sub,
53 input_thread_t*p_input,
55 mtime_t i_microsecperframe );
56 int (*pf_demux)( struct subtitle_demux_s *p_sub, mtime_t i_maxdate );
57 int (*pf_seek) ( struct subtitle_demux_s *p_sub, mtime_t i_date );
58 void (*pf_close)( struct subtitle_demux_s *p_sub );
61 input_thread_t *p_input;
69 int i_previously_selected; /* to make pf_seek */
71 mtime_t i_original_mspf;
75 /*****************************************************************************
76 * subtitle_New: Start a new subtitle demux instance (but subtitle ES isn't
77 * selected by default.
78 *****************************************************************************
79 * Return: NULL if failed, else a pointer on a new subtitle_demux_t.
81 * XXX: - if psz_name is NULL then --sub-file is read
82 * - i_microsecperframe is used only for microdvd file. (overriden
85 *****************************************************************************/
86 static inline subtitle_demux_t *subtitle_New( input_thread_t *p_input,
88 mtime_t i_microsecperframe )
90 subtitle_demux_t *p_sub;
92 p_sub = vlc_object_create( p_input, sizeof( subtitle_demux_t ) );
93 p_sub->psz_object_name = "subtitle demux";
94 vlc_object_attach( p_sub, p_input );
95 p_sub->p_module = module_Need( p_sub, "subtitle demux", NULL, 0 );
97 if( p_sub->p_module &&
98 p_sub->pf_open( p_sub, p_input, psz_name, i_microsecperframe ) >=0 )
100 msg_Info( p_input, "subtitle started" );
105 msg_Warn( p_input, "failed to start subtitle demux" );
106 vlc_object_detach( p_sub );
107 if( p_sub->p_module )
109 module_Unneed( p_sub, p_sub->p_module );
111 vlc_object_destroy( p_sub );
118 /*****************************************************************************
119 * subtitle_Demux: send subtitle to decoder from last date to i_max
120 *****************************************************************************/
121 static inline int subtitle_Demux( subtitle_demux_t *p_sub, mtime_t i_max )
123 return( p_sub->pf_demux( p_sub, i_max ) );
126 /*****************************************************************************
127 * subtitle_Seek: Seek to i_date
128 *****************************************************************************/
129 static inline int subtitle_Seek( subtitle_demux_t *p_sub, mtime_t i_date )
131 return( p_sub->pf_seek( p_sub, i_date ) );
134 /*****************************************************************************
135 * subtitle_Close: Stop ES decoder and free all memory included p_sub.
136 *****************************************************************************/
137 static inline void subtitle_Close( subtitle_demux_t *p_sub )
139 msg_Info( p_sub, "subtitle stopped" );
142 p_sub->pf_close( p_sub );
143 vlc_object_detach( p_sub );
144 if( p_sub->p_module )
146 module_Unneed( p_sub, p_sub->p_module );
148 vlc_object_destroy( p_sub );