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