]> git.sesse.net Git - vlc/blob - modules/demux/ts.c
Fixed typo in MJD decoding (Fix EIT informations)
[vlc] / modules / demux / ts.c
1 /*****************************************************************************
2  * ts.c: Transport Stream input module for VLC.
3  *****************************************************************************
4  * Copyright (C) 2004-2005 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Jean-Paul Saman <jpsaman #_at_# m2x.nl>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28
29 #include <vlc/vlc.h>
30
31 #include <ctype.h>
32
33 #include <vlc_access.h> /* DVB-specific things */
34 #include <vlc_demux.h>
35 #include <vlc_meta.h>
36 #include <vlc_epg.h>
37
38 #include "iso_lang.h"
39 #include <vlc_network.h>
40 #include <vlc_charset.h>
41
42 #include "../mux/mpeg/csa.h"
43
44 /* Include dvbpsi headers */
45 #ifdef HAVE_DVBPSI_DR_H
46 #   include <dvbpsi/dvbpsi.h>
47 #   include <dvbpsi/demux.h>
48 #   include <dvbpsi/descriptor.h>
49 #   include <dvbpsi/pat.h>
50 #   include <dvbpsi/pmt.h>
51 #   include <dvbpsi/sdt.h>
52 #   include <dvbpsi/dr.h>
53 #   include <dvbpsi/psi.h>
54 #else
55 #   include "dvbpsi.h"
56 #   include "demux.h"
57 #   include "descriptor.h"
58 #   include "tables/pat.h"
59 #   include "tables/pmt.h"
60 #   include "tables/sdt.h"
61 #   include "descriptors/dr.h"
62 #   include "psi.h"
63 #endif
64
65 /* EIT support */
66 #ifdef _DVBPSI_DR_4D_H_
67 #   define TS_USE_DVB_SI 1
68 #   ifdef HAVE_DVBPSI_DR_H
69 #       include <dvbpsi/eit.h>
70 #   else
71 #       include "tables/eit.h"
72 #   endif
73 #endif
74 #ifdef HAVE_TIME_H
75 #   include <time.h>
76 #endif
77 #undef TS_DEBUG
78
79 /* TODO:
80  *  - XXX: do not mark options message to be translated, they are too osbcure for now ...
81  *  - test it
82  *  - ...
83  */
84
85 /*****************************************************************************
86  * Module descriptor
87  *****************************************************************************/
88 static int  Open  ( vlc_object_t * );
89 static void Close ( vlc_object_t * );
90
91 #define PMT_TEXT N_("Extra PMT")
92 #define PMT_LONGTEXT N_( \
93   "Allows a user to specify an extra pmt (pmt_pid=pid:stream_type[,...])." )
94
95 #define PID_TEXT N_("Set id of ES to PID")
96 #define PID_LONGTEXT N_("Set the internal ID of each elementary stream" \
97                        " handled by VLC to the same value as the PID in" \
98                        " the TS stream, instead of 1, 2, 3, etc. Useful to" \
99                        " do \'#duplicate{..., select=\"es=<pid>\"}\'.")
100
101 #define TSOUT_TEXT N_("Fast udp streaming")
102 #define TSOUT_LONGTEXT N_( \
103   "Sends TS to specific ip:port by udp (you must know what you are doing).")
104
105 #define MTUOUT_TEXT N_("MTU for out mode")
106 #define MTUOUT_LONGTEXT N_("MTU for out mode.")
107
108 #define CSA_TEXT N_("CSA ck")
109 #define CSA_LONGTEXT N_("Control word for the CSA encryption algorithm")
110
111 #define SILENT_TEXT N_("Silent mode")
112 #define SILENT_LONGTEXT N_("Do not complain on encrypted PES.")
113
114 #define CAPMT_SYSID_TEXT N_("CAPMT System ID")
115 #define CAPMT_SYSID_LONGTEXT N_("Only forward descriptors from this SysID to the CAM.")
116
117 #define CPKT_TEXT N_("Packet size in bytes to decrypt")
118 #define CPKT_LONGTEXT N_("Specify the size of the TS packet to decrypt. " \
119     "The decryption routines subtract the TS-header from the value before " \
120     "decrypting. " )
121
122 #define TSDUMP_TEXT N_("Filename of dump")
123 #define TSDUMP_LONGTEXT N_("Specify a filename where to dump the TS in.")
124
125 #define APPEND_TEXT N_("Append")
126 #define APPEND_LONGTEXT N_( \
127     "If the file exists and this option is selected, the existing file " \
128     "will not be overwritten." )
129
130 #define DUMPSIZE_TEXT N_("Dump buffer size")
131 #define DUMPSIZE_LONGTEXT N_( \
132     "Tweak the buffer size for reading and writing an integer number of packets." \
133     "Specify the size of the buffer here and not the number of packets." )
134
135 vlc_module_begin();
136     set_description( _("MPEG Transport Stream demuxer") );
137     set_shortname ( "MPEG-TS" );
138     set_category( CAT_INPUT );
139     set_subcategory( SUBCAT_INPUT_DEMUX );
140
141     add_string( "ts-extra-pmt", NULL, NULL, PMT_TEXT, PMT_LONGTEXT, VLC_TRUE );
142     add_bool( "ts-es-id-pid", 1, NULL, PID_TEXT, PID_LONGTEXT, VLC_TRUE );
143     add_string( "ts-out", NULL, NULL, TSOUT_TEXT, TSOUT_LONGTEXT, VLC_TRUE );
144     add_integer( "ts-out-mtu", 1400, NULL, MTUOUT_TEXT,
145                  MTUOUT_LONGTEXT, VLC_TRUE );
146     add_string( "ts-csa-ck", NULL, NULL, CSA_TEXT, CSA_LONGTEXT, VLC_TRUE );
147     add_integer( "ts-csa-pkt", 188, NULL, CPKT_TEXT, CPKT_LONGTEXT, VLC_TRUE );
148     add_bool( "ts-silent", 0, NULL, SILENT_TEXT, SILENT_LONGTEXT, VLC_TRUE );
149
150     add_file( "ts-dump-file", NULL, NULL, TSDUMP_TEXT, TSDUMP_LONGTEXT, VLC_FALSE );
151     add_bool( "ts-dump-append", 0, NULL, APPEND_TEXT, APPEND_LONGTEXT, VLC_FALSE );
152     add_integer( "ts-dump-size", 16384, NULL, DUMPSIZE_TEXT,
153                  DUMPSIZE_LONGTEXT, VLC_TRUE );
154
155     set_capability( "demux2", 10 );
156     set_callbacks( Open, Close );
157     add_shortcut( "ts" );
158 vlc_module_end();
159
160 /*****************************************************************************
161  * Local prototypes
162  *****************************************************************************/
163
164 typedef struct
165 {
166     uint8_t                 i_objectTypeIndication;
167     uint8_t                 i_streamType;
168     vlc_bool_t              b_upStream;
169     uint32_t                i_bufferSizeDB;
170     uint32_t                i_maxBitrate;
171     uint32_t                i_avgBitrate;
172
173     int                     i_decoder_specific_info_len;
174     uint8_t                 *p_decoder_specific_info;
175
176 } decoder_config_descriptor_t;
177
178 typedef struct
179 {
180     vlc_bool_t              b_useAccessUnitStartFlag;
181     vlc_bool_t              b_useAccessUnitEndFlag;
182     vlc_bool_t              b_useRandomAccessPointFlag;
183     vlc_bool_t              b_useRandomAccessUnitsOnlyFlag;
184     vlc_bool_t              b_usePaddingFlag;
185     vlc_bool_t              b_useTimeStampsFlags;
186     vlc_bool_t              b_useIdleFlag;
187     vlc_bool_t              b_durationFlag;
188     uint32_t                i_timeStampResolution;
189     uint32_t                i_OCRResolution;
190     uint8_t                 i_timeStampLength;
191     uint8_t                 i_OCRLength;
192     uint8_t                 i_AU_Length;
193     uint8_t                 i_instantBitrateLength;
194     uint8_t                 i_degradationPriorityLength;
195     uint8_t                 i_AU_seqNumLength;
196     uint8_t                 i_packetSeqNumLength;
197
198     uint32_t                i_timeScale;
199     uint16_t                i_accessUnitDuration;
200     uint16_t                i_compositionUnitDuration;
201
202     uint64_t                i_startDecodingTimeStamp;
203     uint64_t                i_startCompositionTimeStamp;
204
205 } sl_config_descriptor_t;
206
207 typedef struct
208 {
209     vlc_bool_t              b_ok;
210     uint16_t                i_es_id;
211
212     vlc_bool_t              b_streamDependenceFlag;
213     vlc_bool_t              b_OCRStreamFlag;
214     uint8_t                 i_streamPriority;
215
216     char                    *psz_url;
217
218     uint16_t                i_dependOn_es_id;
219     uint16_t                i_OCR_es_id;
220
221     decoder_config_descriptor_t    dec_descr;
222     sl_config_descriptor_t         sl_descr;
223
224 } es_mpeg4_descriptor_t;
225
226 typedef struct
227 {
228     uint8_t                i_iod_label, i_iod_label_scope;
229
230     /* IOD */
231     uint16_t                i_od_id;
232     char                    *psz_url;
233
234     uint8_t                 i_ODProfileLevelIndication;
235     uint8_t                 i_sceneProfileLevelIndication;
236     uint8_t                 i_audioProfileLevelIndication;
237     uint8_t                 i_visualProfileLevelIndication;
238     uint8_t                 i_graphicsProfileLevelIndication;
239
240     es_mpeg4_descriptor_t   es_descr[255];
241
242 } iod_descriptor_t;
243
244 typedef struct
245 {
246     dvbpsi_handle   handle;
247
248     int             i_version;
249     int             i_number;
250     int             i_pid_pcr;
251     int             i_pid_pmt;
252     /* IOD stuff (mpeg4) */
253     iod_descriptor_t *iod;
254
255 } ts_prg_psi_t;
256
257 typedef struct
258 {
259     /* for special PAT/SDT case */
260     dvbpsi_handle   handle; /* PAT/SDT/EIT */
261     int             i_pat_version;
262     int             i_sdt_version;
263
264     /* For PMT */
265     int             i_prg;
266     ts_prg_psi_t    **prg;
267
268 } ts_psi_t;
269
270 typedef struct
271 {
272     es_format_t  fmt;
273     es_out_id_t *id;
274     int         i_pes_size;
275     int         i_pes_gathered;
276     block_t     *p_pes;
277     block_t     **pp_last;
278
279     es_mpeg4_descriptor_t *p_mpeg4desc;
280     int         b_gather;
281
282 } ts_es_t;
283
284 typedef struct
285 {
286     int         i_pid;
287
288     vlc_bool_t  b_seen;
289     vlc_bool_t  b_valid;
290     int         i_cc;   /* countinuity counter */
291
292     /* PSI owner (ie PMT -> PAT, ES -> PMT */
293     ts_psi_t   *p_owner;
294     int         i_owner_number;
295
296     /* */
297     ts_psi_t    *psi;
298     ts_es_t     *es;
299
300     /* Some private streams encapsulate several ES (eg. DVB subtitles)*/
301     ts_es_t     **extra_es;
302     int         i_extra_es;
303
304 } ts_pid_t;
305
306 struct demux_sys_t
307 {
308     /* TS packet size (188, 192, 204) */
309     int         i_packet_size;
310
311     /* how many TS packet we read at once */
312     int         i_ts_read;
313
314     /* All pid */
315     ts_pid_t    pid[8192];
316
317     /* All PMT */
318     int         i_pmt;
319     ts_pid_t    **pmt;
320
321     /* */
322     vlc_bool_t  b_es_id_pid;
323     csa_t       *csa;
324     int         i_csa_pkt_size;
325     vlc_bool_t  b_silent;
326
327     vlc_bool_t  b_udp_out;
328     int         fd; /* udp socket */
329     uint8_t     *buffer;
330
331     vlc_bool_t  b_dvb_control;
332     int         i_dvb_program;
333     int64_t     i_dvb_start;
334     int64_t     i_dvb_length;
335     vlc_list_t  *p_programs_list;
336
337     /* TS dump */
338     char        *psz_file;  /* file to dump data in */
339     FILE        *p_file;    /* filehandle */
340     uint64_t    i_write;    /* bytes written */
341     vlc_bool_t  b_file_out; /* dump mode enabled */
342
343     /* */
344     vlc_bool_t  b_meta;
345 };
346
347 static int Demux    ( demux_t *p_demux );
348 static int DemuxFile( demux_t *p_demux );
349 static int Control( demux_t *p_demux, int i_query, va_list args );
350
351 static void PIDInit ( ts_pid_t *pid, vlc_bool_t b_psi, ts_psi_t *p_owner );
352 static void PIDClean( es_out_t *out, ts_pid_t *pid );
353 static int  PIDFillFormat( ts_pid_t *pid, int i_stream_type );
354
355 static void PATCallBack( demux_t *, dvbpsi_pat_t * );
356 static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt );
357 #ifdef TS_USE_DVB_SI
358 static void PSINewTableCallBack( demux_t *, dvbpsi_handle,
359                                  uint8_t  i_table_id, uint16_t i_extension );
360 #endif
361
362 static inline int PIDGet( block_t *p )
363 {
364     return ( (p->p_buffer[1]&0x1f)<<8 )|p->p_buffer[2];
365 }
366
367 static vlc_bool_t GatherPES( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk );
368
369 static void PCRHandle( demux_t *p_demux, ts_pid_t *, block_t * );
370
371 static iod_descriptor_t *IODNew( int , uint8_t * );
372 static void              IODFree( iod_descriptor_t * );
373
374 #define TS_PACKET_SIZE_188 188
375 #define TS_PACKET_SIZE_192 192
376 #define TS_PACKET_SIZE_204 204
377 #define TS_PACKET_SIZE_MAX 204
378 #define TS_TOPFIELD_HEADER 1320
379
380 /*****************************************************************************
381  * Open
382  *****************************************************************************/
383 static int Open( vlc_object_t *p_this )
384 {
385     demux_t     *p_demux = (demux_t*)p_this;
386     demux_sys_t *p_sys;
387
388     const uint8_t *p_peek;
389     int          i_sync, i_peek, i;
390     int          i_packet_size;
391
392     ts_pid_t    *pat;
393     const char  *psz_mode;
394     vlc_bool_t   b_append;
395     vlc_bool_t   b_topfield = VLC_FALSE;
396
397     vlc_value_t  val;
398
399     if( stream_Peek( p_demux->s, &p_peek, TS_PACKET_SIZE_MAX ) <
400         TS_PACKET_SIZE_MAX ) return VLC_EGENERIC;
401
402     if( memcmp( p_peek, "TFrc", 4 ) == 0 )
403     {
404         b_topfield = VLC_TRUE;
405         msg_Dbg( p_demux, "this is a topfield file" );
406     }
407
408     /* Search first sync byte */
409     for( i_sync = 0; i_sync < TS_PACKET_SIZE_MAX; i_sync++ )
410     {
411         if( p_peek[i_sync] == 0x47 ) break;
412     }
413     if( i_sync >= TS_PACKET_SIZE_MAX && !b_topfield )
414     {
415         if( !p_demux->b_force )
416             return VLC_EGENERIC;
417         msg_Warn( p_demux, "this does not look like a TS stream, continuing" );
418     }
419
420     if( b_topfield )
421     {
422         /* Read the entire Topfield header */
423         i_peek = TS_TOPFIELD_HEADER;
424     }
425     else
426     {
427         /* Check next 3 sync bytes */
428         i_peek = TS_PACKET_SIZE_MAX * 3 + i_sync + 1;
429     }
430
431     if( ( stream_Peek( p_demux->s, &p_peek, i_peek ) ) < i_peek )
432     {
433         msg_Err( p_demux, "cannot peek" );
434         return VLC_EGENERIC;
435     }
436     if( p_peek[i_sync + TS_PACKET_SIZE_188] == 0x47 &&
437         p_peek[i_sync + 2 * TS_PACKET_SIZE_188] == 0x47 &&
438         p_peek[i_sync + 3 * TS_PACKET_SIZE_188] == 0x47 )
439     {
440         i_packet_size = TS_PACKET_SIZE_188;
441     }
442     else if( p_peek[i_sync + TS_PACKET_SIZE_192] == 0x47 &&
443              p_peek[i_sync + 2 * TS_PACKET_SIZE_192] == 0x47 &&
444              p_peek[i_sync + 3 * TS_PACKET_SIZE_192] == 0x47 )
445     {
446         i_packet_size = TS_PACKET_SIZE_192;
447     }
448     else if( p_peek[i_sync + TS_PACKET_SIZE_204] == 0x47 &&
449              p_peek[i_sync + 2 * TS_PACKET_SIZE_204] == 0x47 &&
450              p_peek[i_sync + 3 * TS_PACKET_SIZE_204] == 0x47 )
451     {
452         i_packet_size = TS_PACKET_SIZE_204;
453     }
454     else if( p_demux->b_force )
455     {
456         i_packet_size = TS_PACKET_SIZE_188;
457     }
458     else if( b_topfield )
459     {
460         i_packet_size = TS_PACKET_SIZE_188;
461 #if 0
462         /* I used the TF5000PVR 2004 Firmware .doc header documentation,
463          * http://www.i-topfield.com/data/product/firmware/Structure%20of%20Recorded%20File%20in%20TF5000PVR%20(Feb%2021%202004).doc
464          * but after the filename the offsets seem to be incorrect.  - DJ */
465         int i_duration, i_name;
466         char *psz_name = malloc(25);
467         char *psz_event_name;
468         char *psz_event_text = malloc(130);
469         char *psz_ext_text = malloc(1025);
470
471         // 2 bytes version Uimsbf (4,5)
472         // 2 bytes reserved (6,7)
473         // 2 bytes duration in minutes Uimsbf (8,9(
474         i_duration = (int) (p_peek[8] << 8) | p_peek[9];
475         msg_Dbg( p_demux, "Topfield recording length: +/- %d minutes", i_duration);
476         // 2 bytes service number in channel list (10, 11)
477         // 2 bytes service type Bslbf 0=TV 1=Radio Bslb (12, 13)
478         // 4 bytes of reserved + tuner info (14,15,16,17)
479         // 2 bytes of Service ID  Bslbf (18,19)
480         // 2 bytes of PMT PID  Uimsbf (20,21)
481         // 2 bytes of PCR PID  Uimsbf (22,23)
482         // 2 bytes of Video PID  Uimsbf (24,25)
483         // 2 bytes of Audio PID  Uimsbf (26,27)
484         // 24 bytes filename Bslbf
485         memcpy( psz_name, &p_peek[28], 24 );
486         psz_name[24] = '\0';
487         msg_Dbg( p_demux, "recordingname=%s", psz_name );
488         // 1 byte of sat index Uimsbf  (52)
489         // 3 bytes (1 bit of polarity Bslbf +23 bits reserved)
490         // 4 bytes of freq. Uimsbf (56,57,58,59)
491         // 2 bytes of symbol rate Uimsbf (60,61)
492         // 2 bytes of TS stream ID Uimsbf (62,63)
493         // 4 bytes reserved
494         // 2 bytes reserved
495         // 2 bytes duration Uimsbf (70,71)
496         //i_duration = (int) (p_peek[70] << 8) | p_peek[71];
497         //msg_Dbg( p_demux, "Topfield 2nd duration field: +/- %d minutes", i_duration);
498         // 4 bytes EventID Uimsbf (72-75)
499         // 8 bytes of Start and End time info (76-83)
500         // 1 byte reserved (84)
501         // 1 byte event name length Uimsbf (89)
502         i_name = (int)(p_peek[89]&~0x81);
503         msg_Dbg( p_demux, "event name length = %d", i_name);
504         psz_event_name = malloc( i_name+1 );
505         // 1 byte parental rating (90)
506         // 129 bytes of event text
507         memcpy( psz_event_name, &p_peek[91], i_name );
508         psz_event_name[i_name] = '\0';
509         memcpy( psz_event_text, &p_peek[91+i_name], 129-i_name );
510         psz_event_text[129-i_name] = '\0';
511         msg_Dbg( p_demux, "event name=%s", psz_event_name );
512         msg_Dbg( p_demux, "event text=%s", psz_event_text );
513         // 12 bytes reserved (220)
514         // 6 bytes reserved
515         // 2 bytes Event Text Length Uimsbf
516         // 4 bytes EventID Uimsbf
517         // FIXME We just have 613 bytes. not enough for this entire text
518         // 1024 bytes Extended Event Text Bslbf
519         memcpy( psz_ext_text, p_peek+372, 1024 );
520         psz_ext_text[1024] = '\0';
521         msg_Dbg( p_demux, "extended event text=%s", psz_ext_text );
522         // 52 bytes reserved Bslbf
523 #endif
524     }
525     else
526     {
527         msg_Warn( p_demux, "TS module discarded (lost sync)" );
528         return VLC_EGENERIC;
529     }
530
531     p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) );
532     if( !p_sys )
533         return VLC_ENOMEM;
534     memset( p_sys, 0, sizeof( demux_sys_t ) );
535     p_sys->i_packet_size = i_packet_size;
536
537     /* Fill dump mode fields */
538     p_sys->i_write = 0;
539     p_sys->p_file = NULL;
540     p_sys->b_file_out = VLC_FALSE;
541     p_sys->psz_file = var_CreateGetString( p_demux, "ts-dump-file" );
542     if( *p_sys->psz_file != '\0' )
543     {
544         p_sys->b_file_out = VLC_TRUE;
545
546         var_Create( p_demux, "ts-dump-append", VLC_VAR_BOOL|VLC_VAR_DOINHERIT );
547         var_Get( p_demux, "ts-dump-append", &val );
548         b_append = val.b_bool;
549         if ( b_append )
550             psz_mode = "ab";
551         else
552             psz_mode = "wb";
553
554         if( !strcmp( p_sys->psz_file, "-" ) )
555         {
556             msg_Info( p_demux, "dumping raw stream to standard output" );
557             p_sys->p_file = stdout;
558         }
559         else if( ( p_sys->p_file = utf8_fopen( p_sys->psz_file, psz_mode ) ) == NULL )
560         {
561             msg_Err( p_demux, "cannot create `%s' for writing", p_sys->psz_file );
562             p_sys->b_file_out = VLC_FALSE;
563         }
564
565         if( p_sys->b_file_out )
566         {
567             vlc_value_t bufsize;
568
569             /* Determine how many packets to read. */
570             var_Create( p_demux, "ts-dump-size",
571                         VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
572             var_Get( p_demux, "ts-dump-size", &bufsize );
573             p_sys->i_ts_read = (int) (bufsize.i_int / p_sys->i_packet_size);
574             if( p_sys->i_ts_read <= 0 )
575             {
576                 p_sys->i_ts_read = 1500 / p_sys->i_packet_size;
577             }
578             p_sys->buffer = malloc( p_sys->i_packet_size * p_sys->i_ts_read );
579             msg_Info( p_demux, "%s raw stream to file `%s' reading packets %d",
580                       b_append ? "appending" : "dumping", p_sys->psz_file,
581                       p_sys->i_ts_read );
582         }
583     }
584
585     /* Fill p_demux field */
586     if( p_sys->b_file_out )
587         p_demux->pf_demux = DemuxFile;
588     else
589         p_demux->pf_demux = Demux;
590     p_demux->pf_control = Control;
591
592     /* Init p_sys field */
593     p_sys->b_meta = VLC_TRUE;
594     p_sys->b_dvb_control = VLC_TRUE;
595     p_sys->i_dvb_program = 0;
596     p_sys->i_dvb_start = 0;;
597     p_sys->i_dvb_length = 0;
598
599     for( i = 0; i < 8192; i++ )
600     {
601         ts_pid_t *pid = &p_sys->pid[i];
602
603         pid->i_pid      = i;
604         pid->b_seen     = VLC_FALSE;
605         pid->b_valid    = VLC_FALSE;
606     }
607     /* PID 8191 is padding */
608     p_sys->pid[8191].b_seen = VLC_TRUE;
609     p_sys->i_packet_size = i_packet_size;
610     p_sys->b_udp_out = VLC_FALSE;
611     p_sys->i_ts_read = 50;
612     p_sys->csa = NULL;
613
614     /* Init PAT handler */
615     pat = &p_sys->pid[0];
616     PIDInit( pat, VLC_TRUE, NULL );
617     pat->psi->handle = dvbpsi_AttachPAT( (dvbpsi_pat_callback)PATCallBack,
618                                          p_demux );
619 #ifdef TS_USE_DVB_SI
620     if( p_sys->b_meta )
621     {
622         ts_pid_t *sdt = &p_sys->pid[0x11];
623         ts_pid_t *eit = &p_sys->pid[0x12];
624
625         PIDInit( sdt, VLC_TRUE, NULL );
626         sdt->psi->handle =
627             dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t)PSINewTableCallBack,
628                                 p_demux );
629         PIDInit( eit, VLC_TRUE, NULL );
630         eit->psi->handle =
631             dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t)PSINewTableCallBack,
632                                 p_demux );
633         if( p_sys->b_dvb_control )
634         {
635             if( stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
636                                 ACCESS_SET_PRIVATE_ID_STATE, 0x11, VLC_TRUE ) ||
637                 stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
638                                 ACCESS_SET_PRIVATE_ID_STATE, 0x12, VLC_TRUE ) )
639                 p_sys->b_dvb_control = VLC_FALSE;
640         }
641     }
642 #endif
643
644     /* Init PMT array */
645     p_sys->i_pmt = 0;
646     p_sys->pmt   = NULL;
647
648     /* Read config */
649     var_Create( p_demux, "ts-es-id-pid", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
650     var_Get( p_demux, "ts-es-id-pid", &val );
651     p_sys->b_es_id_pid = val.b_bool;
652
653     var_Create( p_demux, "ts-out", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
654     var_Get( p_demux, "ts-out", &val );
655     if( val.psz_string && *val.psz_string && !p_sys->b_file_out )
656     {
657         vlc_value_t mtu;
658         char *psz = strchr( val.psz_string, ':' );
659         int   i_port = 0;
660
661         p_sys->b_udp_out = VLC_TRUE;
662
663         if( psz )
664         {
665             *psz++ = '\0';
666             i_port = atoi( psz );
667         }
668         if( i_port <= 0 ) i_port  = 1234;
669         msg_Dbg( p_demux, "resend ts to '%s:%d'", val.psz_string, i_port );
670
671         p_sys->fd = net_ConnectUDP( VLC_OBJECT(p_demux), val.psz_string, i_port, 0 );
672         if( p_sys->fd < 0 )
673         {
674             msg_Err( p_demux, "failed to open udp socket, send disabled" );
675             p_sys->b_udp_out = VLC_FALSE;
676         }
677         else
678         {
679             var_Create( p_demux, "ts-out-mtu",
680                         VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
681             var_Get( p_demux, "ts-out-mtu", &mtu );
682             p_sys->i_ts_read = mtu.i_int / p_sys->i_packet_size;
683             if( p_sys->i_ts_read <= 0 )
684             {
685                 p_sys->i_ts_read = 1500 / p_sys->i_packet_size;
686             }
687             p_sys->buffer = malloc( p_sys->i_packet_size * p_sys->i_ts_read );
688         }
689     }
690     if( val.psz_string )
691     {
692         free( val.psz_string );
693     }
694
695     /* We handle description of an extra PMT */
696     var_Create( p_demux, "ts-extra-pmt", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
697     var_Get( p_demux, "ts-extra-pmt", &val );
698     if( val.psz_string && strchr( val.psz_string, '=' ) != NULL )
699     {
700         char *psz = val.psz_string;
701         int  i_pid = strtol( psz, &psz, 0 );
702
703         if( i_pid >= 2 && i_pid < 8192 )
704         {
705             ts_pid_t *pmt = &p_sys->pid[i_pid];
706             ts_prg_psi_t *prg;
707
708             msg_Dbg( p_demux, "extra pmt specified (pid=%d)", i_pid );
709             PIDInit( pmt, VLC_TRUE, NULL );
710
711             /* Dummy PMT */
712             prg = malloc( sizeof( ts_prg_psi_t ) );
713             if( !prg )
714             {
715                 msg_Err( p_demux, "out of memory" );
716                 Close( VLC_OBJECT(p_demux) );
717                 return VLC_ENOMEM;
718             }
719
720             memset( prg, 0, sizeof( ts_prg_psi_t ) );
721             prg->i_pid_pcr  = -1;
722             prg->i_pid_pmt  = -1;
723             prg->i_number   = 0;    /* special */
724             prg->handle     = dvbpsi_AttachPMT( 1, (dvbpsi_pmt_callback)PMTCallBack, p_demux );
725             TAB_APPEND( pmt->psi->i_prg, pmt->psi->prg, prg );
726
727             psz = strchr( psz, '=' ) + 1;   /* can't failed */
728             while( psz && *psz )
729             {
730                 char *psz_next = strchr( psz, ',' );
731                 int i_pid, i_stream_type;
732
733                 if( psz_next )
734                 {
735                     *psz_next++ = '\0';
736                 }
737
738                 i_pid = strtol( psz, &psz, 0 );
739                 if( *psz == ':' )
740                 {
741                     i_stream_type = strtol( psz + 1, &psz, 0 );
742                     if( i_pid >= 2 && i_pid < 8192 &&
743                         !p_sys->pid[i_pid].b_valid )
744                     {
745                         ts_pid_t *pid = &p_sys->pid[i_pid];
746
747                         PIDInit( pid, VLC_FALSE, pmt->psi);
748                         if( pmt->psi->prg[0]->i_pid_pcr <= 0 )
749                         {
750                             pmt->psi->prg[0]->i_pid_pcr = i_pid;
751                         }
752                         PIDFillFormat( pid, i_stream_type);
753                         if( pid->es->fmt.i_cat != UNKNOWN_ES )
754                         {
755                             if( p_sys->b_es_id_pid )
756                             {
757                                 pid->es->fmt.i_id = i_pid;
758                             }
759                             msg_Dbg( p_demux, "  * es pid=%d type=%d "
760                                      "fcc=%4.4s", i_pid, i_stream_type,
761                                      (char*)&pid->es->fmt.i_codec );
762                             pid->es->id = es_out_Add( p_demux->out,
763                                                       &pid->es->fmt );
764                         }
765                     }
766                 }
767                 psz = psz_next;
768             }
769         }
770     }
771     if( val.psz_string )
772     {
773         free( val.psz_string );
774     }
775
776     var_Create( p_demux, "ts-csa-ck", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
777     var_Get( p_demux, "ts-csa-ck", &val );
778     if( val.psz_string && *val.psz_string )
779     {
780         char *psz = val.psz_string;
781         if( psz[0] == '0' && ( psz[1] == 'x' || psz[1] == 'X' ) )
782         {
783             psz += 2;
784         }
785         if( strlen( psz ) != 16 )
786         {
787             msg_Warn( p_demux, "invalid csa ck (it must be 16 chars long)" );
788         }
789         else
790         {
791 #ifndef UNDER_CE
792             uint64_t i_ck = strtoull( psz, NULL, 16 );
793 #else
794             uint64_t i_ck = strtoll( psz, NULL, 16 );
795 #endif
796             uint8_t ck[8];
797             int     i;
798             for( i = 0; i < 8; i++ )
799             {
800                 ck[i] = ( i_ck >> ( 56 - 8*i) )&0xff;
801             }
802 #ifndef TS_NO_CSA_CK_MSG
803             msg_Dbg( p_demux, "using CSA scrambling with "
804                      "ck=%x:%x:%x:%x:%x:%x:%x:%x",
805                      ck[0], ck[1], ck[2], ck[3], ck[4], ck[5], ck[6], ck[7] );
806 #endif
807             p_sys->csa = csa_New();
808
809             if( p_sys->csa )
810             {
811                 vlc_value_t pkt_val;
812
813                 csa_SetCW( p_sys->csa, ck, ck );
814
815                 var_Create( p_demux, "ts-csa-pkt", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
816                 var_Get( p_demux, "ts-csa-pkt", &pkt_val );
817                 if( pkt_val.i_int < 4 || pkt_val.i_int > 188 )
818                 {
819                     msg_Err( p_demux, "wrong packet size %d specified.", pkt_val.i_int );
820                     msg_Warn( p_demux, "using default packet size of 188 bytes" );
821                     p_sys->i_csa_pkt_size = 188;
822                 }
823                 else p_sys->i_csa_pkt_size = pkt_val.i_int;
824                 msg_Dbg( p_demux, "decrypting %d bytes of packet", p_sys->i_csa_pkt_size );
825             }
826         }
827     }
828     if( val.psz_string )
829     {
830         free( val.psz_string );
831     }
832
833     var_Create( p_demux, "ts-silent", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
834     var_Get( p_demux, "ts-silent", &val );
835     p_sys->b_silent = val.b_bool;
836
837     return VLC_SUCCESS;
838 }
839
840 /*****************************************************************************
841  * Close
842  *****************************************************************************/
843 static void Close( vlc_object_t *p_this )
844 {
845     demux_t     *p_demux = (demux_t*)p_this;
846     demux_sys_t *p_sys = p_demux->p_sys;
847
848     int          i;
849
850     msg_Dbg( p_demux, "pid list:" );
851     for( i = 0; i < 8192; i++ )
852     {
853         ts_pid_t *pid = &p_sys->pid[i];
854
855         if( pid->b_valid && pid->psi )
856         {
857             switch( pid->i_pid )
858             {
859                 case 0: /* PAT */
860                     dvbpsi_DetachPAT( pid->psi->handle );
861                     free( pid->psi );
862                     break;
863                 case 1: /* CAT */
864                     free( pid->psi );
865                     break;
866                 case 0x11: /* SDT */
867                 case 0x12: /* EIT */
868                     dvbpsi_DetachDemux( pid->psi->handle );
869                     free( pid->psi );
870                     break;
871                 default:
872                     PIDClean( p_demux->out, pid );
873                     break;
874             }
875         }
876         else if( pid->b_valid && pid->es )
877         {
878             PIDClean( p_demux->out, pid );
879         }
880
881         if( pid->b_seen )
882         {
883             msg_Dbg( p_demux, "  - pid[%d] seen", pid->i_pid );
884         }
885
886         if( p_sys->b_dvb_control && pid->i_pid > 0 )
887         {
888             /* too much */
889             stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
890                             ACCESS_SET_PRIVATE_ID_STATE, pid->i_pid,
891                             VLC_FALSE );
892         }
893
894     }
895
896     if( p_sys->b_udp_out )
897     {
898         net_Close( p_sys->fd );
899         free( p_sys->buffer );
900     }
901     if( p_sys->csa )
902     {
903         csa_Delete( p_sys->csa );
904     }
905
906     if( p_sys->i_pmt ) free( p_sys->pmt );
907
908     if ( p_sys->p_programs_list )
909     {
910         vlc_value_t val;
911         val.p_list = p_sys->p_programs_list;
912         var_Change( p_demux, "programs", VLC_VAR_FREELIST, &val, NULL );
913     }
914
915     /* If in dump mode, then close the file */
916     if( p_sys->b_file_out )
917     {
918         msg_Info( p_demux ,"closing %s ("I64Fd" Kbytes dumped)",
919                   p_sys->psz_file, p_sys->i_write / 1024 );
920
921         if( p_sys->p_file != stdout )
922         {
923             fclose( p_sys->p_file );
924             p_sys->p_file = NULL;
925         }
926
927         free( p_sys->buffer );
928     }
929
930     free( p_sys->psz_file );
931     p_sys->psz_file = NULL;
932
933     free( p_sys );
934 }
935
936 /*****************************************************************************
937  * DemuxFile:
938  *****************************************************************************/
939 static int DemuxFile( demux_t *p_demux )
940 {
941     demux_sys_t *p_sys = p_demux->p_sys;
942     uint8_t     *p_buffer = p_sys->buffer; /* Put first on sync byte */
943     int i_diff= 0;
944     int i_data= 0;
945     int i_pos = 0;
946     int i_bufsize = p_sys->i_packet_size * p_sys->i_ts_read;
947
948     i_data = stream_Read( p_demux->s, p_sys->buffer, i_bufsize );
949     if( (i_data <= 0) && (i_data < p_sys->i_packet_size) )
950     {
951         msg_Dbg( p_demux, "error reading malformed packets" );
952         return i_data;
953     }
954
955     /* Test continuity counter */
956     while( i_pos < i_data )
957     {
958         ts_pid_t    *p_pid;   /* point to a PID structure */
959         vlc_bool_t b_payload; /* indicates a packet with payload */
960         vlc_bool_t b_adaptation; /* adaptation field */
961         int i_cc  = 0;        /* continuity counter */
962
963         if( p_sys->buffer[i_pos] != 0x47 )
964         {
965             msg_Warn( p_demux, "lost sync" );
966             while( !p_demux->b_die && (i_pos < i_data) )
967             {
968                 i_pos++;
969                 if( p_sys->buffer[i_pos] == 0x47 )
970                     break;
971             }
972             if( !p_demux->b_die )
973                 msg_Warn( p_demux, "sync found" );
974         }
975
976         /* continuous when (one of this):
977          * diff == 1
978          * diff == 0 and payload == 0
979          * diff == 0 and duplicate packet (playload != 0) <- should we
980          *   test the content ?
981          */
982         i_cc  = p_buffer[i_pos+3]&0x0f;
983         b_payload = p_buffer[i_pos+3]&0x10;
984         b_adaptation = p_buffer[i_pos+3]&0x20;
985
986         /* Get the PID */
987         p_pid = &p_sys->pid[ ((p_buffer[i_pos+1]&0x1f)<<8)|p_buffer[i_pos+2] ];
988
989         /* Detect discontinuity indicator in adaptation field */
990         if( b_adaptation && p_buffer[i_pos + 4] > 0 )
991         {
992             if( p_buffer[i_pos+5]&0x80 )
993                 msg_Warn( p_demux, "discontinuity indicator (pid=%d) ", p_pid->i_pid );
994             if( p_buffer[i_pos+5]&0x40 )
995                 msg_Warn( p_demux, "random access indicator (pid=%d) ", p_pid->i_pid );
996         }
997
998         i_diff = ( i_cc - p_pid->i_cc )&0x0f;
999         if( b_payload && i_diff == 1 )
1000         {
1001             p_pid->i_cc = ( p_pid->i_cc + 1 ) & 0xf;
1002         }
1003         else
1004         {
1005             if( p_pid->i_cc == 0xff )
1006             {
1007                 msg_Warn( p_demux, "first packet for pid=%d cc=0x%x",
1008                         p_pid->i_pid, i_cc );
1009                 p_pid->i_cc = i_cc;
1010             }
1011             else if( i_diff != 0 )
1012             {
1013                 /* FIXME what to do when discontinuity_indicator is set ? */
1014                 msg_Warn( p_demux, "transport error detected 0x%x instead of 0x%x",
1015                           i_cc, ( p_pid->i_cc + 1 )&0x0f );
1016
1017                 p_pid->i_cc = i_cc;
1018                 /* Mark transport error in the TS packet. */
1019                 p_buffer[i_pos+1] |= 0x80;
1020             }
1021         }
1022
1023         /* Test if user wants to decrypt it first */
1024         if( p_sys->csa )
1025             csa_Decrypt( p_demux->p_sys->csa, &p_buffer[i_pos], p_demux->p_sys->i_csa_pkt_size );
1026
1027         i_pos += p_sys->i_packet_size;
1028     }
1029
1030     /* Then write */
1031     i_data = fwrite( p_sys->buffer, 1, i_data, p_sys->p_file );
1032     if( i_data < 0 )
1033     {
1034         msg_Err( p_demux, "failed to write data" );
1035         return -1;
1036     }
1037 #if 0
1038     msg_Dbg( p_demux, "dumped %d bytes", i_data );
1039 #endif
1040
1041     p_sys->i_write += i_data;
1042     return 1;
1043 }
1044
1045 /*****************************************************************************
1046  * Demux:
1047  *****************************************************************************/
1048 static int Demux( demux_t *p_demux )
1049 {
1050     demux_sys_t *p_sys = p_demux->p_sys;
1051     int          i_pkt;
1052
1053     /* We read at most 100 TS packet or until a frame is completed */
1054     for( i_pkt = 0; i_pkt < p_sys->i_ts_read; i_pkt++ )
1055     {
1056         vlc_bool_t  b_frame = VLC_FALSE;
1057         block_t     *p_pkt;
1058         ts_pid_t    *p_pid;
1059
1060         /* Get a new TS packet */
1061         if( !( p_pkt = stream_Block( p_demux->s, p_sys->i_packet_size ) ) )
1062         {
1063             msg_Dbg( p_demux, "eof ?" );
1064             return 0;
1065         }
1066
1067         /* Check sync byte and re-sync if needed */
1068         if( p_pkt->p_buffer[0] != 0x47 )
1069         {
1070             msg_Warn( p_demux, "lost synchro" );
1071             block_Release( p_pkt );
1072
1073             while( !p_demux->b_die )
1074             {
1075                 const uint8_t *p_peek;
1076                 int i_peek, i_skip = 0;
1077
1078                 i_peek = stream_Peek( p_demux->s, &p_peek,
1079                                       p_sys->i_packet_size * 10 );
1080                 if( i_peek < p_sys->i_packet_size + 1 )
1081                 {
1082                     msg_Dbg( p_demux, "eof ?" );
1083                     return 0;
1084                 }
1085
1086                 while( i_skip < i_peek - p_sys->i_packet_size )
1087                 {
1088                     if( p_peek[i_skip] == 0x47 &&
1089                         p_peek[i_skip + p_sys->i_packet_size] == 0x47 )
1090                     {
1091                         break;
1092                     }
1093                     i_skip++;
1094                 }
1095
1096                 msg_Dbg( p_demux, "skipping %d bytes of garbage", i_skip );
1097                 stream_Read( p_demux->s, NULL, i_skip );
1098
1099                 if( i_skip < i_peek - p_sys->i_packet_size )
1100                 {
1101                     break;
1102                 }
1103             }
1104
1105             if( !( p_pkt = stream_Block( p_demux->s, p_sys->i_packet_size ) ) )
1106             {
1107                 msg_Dbg( p_demux, "eof ?" );
1108                 return 0;
1109             }
1110         }
1111
1112         if( p_sys->b_udp_out )
1113         {
1114             memcpy( &p_sys->buffer[i_pkt * p_sys->i_packet_size],
1115                     p_pkt->p_buffer, p_sys->i_packet_size );
1116         }
1117
1118         /* Parse the TS packet */
1119         p_pid = &p_sys->pid[PIDGet( p_pkt )];
1120
1121         if( p_pid->b_valid )
1122         {
1123             if( p_pid->psi )
1124             {
1125                 if( p_pid->i_pid == 0 || p_pid->i_pid == 0x11 || p_pid->i_pid == 0x12 )
1126                 {
1127                     dvbpsi_PushPacket( p_pid->psi->handle, p_pkt->p_buffer );
1128                 }
1129                 else
1130                 {
1131                     int i_prg;
1132                     for( i_prg = 0; i_prg < p_pid->psi->i_prg; i_prg++ )
1133                     {
1134                         dvbpsi_PushPacket( p_pid->psi->prg[i_prg]->handle,
1135                                            p_pkt->p_buffer );
1136                     }
1137                 }
1138                 block_Release( p_pkt );
1139             }
1140             else if( !p_sys->b_udp_out )
1141             {
1142                 b_frame = GatherPES( p_demux, p_pid, p_pkt );
1143             }
1144             else
1145             {
1146                 PCRHandle( p_demux, p_pid, p_pkt );
1147                 block_Release( p_pkt );
1148             }
1149         }
1150         else
1151         {
1152             if( !p_pid->b_seen )
1153             {
1154                 msg_Dbg( p_demux, "pid[%d] unknown", p_pid->i_pid );
1155             }
1156             /* We have to handle PCR if present */
1157             PCRHandle( p_demux, p_pid, p_pkt );
1158             block_Release( p_pkt );
1159         }
1160         p_pid->b_seen = VLC_TRUE;
1161
1162         if( b_frame )
1163         {
1164             break;
1165         }
1166     }
1167
1168     if( p_sys->b_udp_out )
1169     {
1170         /* Send the complete block */
1171         net_Write( p_demux, p_sys->fd, NULL, p_sys->buffer,
1172                    p_sys->i_ts_read * p_sys->i_packet_size );
1173     }
1174
1175     return 1;
1176 }
1177
1178 /*****************************************************************************
1179  * Control:
1180  *****************************************************************************/
1181 static int DVBEventInformation( demux_t *p_demux, int64_t *pi_time, int64_t *pi_length )
1182 {
1183     demux_sys_t *p_sys = p_demux->p_sys;
1184     if( pi_length )
1185         *pi_length = 0;
1186     if( pi_time )
1187         *pi_time = 0;
1188
1189 #ifdef HAVE_TIME_H
1190     if( p_sys->b_dvb_control && p_sys->i_dvb_length > 0 )
1191     {
1192         /* FIXME we should not use time() but read the date from the tdt */
1193         const time_t t = time( NULL );
1194         if( p_sys->i_dvb_start <= t && t < p_sys->i_dvb_start + p_sys->i_dvb_length )
1195         {
1196             if( pi_length )
1197                 *pi_length = p_sys->i_dvb_length * I64C(1000000);
1198             if( pi_time )
1199                 *pi_time   = (t - p_sys->i_dvb_start) * I64C(1000000);
1200             return VLC_SUCCESS;
1201         }
1202     }
1203 #endif
1204     return VLC_EGENERIC;
1205 }
1206
1207 static int Control( demux_t *p_demux, int i_query, va_list args )
1208 {
1209     demux_sys_t *p_sys = p_demux->p_sys;
1210     double f, *pf;
1211     int64_t i64;
1212     int64_t *pi64;
1213     int i_int;
1214
1215     if( p_sys->b_file_out )
1216         return demux2_vaControlHelper( p_demux->s, 0, -1, 0, 1, i_query, args );
1217
1218     switch( i_query )
1219     {
1220         case DEMUX_GET_POSITION:
1221             pf = (double*) va_arg( args, double* );
1222             i64 = stream_Size( p_demux->s );
1223             if( i64 > 0 )
1224             {
1225                 *pf = (double)stream_Tell( p_demux->s ) / (double)i64;
1226             }
1227             else
1228             {
1229                 int64_t i_time, i_length;
1230                 if( !DVBEventInformation( p_demux, &i_time, &i_length ) && i_length > 0 )
1231                     *pf = (double)i_time/(double)i_length;
1232                 else
1233                     *pf = 0.0;
1234             }
1235             return VLC_SUCCESS;
1236         case DEMUX_SET_POSITION:
1237             f = (double) va_arg( args, double );
1238             i64 = stream_Size( p_demux->s );
1239
1240             es_out_Control( p_demux->out, ES_OUT_RESET_PCR );
1241             if( stream_Seek( p_demux->s, (int64_t)(i64 * f) ) )
1242             {
1243                 return VLC_EGENERIC;
1244             }
1245             return VLC_SUCCESS;
1246 #if 0
1247
1248         case DEMUX_GET_TIME:
1249             pi64 = (int64_t*)va_arg( args, int64_t * );
1250             if( p_sys->i_time < 0 )
1251             {
1252                 *pi64 = 0;
1253                 return VLC_EGENERIC;
1254             }
1255             *pi64 = p_sys->i_time;
1256             return VLC_SUCCESS;
1257
1258         case DEMUX_GET_LENGTH:
1259             pi64 = (int64_t*)va_arg( args, int64_t * );
1260             if( p_sys->i_mux_rate > 0 )
1261             {
1262                 *pi64 = I64C(1000000) * ( stream_Size( p_demux->s ) / 50 ) /
1263                         p_sys->i_mux_rate;
1264                 return VLC_SUCCESS;
1265             }
1266             *pi64 = 0;
1267             return VLC_EGENERIC;
1268 #else
1269         case DEMUX_GET_TIME:
1270             pi64 = (int64_t*)va_arg( args, int64_t * );
1271             if( DVBEventInformation( p_demux, pi64, NULL ) )
1272                 *pi64 = 0;
1273             return VLC_SUCCESS;
1274
1275         case DEMUX_GET_LENGTH:
1276             pi64 = (int64_t*)va_arg( args, int64_t * );
1277             if( DVBEventInformation( p_demux, NULL, pi64 ) )
1278                 *pi64 = 0;
1279             return VLC_SUCCESS;
1280 #endif
1281         case DEMUX_SET_GROUP:
1282         {
1283             uint16_t i_vpid = 0, i_apid1 = 0, i_apid2 = 0, i_apid3 = 0;
1284             ts_prg_psi_t *p_prg = NULL;
1285             vlc_list_t *p_list;
1286
1287             i_int = (int)va_arg( args, int );
1288             p_list = (vlc_list_t *)va_arg( args, vlc_list_t * );
1289             msg_Dbg( p_demux, "DEMUX_SET_GROUP %d %p", i_int, p_list );
1290
1291             if( p_sys->b_dvb_control && i_int > 0 && i_int != p_sys->i_dvb_program )
1292             {
1293                 int i_pmt_pid = -1;
1294                 int i;
1295
1296                 /* Search pmt to be unselected */
1297                 for( i = 0; i < p_sys->i_pmt; i++ )
1298                 {
1299                     ts_pid_t *pmt = p_sys->pmt[i];
1300                     int i_prg;
1301
1302                     for( i_prg = 0; i_prg < pmt->psi->i_prg; i_prg++ )
1303                     {
1304                         if( pmt->psi->prg[i_prg]->i_number == p_sys->i_dvb_program )
1305                         {
1306                             i_pmt_pid = p_sys->pmt[i]->i_pid;
1307                             break;
1308                         }
1309                     }
1310                     if( i_pmt_pid > 0 ) break;
1311                 }
1312
1313                 if( i_pmt_pid > 0 )
1314                 {
1315                     stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
1316                                     ACCESS_SET_PRIVATE_ID_STATE, i_pmt_pid,
1317                                     VLC_FALSE );
1318                     /* All ES */
1319                     for( i = 2; i < 8192; i++ )
1320                     {
1321                         ts_pid_t *pid = &p_sys->pid[i];
1322                         int i_prg;
1323
1324                         if( !pid->b_valid || pid->psi ) continue;
1325
1326                         for( i_prg = 0; i_prg < pid->p_owner->i_prg; i_prg++ )
1327                         {
1328                             if( pid->p_owner->prg[i_prg]->i_pid_pmt == i_pmt_pid && pid->es->id )
1329                             {
1330                                 /* We only remove es that aren't defined by extra pmt */
1331                                 stream_Control( p_demux->s,
1332                                                 STREAM_CONTROL_ACCESS,
1333                                                 ACCESS_SET_PRIVATE_ID_STATE,
1334                                                 i, VLC_FALSE );
1335                                 break;
1336                             }
1337                         }
1338                     }
1339                 }
1340
1341                 /* select new program */
1342                 p_sys->i_dvb_program = i_int;
1343                 i_pmt_pid = -1;
1344                 for( i = 0; i < p_sys->i_pmt; i++ )
1345                 {
1346                     ts_pid_t *pmt = p_sys->pmt[i];
1347                     int i_prg;
1348
1349                     for( i_prg = 0; i_prg < pmt->psi->i_prg; i_prg++ )
1350                     {
1351                         if( pmt->psi->prg[i_prg]->i_number == i_int )
1352                         {
1353                             i_pmt_pid = p_sys->pmt[i]->i_pid;
1354                             p_prg = p_sys->pmt[i]->psi->prg[i_prg];
1355                             break;
1356                         }
1357                     }
1358                     if( i_pmt_pid > 0 ) break;
1359                 }
1360                 if( i_pmt_pid > 0 )
1361                 {
1362                     stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
1363                                     ACCESS_SET_PRIVATE_ID_STATE, i_pmt_pid,
1364                                     VLC_TRUE );
1365                     stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
1366                                     ACCESS_SET_PRIVATE_ID_STATE, p_prg->i_pid_pcr,
1367                                     VLC_TRUE );
1368
1369                     for( i = 2; i < 8192; i++ )
1370                     {
1371                         ts_pid_t *pid = &p_sys->pid[i];
1372                         int i_prg;
1373
1374                         if( !pid->b_valid || pid->psi ) continue;
1375
1376                         for( i_prg = 0; i_prg < pid->p_owner->i_prg; i_prg++ )
1377                         {
1378                             if( pid->p_owner->prg[i_prg]->i_pid_pmt == i_pmt_pid && pid->es->id )
1379                             {
1380                                 if ( pid->es->fmt.i_cat == VIDEO_ES && !i_vpid )
1381                                     i_vpid = i;
1382                                 if ( pid->es->fmt.i_cat == AUDIO_ES && !i_apid1 )
1383                                     i_apid1 = i;
1384                                 else if ( pid->es->fmt.i_cat == AUDIO_ES && !i_apid2 )
1385                                     i_apid2 = i;
1386                                 else if ( pid->es->fmt.i_cat == AUDIO_ES && !i_apid3 )
1387                                     i_apid3 = i;
1388
1389                                 stream_Control( p_demux->s,
1390                                                 STREAM_CONTROL_ACCESS,
1391                                                 ACCESS_SET_PRIVATE_ID_STATE,
1392                                                 i, VLC_TRUE );
1393                                 break;
1394                             }
1395                         }
1396                     }
1397                 }
1398             }
1399             else
1400             {
1401                 p_sys->i_dvb_program = -1;
1402                 p_sys->p_programs_list = p_list;
1403             }
1404             return VLC_SUCCESS;
1405         }
1406
1407         case DEMUX_GET_FPS:
1408         case DEMUX_SET_TIME:
1409         default:
1410             return VLC_EGENERIC;
1411     }
1412 }
1413
1414 static void PIDInit( ts_pid_t *pid, vlc_bool_t b_psi, ts_psi_t *p_owner )
1415 {
1416     vlc_bool_t b_old_valid = pid->b_valid;
1417
1418     pid->b_valid    = VLC_TRUE;
1419     pid->i_cc       = 0xff;
1420     pid->p_owner    = p_owner;
1421     pid->i_owner_number = 0;
1422
1423     TAB_INIT( pid->i_extra_es, pid->extra_es );
1424
1425     if( b_psi )
1426     {
1427         pid->es  = NULL;
1428
1429         if( !b_old_valid )
1430         {
1431             free( pid->psi );
1432             pid->psi = malloc( sizeof( ts_psi_t ) );
1433             if( pid->psi )
1434             {
1435                 pid->psi->handle= NULL;
1436                 pid->psi->i_prg = 0;
1437                 pid->psi->prg   = NULL;
1438             }
1439         }
1440         pid->psi->i_pat_version  = -1;
1441         pid->psi->i_sdt_version  = -1;
1442         if( p_owner )
1443         {
1444             ts_prg_psi_t *prg = malloc( sizeof( ts_prg_psi_t ) );
1445             if( prg )
1446             {
1447                 /* PMT */
1448                 prg->i_version  = -1;
1449                 prg->i_number   = -1;
1450                 prg->i_pid_pcr  = -1;
1451                 prg->i_pid_pmt  = -1;
1452                 prg->iod        = NULL;
1453                 prg->handle     = NULL;
1454
1455                 TAB_APPEND( pid->psi->i_prg, pid->psi->prg, prg );
1456             }
1457         }
1458     }
1459     else
1460     {
1461         pid->psi = NULL;
1462         pid->es  = malloc( sizeof( ts_es_t ) );
1463         if( pid->es )
1464         {
1465             es_format_Init( &pid->es->fmt, UNKNOWN_ES, 0 );
1466             pid->es->id      = NULL;
1467             pid->es->p_pes   = NULL;
1468             pid->es->i_pes_size= 0;
1469             pid->es->i_pes_gathered= 0;
1470             pid->es->pp_last = &pid->es->p_pes;
1471             pid->es->p_mpeg4desc = NULL;
1472             pid->es->b_gather = VLC_FALSE;
1473         }
1474     }
1475 }
1476
1477 static void PIDClean( es_out_t *out, ts_pid_t *pid )
1478 {
1479     if( pid->psi )
1480     {
1481         int i;
1482
1483         if( pid->psi->handle ) dvbpsi_DetachPMT( pid->psi->handle );
1484         for( i = 0; i < pid->psi->i_prg; i++ )
1485         {
1486             if( pid->psi->prg[i]->iod )
1487                 IODFree( pid->psi->prg[i]->iod );
1488             if( pid->psi->prg[i]->handle )
1489                 dvbpsi_DetachPMT( pid->psi->prg[i]->handle );
1490             free( pid->psi->prg[i] );
1491         }
1492         if( pid->psi->prg ) free( pid->psi->prg );
1493         free( pid->psi );
1494     }
1495     else
1496     {
1497         int i;
1498
1499         if( pid->es->id )
1500             es_out_Del( out, pid->es->id );
1501
1502         if( pid->es->p_pes )
1503             block_ChainRelease( pid->es->p_pes );
1504
1505         es_format_Clean( &pid->es->fmt );
1506
1507         free( pid->es );
1508
1509         for( i = 0; i < pid->i_extra_es; i++ )
1510         {
1511             if( pid->extra_es[i]->id )
1512                 es_out_Del( out, pid->extra_es[i]->id );
1513
1514             if( pid->extra_es[i]->p_pes )
1515                 block_ChainRelease( pid->extra_es[i]->p_pes );
1516
1517             es_format_Clean( &pid->extra_es[i]->fmt );
1518
1519             free( pid->extra_es[i] );
1520         }
1521         if( pid->i_extra_es ) free( pid->extra_es );
1522     }
1523
1524     pid->b_valid = VLC_FALSE;
1525 }
1526
1527 /****************************************************************************
1528  * gathering stuff
1529  ****************************************************************************/
1530 static void ParsePES( demux_t *p_demux, ts_pid_t *pid )
1531 {
1532     block_t *p_pes = pid->es->p_pes;
1533     uint8_t header[30];
1534     int     i_pes_size = 0;
1535     int     i_skip = 0;
1536     mtime_t i_dts = -1;
1537     mtime_t i_pts = -1;
1538     mtime_t i_length = 0;
1539     int i_max;
1540
1541     /* remove the pes from pid */
1542     pid->es->p_pes = NULL;
1543     pid->es->i_pes_size= 0;
1544     pid->es->i_pes_gathered= 0;
1545     pid->es->pp_last = &pid->es->p_pes;
1546
1547     /* FIXME find real max size */
1548     i_max = block_ChainExtract( p_pes, header, 30 );
1549
1550
1551     if( header[0] != 0 || header[1] != 0 || header[2] != 1 )
1552     {
1553         if( !p_demux->p_sys->b_silent )
1554             msg_Warn( p_demux, "invalid header [0x%x:%x:%x:%x] (pid: %d)",
1555                       header[0], header[1],header[2],header[3], pid->i_pid );
1556         block_ChainRelease( p_pes );
1557         return;
1558     }
1559
1560     /* TODO check size */
1561     switch( header[3] )
1562     {
1563         case 0xBC:  /* Program stream map */
1564         case 0xBE:  /* Padding */
1565         case 0xBF:  /* Private stream 2 */
1566         case 0xB0:  /* ECM */
1567         case 0xB1:  /* EMM */
1568         case 0xFF:  /* Program stream directory */
1569         case 0xF2:  /* DSMCC stream */
1570         case 0xF8:  /* ITU-T H.222.1 type E stream */
1571             i_skip = 6;
1572             break;
1573         default:
1574             if( ( header[6]&0xC0 ) == 0x80 )
1575             {
1576                 /* mpeg2 PES */
1577                 i_skip = header[8] + 9;
1578
1579                 if( header[7]&0x80 )    /* has pts */
1580                 {
1581                     i_pts = ((mtime_t)(header[ 9]&0x0e ) << 29)|
1582                              (mtime_t)(header[10] << 22)|
1583                             ((mtime_t)(header[11]&0xfe) << 14)|
1584                              (mtime_t)(header[12] << 7)|
1585                              (mtime_t)(header[13] >> 1);
1586
1587                     if( header[7]&0x40 )    /* has dts */
1588                     {
1589                          i_dts = ((mtime_t)(header[14]&0x0e ) << 29)|
1590                                  (mtime_t)(header[15] << 22)|
1591                                 ((mtime_t)(header[16]&0xfe) << 14)|
1592                                  (mtime_t)(header[17] << 7)|
1593                                  (mtime_t)(header[18] >> 1);
1594                     }
1595                 }
1596             }
1597             else
1598             {
1599                 i_skip = 6;
1600                 while( i_skip < 23 && header[i_skip] == 0xff )
1601                 {
1602                     i_skip++;
1603                 }
1604                 if( i_skip == 23 )
1605                 {
1606                     msg_Err( p_demux, "too much MPEG-1 stuffing" );
1607                     block_ChainRelease( p_pes );
1608                     return;
1609                 }
1610                 if( ( header[i_skip] & 0xC0 ) == 0x40 )
1611                 {
1612                     i_skip += 2;
1613                 }
1614
1615                 if(  header[i_skip]&0x20 )
1616                 {
1617                      i_pts = ((mtime_t)(header[i_skip]&0x0e ) << 29)|
1618                               (mtime_t)(header[i_skip+1] << 22)|
1619                              ((mtime_t)(header[i_skip+2]&0xfe) << 14)|
1620                               (mtime_t)(header[i_skip+3] << 7)|
1621                               (mtime_t)(header[i_skip+4] >> 1);
1622
1623                     if( header[i_skip]&0x10 )    /* has dts */
1624                     {
1625                          i_dts = ((mtime_t)(header[i_skip+5]&0x0e ) << 29)|
1626                                   (mtime_t)(header[i_skip+6] << 22)|
1627                                  ((mtime_t)(header[i_skip+7]&0xfe) << 14)|
1628                                   (mtime_t)(header[i_skip+8] << 7)|
1629                                   (mtime_t)(header[i_skip+9] >> 1);
1630                          i_skip += 10;
1631                     }
1632                     else
1633                     {
1634                         i_skip += 5;
1635                     }
1636                 }
1637                 else
1638                 {
1639                     i_skip += 1;
1640                 }
1641             }
1642             break;
1643     }
1644
1645     if( pid->es->fmt.i_codec == VLC_FOURCC( 'a', '5', '2', 'b' ) ||
1646         pid->es->fmt.i_codec == VLC_FOURCC( 'd', 't', 's', 'b' ) )
1647     {
1648         i_skip += 4;
1649     }
1650     else if( pid->es->fmt.i_codec == VLC_FOURCC( 'l', 'p', 'c', 'b' ) ||
1651              pid->es->fmt.i_codec == VLC_FOURCC( 's', 'p', 'u', 'b' ) ||
1652              pid->es->fmt.i_codec == VLC_FOURCC( 's', 'd', 'd', 'b' ) )
1653     {
1654         i_skip += 1;
1655     }
1656     else if( pid->es->fmt.i_codec == VLC_FOURCC( 's', 'u', 'b', 't' ) &&
1657              pid->es->p_mpeg4desc )
1658     {
1659         decoder_config_descriptor_t *dcd = &pid->es->p_mpeg4desc->dec_descr;
1660
1661         if( dcd->i_decoder_specific_info_len > 2 &&
1662             dcd->p_decoder_specific_info[0] == 0x10 &&
1663             ( dcd->p_decoder_specific_info[1]&0x10 ) )
1664         {
1665             /* display length */
1666             if( p_pes->i_buffer + 2 <= i_skip )
1667             {
1668                 i_length = GetWBE( &p_pes->p_buffer[i_skip] );
1669             }
1670
1671             i_skip += 2;
1672         }
1673         if( p_pes->i_buffer + 2 <= i_skip )
1674         {
1675             i_pes_size = GetWBE( &p_pes->p_buffer[i_skip] );
1676         }
1677         /* */
1678         i_skip += 2;
1679     }
1680 #ifdef ZVBI_COMPILED
1681     else if( pid->es->fmt.i_codec == VLC_FOURCC( 't', 'e', 'l', 'x' ) )
1682         i_skip = 0; /*hack for zvbi support */
1683 #endif
1684     /* skip header */
1685     while( p_pes && i_skip > 0 )
1686     {
1687         if( p_pes->i_buffer <= i_skip )
1688         {
1689             block_t *p_next = p_pes->p_next;
1690
1691             i_skip -= p_pes->i_buffer;
1692             block_Release( p_pes );
1693             p_pes = p_next;
1694         }
1695         else
1696         {
1697             p_pes->i_buffer -= i_skip;
1698             p_pes->p_buffer += i_skip;
1699             break;
1700         }
1701     }
1702
1703     /* ISO/IEC 13818-1 2.7.5: if no pts and no dts, then dts == pts */
1704     if( i_pts >= 0 && i_dts < 0 )
1705         i_dts = i_pts;
1706
1707     if( p_pes )
1708     {
1709         block_t *p_block;
1710         int i;
1711
1712         if( i_dts >= 0 )
1713         {
1714             p_pes->i_dts = i_dts * 100 / 9;
1715         }
1716         if( i_pts >= 0 )
1717         {
1718             p_pes->i_pts = i_pts * 100 / 9;
1719         }
1720         p_pes->i_length = i_length * 100 / 9;
1721
1722         p_block = block_ChainGather( p_pes );
1723         if( pid->es->fmt.i_codec == VLC_FOURCC( 's', 'u', 'b', 't' ) )
1724         {
1725             if( i_pes_size > 0 && p_block->i_buffer > i_pes_size )
1726             {
1727                 p_block->i_buffer = i_pes_size;
1728             }
1729             /* Append a \0 */
1730             p_block = block_Realloc( p_block, 0, p_block->i_buffer + 1 );
1731             p_block->p_buffer[p_block->i_buffer -1] = '\0';
1732         }
1733
1734         for( i = 0; i < pid->i_extra_es; i++ )
1735         {
1736             es_out_Send( p_demux->out, pid->extra_es[i]->id,
1737                          block_Duplicate( p_block ) );
1738         }
1739
1740         es_out_Send( p_demux->out, pid->es->id, p_block );
1741     }
1742     else
1743     {
1744         msg_Warn( p_demux, "empty pes" );
1745     }
1746 }
1747
1748 static void PCRHandle( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
1749 {
1750     demux_sys_t   *p_sys = p_demux->p_sys;
1751     const uint8_t *p = p_bk->p_buffer;
1752
1753     if( ( p[3]&0x20 ) && /* adaptation */
1754         ( p[5]&0x10 ) &&
1755         ( p[4] >= 7 ) )
1756     {
1757         int i;
1758         mtime_t i_pcr;  /* 33 bits */
1759
1760         i_pcr = ( (mtime_t)p[6] << 25 ) |
1761                 ( (mtime_t)p[7] << 17 ) |
1762                 ( (mtime_t)p[8] << 9 ) |
1763                 ( (mtime_t)p[9] << 1 ) |
1764                 ( (mtime_t)p[10] >> 7 );
1765
1766         /* Search program and set the PCR */
1767         for( i = 0; i < p_sys->i_pmt; i++ )
1768         {
1769             int i_prg;
1770             for( i_prg = 0; i_prg < p_sys->pmt[i]->psi->i_prg; i_prg++ )
1771             {
1772                 if( pid->i_pid == p_sys->pmt[i]->psi->prg[i_prg]->i_pid_pcr )
1773                 {
1774                     es_out_Control( p_demux->out, ES_OUT_SET_GROUP_PCR,
1775                                     (int)p_sys->pmt[i]->psi->prg[i_prg]->i_number,
1776                                     (int64_t)(i_pcr * 100 / 9) );
1777                 }
1778             }
1779         }
1780     }
1781 }
1782
1783 static vlc_bool_t GatherPES( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
1784 {
1785     const uint8_t    *p = p_bk->p_buffer;
1786     const vlc_bool_t b_unit_start = p[1]&0x40;
1787     const vlc_bool_t b_adaptation = p[3]&0x20;
1788     const vlc_bool_t b_payload    = p[3]&0x10;
1789     const int        i_cc         = p[3]&0x0f;   /* continuity counter */
1790     vlc_bool_t       b_discontinuity = VLC_FALSE;/* discontinuity */
1791
1792     /* transport_scrambling_control is ignored */
1793     int         i_skip = 0;
1794     vlc_bool_t  i_ret  = VLC_FALSE;
1795     int         i_diff;
1796
1797 #if 0
1798     msg_Dbg( p_demux, "pid=%d unit_start=%d adaptation=%d payload=%d "
1799              "cc=0x%x", pid->i_pid, b_unit_start, b_adaptation,
1800              b_payload, i_cc );
1801 #endif
1802
1803     /* For now, ignore additional error correction
1804      * TODO: handle Reed-Solomon 204,188 error correction */
1805     p_bk->i_buffer = TS_PACKET_SIZE_188;
1806
1807     if( p[1]&0x80 )
1808     {
1809         msg_Dbg( p_demux, "transport_error_indicator set (pid=%d)",
1810                  pid->i_pid );
1811         if( pid->es->p_pes ) //&& pid->es->fmt.i_cat == VIDEO_ES )
1812             pid->es->p_pes->i_flags |= BLOCK_FLAG_CORRUPTED;
1813     }
1814
1815     if( p_demux->p_sys->csa )
1816     {
1817         csa_Decrypt( p_demux->p_sys->csa, p_bk->p_buffer, p_demux->p_sys->i_csa_pkt_size );
1818     }
1819
1820     if( !b_adaptation )
1821     {
1822         /* We don't have any adaptation_field, so payload starts
1823          * immediately after the 4 byte TS header */
1824         i_skip = 4;
1825     }
1826     else
1827     {
1828         /* p[4] is adaptation_field_length minus one */
1829         i_skip = 5 + p[4];
1830         if( p[4] > 0 )
1831         {
1832             /* discontinuity indicator found in stream */
1833             b_discontinuity = (p[5]&0x80) ? VLC_TRUE : VLC_FALSE;
1834             if( b_discontinuity && pid->es->p_pes )
1835             {
1836                 msg_Warn( p_demux, "discontinuity indicator (pid=%d) ",
1837                             pid->i_pid );
1838                 /* pid->es->p_pes->i_flags |= BLOCK_FLAG_DISCONTINUITY; */
1839             }
1840 #if 0
1841             if( p[5]&0x40 )
1842                 msg_Dbg( p_demux, "random access indicator (pid=%d) ", pid->i_pid );
1843 #endif
1844         }
1845     }
1846
1847     /* Test continuity counter */
1848     /* continuous when (one of this):
1849         * diff == 1
1850         * diff == 0 and payload == 0
1851         * diff == 0 and duplicate packet (playload != 0) <- should we
1852         *   test the content ?
1853      */
1854     i_diff = ( i_cc - pid->i_cc )&0x0f;
1855     if( b_payload && i_diff == 1 )
1856     {
1857         pid->i_cc = ( pid->i_cc + 1 ) & 0xf;
1858     }
1859     else
1860     {
1861         if( pid->i_cc == 0xff )
1862         {
1863             msg_Warn( p_demux, "first packet for pid=%d cc=0x%x",
1864                       pid->i_pid, i_cc );
1865             pid->i_cc = i_cc;
1866         }
1867         else if( i_diff != 0 && !b_discontinuity )
1868         {
1869             msg_Warn( p_demux, "discontinuity received 0x%x instead of 0x%x (pid=%d)",
1870                       i_cc, ( pid->i_cc + 1 )&0x0f, pid->i_pid );
1871
1872             pid->i_cc = i_cc;
1873             if( pid->es->p_pes && pid->es->fmt.i_cat != VIDEO_ES )
1874             {
1875                 /* Small video artifacts are usually better then
1876                  * dropping full frames */
1877                 pid->es->p_pes->i_flags |= BLOCK_FLAG_CORRUPTED;
1878             }
1879         }
1880     }
1881
1882     PCRHandle( p_demux, pid, p_bk );
1883
1884     if( i_skip >= 188 || pid->es->id == NULL || p_demux->p_sys->b_udp_out )
1885     {
1886         block_Release( p_bk );
1887         return i_ret;
1888     }
1889
1890     /* We have to gather it */
1891     p_bk->p_buffer += i_skip;
1892     p_bk->i_buffer -= i_skip;
1893
1894     if( b_unit_start )
1895     {
1896         if( pid->es->p_pes )
1897         {
1898             ParsePES( p_demux, pid );
1899             i_ret = VLC_TRUE;
1900         }
1901
1902         block_ChainLastAppend( &pid->es->pp_last, p_bk );
1903         if( p_bk->i_buffer > 6 )
1904         {
1905             pid->es->i_pes_size = GetWBE( &p_bk->p_buffer[4] );
1906             if( pid->es->i_pes_size > 0 )
1907             {
1908                 pid->es->i_pes_size += 6;
1909             }
1910         }
1911         pid->es->i_pes_gathered += p_bk->i_buffer;
1912         if( pid->es->i_pes_size > 0 &&
1913             pid->es->i_pes_gathered >= pid->es->i_pes_size )
1914         {
1915             ParsePES( p_demux, pid );
1916             i_ret = VLC_TRUE;
1917         }
1918     }
1919     else
1920     {
1921         if( pid->es->p_pes == NULL )
1922         {
1923             /* msg_Dbg( p_demux, "broken packet" ); */
1924             block_Release( p_bk );
1925         }
1926         else
1927         {
1928             block_ChainLastAppend( &pid->es->pp_last, p_bk );
1929             pid->es->i_pes_gathered += p_bk->i_buffer;
1930             if( pid->es->i_pes_size > 0 &&
1931                 pid->es->i_pes_gathered >= pid->es->i_pes_size )
1932             {
1933                 ParsePES( p_demux, pid );
1934                 i_ret = VLC_TRUE;
1935             }
1936         }
1937     }
1938
1939     return i_ret;
1940 }
1941
1942 static int PIDFillFormat( ts_pid_t *pid, int i_stream_type )
1943 {
1944     es_format_t *fmt = &pid->es->fmt;
1945
1946     switch( i_stream_type )
1947     {
1948         case 0x01:  /* MPEG-1 video */
1949         case 0x02:  /* MPEG-2 video */
1950         case 0x80:  /* MPEG-2 MOTO video */
1951             es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'm', 'p', 'g', 'v' ) );
1952             break;
1953         case 0x03:  /* MPEG-1 audio */
1954         case 0x04:  /* MPEG-2 audio */
1955             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'm', 'p', 'g', 'a' ) );
1956             break;
1957         case 0x11:  /* MPEG4 (audio) */
1958         case 0x0f:  /* ISO/IEC 13818-7 Audio with ADTS transport syntax */
1959             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'm', 'p', '4', 'a' ) );
1960             break;
1961         case 0x10:  /* MPEG4 (video) */
1962             es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'm', 'p', '4', 'v' ) );
1963             pid->es->b_gather = VLC_TRUE;
1964             break;
1965         case 0x1B:  /* H264 <- check transport syntax/needed descriptor */
1966             es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'h', '2', '6', '4' ) );
1967             break;
1968
1969         case 0x81:  /* A52 (audio) */
1970             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'a', '5', '2', ' ' ) );
1971             break;
1972         case 0x82:  /* DVD_SPU (sub) */
1973             es_format_Init( fmt, SPU_ES, VLC_FOURCC( 's', 'p', 'u', ' ' ) );
1974             break;
1975         case 0x83:  /* LPCM (audio) */
1976             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'l', 'p', 'c', 'm' ) );
1977             break;
1978         case 0x84:  /* SDDS (audio) */
1979             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 's', 'd', 'd', 's' ) );
1980             break;
1981         case 0x85:  /* DTS (audio) */
1982             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'd', 't', 's', ' ' ) );
1983             break;
1984
1985         case 0x91:  /* A52 vls (audio) */
1986             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'a', '5', '2', 'b' ) );
1987             break;
1988         case 0x92:  /* DVD_SPU vls (sub) */
1989             es_format_Init( fmt, SPU_ES, VLC_FOURCC( 's', 'p', 'u', 'b' ) );
1990             break;
1991
1992         case 0x94:  /* SDDS (audio) */
1993             es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 's', 'd', 'd', 'b' ) );
1994             break;
1995
1996         case 0xa0:  /* MSCODEC vlc (video) (fixed later) */
1997             es_format_Init( fmt, UNKNOWN_ES, 0 );
1998             pid->es->b_gather = VLC_TRUE;
1999             break;
2000
2001         case 0x06:  /* PES_PRIVATE  (fixed later) */
2002         case 0x12:  /* MPEG-4 generic (sub/scene/...) (fixed later) */
2003         case 0xEA:  /* Privately managed ES (VC-1) (fixed later */
2004         default:
2005             es_format_Init( fmt, UNKNOWN_ES, 0 );
2006             break;
2007     }
2008
2009     /* PES packets usually contain truncated frames */
2010     fmt->b_packetized = VLC_FALSE;
2011
2012     return fmt->i_cat == UNKNOWN_ES ? VLC_EGENERIC : VLC_SUCCESS ;
2013 }
2014
2015 /*****************************************************************************
2016  * MP4 specific functions (IOD parser)
2017  *****************************************************************************/
2018 static int  IODDescriptorLength( int *pi_data, uint8_t **pp_data )
2019 {
2020     unsigned int i_b;
2021     unsigned int i_len = 0;
2022     do
2023     {
2024         i_b = **pp_data;
2025         (*pp_data)++;
2026         (*pi_data)--;
2027         i_len = ( i_len << 7 ) + ( i_b&0x7f );
2028
2029     } while( i_b&0x80 );
2030
2031     return( i_len );
2032 }
2033
2034 static int IODGetByte( int *pi_data, uint8_t **pp_data )
2035 {
2036     if( *pi_data > 0 )
2037     {
2038         const int i_b = **pp_data;
2039         (*pp_data)++;
2040         (*pi_data)--;
2041         return( i_b );
2042     }
2043     return( 0 );
2044 }
2045
2046 static int IODGetWord( int *pi_data, uint8_t **pp_data )
2047 {
2048     const int i1 = IODGetByte( pi_data, pp_data );
2049     const int i2 = IODGetByte( pi_data, pp_data );
2050     return( ( i1 << 8 ) | i2 );
2051 }
2052
2053 static int IODGet3Bytes( int *pi_data, uint8_t **pp_data )
2054 {
2055     const int i1 = IODGetByte( pi_data, pp_data );
2056     const int i2 = IODGetByte( pi_data, pp_data );
2057     const int i3 = IODGetByte( pi_data, pp_data );
2058
2059     return( ( i1 << 16 ) | ( i2 << 8) | i3 );
2060 }
2061
2062 static uint32_t IODGetDWord( int *pi_data, uint8_t **pp_data )
2063 {
2064     const uint32_t i1 = IODGetWord( pi_data, pp_data );
2065     const uint32_t i2 = IODGetWord( pi_data, pp_data );
2066     return( ( i1 << 16 ) | i2 );
2067 }
2068
2069 static char* IODGetURL( int *pi_data, uint8_t **pp_data )
2070 {
2071     char *url;
2072     int i_url_len, i;
2073
2074     i_url_len = IODGetByte( pi_data, pp_data );
2075     url = malloc( i_url_len + 1 );
2076     if( !url ) return NULL;
2077     for( i = 0; i < i_url_len; i++ )
2078     {
2079         url[i] = IODGetByte( pi_data, pp_data );
2080     }
2081     url[i_url_len] = '\0';
2082     return( url );
2083 }
2084
2085 static iod_descriptor_t *IODNew( int i_data, uint8_t *p_data )
2086 {
2087     iod_descriptor_t *p_iod;
2088     int i;
2089     int i_es_index;
2090     uint8_t     i_flags, i_iod_tag, byte1, byte2, byte3;
2091     vlc_bool_t  b_url;
2092     int         i_iod_length;
2093
2094     p_iod = malloc( sizeof( iod_descriptor_t ) );
2095     if( !p_iod ) return NULL;
2096     memset( p_iod, 0, sizeof( iod_descriptor_t ) );
2097
2098 #ifdef TS_DEBUG
2099     fprintf( stderr, "\n************ IOD ************" );
2100 #endif
2101     for( i = 0; i < 255; i++ )
2102     {
2103         p_iod->es_descr[i].b_ok = 0;
2104     }
2105     i_es_index = 0;
2106
2107     if( i_data < 3 )
2108     {
2109         return p_iod;
2110     }
2111
2112     byte1 = IODGetByte( &i_data, &p_data );
2113     byte2 = IODGetByte( &i_data, &p_data );
2114     byte3 = IODGetByte( &i_data, &p_data );
2115     if( byte2 == 0x02 ) //old vlc's buggy implementation of the IOD_descriptor
2116     {
2117         p_iod->i_iod_label_scope = 0x11;
2118         p_iod->i_iod_label = byte1;
2119         i_iod_tag = byte2;
2120     }
2121     else  //correct implementation of the IOD_descriptor
2122     {
2123         p_iod->i_iod_label_scope = byte1;
2124         p_iod->i_iod_label = byte2;
2125         i_iod_tag = byte3;
2126     }
2127 #ifdef TS_DEBUG
2128     fprintf( stderr, "\n* iod_label:%d", p_iod->i_iod_label );
2129     fprintf( stderr, "\n* ===========" );
2130     fprintf( stderr, "\n* tag:0x%x", i_iod_tag );
2131 #endif
2132     if( i_iod_tag != 0x02 )
2133     {
2134 #ifdef TS_DEBUG
2135         fprintf( stderr, "\n ERR: tag %02x != 0x02", i_iod_tag );
2136 #endif
2137         return p_iod;
2138     }
2139
2140     i_iod_length = IODDescriptorLength( &i_data, &p_data );
2141 #ifdef TS_DEBUG
2142     fprintf( stderr, "\n* length:%d", i_iod_length );
2143 #endif
2144     if( i_iod_length > i_data )
2145     {
2146         i_iod_length = i_data;
2147     }
2148
2149     p_iod->i_od_id = ( IODGetByte( &i_data, &p_data ) << 2 );
2150     i_flags = IODGetByte( &i_data, &p_data );
2151     p_iod->i_od_id |= i_flags >> 6;
2152     b_url = ( i_flags >> 5  )&0x01;
2153 #ifdef TS_DEBUG
2154     fprintf( stderr, "\n* od_id:%d", p_iod->i_od_id );
2155     fprintf( stderr, "\n* url flag:%d", b_url );
2156     fprintf( stderr, "\n* includeInlineProfileLevel flag:%d", ( i_flags >> 4 )&0x01 );
2157 #endif
2158     if( b_url )
2159     {
2160         p_iod->psz_url = IODGetURL( &i_data, &p_data );
2161 #ifdef TS_DEBUG
2162         fprintf( stderr, "\n* url string:%s", p_iod->psz_url );
2163         fprintf( stderr, "\n*****************************\n" );
2164 #endif
2165         return p_iod;
2166     }
2167     else
2168     {
2169         p_iod->psz_url = NULL;
2170     }
2171
2172     p_iod->i_ODProfileLevelIndication = IODGetByte( &i_data, &p_data );
2173     p_iod->i_sceneProfileLevelIndication = IODGetByte( &i_data, &p_data );
2174     p_iod->i_audioProfileLevelIndication = IODGetByte( &i_data, &p_data );
2175     p_iod->i_visualProfileLevelIndication = IODGetByte( &i_data, &p_data );
2176     p_iod->i_graphicsProfileLevelIndication = IODGetByte( &i_data, &p_data );
2177 #ifdef TS_DEBUG
2178     fprintf( stderr, "\n* ODProfileLevelIndication:%d", p_iod->i_ODProfileLevelIndication );
2179     fprintf( stderr, "\n* sceneProfileLevelIndication:%d", p_iod->i_sceneProfileLevelIndication );
2180     fprintf( stderr, "\n* audioProfileLevelIndication:%d", p_iod->i_audioProfileLevelIndication );
2181     fprintf( stderr, "\n* visualProfileLevelIndication:%d", p_iod->i_visualProfileLevelIndication );
2182     fprintf( stderr, "\n* graphicsProfileLevelIndication:%d", p_iod->i_graphicsProfileLevelIndication );
2183 #endif
2184
2185     while( i_data > 0 && i_es_index < 255)
2186     {
2187         int i_tag, i_length;
2188         int     i_data_sav;
2189         uint8_t *p_data_sav;
2190
2191         i_tag = IODGetByte( &i_data, &p_data );
2192         i_length = IODDescriptorLength( &i_data, &p_data );
2193
2194         i_data_sav = i_data;
2195         p_data_sav = p_data;
2196
2197         i_data = i_length;
2198
2199         switch( i_tag )
2200         {
2201             case 0x03:
2202                 {
2203 #define es_descr    p_iod->es_descr[i_es_index]
2204                     int i_decoderConfigDescr_length;
2205 #ifdef TS_DEBUG
2206                     fprintf( stderr, "\n* - ES_Descriptor length:%d", i_length );
2207 #endif
2208                     es_descr.b_ok = 1;
2209
2210                     es_descr.i_es_id = IODGetWord( &i_data, &p_data );
2211                     i_flags = IODGetByte( &i_data, &p_data );
2212                     es_descr.b_streamDependenceFlag = ( i_flags >> 7 )&0x01;
2213                     b_url = ( i_flags >> 6 )&0x01;
2214                     es_descr.b_OCRStreamFlag = ( i_flags >> 5 )&0x01;
2215                     es_descr.i_streamPriority = i_flags & 0x1f;
2216 #ifdef TS_DEBUG
2217                     fprintf( stderr, "\n*   * streamDependenceFlag:%d", es_descr.b_streamDependenceFlag );
2218                     fprintf( stderr, "\n*   * OCRStreamFlag:%d", es_descr.b_OCRStreamFlag );
2219                     fprintf( stderr, "\n*   * streamPriority:%d", es_descr.i_streamPriority );
2220 #endif
2221                     if( es_descr.b_streamDependenceFlag )
2222                     {
2223                         es_descr.i_dependOn_es_id = IODGetWord( &i_data, &p_data );
2224 #ifdef TS_DEBUG
2225                         fprintf( stderr, "\n*   * dependOn_es_id:%d", es_descr.i_dependOn_es_id );
2226 #endif
2227                     }
2228
2229                     if( b_url )
2230                     {
2231                         es_descr.psz_url = IODGetURL( &i_data, &p_data );
2232 #ifdef TS_DEBUG
2233                         fprintf( stderr, "\n* url string:%s", es_descr.psz_url );
2234 #endif
2235                     }
2236                     else
2237                     {
2238                         es_descr.psz_url = NULL;
2239                     }
2240
2241                     if( es_descr.b_OCRStreamFlag )
2242                     {
2243                         es_descr.i_OCR_es_id = IODGetWord( &i_data, &p_data );
2244 #ifdef TS_DEBUG
2245                         fprintf( stderr, "\n*   * OCR_es_id:%d", es_descr.i_OCR_es_id );
2246 #endif
2247                     }
2248
2249                     if( IODGetByte( &i_data, &p_data ) != 0x04 )
2250                     {
2251 #ifdef TS_DEBUG
2252                         fprintf( stderr, "\n* ERR missing DecoderConfigDescr" );
2253 #endif
2254                         es_descr.b_ok = 0;
2255                         break;
2256                     }
2257                     i_decoderConfigDescr_length = IODDescriptorLength( &i_data, &p_data );
2258 #ifdef TS_DEBUG
2259                     fprintf( stderr, "\n*   - DecoderConfigDesc length:%d", i_decoderConfigDescr_length );
2260 #endif
2261 #define dec_descr   es_descr.dec_descr
2262                     dec_descr.i_objectTypeIndication = IODGetByte( &i_data, &p_data );
2263                     i_flags = IODGetByte( &i_data, &p_data );
2264                     dec_descr.i_streamType = i_flags >> 2;
2265                     dec_descr.b_upStream = ( i_flags >> 1 )&0x01;
2266                     dec_descr.i_bufferSizeDB = IODGet3Bytes( &i_data, &p_data );
2267                     dec_descr.i_maxBitrate = IODGetDWord( &i_data, &p_data );
2268                     dec_descr.i_avgBitrate = IODGetDWord( &i_data, &p_data );
2269 #ifdef TS_DEBUG
2270                     fprintf( stderr, "\n*     * objectTypeIndication:0x%x", dec_descr.i_objectTypeIndication  );
2271                     fprintf( stderr, "\n*     * streamType:0x%x", dec_descr.i_streamType );
2272                     fprintf( stderr, "\n*     * upStream:%d", dec_descr.b_upStream );
2273                     fprintf( stderr, "\n*     * bufferSizeDB:%d", dec_descr.i_bufferSizeDB );
2274                     fprintf( stderr, "\n*     * maxBitrate:%d", dec_descr.i_maxBitrate );
2275                     fprintf( stderr, "\n*     * avgBitrate:%d", dec_descr.i_avgBitrate );
2276 #endif
2277                     if( i_decoderConfigDescr_length > 13 && IODGetByte( &i_data, &p_data ) == 0x05 )
2278                     {
2279                         int i;
2280                         dec_descr.i_decoder_specific_info_len =
2281                             IODDescriptorLength( &i_data, &p_data );
2282                         if( dec_descr.i_decoder_specific_info_len > 0 )
2283                         {
2284                             dec_descr.p_decoder_specific_info =
2285                                 malloc( dec_descr.i_decoder_specific_info_len );
2286                         }
2287                         for( i = 0; i < dec_descr.i_decoder_specific_info_len; i++ )
2288                         {
2289                             dec_descr.p_decoder_specific_info[i] = IODGetByte( &i_data, &p_data );
2290                         }
2291                     }
2292                     else
2293                     {
2294                         dec_descr.i_decoder_specific_info_len = 0;
2295                         dec_descr.p_decoder_specific_info = NULL;
2296                     }
2297                 }
2298 #undef  dec_descr
2299 #define sl_descr    es_descr.sl_descr
2300                 {
2301                     int i_SLConfigDescr_length;
2302                     int i_predefined;
2303
2304                     if( IODGetByte( &i_data, &p_data ) != 0x06 )
2305                     {
2306 #ifdef TS_DEBUG
2307                         fprintf( stderr, "\n* ERR missing SLConfigDescr" );
2308 #endif
2309                         es_descr.b_ok = 0;
2310                         break;
2311                     }
2312                     i_SLConfigDescr_length = IODDescriptorLength( &i_data, &p_data );
2313 #ifdef TS_DEBUG
2314                     fprintf( stderr, "\n*   - SLConfigDescr length:%d", i_SLConfigDescr_length );
2315 #endif
2316                     i_predefined = IODGetByte( &i_data, &p_data );
2317 #ifdef TS_DEBUG
2318                     fprintf( stderr, "\n*     * i_predefined:0x%x", i_predefined  );
2319 #endif
2320                     switch( i_predefined )
2321                     {
2322                         case 0x01:
2323                             {
2324                                 sl_descr.b_useAccessUnitStartFlag   = 0;
2325                                 sl_descr.b_useAccessUnitEndFlag     = 0;
2326                                 sl_descr.b_useRandomAccessPointFlag = 0;
2327                                 //sl_descr.b_useRandomAccessUnitsOnlyFlag = 0;
2328                                 sl_descr.b_usePaddingFlag           = 0;
2329                                 sl_descr.b_useTimeStampsFlags       = 0;
2330                                 sl_descr.b_useIdleFlag              = 0;
2331                                 sl_descr.b_durationFlag     = 0;    // FIXME FIXME
2332                                 sl_descr.i_timeStampResolution      = 1000;
2333                                 sl_descr.i_OCRResolution    = 0;    // FIXME FIXME
2334                                 sl_descr.i_timeStampLength          = 32;
2335                                 sl_descr.i_OCRLength        = 0;    // FIXME FIXME
2336                                 sl_descr.i_AU_Length                = 0;
2337                                 sl_descr.i_instantBitrateLength= 0; // FIXME FIXME
2338                                 sl_descr.i_degradationPriorityLength= 0;
2339                                 sl_descr.i_AU_seqNumLength          = 0;
2340                                 sl_descr.i_packetSeqNumLength       = 0;
2341                                 if( sl_descr.b_durationFlag )
2342                                 {
2343                                     sl_descr.i_timeScale            = 0;    // FIXME FIXME
2344                                     sl_descr.i_accessUnitDuration   = 0;    // FIXME FIXME
2345                                     sl_descr.i_compositionUnitDuration= 0;    // FIXME FIXME
2346                                 }
2347                                 if( !sl_descr.b_useTimeStampsFlags )
2348                                 {
2349                                     sl_descr.i_startDecodingTimeStamp   = 0;    // FIXME FIXME
2350                                     sl_descr.i_startCompositionTimeStamp= 0;    // FIXME FIXME
2351                                 }
2352                             }
2353                             break;
2354                         default:
2355 #ifdef TS_DEBUG
2356                             fprintf( stderr, "\n* ERR unsupported SLConfigDescr predefined" );
2357 #endif
2358                             es_descr.b_ok = 0;
2359                             break;
2360                     }
2361                 }
2362                 break;
2363 #undef  sl_descr
2364 #undef  es_descr
2365             default:
2366 #ifdef TS_DEBUG
2367                 fprintf( stderr, "\n* - OD tag:0x%x length:%d (Unsupported)", i_tag, i_length );
2368 #endif
2369                 break;
2370         }
2371
2372         p_data = p_data_sav + i_length;
2373         i_data = i_data_sav - i_length;
2374         i_es_index++;
2375     }
2376 #ifdef TS_DEBUG
2377     fprintf( stderr, "\n*****************************\n" );
2378 #endif
2379     return p_iod;
2380 }
2381
2382 static void IODFree( iod_descriptor_t *p_iod )
2383 {
2384     int i;
2385
2386     if( p_iod->psz_url )
2387     {
2388         free( p_iod->psz_url );
2389         p_iod->psz_url = NULL;
2390         free( p_iod );
2391         return;
2392     }
2393
2394     for( i = 0; i < 255; i++ )
2395     {
2396 #define es_descr p_iod->es_descr[i]
2397         if( es_descr.b_ok )
2398         {
2399             if( es_descr.psz_url )
2400             {
2401                 free( es_descr.psz_url );
2402                 es_descr.psz_url = NULL;
2403             }
2404             else
2405             {
2406                 if( es_descr.dec_descr.p_decoder_specific_info != NULL )
2407                 {
2408                     free( es_descr.dec_descr.p_decoder_specific_info );
2409                     es_descr.dec_descr.p_decoder_specific_info = NULL;
2410                     es_descr.dec_descr.i_decoder_specific_info_len = 0;
2411                 }
2412             }
2413         }
2414         es_descr.b_ok = 0;
2415 #undef  es_descr
2416     }
2417     free( p_iod );
2418 }
2419
2420 /****************************************************************************
2421  ****************************************************************************
2422  ** libdvbpsi callbacks
2423  ****************************************************************************
2424  ****************************************************************************/
2425 static vlc_bool_t DVBProgramIsSelected( demux_t *p_demux, uint16_t i_pgrm )
2426 {
2427     demux_sys_t          *p_sys = p_demux->p_sys;
2428
2429     if ( !p_sys->b_dvb_control ) return VLC_FALSE;
2430     if ( (p_sys->i_dvb_program == -1 && p_sys->p_programs_list == NULL)
2431            || p_sys->i_dvb_program == 0 )
2432         return VLC_TRUE;
2433     if ( p_sys->i_dvb_program == i_pgrm ) return VLC_TRUE;
2434
2435     if ( p_sys->p_programs_list != NULL )
2436     {
2437         int i;
2438         for ( i = 0; i < p_sys->p_programs_list->i_count; i++ )
2439         {
2440             if ( i_pgrm == p_sys->p_programs_list->p_values[i].i_int )
2441                 return VLC_TRUE;
2442         }
2443     }
2444     return VLC_FALSE;
2445 }
2446
2447 #ifdef TS_USE_DVB_SI
2448 static void SDTCallBack( demux_t *p_demux, dvbpsi_sdt_t *p_sdt )
2449 {
2450     demux_sys_t          *p_sys = p_demux->p_sys;
2451     ts_pid_t             *sdt = &p_sys->pid[0x11];
2452     dvbpsi_sdt_service_t *p_srv;
2453
2454     msg_Dbg( p_demux, "SDTCallBack called" );
2455
2456     if( sdt->psi->i_sdt_version != -1 &&
2457         ( !p_sdt->b_current_next ||
2458           p_sdt->i_version == sdt->psi->i_sdt_version ) )
2459     {
2460         dvbpsi_DeleteSDT( p_sdt );
2461         return;
2462     }
2463
2464     msg_Dbg( p_demux, "new SDT ts_id=%d version=%d current_next=%d "
2465              "network_id=%d",
2466              p_sdt->i_ts_id, p_sdt->i_version, p_sdt->b_current_next,
2467              p_sdt->i_network_id );
2468
2469     for( p_srv = p_sdt->p_first_service; p_srv; p_srv = p_srv->p_next )
2470     {
2471         vlc_meta_t          *p_meta;
2472         dvbpsi_descriptor_t *p_dr;
2473
2474         const char *psz_type = NULL;
2475         const char *psz_status = NULL;
2476
2477         msg_Dbg( p_demux, "  * service id=%d eit schedule=%d present=%d "
2478                  "running=%d free_ca=%d",
2479                  p_srv->i_service_id, p_srv->b_eit_schedule,
2480                  p_srv->b_eit_present, p_srv->i_running_status,
2481                  p_srv->b_free_ca );
2482
2483         if( p_sys->i_dvb_program != -1 && p_sys->i_dvb_program != p_srv->i_service_id )
2484             continue;
2485
2486         p_meta = vlc_meta_New();
2487         for( p_dr = p_srv->p_first_descriptor; p_dr; p_dr = p_dr->p_next )
2488         {
2489             if( p_dr->i_tag == 0x48 )
2490             {
2491                 static const char *ppsz_type[17] = {
2492                     "Reserved",
2493                     "Digital television service",
2494                     "Digital radio sound service",
2495                     "Teletext service",
2496                     "NVOD reference service",
2497                     "NVOD time-shifted service",
2498                     "Mosaic service",
2499                     "PAL coded signal",
2500                     "SECAM coded signal",
2501                     "D/D2-MAC",
2502                     "FM Radio",
2503                     "NTSC coded signal",
2504                     "Data broadcast service",
2505                     "Reserved for Common Interface Usage",
2506                     "RCS Map (see EN 301 790 [35])",
2507                     "RCS FLS (see EN 301 790 [35])",
2508                     "DVB MHP service"
2509                 };
2510                 dvbpsi_service_dr_t *pD = dvbpsi_DecodeServiceDr( p_dr );
2511                 char str1[257];
2512                 char str2[257];
2513
2514                 memcpy( str1, pD->i_service_provider_name,
2515                         pD->i_service_provider_name_length );
2516                 str1[pD->i_service_provider_name_length] = '\0';
2517                 memcpy( str2, pD->i_service_name, pD->i_service_name_length );
2518                 str2[pD->i_service_name_length] = '\0';
2519
2520                 msg_Dbg( p_demux, "    - type=%d provider=%s name=%s",
2521                          pD->i_service_type, str1, str2 );
2522
2523                 vlc_meta_SetTitle( p_meta, str2 );
2524                 vlc_meta_SetPublisher( p_meta, str1 );
2525                 if( pD->i_service_type >= 0x01 && pD->i_service_type <= 0x10 )
2526                     psz_type = ppsz_type[pD->i_service_type];
2527             }
2528         }
2529
2530         if( p_srv->i_running_status >= 0x01 && p_srv->i_running_status <= 0x04 )
2531         {
2532             static const char *ppsz_status[5] = {
2533                 "Unknown",
2534                 "Not running",
2535                 "Starts in a few seconds",
2536                 "Pausing",
2537                 "Running"
2538             };
2539             psz_status = ppsz_status[p_srv->i_running_status];
2540         }
2541
2542         if( psz_type )
2543             vlc_meta_AddExtra( p_meta, "Type", psz_type );
2544         if( psz_status )
2545             vlc_meta_AddExtra( p_meta, "Status", psz_status );
2546
2547         es_out_Control( p_demux->out, ES_OUT_SET_GROUP_META,
2548                         p_srv->i_service_id, p_meta );
2549         vlc_meta_Delete( p_meta );
2550     }
2551
2552     sdt->psi->i_sdt_version = p_sdt->i_version;
2553     dvbpsi_DeleteSDT( p_sdt );
2554 }
2555
2556 /* i_year: year - 1900  i_month: 0-11  i_mday: 1-31 i_hour: 0-23 i_minute: 0-59 i_second: 0-59 */
2557 static int64_t vlc_timegm( int i_year, int i_month, int i_mday, int i_hour, int i_minute, int i_second )
2558 {
2559     static const int pn_day[12+1] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
2560     int64_t i_day;
2561     int i;
2562
2563     if( i_year < 70 ||
2564         i_month < 0 || i_month > 11 || i_mday < 1 || i_mday > 31 ||
2565         i_hour < 0 || i_hour > 23 || i_minute < 0 || i_minute > 59 || i_second < 0 || i_second > 59 )
2566         return -1;
2567
2568     /* Count the number of days */
2569     i_day = 365 * (i_year-70) + pn_day[i_month] + i_mday - 1;
2570 #define LEAP(y) ( ((y)%4) == 0 && (((y)%100) != 0 || ((y)%400) == 0) ? 1 : 0)
2571     for( i = 70; i < i_year; i++ )
2572         i_day += LEAP(1900+i);
2573     if( i_month > 1 )
2574         i_day += LEAP(1900+i_year);
2575 #undef LEAP
2576     /**/
2577     return ((24*i_day + i_hour)*60 + i_minute)*60 + i_second;
2578 }
2579
2580 static void EITDecodeMjd( int i_mjd, int *p_y, int *p_m, int *p_d )
2581 {
2582     const int yp = (int)( ( (double)i_mjd - 15078.2)/365.25 );
2583     const int mp = (int)( ((double)i_mjd - 14956.1 - (int)(yp * 365.25)) / 30.6001 );
2584     const int c = ( mp == 14 || mp == 15 ) ? 1 : 0;
2585
2586     *p_y = 1900 + yp + c*1;
2587     *p_m = mp - 1 - c*12;
2588     *p_d = i_mjd - 14956 - (int)(yp*365.25) - (int)(mp*30.6001);
2589 }
2590 #define CVT_FROM_BCD(v) ((((v) >> 4)&0xf)*10 + ((v)&0xf))
2591 static int64_t EITConvertStartTime( uint64_t i_date )
2592 {
2593     const int i_mjd = i_date >> 24;
2594     const int i_hour   = CVT_FROM_BCD(i_date >> 16);
2595     const int i_minute = CVT_FROM_BCD(i_date >>  8);
2596     const int i_second = CVT_FROM_BCD(i_date      );
2597     int i_year;
2598     int i_month;
2599     int i_day;
2600
2601     /* if all 40 bits are 1, the start is unknown */
2602     if( i_date == UINT64_C(0xffffffffff) )
2603         return -1;
2604
2605     EITDecodeMjd( i_mjd, &i_year, &i_month, &i_day );
2606     return vlc_timegm( i_year - 1900, i_month - 1, i_day, i_hour, i_minute, i_second );
2607 }
2608 static int EITConvertDuration( uint32_t i_duration )
2609 {
2610     return CVT_FROM_BCD(i_duration >> 16) * 3600 +
2611            CVT_FROM_BCD(i_duration >> 8 ) * 60 +
2612            CVT_FROM_BCD(i_duration      );
2613 }
2614 #undef CVT_FROM_BCD
2615
2616 /* FIXME same than dvbsi_to_utf8 from dvb access */
2617 static char *EITConvertToUTF8( const unsigned char *psz_instring,
2618                                size_t i_length )
2619 {
2620     const char *psz_encoding;
2621     char *psz_outstring;
2622     char psz_encbuf[sizeof( "ISO_8859-123" )];
2623     size_t i_in, i_out, offset = 1;
2624     vlc_iconv_t iconv_handle;
2625
2626     if( i_length < 1 ) return NULL;
2627     if( psz_instring[0] >= 0x20 )
2628     {
2629         psz_encoding = "ISO_8859-1";
2630         /* According to the specification, this should be ISO6937,
2631          * but it seems Latin-1 is used instead. */
2632         offset = 0;
2633     }
2634     else switch( psz_instring[0] )
2635     {
2636     case 0x01:
2637         psz_encoding = "ISO_8859-5";
2638         break;
2639     case 0x02:
2640         psz_encoding = "ISO_8859-6";
2641         break;
2642     case 0x03:
2643         psz_encoding = "ISO_8859-7";
2644         break;
2645     case 0x04:
2646         psz_encoding = "ISO_8859-8";
2647         break;
2648     case 0x05:
2649         psz_encoding = "ISO_8859-9";
2650         break;
2651     case 0x06:
2652         psz_encoding = "ISO_8859-10";
2653         break;
2654     case 0x07:
2655         psz_encoding = "ISO_8859-11";
2656         break;
2657     case 0x08:
2658         psz_encoding = "ISO_8859-12";
2659         break;
2660     case 0x09:
2661         psz_encoding = "ISO_8859-13";
2662         break;
2663     case 0x0a:
2664         psz_encoding = "ISO_8859-14";
2665         break;
2666     case 0x0b:
2667         psz_encoding = "ISO_8859-15";
2668         break;
2669     case 0x10:
2670 #warning Is Latin-10 (psz_instring[2] == 16) really illegal?
2671         if( i_length < 3 || psz_instring[1] != 0x00 || psz_instring[2] > 15
2672          || psz_instring[2] == 0 )
2673         {
2674             psz_encoding = "UTF-8";
2675             offset = 0;
2676         }
2677         else
2678         {
2679             sprintf( psz_encbuf, "ISO_8859-%u", psz_instring[2] );
2680             psz_encoding = psz_encbuf;
2681             offset = 3;
2682         }
2683         break;
2684     case 0x11:
2685 #warning Is there a BOM or do we use a fixed endianess?
2686         psz_encoding = "UTF-16";
2687         break;
2688     case 0x12:
2689         psz_encoding = "KSC5601-1987";
2690         break;
2691     case 0x13:
2692         psz_encoding = "GB2312"; /* GB-2312-1980 */
2693         break;
2694     case 0x14:
2695         psz_encoding = "BIG-5";
2696         break;
2697     case 0x15:
2698         psz_encoding = "UTF-8";
2699         break;
2700     default:
2701         /* invalid */
2702         psz_encoding = "UTF-8";
2703         offset = 0;
2704     }
2705
2706     i_in = i_length - offset;
2707     i_out = i_in * 6 + 1;
2708
2709     psz_outstring = malloc( i_out );
2710     if( !psz_outstring )
2711     {
2712         return NULL;
2713     }
2714
2715     iconv_handle = vlc_iconv_open( "UTF-8", psz_encoding );
2716     if( iconv_handle == (vlc_iconv_t)(-1) )
2717     {
2718          /* Invalid character set (e.g. ISO_8859-12) */
2719          memcpy( psz_outstring, &psz_instring[offset], i_in );
2720          psz_outstring[i_in] = '\0';
2721          EnsureUTF8( psz_outstring );
2722     }
2723     else
2724     {
2725         const char *psz_in = (const char *)&psz_instring[offset];
2726         char *psz_out = psz_outstring;
2727
2728         while( vlc_iconv( iconv_handle, &psz_in, &i_in,
2729                           &psz_out, &i_out ) == (size_t)(-1) )
2730         {
2731             /* skip naughty byte. This may fail terribly for multibyte stuff,
2732              * but what can we do anyway? */
2733             psz_in++;
2734             i_in--;
2735             vlc_iconv( iconv_handle, NULL, NULL, NULL, NULL ); /* reset */
2736         }
2737         vlc_iconv_close( iconv_handle );
2738
2739         *psz_out = '\0';
2740     }
2741     return psz_outstring;
2742 }
2743
2744 static void EITCallBack( demux_t *p_demux, dvbpsi_eit_t *p_eit )
2745 {
2746     demux_sys_t        *p_sys = p_demux->p_sys;
2747     dvbpsi_eit_event_t *p_evt;
2748     vlc_epg_t *p_epg;
2749
2750     msg_Dbg( p_demux, "EITCallBack called" );
2751     if( !p_eit->b_current_next || ( p_sys->i_dvb_program != -1 && p_sys->i_dvb_program != p_eit->i_service_id ) )
2752     {
2753         dvbpsi_DeleteEIT( p_eit );
2754         return;
2755     }
2756
2757     msg_Dbg( p_demux, "new EIT service_id=%d version=%d current_next=%d "
2758              "ts_id=%d network_id=%d segment_last_section_number=%d "
2759              "last_table_id=%d",
2760              p_eit->i_service_id, p_eit->i_version, p_eit->b_current_next,
2761              p_eit->i_ts_id, p_eit->i_network_id,
2762              p_eit->i_segment_last_section_number, p_eit->i_last_table_id );
2763
2764     p_epg = vlc_epg_New( NULL );
2765     for( p_evt = p_eit->p_first_event; p_evt; p_evt = p_evt->p_next )
2766     {
2767         dvbpsi_descriptor_t *p_dr;
2768         char                *psz_name = NULL;
2769         char                *psz_text = NULL;
2770         char                *psz_extra = strdup("");
2771         int64_t i_start;
2772         int i_duration;
2773
2774         i_start = EITConvertStartTime( p_evt->i_start_time );
2775         i_duration = EITConvertDuration( p_evt->i_duration );
2776
2777         msg_Dbg( p_demux, "  * event id=%d start_time:%d duration=%d "
2778                           "running=%d free_ca=%d",
2779                  p_evt->i_event_id, (int)i_start, (int)i_duration,
2780                  p_evt->i_running_status, p_evt->b_free_ca );
2781
2782         for( p_dr = p_evt->p_first_descriptor; p_dr; p_dr = p_dr->p_next )
2783         {
2784             if( p_dr->i_tag == 0x4d )
2785             {
2786                 dvbpsi_short_event_dr_t *pE = dvbpsi_DecodeShortEventDr( p_dr );
2787
2788                 if( pE )
2789                 {
2790                     psz_name = EITConvertToUTF8( pE->i_event_name, pE->i_event_name_length);
2791                     psz_text = EITConvertToUTF8( pE->i_text, pE->i_text_length );
2792                     msg_Dbg( p_demux, "    - short event lang=%3.3s '%s' : '%s'",
2793                              pE->i_iso_639_code, psz_name, psz_text );
2794                 }
2795             }
2796             else if( p_dr->i_tag == 0x4e )
2797             {
2798                 dvbpsi_extended_event_dr_t *pE = dvbpsi_DecodeExtendedEventDr( p_dr );
2799                 if( pE )
2800                 {
2801                     int i;
2802                     msg_Dbg( p_demux, "    - extended event lang=%3.3s [%d/%d]",
2803                              pE->i_iso_639_code,
2804                              pE->i_descriptor_number, pE->i_last_descriptor_number );
2805
2806                     if( pE->i_text_length > 0 )
2807                     {
2808                         char *psz_text = EITConvertToUTF8( pE->i_text, pE->i_text_length );
2809                         msg_Dbg( p_demux, "       - text='%s'", psz_text );
2810
2811                         psz_extra = realloc( psz_extra, strlen(psz_extra) + strlen(psz_text) + 1 );
2812                         strcat( psz_extra, psz_text );
2813                         free( psz_text );
2814                     }
2815
2816                     for( i = 0; i < pE->i_entry_count; i++ )
2817                     {
2818                         char *psz_dsc = EITConvertToUTF8( pE->i_item_description[i],
2819                                                           pE->i_item_description_length[i] );
2820                         char *psz_itm = EITConvertToUTF8( pE->i_item[i], pE->i_item_length[i] );
2821
2822                         if( psz_dsc && psz_itm )
2823                         {
2824                             msg_Dbg( p_demux, "       - desc='%s' item='%s'", psz_dsc, psz_itm );
2825
2826                             psz_extra = realloc( psz_extra, strlen(psz_extra) + strlen(psz_dsc) + strlen(psz_itm) + 3 + 1 );
2827                             strcat( psz_extra, "(" );
2828                             strcat( psz_extra, psz_dsc );
2829                             strcat( psz_extra, " " );
2830                             strcat( psz_extra, psz_itm );
2831                             strcat( psz_extra, ")" );
2832                         }
2833                         if( psz_dsc )
2834                             free( psz_dsc );
2835                         if( psz_itm )
2836                             free( psz_itm );
2837                     }
2838                 }
2839             }
2840             else
2841             {
2842                 msg_Dbg( p_demux, "    - tag=0x%x(%d)", p_dr->i_tag, p_dr->i_tag );
2843             }
2844         }
2845
2846         /* */
2847         if( i_start > 0 )
2848             vlc_epg_AddEvent( p_epg, i_start, i_duration, psz_name, psz_text, psz_extra );
2849
2850         /* Update "now playing" field */
2851         if( p_evt->i_running_status == 0x04 && i_start > 0 )
2852             vlc_epg_SetCurrent( p_epg, i_start );
2853
2854         if( psz_name )
2855             free( psz_name );
2856         if( psz_text )
2857             free( psz_text );
2858
2859         free( psz_extra );
2860     }
2861     if( p_epg->i_event > 0 )
2862     {
2863         if( p_eit->i_service_id == p_sys->i_dvb_program )
2864         {
2865             p_sys->i_dvb_length = 0;
2866             p_sys->i_dvb_start = 0;
2867
2868             if( p_epg->p_current )
2869             {
2870                 p_sys->i_dvb_start = p_epg->p_current->i_start;
2871                 p_sys->i_dvb_length = p_epg->p_current->i_duration;
2872             }
2873         }
2874         es_out_Control( p_demux->out, ES_OUT_SET_GROUP_EPG, p_eit->i_service_id, p_epg );
2875     }
2876     vlc_epg_Delete( p_epg );
2877
2878     dvbpsi_DeleteEIT( p_eit );
2879 }
2880
2881 static void PSINewTableCallBack( demux_t *p_demux, dvbpsi_handle h,
2882                                  uint8_t  i_table_id, uint16_t i_extension )
2883 {
2884 #if 0
2885     msg_Dbg( p_demux, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
2886              i_table_id, i_table_id, i_extension, i_extension );
2887 #endif
2888     if( p_demux->p_sys->pid[0].psi->i_pat_version != -1 && i_table_id == 0x42 )
2889     {
2890         msg_Dbg( p_demux, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
2891                  i_table_id, i_table_id, i_extension, i_extension );
2892
2893         dvbpsi_AttachSDT( h, i_table_id, i_extension,
2894                           (dvbpsi_sdt_callback)SDTCallBack, p_demux );
2895     }
2896     else if( p_demux->p_sys->pid[0x11].psi->i_sdt_version != -1 &&
2897              ( i_table_id == 0x4e || /* Current/Following */
2898                (i_table_id >= 0x50 && i_table_id <= 0x5f) ) ) /* Schedule */
2899     {
2900         msg_Dbg( p_demux, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
2901                  i_table_id, i_table_id, i_extension, i_extension );
2902
2903         dvbpsi_AttachEIT( h, i_table_id, i_extension,
2904                           (dvbpsi_eit_callback)EITCallBack, p_demux );
2905     }
2906 }
2907 #endif
2908
2909 static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt )
2910 {
2911     demux_sys_t          *p_sys = p_demux->p_sys;
2912     dvbpsi_descriptor_t  *p_dr;
2913     dvbpsi_pmt_es_t      *p_es;
2914
2915     ts_pid_t             *pmt = NULL;
2916     ts_prg_psi_t         *prg = NULL;
2917
2918     ts_pid_t             **pp_clean = NULL;
2919     int                  i_clean = 0, i;
2920
2921     msg_Dbg( p_demux, "PMTCallBack called" );
2922
2923     /* First find this PMT declared in PAT */
2924     for( i = 0; i < p_sys->i_pmt; i++ )
2925     {
2926         int i_prg;
2927         for( i_prg = 0; i_prg < p_sys->pmt[i]->psi->i_prg; i_prg++ )
2928         {
2929             if( p_sys->pmt[i]->psi->prg[i_prg]->i_number ==
2930                 p_pmt->i_program_number )
2931             {
2932                 pmt = p_sys->pmt[i];
2933                 prg = p_sys->pmt[i]->psi->prg[i_prg];
2934                 break;
2935             }
2936         }
2937         if( pmt ) break;
2938     }
2939
2940     if( pmt == NULL )
2941     {
2942         msg_Warn( p_demux, "unreferenced program (broken stream)" );
2943         dvbpsi_DeletePMT(p_pmt);
2944         return;
2945     }
2946
2947     if( prg->i_version != -1 &&
2948         ( !p_pmt->b_current_next || prg->i_version == p_pmt->i_version ) )
2949     {
2950         dvbpsi_DeletePMT( p_pmt );
2951         return;
2952     }
2953
2954     /* Clean this program (remove all es) */
2955     for( i = 0; i < 8192; i++ )
2956     {
2957         ts_pid_t *pid = &p_sys->pid[i];
2958
2959         if( pid->b_valid && pid->p_owner == pmt->psi &&
2960             pid->i_owner_number == prg->i_number && pid->psi == NULL )
2961         {
2962             TAB_APPEND( i_clean, pp_clean, pid );
2963         }
2964     }
2965     if( prg->iod )
2966     {
2967         IODFree( prg->iod );
2968         prg->iod = NULL;
2969     }
2970
2971     msg_Dbg( p_demux, "new PMT program number=%d version=%d pid_pcr=%d",
2972              p_pmt->i_program_number, p_pmt->i_version, p_pmt->i_pcr_pid );
2973     prg->i_pid_pcr = p_pmt->i_pcr_pid;
2974     prg->i_version = p_pmt->i_version;
2975
2976     if( DVBProgramIsSelected( p_demux, prg->i_number ) )
2977     {
2978         /* Set demux filter */
2979         stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
2980                         ACCESS_SET_PRIVATE_ID_STATE, prg->i_pid_pcr,
2981                         VLC_TRUE );
2982     }
2983     else if ( p_sys->b_dvb_control )
2984     {
2985         msg_Warn( p_demux, "skipping program (not selected)" );
2986         dvbpsi_DeletePMT(p_pmt);
2987         return;
2988     }
2989
2990     /* Parse descriptor */
2991     for( p_dr = p_pmt->p_first_descriptor; p_dr != NULL; p_dr = p_dr->p_next )
2992     {
2993         if( p_dr->i_tag == 0x1d )
2994         {
2995             /* We have found an IOD descriptor */
2996             msg_Dbg( p_demux, " * descriptor : IOD (0x1d)" );
2997
2998             prg->iod = IODNew( p_dr->i_length, p_dr->p_data );
2999         }
3000         else if( p_dr->i_tag == 0x9 )
3001         {
3002             uint16_t i_sysid = ((uint16_t)p_dr->p_data[0] << 8)
3003                                 | p_dr->p_data[1];
3004             msg_Dbg( p_demux, " * descriptor : CA (0x9) SysID 0x%x", i_sysid );
3005         }
3006         else
3007         {
3008             msg_Dbg( p_demux, " * descriptor : unknown (0x%x)", p_dr->i_tag );
3009         }
3010     }
3011
3012     for( p_es = p_pmt->p_first_es; p_es != NULL; p_es = p_es->p_next )
3013     {
3014         ts_pid_t tmp_pid, *old_pid = 0, *pid = &tmp_pid;
3015
3016         /* Find out if the PID was already declared */
3017         for( i = 0; i < i_clean; i++ )
3018         {
3019             if( pp_clean[i] == &p_sys->pid[p_es->i_pid] )
3020             {
3021                 old_pid = pp_clean[i];
3022                 break;
3023             }
3024         }
3025
3026         if( !old_pid && p_sys->pid[p_es->i_pid].b_valid )
3027         {
3028             ts_pid_t *pid = &p_sys->pid[p_es->i_pid];
3029             if( ( pid->i_pid == 0x11 /* SDT */ ||
3030                   pid->i_pid == 0x12 /* EDT */ ) && pid->psi )
3031             {
3032                 /* This doesn't look like a DVB stream so don't try
3033                  * parsing the SDT/EDT */
3034                 dvbpsi_DetachDemux( pid->psi->handle );
3035                 free( pid->psi );
3036                 pid->psi = 0;
3037             }
3038             else
3039             {
3040                 msg_Warn( p_demux, "pmt error: pid=%d already defined",
3041                           p_es->i_pid );
3042                 continue;
3043             }
3044         }
3045
3046         PIDInit( pid, VLC_FALSE, pmt->psi );
3047         PIDFillFormat( pid, p_es->i_type );
3048         pid->i_owner_number = prg->i_number;
3049         pid->i_pid          = p_es->i_pid;
3050         pid->b_seen         = p_sys->pid[p_es->i_pid].b_seen;
3051
3052         if( p_es->i_type == 0x10 || p_es->i_type == 0x11 ||
3053             p_es->i_type == 0x12 )
3054         {
3055             /* MPEG-4 stream: search SL_DESCRIPTOR */
3056             dvbpsi_descriptor_t *p_dr = p_es->p_first_descriptor;;
3057
3058             while( p_dr && ( p_dr->i_tag != 0x1f ) ) p_dr = p_dr->p_next;
3059
3060             if( p_dr && p_dr->i_length == 2 )
3061             {
3062                 int i_es_id = ( p_dr->p_data[0] << 8 ) | p_dr->p_data[1];
3063
3064                 msg_Warn( p_demux, "found SL_descriptor es_id=%d", i_es_id );
3065
3066                 pid->es->p_mpeg4desc = NULL;
3067
3068                 for( i = 0; i < 255; i++ )
3069                 {
3070                     iod_descriptor_t *iod = prg->iod;
3071
3072                     if( iod->es_descr[i].b_ok &&
3073                         iod->es_descr[i].i_es_id == i_es_id )
3074                     {
3075                         pid->es->p_mpeg4desc = &iod->es_descr[i];
3076                         break;
3077                     }
3078                 }
3079             }
3080
3081             if( pid->es->p_mpeg4desc != NULL )
3082             {
3083                 decoder_config_descriptor_t *dcd =
3084                     &pid->es->p_mpeg4desc->dec_descr;
3085
3086                 if( dcd->i_streamType == 0x04 )    /* VisualStream */
3087                 {
3088                     pid->es->fmt.i_cat = VIDEO_ES;
3089                     switch( dcd->i_objectTypeIndication )
3090                     {
3091                     case 0x0B: /* mpeg4 sub */
3092                         pid->es->fmt.i_cat = SPU_ES;
3093                         pid->es->fmt.i_codec = VLC_FOURCC('s','u','b','t');
3094                         break;
3095
3096                     case 0x20: /* mpeg4 */
3097                         pid->es->fmt.i_codec = VLC_FOURCC('m','p','4','v');
3098                         break;
3099                     case 0x21: /* h264 */
3100                         pid->es->fmt.i_codec = VLC_FOURCC('h','2','6','4');
3101                         break;
3102                     case 0x60:
3103                     case 0x61:
3104                     case 0x62:
3105                     case 0x63:
3106                     case 0x64:
3107                     case 0x65: /* mpeg2 */
3108                         pid->es->fmt.i_codec = VLC_FOURCC( 'm','p','g','v' );
3109                         break;
3110                     case 0x6a: /* mpeg1 */
3111                         pid->es->fmt.i_codec = VLC_FOURCC( 'm','p','g','v' );
3112                         break;
3113                     case 0x6c: /* mpeg1 */
3114                         pid->es->fmt.i_codec = VLC_FOURCC( 'j','p','e','g' );
3115                         break;
3116                     default:
3117                         pid->es->fmt.i_cat = UNKNOWN_ES;
3118                         break;
3119                     }
3120                 }
3121                 else if( dcd->i_streamType == 0x05 )    /* AudioStream */
3122                 {
3123                     pid->es->fmt.i_cat = AUDIO_ES;
3124                     switch( dcd->i_objectTypeIndication )
3125                     {
3126                     case 0x40: /* mpeg4 */
3127                         pid->es->fmt.i_codec = VLC_FOURCC('m','p','4','a');
3128                         break;
3129                     case 0x66:
3130                     case 0x67:
3131                     case 0x68: /* mpeg2 aac */
3132                         pid->es->fmt.i_codec = VLC_FOURCC('m','p','4','a');
3133                         break;
3134                     case 0x69: /* mpeg2 */
3135                         pid->es->fmt.i_codec = VLC_FOURCC('m','p','g','a');
3136                         break;
3137                     case 0x6b: /* mpeg1 */
3138                         pid->es->fmt.i_codec = VLC_FOURCC('m','p','g','a');
3139                         break;
3140                     default:
3141                         pid->es->fmt.i_cat = UNKNOWN_ES;
3142                         break;
3143                     }
3144                 }
3145                 else
3146                 {
3147                     pid->es->fmt.i_cat = UNKNOWN_ES;
3148                 }
3149
3150                 if( pid->es->fmt.i_cat != UNKNOWN_ES )
3151                 {
3152                     pid->es->fmt.i_extra = dcd->i_decoder_specific_info_len;
3153                     if( pid->es->fmt.i_extra > 0 )
3154                     {
3155                         pid->es->fmt.p_extra = malloc( pid->es->fmt.i_extra );
3156                         if( pid->es->fmt.p_extra )
3157                             memcpy( pid->es->fmt.p_extra,
3158                                     dcd->p_decoder_specific_info,
3159                                     pid->es->fmt.i_extra );
3160                     }
3161                 }
3162             }
3163         }
3164         else if( p_es->i_type == 0x06 )
3165         {
3166             dvbpsi_descriptor_t *p_dr;
3167
3168             for( p_dr = p_es->p_first_descriptor; p_dr != NULL;
3169                  p_dr = p_dr->p_next )
3170             {
3171                 msg_Dbg( p_demux, "  * es pid=%d type=%d dr->i_tag=0x%x",
3172                          p_es->i_pid, p_es->i_type, p_dr->i_tag );
3173
3174                 if( p_dr->i_tag == 0x05 )
3175                 {
3176                     /* Registration Descriptor */
3177                     if( p_dr->i_length != 4 )
3178                     {
3179                         msg_Warn( p_demux, "invalid Registration Descriptor" );
3180                     }
3181                     else
3182                     {
3183                         if( !memcmp( p_dr->p_data, "AC-3", 4 ) )
3184                         {
3185                             /* ATSC with stream_type 0x81 (but this descriptor
3186                              * is then not mandatory */
3187                             pid->es->fmt.i_cat = AUDIO_ES;
3188                             pid->es->fmt.i_codec = VLC_FOURCC('a','5','2',' ');
3189                         }
3190                         else if( !memcmp( p_dr->p_data, "DTS1", 4 ) ||
3191                                  !memcmp( p_dr->p_data, "DTS2", 4 ) ||
3192                                  !memcmp( p_dr->p_data, "DTS3", 4 ) )
3193                         {
3194                            /*registration descriptor(ETSI TS 101 154 Annex F)*/
3195                             pid->es->fmt.i_cat = AUDIO_ES;
3196                             pid->es->fmt.i_codec = VLC_FOURCC('d','t','s',' ');
3197                         }
3198                         else if( !memcmp( p_dr->p_data, "BSSD", 4 ) )
3199                         {
3200                             pid->es->fmt.i_cat = AUDIO_ES;
3201                             pid->es->fmt.i_codec = VLC_FOURCC('l','p','c','m');
3202                         }
3203                         else
3204                         {
3205                             msg_Warn( p_demux,
3206                                       "unknown Registration Descriptor (%4.4s)",
3207                                       p_dr->p_data );
3208                         }
3209                     }
3210
3211                 }
3212                 else if( p_dr->i_tag == 0x6a )
3213                 {
3214                     /* DVB with stream_type 0x06 */
3215                     pid->es->fmt.i_cat = AUDIO_ES;
3216                     pid->es->fmt.i_codec = VLC_FOURCC( 'a', '5', '2', ' ' );
3217                 }
3218                 else if( p_dr->i_tag == 0x73 )
3219                 {
3220                     /* DTS audio descriptor (ETSI TS 101 154 Annex F) */
3221                     msg_Dbg( p_demux, "    * DTS audio descriptor not decoded" );
3222                     pid->es->fmt.i_cat = AUDIO_ES;
3223                     pid->es->fmt.i_codec = VLC_FOURCC( 'd', 't', 's', ' ' );
3224                 }
3225                 else if( p_dr->i_tag == 0x45 )
3226                 {
3227                     msg_Dbg( p_demux, "    * VBI Data descriptor" );
3228                     /* FIXME : store the information somewhere */
3229                 }
3230                 else if( p_dr->i_tag == 0x46 )
3231                 {
3232                     msg_Dbg( p_demux, "    * VBI Teletext descriptor" );
3233                     /* FIXME : store the information somewhere */
3234                 }
3235 #ifdef _DVBPSI_DR_52_H_
3236                 else if( p_dr->i_tag == 0x52 )
3237                 {
3238                     dvbpsi_stream_identifier_dr_t *si;
3239                     si = dvbpsi_DecodeStreamIdentifierDr( p_dr );
3240
3241                     msg_Dbg( p_demux, "    * Stream Component Identifier: %d", si->i_component_tag );
3242                 }
3243 #endif
3244                 else if( p_dr->i_tag == 0x56 )
3245                 {
3246                     msg_Dbg( p_demux, "    * EBU Teletext descriptor" );
3247                     pid->es->fmt.i_cat = SPU_ES;
3248                     pid->es->fmt.i_codec = VLC_FOURCC( 't', 'e', 'l', 'x' );
3249                     pid->es->fmt.i_extra = p_dr->i_length;
3250                     pid->es->fmt.p_extra = malloc( p_dr->i_length );
3251                     if( pid->es->fmt.p_extra )
3252                         memcpy( pid->es->fmt.p_extra, p_dr->p_data,
3253                                 p_dr->i_length );
3254
3255 #if defined _DVBPSI_DR_56_H_ && defined DVBPSI_VERSION \
3256                     && DVBPSI_VERSION_INT > ((0<<16)+(1<<8)+5)
3257                     pid->es->fmt.i_group = p_pmt->i_program_number;
3258
3259                     /* In stream output mode, only enable descriptor
3260                      * pass-through. */
3261                     if( !p_demux->out->b_sout )
3262                     {
3263                         uint16_t n, i = 0;
3264                         dvbpsi_teletext_dr_t *sub;
3265
3266                         sub = dvbpsi_DecodeTeletextDr( p_dr );
3267                         if( !sub ) continue;
3268
3269                         /* Each subtitle ES contains n languages,
3270                          * We are going to create n ES for the n tracks */
3271                         for( n = 0; n < sub->i_pages_number; n++ )
3272                         {
3273                             dvbpsi_teletextpage_t *p_page = &sub->p_pages[n];
3274                             if( (p_page->i_teletext_type == 0x2)
3275                                  || (p_page->i_teletext_type == 0x5) )
3276                             {
3277                                 ts_es_t *p_es;
3278
3279                                 if( i == 0 )
3280                                 {
3281                                     p_es = pid->es;
3282                                 }
3283                                 else
3284                                 {
3285                                     p_es = malloc( sizeof( ts_es_t ) );
3286                                     if( !p_es ) break;
3287
3288                                     es_format_Copy( &p_es->fmt, &pid->es->fmt );
3289                                     free( p_es->fmt.psz_language );
3290                                     free( p_es->fmt.psz_description );
3291                                     p_es->fmt.psz_language = NULL;
3292                                     p_es->fmt.psz_description = NULL;
3293                                     p_es->id = NULL;
3294                                     p_es->p_pes = NULL;
3295                                     p_es->i_pes_size = 0;
3296                                     p_es->i_pes_gathered = 0;
3297                                     p_es->pp_last = &p_es->p_pes;
3298                                     p_es->p_mpeg4desc = NULL;
3299
3300                                     TAB_APPEND( pid->i_extra_es, pid->extra_es,
3301                                                 p_es );
3302                                 }
3303
3304                                 p_es->fmt.psz_language = malloc( 4 );
3305                                 if( p_es->fmt.psz_language )
3306                                 {
3307                                     memcpy( p_es->fmt.psz_language,
3308                                             p_page->i_iso6392_language_code, 3 );
3309                                     p_es->fmt.psz_language[3] = 0;
3310                                 }
3311                                 switch( p_page->i_teletext_type )
3312                                 {
3313                                 case 0x2:
3314                                     p_es->fmt.psz_description =
3315                                         strdup(_("Teletext subtitles"));
3316                                     msg_Dbg( p_demux,
3317                                              "    * sub lan=%s page=%d%x",
3318                                              p_es->fmt.psz_language,
3319                                              p_page->i_teletext_magazine_number,
3320                                              p_page->i_teletext_page_number );
3321                                     break;
3322
3323                                 case 0x5:
3324                                     p_es->fmt.psz_description =
3325                                         strdup(_("Teletext hearing impaired subtitles"));
3326                                     msg_Dbg( p_demux,
3327                                              "    * hearing impaired lan=%s page=%d%x",
3328                                              p_es->fmt.psz_language,
3329                                              p_page->i_teletext_magazine_number,
3330                                              p_page->i_teletext_page_number );
3331                                     break;
3332                                 default:
3333                                     break;
3334                                 }
3335
3336                                 p_es->fmt.subs.dvb.i_id =
3337                                     p_page->i_teletext_page_number;
3338                                 /* Hack, FIXME */
3339                                 p_es->fmt.subs.dvb.i_id |=
3340                                 ((int)p_page->i_teletext_magazine_number << 16);
3341
3342                                 i++;
3343                             }
3344                         }
3345
3346                         if( !i )
3347                             pid->es->fmt.i_cat = UNKNOWN_ES;
3348                     }
3349                     else
3350 #endif  /* defined _DVBPSI_DR_56_H_  && DVBPSI_VERSION(0,1,6) */
3351                     {
3352                         pid->es->fmt.subs.dvb.i_id = -1;
3353                         pid->es->fmt.psz_description = strdup( "Teletext" );
3354                     }
3355                 }
3356                 else if( p_dr->i_tag == 0x59 )
3357                 {
3358                     /* DVB subtitles */
3359                     pid->es->fmt.i_cat = SPU_ES;
3360                     pid->es->fmt.i_codec = VLC_FOURCC( 'd', 'v', 'b', 's' );
3361                     pid->es->fmt.i_extra = p_dr->i_length;
3362                     pid->es->fmt.p_extra = malloc( p_dr->i_length );
3363                     if( pid->es->fmt.p_extra )
3364                         memcpy( pid->es->fmt.p_extra, p_dr->p_data,
3365                                 p_dr->i_length );
3366
3367 #ifdef _DVBPSI_DR_59_H_
3368                     pid->es->fmt.i_group = p_pmt->i_program_number;
3369
3370                     /* In stream output mode, only enable descriptor
3371                      * pass-through. */
3372                     if( !p_demux->out->b_sout )
3373                     {
3374                         uint16_t n, i = 0;
3375                         dvbpsi_subtitling_dr_t *sub;
3376
3377                         sub = dvbpsi_DecodeSubtitlingDr( p_dr );
3378                         if( !sub ) continue;
3379
3380                         for( n = 0; n < sub->i_subtitles_number; n++ )
3381                         {
3382                             dvbpsi_subtitle_t *p_sub = &sub->p_subtitle[n];
3383                             ts_es_t *p_es;
3384
3385                             if( i == 0 )
3386                             {
3387                                 p_es = pid->es;
3388                             }
3389                             else
3390                             {
3391                                 p_es = malloc( sizeof( ts_es_t ) );
3392                                 if( !p_es ) break;
3393                                 es_format_Copy( &p_es->fmt, &pid->es->fmt );
3394                                 free( p_es->fmt.psz_language ); p_es->fmt.psz_language = NULL;
3395                                 free( p_es->fmt.psz_description ); p_es->fmt.psz_description = NULL;
3396
3397                                 p_es->id = NULL;
3398                                 p_es->p_pes = NULL;
3399                                 p_es->i_pes_size = 0;
3400                                 p_es->i_pes_gathered = 0;
3401                                 p_es->pp_last = &p_es->p_pes;
3402                                 p_es->p_mpeg4desc = NULL;
3403
3404                                 TAB_APPEND( pid->i_extra_es, pid->extra_es,
3405                                             p_es );
3406                             }
3407
3408                             p_es->fmt.psz_language = malloc( 4 );
3409                             if( p_es->fmt.psz_language )
3410                             {
3411                                 memcpy( p_es->fmt.psz_language,
3412                                         p_sub->i_iso6392_language_code, 3 );
3413                                 p_es->fmt.psz_language[3] = 0;
3414                             }
3415
3416                             switch( p_sub->i_subtitling_type )
3417                             {
3418                             case 0x10:
3419                                 p_es->fmt.psz_description =
3420                                     strdup(_("subtitles"));
3421                                 break;
3422                             case 0x11:
3423                                 p_es->fmt.psz_description =
3424                                     strdup(_("4:3 subtitles"));
3425                                 break;
3426                             case 0x12:
3427                                 p_es->fmt.psz_description =
3428                                     strdup(_("16:9 subtitles"));
3429                                 break;
3430                             case 0x13:
3431                                 p_es->fmt.psz_description =
3432                                     strdup(_("2.21:1 subtitles"));
3433                                 break;
3434                             case 0x20:
3435                                 p_es->fmt.psz_description =
3436                                     strdup(_("hearing impaired"));
3437                                 break;
3438                             case 0x21:
3439                                 p_es->fmt.psz_description =
3440                                     strdup(_("4:3 hearing impaired"));
3441                                 break;
3442                             case 0x22:
3443                                 p_es->fmt.psz_description =
3444                                     strdup(_("16:9 hearing impaired"));
3445                                 break;
3446                             case 0x23:
3447                                 p_es->fmt.psz_description =
3448                                     strdup(_("2.21:1 hearing impaired"));
3449                                 break;
3450                             default:
3451                                 break;
3452                             }
3453
3454                             p_es->fmt.subs.dvb.i_id =
3455                                 p_sub->i_composition_page_id;
3456                             /* Hack, FIXME */
3457                             p_es->fmt.subs.dvb.i_id |=
3458                               ((int)p_sub->i_ancillary_page_id << 16);
3459
3460                             i++;
3461                         }
3462
3463                         if( !i )
3464                             pid->es->fmt.i_cat = UNKNOWN_ES;
3465                     }
3466                     else
3467 #endif /* _DVBPSI_DR_59_H_ */
3468                     {
3469                         pid->es->fmt.subs.dvb.i_id = -1;
3470                         pid->es->fmt.psz_description = strdup( "DVB subtitles" );
3471                     }
3472                 }
3473             }
3474         }
3475         else if( p_es->i_type == 0xEA )
3476         {
3477             dvbpsi_descriptor_t *p_dr;
3478
3479             for( p_dr = p_es->p_first_descriptor; p_dr != NULL;
3480                  p_dr = p_dr->p_next )
3481             {
3482                 msg_Dbg( p_demux, "  * es pid=%d type=%d dr->i_tag=0x%x",
3483                          p_es->i_pid, p_es->i_type, p_dr->i_tag );
3484
3485                 if( p_dr->i_tag == 0x05 )
3486                 {
3487                     /* Registration Descriptor */
3488                     if( p_dr->i_length < 4 ) // XXX VC-1 has extended this descriptor with sub-descriptor
3489                     {
3490                         msg_Warn( p_demux, "invalid Registration Descriptor" );
3491                     }
3492                     else
3493                     {
3494                         if( !memcmp( p_dr->p_data, "VC-1", 4 ) )
3495                         {
3496                             /* registration descriptor for VC-1 (SMPTE rp227) */
3497                             pid->es->fmt.i_cat = VIDEO_ES;
3498                             pid->es->fmt.i_codec = VLC_FOURCC('W','V','C','1');
3499
3500                             /* XXX With Simple and Main profile the SEQUENCE
3501                              * header is modified: video width and height are
3502                              * inserted just after the start code as 2 int16_t
3503                              * The packetizer will take care of that. */
3504                         }
3505                         else
3506                         {
3507                             msg_Warn( p_demux,
3508                                       "unknown Registration Descriptor (%4.4s)",
3509                                       p_dr->p_data );
3510                         }
3511                     }
3512                 }
3513             }
3514         }
3515         else if( p_es->i_type == 0xa0 )
3516         {
3517             /* MSCODEC sent by vlc */
3518             dvbpsi_descriptor_t *p_dr = p_es->p_first_descriptor;
3519
3520             while( p_dr && ( p_dr->i_tag != 0xa0 ) ) p_dr = p_dr->p_next;
3521
3522             if( p_dr && p_dr->i_length >= 8 )
3523             {
3524                 pid->es->fmt.i_cat = VIDEO_ES;
3525                 pid->es->fmt.i_codec =
3526                     VLC_FOURCC( p_dr->p_data[0], p_dr->p_data[1],
3527                                 p_dr->p_data[2], p_dr->p_data[3] );
3528                 pid->es->fmt.video.i_width =
3529                     ( p_dr->p_data[4] << 8 ) | p_dr->p_data[5];
3530                 pid->es->fmt.video.i_height =
3531                     ( p_dr->p_data[6] << 8 ) | p_dr->p_data[7];
3532                 pid->es->fmt.i_extra =
3533                     (p_dr->p_data[8] << 8) | p_dr->p_data[9];
3534
3535                 if( pid->es->fmt.i_extra > 0 )
3536                 {
3537                     pid->es->fmt.p_extra = malloc( pid->es->fmt.i_extra );
3538                     if( pid->es->fmt.p_extra )
3539                         memcpy( pid->es->fmt.p_extra, &p_dr->p_data[10],
3540                                 pid->es->fmt.i_extra );
3541                 }
3542             }
3543             else
3544             {
3545                 msg_Warn( p_demux, "private MSCODEC (vlc) without bih private "
3546                           "descriptor" );
3547             }
3548             /* For such stream we will gather them ourself and don't launch a
3549              * packetizer.
3550              * Yes it's ugly but it's the only way to have DIV3 working */
3551             pid->es->fmt.b_packetized = VLC_TRUE;
3552         }
3553
3554         if( pid->es->fmt.i_cat == AUDIO_ES ||
3555             ( pid->es->fmt.i_cat == SPU_ES &&
3556               pid->es->fmt.i_codec != VLC_FOURCC('d','v','b','s') &&
3557               pid->es->fmt.i_codec != VLC_FOURCC('t','e','l','x') ) )
3558         {
3559             /* get language descriptor */
3560             dvbpsi_descriptor_t *p_dr = p_es->p_first_descriptor;
3561             while( p_dr && ( p_dr->i_tag != 0x0a ) ) p_dr = p_dr->p_next;
3562
3563             if( p_dr )
3564             {
3565                 dvbpsi_iso639_dr_t *p_decoded = dvbpsi_DecodeISO639Dr( p_dr );
3566
3567                 if( p_decoded )
3568                 {
3569 #if defined(DR_0A_API_VER) && (DR_0A_API_VER >= 2)
3570                     pid->es->fmt.psz_language = malloc( 4 );
3571                     if( pid->es->fmt.psz_language )
3572                     {
3573                         memcpy( pid->es->fmt.psz_language,
3574                                 p_decoded->code[0].iso_639_code, 3 );
3575                         pid->es->fmt.psz_language[3] = 0;
3576                         msg_Dbg( p_demux, "found language: %s", pid->es->fmt.psz_language);
3577                     }
3578                     switch( p_decoded->code[0].i_audio_type ) {
3579                     case 0:
3580                         pid->es->fmt.psz_description = NULL;
3581                         break;
3582                     case 1:
3583                         pid->es->fmt.psz_description =
3584                             strdup(_("clean effects"));
3585                         break;
3586                     case 2:
3587                         pid->es->fmt.psz_description =
3588                             strdup(_("hearing impaired"));
3589                         break;
3590                     case 3:
3591                         pid->es->fmt.psz_description =
3592                             strdup(_("visual impaired commentary"));
3593                         break;
3594                     default:
3595                         msg_Dbg( p_demux, "unknown audio type: %d",
3596                                  p_decoded->code[0].i_audio_type);
3597                         pid->es->fmt.psz_description = NULL;
3598                         break;
3599                     }
3600                     pid->es->fmt.i_extra_languages = p_decoded->i_code_count-1;
3601                     if( pid->es->fmt.i_extra_languages > 0 )
3602                         pid->es->fmt.p_extra_languages =
3603                             malloc( sizeof(*pid->es->fmt.p_extra_languages) *
3604                                     pid->es->fmt.i_extra_languages );
3605                     if( pid->es->fmt.p_extra_languages )
3606                     {
3607                         for( i = 0; i < pid->es->fmt.i_extra_languages; i++ )
3608                         {
3609                             msg_Dbg( p_demux, "bang" );
3610                             pid->es->fmt.p_extra_languages[i].psz_language =
3611                                 malloc(4);
3612                             if( pid->es->fmt.p_extra_languages[i].psz_language )
3613                             {
3614                                 memcpy( pid->es->fmt.p_extra_languages[i].psz_language,
3615                                     p_decoded->code[i+1].iso_639_code, 3 );
3616                                 pid->es->fmt.p_extra_languages[i].psz_language[3] = '\0';
3617                             }
3618                             switch( p_decoded->code[i].i_audio_type ) {
3619                             case 0:
3620                                 pid->es->fmt.p_extra_languages[i].psz_description =
3621                                     NULL;
3622                                 break;
3623                             case 1:
3624                                 pid->es->fmt.p_extra_languages[i].psz_description =
3625                                     strdup(_("clean effects"));
3626                                 break;
3627                             case 2:
3628                                 pid->es->fmt.p_extra_languages[i].psz_description =
3629                                     strdup(_("hearing impaired"));
3630                                 break;
3631                             case 3:
3632                                 pid->es->fmt.p_extra_languages[i].psz_description =
3633                                     strdup(_("visual impaired commentary"));
3634                                 break;
3635                             default:
3636                                 msg_Dbg( p_demux, "unknown audio type: %d",
3637                                         p_decoded->code[i].i_audio_type);
3638                                 pid->es->fmt.psz_description = NULL;
3639                                 break;
3640                             }
3641
3642                         }
3643                     }
3644 #else
3645                     pid->es->fmt.psz_language = malloc( 4 );
3646                     if( pid->es->fmt.psz_language )
3647                     {
3648                         memcpy( pid->es->fmt.psz_language,
3649                                 p_decoded->i_iso_639_code, 3 );
3650                         pid->es->fmt.psz_language[3] = 0;
3651                     }
3652 #endif
3653                 }
3654             }
3655         }
3656
3657         pid->es->fmt.i_group = p_pmt->i_program_number;
3658         if( pid->es->fmt.i_cat == UNKNOWN_ES )
3659         {
3660             msg_Dbg( p_demux, "  * es pid=%d type=%d *unknown*",
3661                      p_es->i_pid, p_es->i_type );
3662         }
3663         else if( !p_sys->b_udp_out )
3664         {
3665             msg_Dbg( p_demux, "  * es pid=%d type=%d fcc=%4.4s",
3666                      p_es->i_pid, p_es->i_type, (char*)&pid->es->fmt.i_codec );
3667
3668             if( p_sys->b_es_id_pid ) pid->es->fmt.i_id = p_es->i_pid;
3669
3670             /* Check if we can avoid restarting the ES */
3671             if( old_pid &&
3672                 pid->es->fmt.i_codec == old_pid->es->fmt.i_codec &&
3673                 pid->es->fmt.i_extra == old_pid->es->fmt.i_extra &&
3674                 pid->es->fmt.i_extra == 0 &&
3675                 pid->i_extra_es == old_pid->i_extra_es &&
3676                 ( ( !pid->es->fmt.psz_language &&
3677                     !old_pid->es->fmt.psz_language ) ||
3678                   ( pid->es->fmt.psz_language &&
3679                     old_pid->es->fmt.psz_language &&
3680                     !strcmp( pid->es->fmt.psz_language,
3681                              old_pid->es->fmt.psz_language ) ) ) )
3682             {
3683                 pid->es->id = old_pid->es->id;
3684                 old_pid->es->id = NULL;
3685                 for( i = 0; i < pid->i_extra_es; i++ )
3686                 {
3687                     pid->extra_es[i]->id = old_pid->extra_es[i]->id;
3688                     old_pid->extra_es[i]->id = NULL;
3689                 }
3690             }
3691             else
3692             {
3693                 if( old_pid )
3694                 {
3695                     PIDClean( p_demux->out, old_pid );
3696                     TAB_REMOVE( i_clean, pp_clean, old_pid );
3697                     old_pid = 0;
3698                 }
3699
3700                 pid->es->id = es_out_Add( p_demux->out, &pid->es->fmt );
3701                 for( i = 0; i < pid->i_extra_es; i++ )
3702                 {
3703                     pid->extra_es[i]->id =
3704                         es_out_Add( p_demux->out, &pid->extra_es[i]->fmt );
3705                 }
3706             }
3707         }
3708
3709         /* Add ES to the list */
3710         if( old_pid )
3711         {
3712             PIDClean( p_demux->out, old_pid );
3713             TAB_REMOVE( i_clean, pp_clean, old_pid );
3714         }
3715         p_sys->pid[p_es->i_pid] = *pid;
3716
3717         for( p_dr = p_es->p_first_descriptor; p_dr != NULL;
3718              p_dr = p_dr->p_next )
3719         {
3720             if( p_dr->i_tag == 0x9 )
3721             {
3722                 uint16_t i_sysid = ((uint16_t)p_dr->p_data[0] << 8)
3723                                     | p_dr->p_data[1];
3724                 msg_Dbg( p_demux, "   * descriptor : CA (0x9) SysID 0x%x",
3725                          i_sysid );
3726             }
3727         }
3728
3729         if( DVBProgramIsSelected( p_demux, prg->i_number )
3730              && (pid->es->id != NULL || p_sys->b_udp_out) )
3731         {
3732             /* Set demux filter */
3733             stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
3734                             ACCESS_SET_PRIVATE_ID_STATE, p_es->i_pid,
3735                             VLC_TRUE );
3736         }
3737     }
3738
3739     if( DVBProgramIsSelected( p_demux, prg->i_number ) )
3740     {
3741         /* Set CAM descrambling */
3742         stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
3743                         ACCESS_SET_PRIVATE_ID_CA, p_pmt );
3744     }
3745     else
3746     {
3747         dvbpsi_DeletePMT( p_pmt );
3748     }
3749
3750     for ( i = 0; i < i_clean; i++ )
3751     {
3752         if( DVBProgramIsSelected( p_demux, prg->i_number ) )
3753         {
3754             stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
3755                             ACCESS_SET_PRIVATE_ID_STATE, pp_clean[i]->i_pid,
3756                             VLC_FALSE );
3757         }
3758
3759         PIDClean( p_demux->out, pp_clean[i] );
3760     }
3761     if( i_clean ) free( pp_clean );
3762 }
3763
3764 static void PATCallBack( demux_t *p_demux, dvbpsi_pat_t *p_pat )
3765 {
3766     demux_sys_t          *p_sys = p_demux->p_sys;
3767     dvbpsi_pat_program_t *p_program;
3768     ts_pid_t             *pat = &p_sys->pid[0];
3769     int                  i, j;
3770
3771     msg_Dbg( p_demux, "PATCallBack called" );
3772
3773     if( pat->psi->i_pat_version != -1 &&
3774         ( !p_pat->b_current_next ||
3775           p_pat->i_version == pat->psi->i_pat_version ) )
3776     {
3777         dvbpsi_DeletePAT( p_pat );
3778         return;
3779     }
3780
3781     msg_Dbg( p_demux, "new PAT ts_id=%d version=%d current_next=%d",
3782              p_pat->i_ts_id, p_pat->i_version, p_pat->b_current_next );
3783
3784     /* Clean old */
3785     if( p_sys->i_pmt > 0 )
3786     {
3787         int      i_pmt_rm = 0;
3788         ts_pid_t **pmt_rm = NULL;
3789
3790         /* Search pmt to be deleted */
3791         for( i = 0; i < p_sys->i_pmt; i++ )
3792         {
3793             ts_pid_t *pmt = p_sys->pmt[i];
3794             vlc_bool_t b_keep = VLC_FALSE;
3795
3796             for( p_program = p_pat->p_first_program; p_program != NULL;
3797                  p_program = p_program->p_next )
3798             {
3799                 if( p_program->i_pid == pmt->i_pid )
3800                 {
3801                     int i_prg;
3802                     for( i_prg = 0; i_prg < pmt->psi->i_prg; i_prg++ )
3803                     {
3804                         if( p_program->i_number ==
3805                             pmt->psi->prg[i_prg]->i_number )
3806                         {
3807                             b_keep = VLC_TRUE;
3808                             break;
3809                         }
3810                     }
3811                     if( b_keep ) break;
3812                 }
3813             }
3814
3815             if( !b_keep )
3816             {
3817                 TAB_APPEND( i_pmt_rm, pmt_rm, pmt );
3818             }
3819         }
3820
3821         /* Delete all ES attached to thoses PMT */
3822         for( i = 2; i < 8192; i++ )
3823         {
3824             ts_pid_t *pid = &p_sys->pid[i];
3825
3826             if( !pid->b_valid || pid->psi ) continue;
3827
3828             for( j = 0; j < i_pmt_rm; j++ )
3829             {
3830                 int i_prg;
3831                 for( i_prg = 0; i_prg < pid->p_owner->i_prg; i_prg++ )
3832                 {
3833                     /* We only remove es that aren't defined by extra pmt */
3834                     if( pid->p_owner->prg[i_prg]->i_pid_pmt !=
3835                         pmt_rm[j]->i_pid ) continue;
3836
3837                     if( p_sys->b_dvb_control && pid->es->id )
3838                     {
3839                         if( stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
3840                                             ACCESS_SET_PRIVATE_ID_STATE, i,
3841                                             VLC_FALSE ) )
3842                             p_sys->b_dvb_control = VLC_FALSE;
3843                     }
3844
3845                     PIDClean( p_demux->out, pid );
3846                     break;
3847                 }
3848
3849                 if( !pid->b_valid ) break;
3850             }
3851         }
3852
3853         /* Delete PMT pid */
3854         for( i = 0; i < i_pmt_rm; i++ )
3855         {
3856             int i_prg;
3857             if( p_sys->b_dvb_control )
3858             {
3859                 if( stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
3860                                     ACCESS_SET_PRIVATE_ID_STATE,
3861                                     pmt_rm[i]->i_pid, VLC_FALSE ) )
3862                     p_sys->b_dvb_control = VLC_FALSE;
3863             }
3864
3865             for( i_prg = 0; i_prg < pmt_rm[i]->psi->i_prg; i_prg++ )
3866             {
3867                 const int i_number = pmt_rm[i]->psi->prg[i_prg]->i_number;
3868                 if( i_number != 0 )
3869                     es_out_Control( p_demux->out, ES_OUT_DEL_GROUP, i_number );
3870             }
3871
3872             PIDClean( p_demux->out, &p_sys->pid[pmt_rm[i]->i_pid] );
3873             TAB_REMOVE( p_sys->i_pmt, p_sys->pmt, pmt_rm[i] );
3874         }
3875
3876         if( pmt_rm ) free( pmt_rm );
3877     }
3878
3879     /* now create programs */
3880     for( p_program = p_pat->p_first_program; p_program != NULL;
3881          p_program = p_program->p_next )
3882     {
3883         msg_Dbg( p_demux, "  * number=%d pid=%d", p_program->i_number,
3884                  p_program->i_pid );
3885         if( p_program->i_number != 0 )
3886         {
3887             ts_pid_t *pmt = &p_sys->pid[p_program->i_pid];
3888             vlc_bool_t b_add = VLC_TRUE;
3889
3890             if( pmt->b_valid )
3891             {
3892                 int i_prg;
3893                 for( i_prg = 0; i_prg < pmt->psi->i_prg; i_prg++ )
3894                 {
3895                     if( pmt->psi->prg[i_prg]->i_number == p_program->i_number )
3896                     {
3897                         b_add = VLC_FALSE;
3898                         break;
3899                     }
3900                 }
3901             }
3902             else
3903             {
3904                 TAB_APPEND( p_sys->i_pmt, p_sys->pmt, pmt );
3905             }
3906
3907             if( b_add )
3908             {
3909                 PIDInit( pmt, VLC_TRUE, pat->psi );
3910                 pmt->psi->prg[pmt->psi->i_prg-1]->handle =
3911                     dvbpsi_AttachPMT( p_program->i_number,
3912                                       (dvbpsi_pmt_callback)PMTCallBack,
3913                                       p_demux );
3914                 pmt->psi->prg[pmt->psi->i_prg-1]->i_number =
3915                     p_program->i_number;
3916                 pmt->psi->prg[pmt->psi->i_prg-1]->i_pid_pmt =
3917                     p_program->i_pid;
3918
3919                 /* Now select PID at access level */
3920                 if( p_sys->b_dvb_control )
3921                 {
3922                     if( DVBProgramIsSelected( p_demux, p_program->i_number ) )
3923                     {
3924                         if( p_sys->i_dvb_program == 0 )
3925                             p_sys->i_dvb_program = p_program->i_number;
3926
3927                         if( stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
3928                                             ACCESS_SET_PRIVATE_ID_STATE,
3929                                             p_program->i_pid, VLC_TRUE ) )
3930                             p_sys->b_dvb_control = VLC_FALSE;
3931                     }
3932                 }
3933             }
3934         }
3935     }
3936     pat->psi->i_pat_version = p_pat->i_version;
3937
3938     dvbpsi_DeletePAT( p_pat );
3939 }