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