]> git.sesse.net Git - vlc/blob - modules/demux/mpeg/system.h
11e152461eae804cf8b54561a9e3d7d2cd8401ca
[vlc] / modules / demux / mpeg / system.h
1 /*****************************************************************************
2  * system.h: MPEG demultiplexing.
3  *****************************************************************************
4  * Copyright (C) 1999-2002 VideoLAN
5  * $Id: system.h,v 1.2 2002/08/30 22:22:24 massiot Exp $
6  *
7  * Authors: Christophe Massiot <massiot@via.ecp.fr>
8  *
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.
13  *
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.
18  *
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  *****************************************************************************/
23
24 /*
25  * Optional MPEG demultiplexing
26  */
27
28 /*****************************************************************************
29  * Constants
30  *****************************************************************************/
31 #define TS_PACKET_SIZE      188                       /* Size of a TS packet */
32 #define TS_SYNC_CODE        0x47                /* First byte of a TS packet */
33 #define PSI_SECTION_SIZE    4096            /* Maximum size of a PSI section */
34
35 #define PAT_UNINITIALIZED    (1 << 6)
36 #define PMT_UNINITIALIZED    (1 << 6)
37
38 #define PSI_IS_PAT          0x00
39 #define PSI_IS_PMT          0x01
40 #define UNKNOWN_PSI         0xff
41
42 /* ES streams types - see ISO/IEC 13818-1 table 2-29 numbers.
43  * these values are used in mpeg_system.c, and in
44  * the following plugins: mpeg_ts, mpeg_ts_dvbpsi, satellite. */
45 #define MPEG1_VIDEO_ES      0x01
46 #define MPEG2_VIDEO_ES      0x02
47 #define MPEG1_AUDIO_ES      0x03
48 #define MPEG2_AUDIO_ES      0x04
49 #define A52_AUDIO_ES        0x81
50 /* These ones might violate the usage : */
51 #define DVD_SPU_ES          0x82
52 #define LPCM_AUDIO_ES       0x83
53 #define SDDS_AUDIO_ES       0x84
54 #define DTS_AUDIO_ES        0x85
55 /* These ones are only here to work around a bug in VLS - VLS doesn't
56  * skip the first bytes of the PES payload (stream private ID) when
57  * streaming. This is incompatible with all equipments. 'B' is for
58  * buggy. Please note that they are associated with FOURCCs '***b'.
59  * --Meuuh 2002-08-30
60  */
61 #define A52B_AUDIO_ES       0x91
62 #define DVDB_SPU_ES         0x92
63 #define LPCMB_AUDIO_ES      0x93
64
65 /****************************************************************************
66  * psi_callback_t
67  ****************************************************************************
68  * Used by TS demux to handle a PSI, either with the builtin decoder, either
69  * with a library such as libdvbpsi
70  ****************************************************************************/
71 typedef void( * psi_callback_t )( 
72         input_thread_t  * p_input,
73         data_packet_t   * p_data,
74         es_descriptor_t * p_es,
75         vlc_bool_t        b_unit_start );
76
77
78 /****************************************************************************
79  * mpeg_demux_t
80  ****************************************************************************
81  * Demux callbacks exported by the helper plugin
82  ****************************************************************************/
83 typedef struct mpeg_demux_t
84 {
85     module_t * p_module;
86
87     ssize_t           (*pf_read_ps)  ( input_thread_t *, data_packet_t ** );
88     es_descriptor_t * (*pf_parse_ps) ( input_thread_t *, data_packet_t * );
89     void              (*pf_demux_ps) ( input_thread_t *, data_packet_t * );
90
91     ssize_t           (*pf_read_ts)  ( input_thread_t *, data_packet_t ** );
92     void              (*pf_demux_ts) ( input_thread_t *, data_packet_t *,
93                                        psi_callback_t );
94 } mpeg_demux_t;
95
96 /*****************************************************************************
97  * psi_section_t
98  *****************************************************************************
99  * Describes a PSI section. Beware, it doesn't contain pointers to the TS
100  * packets that contain it as for a PES, but the data themselves
101  *****************************************************************************/
102 typedef struct psi_section_t
103 {
104     byte_t                  buffer[PSI_SECTION_SIZE];
105
106     u8                      i_section_number;
107     u8                      i_last_section_number;
108     u8                      i_version_number;
109     u16                     i_section_length;
110     u16                     i_read_in_section;
111     
112     /* the PSI is complete */
113     vlc_bool_t              b_is_complete;
114     
115     /* packet missed up ? */
116     vlc_bool_t              b_trash;
117
118     /*about sections  */ 
119     vlc_bool_t              b_section_complete;
120
121     /* where are we currently ? */
122     byte_t                * p_current;
123
124 } psi_section_t;
125
126 /*****************************************************************************
127  * es_ts_data_t: extension of es_descriptor_t
128  *****************************************************************************/
129 typedef struct es_ts_data_t
130 {
131     vlc_bool_t              b_psi;   /* Does the stream have to be handled by
132                                       *                    the PSI decoder ? */
133
134     int                     i_psi_type;  /* There are different types of PSI */
135     
136     psi_section_t *         p_psi_section;                    /* PSI packets */
137
138     /* Markers */
139     int                     i_continuity_counter;
140 } es_ts_data_t;
141
142 /*****************************************************************************
143  * pgrm_ts_data_t: extension of pgrm_descriptor_t
144  *****************************************************************************/
145 typedef struct pgrm_ts_data_t
146 {
147     u16                     i_pcr_pid;             /* PCR ES, for TS streams */
148     int                     i_pmt_version;
149     /* libdvbpsi pmt decoder handle */
150     void *                  p_pmt_handle;
151 } pgrm_ts_data_t;
152
153 /*****************************************************************************
154  * stream_ts_data_t: extension of stream_descriptor_t
155  *****************************************************************************/
156 typedef struct stream_ts_data_t
157 {
158     int i_pat_version;          /* Current version of the PAT */
159     /* libdvbpsi pmt decoder handle */
160     void *                  p_pat_handle;
161 } stream_ts_data_t;
162
163 /*****************************************************************************
164  * stream_ps_data_t: extension of stream_descriptor_t
165  *****************************************************************************/
166 typedef struct stream_ps_data_t
167 {
168     vlc_bool_t              b_has_PSM;                 /* very rare, in fact */
169
170     u8                      i_PSM_version;
171 } stream_ps_data_t;
172
173 /* PSM version is 5 bits, so -1 is not a valid value */
174 #define EMPTY_PSM_VERSION   -1
175