sub.h 7.14 KB
Newer Older
1
2
3
4
/*****************************************************************************
 * sub.h
 *****************************************************************************
 * Copyright (C) 2001 VideoLAN
gbazin's avatar
   
gbazin committed
5
 * $Id: sub.h,v 1.6 2003/07/24 21:50:28 gbazin Exp $
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 *
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

#define SUB_TYPE_MICRODVD   0x00
#define SUB_TYPE_SUBRIP     0x01
#define SUB_TYPE_SSA1       0x02
#define SUB_TYPE_SSA2_4     0x03
28
#define SUB_TYPE_VPLAYER    0x04
29
#define SUB_TYPE_SAMI       0x05
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#define SUB_TYPE_UNKNOWN    0xffff

typedef struct subtitle_s
{
    mtime_t i_start;
    mtime_t i_stop;

    char    *psz_text;
} subtitle_t;


typedef struct subtitle_demux_s
{
    VLC_COMMON_MEMBERS
    
    module_t        *p_module;
    
    int     (*pf_open) ( struct subtitle_demux_s *p_sub, 
                         input_thread_t*p_input, 
                         char *psz_name,
                         mtime_t i_microsecperframe );
    int     (*pf_demux)( struct subtitle_demux_s *p_sub, mtime_t i_maxdate );
    int     (*pf_seek) ( struct subtitle_demux_s *p_sub, mtime_t i_date );
    void    (*pf_close)( struct subtitle_demux_s *p_sub );
    

    /* *** private *** */
    input_thread_t  *p_input;
    int             i_sub_type;
    
    int             i_previously_selected; // to make pf_seek
    es_descriptor_t *p_es;
    
    int             i_subtitle;
    int             i_subtitles;
    subtitle_t      *subtitle;

} subtitle_demux_t;

/*****************************************************************************
 *
 * I made somes wrappers : So use them !
 *  I think you shouldn't need access to subtitle_demux_t members else said
 *  it to me.
 *
 *****************************************************************************/


/*****************************************************************************
 * subtitle_New: Start a new subtitle demux instance (but subtitle ES isn't 
 *               selected by default.
 *****************************************************************************
 * Return: NULL if failed, else a pointer on a new subtitle_demux_t.
 *
 * XXX: - if psz_name is NULL then --sub-file is read
 *      - i_microsecperframe is used only for microdvd file. (overriden
 *        by --sub-fps )
 *      - it's at this point that --sub-delay is applied
 *
 *****************************************************************************/
static inline subtitle_demux_t *subtitle_New( input_thread_t *p_input,
                                              char *psz_name,
                                              mtime_t i_microsecperframe );
/*****************************************************************************
 * subtitle_Select: Select the related subtitle ES.
 *****************************************************************************/
static inline void subtitle_Select( subtitle_demux_t *p_sub );

/*****************************************************************************
 * subtitle_Unselect: Unselect the related subtitle ES.
 *****************************************************************************/
static inline void subtitle_Unselect( subtitle_demux_t *p_sub );

/*****************************************************************************
 * subtitle_Demux: send subtitle to decoder from last date to i_max
 *****************************************************************************/
static inline int  subtitle_Demux( subtitle_demux_t *p_sub, mtime_t i_max );

/*****************************************************************************
 * subtitle_Seek: Seek to i_date
 *****************************************************************************/
static inline int  subtitle_Seek( subtitle_demux_t *p_sub, mtime_t i_date );

/*****************************************************************************
 * subtitle_Close: Stop ES decoder and free all memory included p_sub.
 *****************************************************************************/
static inline void subtitle_Close( subtitle_demux_t *p_sub );





/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/


static inline 
    subtitle_demux_t *subtitle_New( input_thread_t *p_input,
                                    char *psz_name,
                                    mtime_t i_microsecperframe )
{
    subtitle_demux_t *p_sub;

    p_sub = vlc_object_create( p_input, sizeof( subtitle_demux_t ) );
    p_sub->psz_object_name = "subtitle demux";
gbazin's avatar
   
gbazin committed
136
    vlc_object_attach( p_sub, p_input );
137
138
139
140
141
142
143
144
145
146
147
148
149
    p_sub->p_module = module_Need( p_sub, "subtitle demux", "" );

    if( p_sub->p_module &&
        p_sub->pf_open( p_sub,
                        p_input,
                        psz_name,
                        i_microsecperframe ) >=0 )
    {
        msg_Info( p_input, "subtitle started" );

    }
    else
    {
Christophe Massiot's avatar
Christophe Massiot committed
150
        msg_Warn( p_input, "failed to start subtitle demux" );
gbazin's avatar
   
gbazin committed
151
        vlc_object_detach( p_sub );
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
        if( p_sub->p_module )
        {
            module_Unneed( p_sub, p_sub->p_module );
        }
        vlc_object_destroy( p_sub );
        p_sub = NULL;
    }

    return( p_sub );
}

static inline void subtitle_Select( subtitle_demux_t *p_sub )
{
    if( p_sub && p_sub->p_es )
    {
        vlc_mutex_lock( &p_sub->p_input->stream.stream_lock );
        input_SelectES( p_sub->p_input, p_sub->p_es );
        vlc_mutex_unlock( &p_sub->p_input->stream.stream_lock );
        p_sub->i_previously_selected = 0;
    }
}
static inline void subtitle_Unselect( subtitle_demux_t *p_sub )
{
    if( p_sub && p_sub->p_es )
    {
        vlc_mutex_lock( &p_sub->p_input->stream.stream_lock );
        input_UnselectES( p_sub->p_input, p_sub->p_es );
        vlc_mutex_unlock( &p_sub->p_input->stream.stream_lock );
        p_sub->i_previously_selected = 0;
    }
}

static inline int subtitle_Demux( subtitle_demux_t *p_sub, mtime_t i_max )
{
    return( p_sub->pf_demux( p_sub, i_max ) );
}

static inline int subtitle_Seek( subtitle_demux_t *p_sub, mtime_t i_date )
{
    return( p_sub->pf_demux( p_sub, i_date ) );
}

static inline void subtitle_Close( subtitle_demux_t *p_sub )
{
    msg_Info( p_sub, "subtitle stopped" );
    if( p_sub )
    {
gbazin's avatar
   
gbazin committed
199
200
201
202
203
        vlc_object_detach( p_sub );
        if( p_sub->p_module )
        {
            module_Unneed( p_sub, p_sub->p_module );
        }
204
205
206
        vlc_object_destroy( p_sub );
    }
}