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