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