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