sub.h 5.14 KB
Newer Older
1
2
3
/*****************************************************************************
 * sub.h
 *****************************************************************************
hartman's avatar
hartman committed
4
 * Copyright (C) 2001-2004 VideoLAN
5
 * $Id: sub.h,v 1.19 2004/01/27 13:10:29 fenrir Exp $
6
7
 *
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8
 *
9
10
11
12
 * 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.
13
 *
14
15
16
17
18
19
20
21
22
23
 * 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.
 *****************************************************************************/

24
25
#include "../ps.h"

26
27
28
29
#define SUB_TYPE_MICRODVD   0x00
#define SUB_TYPE_SUBRIP     0x01
#define SUB_TYPE_SSA1       0x02
#define SUB_TYPE_SSA2_4     0x03
30
#define SUB_TYPE_VPLAYER    0x04
31
#define SUB_TYPE_SAMI       0x05
32
#define SUB_TYPE_VOBSUB     0x100
33
34
35
36
37
38
39
40
#define SUB_TYPE_UNKNOWN    0xffff

typedef struct subtitle_s
{
    mtime_t i_start;
    mtime_t i_stop;

    char    *psz_text;
41
42
    int     i_vobsub_location;

43
44
45
46
47
} subtitle_t;

typedef struct subtitle_demux_s
{
    VLC_COMMON_MEMBERS
48

49
    module_t        *p_module;
50
51
52

    int     (*pf_open) ( struct subtitle_demux_s *p_sub,
                         input_thread_t*p_input,
53
                         char *psz_name,
hartman's avatar
hartman committed
54
                         mtime_t i_microsecperframe );
55
56
57
58
59
    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 *** */
60
61
62
    input_thread_t      *p_input;
    int                 i_sub_type;

63
    char                *psz_header;
64
65
66
    int                 i_subtitle;
    int                 i_subtitles;
    subtitle_t          *subtitle;
67
    es_out_id_t         *p_es;
68
    int                 i_previously_selected; /* to make pf_seek */
hartman's avatar
hartman committed
69
    FILE                *p_vobsub_file;
70

71
72
73
} subtitle_demux_t;

/*****************************************************************************
74
 * subtitle_New: Start a new subtitle demux instance (but subtitle ES isn't
75
76
77
78
79
80
81
82
83
84
85
86
 *               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,
hartman's avatar
hartman committed
87
                                              mtime_t i_microsecperframe )
88
89
90
91
92
{
    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
93
    vlc_object_attach( p_sub, p_input );
94
95
96
    p_sub->p_module = module_Need( p_sub, "subtitle demux", "" );

    if( p_sub->p_module &&
hartman's avatar
hartman committed
97
        p_sub->pf_open( p_sub, p_input, psz_name, i_microsecperframe ) >=0 )
98
99
100
101
102
103
    {
        msg_Info( p_input, "subtitle started" );

    }
    else
    {
Christophe Massiot's avatar
Christophe Massiot committed
104
        msg_Warn( p_input, "failed to start subtitle demux" );
gbazin's avatar
   
gbazin committed
105
        vlc_object_detach( p_sub );
106
107
108
109
110
111
112
113
114
115
116
        if( p_sub->p_module )
        {
            module_Unneed( p_sub, p_sub->p_module );
        }
        vlc_object_destroy( p_sub );
        p_sub = NULL;
    }

    return( p_sub );
}

117
118
119
/*****************************************************************************
 * subtitle_Demux: send subtitle to decoder from last date to i_max
 *****************************************************************************/
120
121
122
123
124
static inline int subtitle_Demux( subtitle_demux_t *p_sub, mtime_t i_max )
{
    return( p_sub->pf_demux( p_sub, i_max ) );
}

125
126
127
/*****************************************************************************
 * subtitle_Seek: Seek to i_date
 *****************************************************************************/
128
129
static inline int subtitle_Seek( subtitle_demux_t *p_sub, mtime_t i_date )
{
130
    return( p_sub->pf_seek( p_sub, i_date ) );
131
132
}

133
134
135
/*****************************************************************************
 * subtitle_Close: Stop ES decoder and free all memory included p_sub.
 *****************************************************************************/
136
137
138
139
140
static inline void subtitle_Close( subtitle_demux_t *p_sub )
{
    msg_Info( p_sub, "subtitle stopped" );
    if( p_sub )
    {
gbazin's avatar
   
gbazin committed
141
        p_sub->pf_close( p_sub );
gbazin's avatar
   
gbazin committed
142
143
144
145
146
        vlc_object_detach( p_sub );
        if( p_sub->p_module )
        {
            module_Unneed( p_sub, p_sub->p_module );
        }
147
148
149
        vlc_object_destroy( p_sub );
    }
}
150