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 $
7 * Authors: Christophe Massiot <massiot@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 *****************************************************************************/
25 * Optional MPEG demultiplexing
28 /*****************************************************************************
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 */
35 #define PAT_UNINITIALIZED (1 << 6)
36 #define PMT_UNINITIALIZED (1 << 6)
38 #define PSI_IS_PAT 0x00
39 #define PSI_IS_PMT 0x01
40 #define UNKNOWN_PSI 0xff
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'.
61 #define A52B_AUDIO_ES 0x91
62 #define DVDB_SPU_ES 0x92
63 #define LPCMB_AUDIO_ES 0x93
65 /****************************************************************************
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 );
78 /****************************************************************************
80 ****************************************************************************
81 * Demux callbacks exported by the helper plugin
82 ****************************************************************************/
83 typedef struct mpeg_demux_t
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 * );
91 ssize_t (*pf_read_ts) ( input_thread_t *, data_packet_t ** );
92 void (*pf_demux_ts) ( input_thread_t *, data_packet_t *,
96 /*****************************************************************************
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
104 byte_t buffer[PSI_SECTION_SIZE];
107 u8 i_last_section_number;
109 u16 i_section_length;
110 u16 i_read_in_section;
112 /* the PSI is complete */
113 vlc_bool_t b_is_complete;
115 /* packet missed up ? */
119 vlc_bool_t b_section_complete;
121 /* where are we currently ? */
126 /*****************************************************************************
127 * es_ts_data_t: extension of es_descriptor_t
128 *****************************************************************************/
129 typedef struct es_ts_data_t
131 vlc_bool_t b_psi; /* Does the stream have to be handled by
132 * the PSI decoder ? */
134 int i_psi_type; /* There are different types of PSI */
136 psi_section_t * p_psi_section; /* PSI packets */
139 int i_continuity_counter;
142 /*****************************************************************************
143 * pgrm_ts_data_t: extension of pgrm_descriptor_t
144 *****************************************************************************/
145 typedef struct pgrm_ts_data_t
147 u16 i_pcr_pid; /* PCR ES, for TS streams */
149 /* libdvbpsi pmt decoder handle */
153 /*****************************************************************************
154 * stream_ts_data_t: extension of stream_descriptor_t
155 *****************************************************************************/
156 typedef struct stream_ts_data_t
158 int i_pat_version; /* Current version of the PAT */
159 /* libdvbpsi pmt decoder handle */
163 /*****************************************************************************
164 * stream_ps_data_t: extension of stream_descriptor_t
165 *****************************************************************************/
166 typedef struct stream_ps_data_t
168 vlc_bool_t b_has_PSM; /* very rare, in fact */
173 /* PSM version is 5 bits, so -1 is not a valid value */
174 #define EMPTY_PSM_VERSION -1