]> git.sesse.net Git - vlc/blob - modules/demux/mpeg/ts.c
ff510aff9339a8c0f5c46c913d950968f71d2815
[vlc] / modules / demux / mpeg / ts.c
1 /*****************************************************************************
2  * mpeg_ts.c : Transport Stream input module for vlc
3  *****************************************************************************
4  * Copyright (C) 2000-2001 VideoLAN
5  * $Id: ts.c,v 1.19 2003/02/23 18:07:30 fenrir Exp $
6  *
7  * Authors: Henri Fallon <henri@via.ecp.fr>
8  *          Johan Bilien <jobi@via.ecp.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <stdlib.h>
29 #include <string.h>
30
31 #ifdef HAVE_STDINT_H
32 #   include <stdint.h>                                            /* uint8_t */
33 #endif
34
35 #include <vlc/vlc.h>
36 #include <vlc/input.h>
37
38 #include "iso_lang.h"
39
40 #if defined MODULE_NAME_IS_ts_dvbpsi
41 #   ifdef HAVE_DVBPSI_DR_H
42 #       include <dvbpsi/dvbpsi.h>
43 #       include <dvbpsi/descriptor.h>
44 #       include <dvbpsi/pat.h>
45 #       include <dvbpsi/pmt.h>
46 #       include <dvbpsi/dr.h>
47 #   else
48 #       include "dvbpsi.h"
49 #       include "descriptor.h"
50 #       include "tables/pat.h"
51 #       include "tables/pmt.h"
52 #       include "descriptors/dr.h"
53 #   endif
54 #endif
55
56 #include "system.h"
57 #include "codecs.h"
58
59 /*****************************************************************************
60  * Constants
61  *****************************************************************************/
62 #define TS_READ_ONCE 200
63
64 /*****************************************************************************
65  * Private structure
66  *****************************************************************************/
67 struct demux_sys_t
68 {
69     module_t *   p_module;
70     mpeg_demux_t mpeg;
71 };
72
73 /*****************************************************************************
74  * Local prototypes
75  *****************************************************************************/
76 static int  Activate   ( vlc_object_t * );
77 static void Deactivate ( vlc_object_t * );
78 static int  Demux      ( input_thread_t * );
79
80 #if defined MODULE_NAME_IS_ts
81 static void TSDemuxPSI ( input_thread_t *, data_packet_t *,
82                           es_descriptor_t *, vlc_bool_t );
83 static void TSDecodePAT( input_thread_t *, es_descriptor_t *);
84 static void TSDecodePMT( input_thread_t *, es_descriptor_t *);
85 #define PSI_CALLBACK TSDemuxPSI
86 #elif defined MODULE_NAME_IS_ts_dvbpsi
87 static void TS_DVBPSI_DemuxPSI  ( input_thread_t *, data_packet_t *,
88                                   es_descriptor_t *, vlc_bool_t );
89 static void TS_DVBPSI_HandlePAT ( input_thread_t *, dvbpsi_pat_t * );
90 static void TS_DVBPSI_HandlePMT ( input_thread_t *, dvbpsi_pmt_t * );
91 #define PSI_CALLBACK TS_DVBPSI_DemuxPSI
92 #endif
93
94 /*****************************************************************************
95  * Module descriptor
96  *****************************************************************************/
97 #define VLS_BACKWARDS_COMPAT_TEXT N_("compatibility with pre-0.4 VLS")
98 #define VLS_BACKWARDS_COMPAT_LONGTEXT N_( \
99     "The protocol for transmitting A/52 audio streams changed between VLC " \
100     "0.3.x and 0.4. By default VLC assumes you have the latest VLS. In case " \
101     "you're using an old version, select this option.")
102
103 #define BUGGY_PSI_TEXT N_("buggy PSI")
104 #define BUGGY_PSI_LONGTEXT N_( \
105     "If you have a stream whose PSI packets do not feature incremented " \
106     "continuity counters, select this option.")
107
108 vlc_module_begin();
109 #if defined MODULE_NAME_IS_ts
110     set_description( _("ISO 13818-1 MPEG Transport Stream input") );
111     set_capability( "demux", 160 );
112     add_shortcut( "ts" );
113 #elif defined MODULE_NAME_IS_ts_dvbpsi
114     set_description( _("ISO 13818-1 MPEG Transport Stream input (libdvbpsi)") );
115     set_capability( "demux", 170 );
116     add_shortcut( "ts_dvbpsi" );
117 #endif
118     add_category_hint( N_("Miscellaneous"), NULL, VLC_TRUE );
119     add_bool( "vls-backwards-compat", 0, NULL,
120               VLS_BACKWARDS_COMPAT_TEXT, VLS_BACKWARDS_COMPAT_LONGTEXT, VLC_TRUE );
121     add_bool( "buggy-psi", 0, NULL, BUGGY_PSI_TEXT, BUGGY_PSI_LONGTEXT, VLC_TRUE );
122     set_callbacks( Activate, Deactivate );
123 vlc_module_end();
124
125 /*****************************************************************************
126  * Activate: initialize TS structures
127  *****************************************************************************/
128 static int Activate( vlc_object_t * p_this )
129 {
130     input_thread_t *    p_input = (input_thread_t *)p_this;
131     demux_sys_t *       p_demux;
132     es_descriptor_t *   p_pat_es;
133     es_ts_data_t *      p_demux_data;
134     stream_ts_data_t *  p_stream_data;
135     byte_t *            p_peek;
136
137     /* Set the demux function */
138     p_input->pf_demux = Demux;
139
140     /* Initialize access plug-in structures. */
141     if( p_input->i_mtu == 0 )
142     {
143         /* Improve speed. */
144         p_input->i_bufsize = INPUT_DEFAULT_BUFSIZE;
145     }
146
147     /* Have a peep at the show. */
148     if( input_Peek( p_input, &p_peek, 1 ) < 1 )
149     {
150         msg_Err( p_input, "cannot peek()" );
151         return -1;
152     }
153
154     if( *p_peek != TS_SYNC_CODE )
155     {
156         if( *p_input->psz_demux && ( !strncmp( p_input->psz_demux, "ts", 3 )
157                          || !strncmp( p_input->psz_demux, "ts_dvbpsi", 10 ) ) )
158         {
159             /* User forced */
160             msg_Err( p_input, "this does not look like a TS stream, continuing" );
161         }
162         else
163         {
164             msg_Warn( p_input, "TS module discarded (no sync)" );
165             return -1;
166         }
167     }
168
169     /* Adapt the bufsize for our only use. */
170     if( p_input->i_mtu != 0 )
171     {
172         /* Have minimum granularity to avoid bottlenecks at the input level. */
173         p_input->i_bufsize = (p_input->i_mtu / TS_PACKET_SIZE) * TS_PACKET_SIZE;
174     }
175
176     p_demux = p_input->p_demux_data = malloc( sizeof(demux_sys_t ) );
177     if( p_demux == NULL )
178     {
179         return -1;
180     }
181
182     p_input->p_private = (void*)&p_demux->mpeg;
183     p_demux->p_module = module_Need( p_input, "mpeg-system", NULL );
184     if( p_demux->p_module == NULL )
185     {
186         free( p_input->p_demux_data );
187         return -1;
188     }
189
190     vlc_mutex_lock( &p_input->stream.stream_lock );
191
192     if( input_InitStream( p_input, sizeof( stream_ts_data_t ) ) == -1 )
193     {
194         module_Unneed( p_input, p_demux->p_module );
195         free( p_input->p_demux_data );
196         return -1;
197     }
198
199     p_stream_data = (stream_ts_data_t *)p_input->stream.p_demux_data;
200     p_stream_data->i_pat_version = PAT_UNINITIALIZED ;
201     p_stream_data->b_buggy_psi = config_GetInt( p_input, "buggy-psi" );
202
203 #ifdef MODULE_NAME_IS_ts_dvbpsi
204     p_stream_data->p_pat_handle = (dvbpsi_handle *)
205       dvbpsi_AttachPAT( (dvbpsi_pat_callback) &TS_DVBPSI_HandlePAT, p_input );
206
207     if( p_stream_data->p_pat_handle == NULL )
208     {
209         msg_Err( p_input, "could not create PAT decoder" );
210         module_Unneed( p_input, p_demux->p_module );
211         free( p_input->p_demux_data );
212         return -1;
213     }
214 #endif
215
216     /* We'll have to catch the PAT in order to continue
217      * Then the input will catch the PMT and then the others ES
218      * The PAT es is indepedent of any program. */
219     p_pat_es = input_AddES( p_input, NULL,
220                             0x00, sizeof( es_ts_data_t ) );
221     p_demux_data = (es_ts_data_t *)p_pat_es->p_demux_data;
222     p_demux_data->b_psi = 1;
223     p_demux_data->i_psi_type = PSI_IS_PAT;
224     p_demux_data->p_psi_section = malloc(sizeof(psi_section_t));
225     p_demux_data->p_psi_section->b_is_complete = 1;
226     p_demux_data->i_continuity_counter = 0xFF;
227
228     vlc_mutex_unlock( &p_input->stream.stream_lock );
229
230     return 0;
231 }
232
233 /*****************************************************************************
234  * Deactivate: deinitialize TS structures
235  *****************************************************************************/
236 static void Deactivate( vlc_object_t * p_this )
237 {
238     input_thread_t *    p_input = (input_thread_t *)p_this;
239
240     module_Unneed( p_input, p_input->p_demux_data->p_module );
241     free( p_input->p_demux_data );
242 }
243
244 /*****************************************************************************
245  * Demux: reads and demuxes data packets
246  *****************************************************************************
247  * Returns -1 in case of error, 0 in case of EOF, otherwise the number of
248  * packets.
249  *****************************************************************************/
250 static int Demux( input_thread_t * p_input )
251 {
252     demux_sys_t *   p_demux = p_input->p_demux_data;
253     int             i_read_once = (p_input->i_mtu ?
254                                    p_input->i_bufsize / TS_PACKET_SIZE :
255                                    TS_READ_ONCE);
256     int             i;
257
258     for( i = 0; i < i_read_once; i++ )
259     {
260         data_packet_t *     p_data;
261         ssize_t             i_result;
262
263         i_result = p_demux->mpeg.pf_read_ts( p_input, &p_data );
264
265         if( i_result <= 0 )
266         {
267             return i_result;
268         }
269
270         p_demux->mpeg.pf_demux_ts( p_input, p_data,
271                                    (psi_callback_t) &PSI_CALLBACK );
272     }
273
274     return i_read_once;
275 }
276
277
278 #if defined MODULE_NAME_IS_ts
279 /*
280  * PSI demultiplexing and decoding without libdvbpsi
281  */
282
283 /*****************************************************************************
284  * DemuxPSI : makes up complete PSI data
285  *****************************************************************************/
286 static void TSDemuxPSI( input_thread_t * p_input, data_packet_t * p_data,
287         es_descriptor_t * p_es, vlc_bool_t b_unit_start )
288 {
289     es_ts_data_t  * p_demux_data;
290
291     p_demux_data = (es_ts_data_t *)p_es->p_demux_data;
292
293 #define p_psi (p_demux_data->p_psi_section)
294 #define p (p_data->p_payload_start)
295
296     if( b_unit_start )
297     {
298         /* unit_start set to 1 -> presence of a pointer field
299          * (see ISO/IEC 13818 (2.4.4.2) which should be set to 0x00 */
300         if( (u8)p[0] != 0x00 )
301         {
302             msg_Warn( p_input,
303                       "non-zero pointer field found, trying to continue" );
304             p+=(u8)p[0];
305         }
306         else
307         {
308             p++;
309         }
310
311         /* This is the begining of a new section */
312
313         if( ((u8)(p[1]) & 0xc0) != 0x80 )
314         {
315             msg_Warn( p_input, "invalid PSI packet" );
316             p_psi->b_trash = 1;
317         }
318         else
319         {
320             p_psi->i_section_length = ((p[1] & 0xF) << 8) | p[2];
321             p_psi->b_section_complete = 0;
322             p_psi->i_read_in_section = 0;
323             p_psi->i_section_number = (u8)p[6];
324
325             if( p_psi->b_is_complete || p_psi->i_section_number == 0 )
326             {
327                 /* This is a new PSI packet */
328                 p_psi->b_is_complete = 0;
329                 p_psi->b_trash = 0;
330                 p_psi->i_version_number = ( p[5] >> 1 ) & 0x1f;
331                 p_psi->i_last_section_number = (u8)p[7];
332
333                 /* We'll write at the begining of the buffer */
334                 p_psi->p_current = p_psi->buffer;
335             }
336             else
337             {
338                 if( p_psi->b_section_complete )
339                 {
340                     /* New Section of an already started PSI */
341                     p_psi->b_section_complete = 0;
342
343                     if( p_psi->i_version_number != (( p[5] >> 1 ) & 0x1f) )
344                     {
345                         msg_Warn( p_input,
346                                   "PSI version differs inside same PAT" );
347                         p_psi->b_trash = 1;
348                     }
349                     if( p_psi->i_section_number + 1 != (u8)p[6] )
350                     {
351                         msg_Warn( p_input,
352                                   "PSI Section discontinuity, packet lost?" );
353                         p_psi->b_trash = 1;
354                     }
355                     else
356                         p_psi->i_section_number++;
357                 }
358                 else
359                 {
360                     msg_Warn( p_input, "got unexpected new PSI section" );
361                     p_psi->b_trash = 1;
362                 }
363             }
364         }
365     } /* b_unit_start */
366
367     if( !p_psi->b_trash )
368     {
369         /* read */
370         if( (p_data->p_payload_end - p) >=
371             ( p_psi->i_section_length - p_psi->i_read_in_section ) )
372         {
373             /* The end of the section is in this TS packet */
374             memcpy( p_psi->p_current, p,
375             (p_psi->i_section_length - p_psi->i_read_in_section) );
376
377             p_psi->b_section_complete = 1;
378             p_psi->p_current +=
379                 (p_psi->i_section_length - p_psi->i_read_in_section);
380
381             if( p_psi->i_section_number == p_psi->i_last_section_number )
382             {
383                 /* This was the last section of PSI */
384                 p_psi->b_is_complete = 1;
385
386                 switch( p_demux_data->i_psi_type)
387                 {
388                 case PSI_IS_PAT:
389                     TSDecodePAT( p_input, p_es );
390                     break;
391                 case PSI_IS_PMT:
392                     TSDecodePMT( p_input, p_es );
393                     break;
394                 default:
395                     msg_Warn( p_input, "received unknown PSI in DemuxPSI" );
396                 }
397             }
398         }
399         else
400         {
401             memcpy( p_psi->buffer, p, p_data->p_payload_end - p );
402             p_psi->i_read_in_section += p_data->p_payload_end - p;
403
404             p_psi->p_current += p_data->p_payload_end - p;
405         }
406     }
407
408 #undef p_psi
409 #undef p
410
411     input_DeletePacket( p_input->p_method_data, p_data );
412
413     return ;
414 }
415
416 /*****************************************************************************
417  * DecodePAT : Decodes Programm association table and deal with it
418  *****************************************************************************/
419 static void TSDecodePAT( input_thread_t * p_input, es_descriptor_t * p_es )
420 {
421     stream_ts_data_t  * p_stream_data;
422     es_ts_data_t      * p_demux_data;
423
424     pgrm_descriptor_t * p_pgrm;
425     es_descriptor_t   * p_current_es;
426     byte_t            * p_current_data;
427
428     int                 i_section_length, i_program_id, i_pmt_pid;
429     int                 i_loop, i_current_section;
430
431     vlc_bool_t          b_changed = 0;
432
433     p_demux_data = (es_ts_data_t *)p_es->p_demux_data;
434     p_stream_data = (stream_ts_data_t *)p_input->stream.p_demux_data;
435
436 #define p_psi (p_demux_data->p_psi_section)
437
438     /* Not so fast, Mike ! If the PAT version has changed, we first check
439      * that its content has really changed before doing anything */
440     if( p_stream_data->i_pat_version != p_psi->i_version_number )
441     {
442         int i_programs = p_input->stream.i_pgrm_number;
443
444         p_current_data = p_psi->buffer;
445
446         do
447         {
448             i_section_length = ((u32)(p_current_data[1] & 0xF) << 8) |
449                                  p_current_data[2];
450             i_current_section = (u8)p_current_data[6];
451
452             for( i_loop = 0;
453                  ( i_loop < (i_section_length - 9) / 4 ) && !b_changed;
454                  i_loop++ )
455             {
456                 i_program_id = ( (u32)*(p_current_data + i_loop * 4 + 8) << 8 )
457                                  | *(p_current_data + i_loop * 4 + 9);
458                 i_pmt_pid = ( ((u32)*(p_current_data + i_loop * 4 + 10) & 0x1F)
459                                     << 8 )
460                                | *(p_current_data + i_loop * 4 + 11);
461
462                 if( i_program_id )
463                 {
464                     if( (p_pgrm = input_FindProgram( p_input, i_program_id ))
465                         && (p_current_es = input_FindES( p_input, i_pmt_pid ))
466                         && p_current_es->p_pgrm == p_pgrm
467                         && p_current_es->i_id == i_pmt_pid
468                         && ((es_ts_data_t *)p_current_es->p_demux_data)->b_psi
469                         && ((es_ts_data_t *)p_current_es->p_demux_data)
470                             ->i_psi_type == PSI_IS_PMT )
471                     {
472                         i_programs--;
473                     }
474                     else
475                     {
476                         b_changed = 1;
477                     }
478                 }
479             }
480
481             p_current_data += 3 + i_section_length;
482
483         } while( ( i_current_section < p_psi->i_last_section_number )
484                   && !b_changed );
485
486         /* If we didn't find the expected amount of programs, the PAT has
487          * changed. Otherwise, it only changed if b_changed is already != 0 */
488         b_changed = b_changed || i_programs;
489     }
490
491     if( b_changed )
492     {
493         /* PAT has changed. We are going to delete all programs and
494          * create new ones. We chose not to only change what was needed
495          * as a PAT change may mean the stream is radically changing and
496          * this is a secure method to avoid crashes */
497         es_ts_data_t      * p_es_demux;
498         pgrm_ts_data_t    * p_pgrm_demux;
499
500         p_current_data = p_psi->buffer;
501
502         /* Delete all programs */
503         while( p_input->stream.i_pgrm_number )
504         {
505             input_DelProgram( p_input, p_input->stream.pp_programs[0] );
506         }
507
508         do
509         {
510             i_section_length = ((u32)(p_current_data[1] & 0xF) << 8) |
511                                  p_current_data[2];
512             i_current_section = (u8)p_current_data[6];
513
514             for( i_loop = 0; i_loop < (i_section_length - 9) / 4 ; i_loop++ )
515             {
516                 i_program_id = ( (u32)*(p_current_data + i_loop * 4 + 8) << 8 )
517                                  | *(p_current_data + i_loop * 4 + 9);
518                 i_pmt_pid = ( ((u32)*(p_current_data + i_loop * 4 + 10) & 0x1F)
519                                     << 8 )
520                                | *(p_current_data + i_loop * 4 + 11);
521
522                 /* If program = 0, we're having info about NIT not PMT */
523                 if( i_program_id )
524                 {
525                     /* Add this program */
526                     p_pgrm = input_AddProgram( p_input, i_program_id,
527                                                sizeof( pgrm_ts_data_t ) );
528
529                     /* whatis the PID of the PMT of this program */
530                     p_pgrm_demux = (pgrm_ts_data_t *)p_pgrm->p_demux_data;
531                     p_pgrm_demux->i_pmt_version = PMT_UNINITIALIZED;
532
533                     /* Add the PMT ES to this program */
534                     p_current_es = input_AddES( p_input, p_pgrm,(u16)i_pmt_pid,
535                                         sizeof( es_ts_data_t) );
536                     p_es_demux = (es_ts_data_t *)p_current_es->p_demux_data;
537                     p_es_demux->b_psi = 1;
538                     p_es_demux->i_psi_type = PSI_IS_PMT;
539
540                     p_es_demux->p_psi_section =
541                                             malloc( sizeof( psi_section_t ) );
542                     p_es_demux->p_psi_section->b_is_complete = 0;
543                     p_es_demux->i_continuity_counter = 0xFF;
544                 }
545             }
546
547             p_current_data += 3 + i_section_length;
548
549         } while( i_current_section < p_psi->i_last_section_number );
550
551         /* Go to the beginning of the next section */
552         p_stream_data->i_pat_version = p_psi->i_version_number;
553
554     }
555 #undef p_psi
556
557 }
558
559 /*****************************************************************************
560  * DecodePMT : decode a given Program Stream Map
561  * ***************************************************************************
562  * When the PMT changes, it may mean a deep change in the stream, and it is
563  * careful to delete the ES and add them again. If the PMT doesn't change,
564  * there no need to do anything.
565  *****************************************************************************/
566 static void TSDecodePMT( input_thread_t * p_input, es_descriptor_t * p_es )
567 {
568
569     pgrm_ts_data_t            * p_pgrm_data;
570     es_ts_data_t              * p_demux_data;
571     vlc_bool_t b_vls_compat = config_GetInt( p_input, "vls-backwards-compat" );
572
573     p_demux_data = (es_ts_data_t *)p_es->p_demux_data;
574     p_pgrm_data = (pgrm_ts_data_t *)p_es->p_pgrm->p_demux_data;
575
576 #define p_psi (p_demux_data->p_psi_section)
577
578     if( p_psi->i_version_number != p_pgrm_data->i_pmt_version )
579     {
580         es_descriptor_t   * p_new_es;
581         es_ts_data_t      * p_es_demux;
582         byte_t            * p_current_data, * p_current_section;
583         int                 i_section_length,i_current_section;
584         int                 i_prog_info_length, i_loop;
585         int                 i_es_info_length, i_pid, i_stream_type;
586
587         p_current_section = p_psi->buffer;
588         p_current_data = p_psi->buffer;
589
590         p_pgrm_data->i_pcr_pid = ( ((u32)*(p_current_section + 8) & 0x1F) << 8 ) |
591                                     *(p_current_section + 9);
592
593
594         /* Lock stream information */
595         vlc_mutex_lock( &p_input->stream.stream_lock );
596
597         /* Delete all ES in this program  except the PSI. We start from the
598          * end because i_es_number gets decremented after each deletion. */
599         for( i_loop = p_es->p_pgrm->i_es_number ; i_loop ; )
600         {
601             i_loop--;
602             p_es_demux = (es_ts_data_t *)
603                          p_es->p_pgrm->pp_es[i_loop]->p_demux_data;
604             if ( ! p_es_demux->b_psi )
605             {
606                 input_DelES( p_input, p_es->p_pgrm->pp_es[i_loop] );
607             }
608         }
609
610         /* Then add what we received in this PMT */
611         do
612         {
613             i_section_length = ( ((u32)*(p_current_data + 1) & 0xF) << 8 ) |
614                                   *(p_current_data + 2);
615             i_current_section = (u8)p_current_data[6];
616             i_prog_info_length = ( ((u32)*(p_current_data + 10) & 0xF) << 8 ) |
617                                     *(p_current_data + 11);
618
619             /* For the moment we ignore program descriptors */
620             p_current_data += 12 + i_prog_info_length;
621
622             /* The end of the section, before the CRC is at
623              * p_current_section + i_section_length -1 */
624             while( p_current_data < p_current_section + i_section_length -1 )
625             {
626                 i_stream_type = (int)p_current_data[0];
627                 i_pid = ( ((u32)*(p_current_data + 1) & 0x1F) << 8 ) |
628                            *(p_current_data + 2);
629                 i_es_info_length = ( ((u32)*(p_current_data + 3) & 0xF) << 8 ) |
630                                       *(p_current_data + 4);
631
632                 /* Add this ES to the program */
633                 p_new_es = input_AddES( p_input, p_es->p_pgrm,
634                                         (u16)i_pid, sizeof( es_ts_data_t ) );
635                 ((es_ts_data_t *)p_new_es->p_demux_data)->i_continuity_counter = 0xFF;
636
637                 /* Tell the interface what kind of stream it is and select
638                  * the required ones */
639                 {
640                     switch( i_stream_type )
641                     {
642                         case MPEG1_VIDEO_ES:
643                         case MPEG2_VIDEO_ES:
644                             /* This isn't real, but we don't actually use
645                              * it. */
646                             p_new_es->i_stream_id = 0xE0;
647                             p_new_es->i_fourcc = VLC_FOURCC('m','p','g','v');
648                             p_new_es->i_cat = VIDEO_ES;
649                             break;
650                         case MPEG1_AUDIO_ES:
651                         case MPEG2_AUDIO_ES:
652                             /* This isn't real, but we don't actually use
653                              * it. */
654                             p_new_es->i_stream_id = 0xC0;
655                             p_new_es->i_fourcc = VLC_FOURCC('m','p','g','a');
656                             p_new_es->i_cat = AUDIO_ES;
657                             break;
658                         case A52_AUDIO_ES:
659                         case A52DVB_AUDIO_ES:
660                             if ( !b_vls_compat )
661                                 p_new_es->i_fourcc = VLC_FOURCC('a','5','2',' ');
662                             else
663                                 p_new_es->i_fourcc = VLC_FOURCC('a','5','2','b');
664                             p_new_es->i_stream_id = 0xBD;
665                             p_new_es->i_cat = AUDIO_ES;
666                             break;
667                         case LPCM_AUDIO_ES:
668                             p_new_es->i_fourcc = VLC_FOURCC('l','p','c','m');
669                             p_new_es->i_stream_id = 0xBD;
670                             p_new_es->i_cat = AUDIO_ES;
671                             break;
672                         case DVD_SPU_ES:
673                             if ( !b_vls_compat )
674                                 p_new_es->i_fourcc = VLC_FOURCC('s','p','u',' ');
675                             else
676                                 p_new_es->i_fourcc = VLC_FOURCC('s','p','u','b');
677                             p_new_es->i_stream_id = 0xBD;
678                             p_new_es->i_cat = SPU_ES;
679                             break;
680                         case SDDS_AUDIO_ES:
681                             p_new_es->i_fourcc = VLC_FOURCC('s','d','d','s');
682                             p_new_es->i_stream_id = 0xBD;
683                             p_new_es->i_cat = AUDIO_ES;
684                             break;
685                         case DTS_AUDIO_ES:
686                             p_new_es->i_fourcc = VLC_FOURCC('d','t','s',' ');
687                             p_new_es->i_stream_id = 0xBD;
688                             p_new_es->i_cat = AUDIO_ES;
689                             break;
690                         /* 'b' stands for 'buggy' */
691                         case A52B_AUDIO_ES:
692                             p_new_es->i_fourcc = VLC_FOURCC('a','5','2','b');
693                             p_new_es->i_stream_id = 0xBD;
694                             p_new_es->i_cat = AUDIO_ES;
695                             break;
696                         case LPCMB_AUDIO_ES:
697                             p_new_es->i_fourcc = VLC_FOURCC('l','p','c','b');
698                             p_new_es->i_stream_id = 0xBD;
699                             p_new_es->i_cat = AUDIO_ES;
700                             break;
701                         case DVDB_SPU_ES:
702                             p_new_es->i_fourcc = VLC_FOURCC('s','p','u','b');
703                             p_new_es->i_stream_id = 0xBD;
704                             p_new_es->i_cat = SPU_ES;
705                             break;
706
707                         default :
708                             p_new_es->i_fourcc = 0;
709                             p_new_es->i_cat = UNKNOWN_ES;
710                             break;
711                     }
712                 }
713
714                 p_current_data += 5 + i_es_info_length;
715             }
716
717             /* Go to the beginning of the next section*/
718             p_current_data += 3 + i_section_length;
719
720             p_current_section++;
721
722         } while( i_current_section < p_psi->i_last_section_number );
723
724         p_pgrm_data->i_pmt_version = p_psi->i_version_number;
725
726         /* if no program is selected :*/
727         if( !p_input->stream.p_selected_program )
728         {
729             pgrm_descriptor_t *     p_pgrm_to_select;
730             u16 i_id = (u16)config_GetInt( p_input, "program" );
731
732             if( i_id != 0 ) /* if user specified a program */
733             {
734                 p_pgrm_to_select = input_FindProgram( p_input, i_id );
735
736                 if( p_pgrm_to_select && p_pgrm_to_select == p_es->p_pgrm )
737                     p_input->pf_set_program( p_input, p_pgrm_to_select );
738             }
739             else
740                     p_input->pf_set_program( p_input, p_es->p_pgrm );
741         }
742
743         /* if the pmt belongs to the currently selected program, we
744          * reselect it to update its ES */
745         else if( p_es->p_pgrm == p_input->stream.p_selected_program )
746         {
747             p_input->pf_set_program( p_input, p_es->p_pgrm );
748         }
749
750         /* inform interface that stream has changed */
751         p_input->stream.b_changed = 1;
752         /*  Remove lock */
753         vlc_mutex_unlock( &p_input->stream.stream_lock );
754     }
755
756 #undef p_psi
757 }
758
759 #elif defined MODULE_NAME_IS_ts_dvbpsi
760 /*
761  * PSI Decoding using libdvbpsi
762  */
763
764 /*****************************************************************************
765  * DemuxPSI : send the PSI to the right libdvbpsi decoder
766  *****************************************************************************/
767 static void TS_DVBPSI_DemuxPSI( input_thread_t  * p_input,
768                                 data_packet_t   * p_data,
769                                 es_descriptor_t * p_es,
770                                 vlc_bool_t        b_unit_start )
771 {
772     es_ts_data_t        * p_es_demux_data;
773     pgrm_ts_data_t      * p_pgrm_demux_data;
774     stream_ts_data_t    * p_stream_demux_data;
775
776     p_es_demux_data = (es_ts_data_t *)p_es->p_demux_data;
777     p_stream_demux_data = (stream_ts_data_t *) p_input->stream.p_demux_data;
778
779     switch( p_es_demux_data->i_psi_type)
780     {
781         case PSI_IS_PAT:
782             dvbpsi_PushPacket(
783                     (dvbpsi_handle)p_stream_demux_data->p_pat_handle,
784                     p_data->p_demux_start );
785             break;
786         case PSI_IS_PMT:
787             p_pgrm_demux_data = ( pgrm_ts_data_t * )p_es->p_pgrm->p_demux_data;
788             dvbpsi_PushPacket(
789                     (dvbpsi_handle)p_pgrm_demux_data->p_pmt_handle,
790                     p_data->p_demux_start );
791             break;
792         default:
793             msg_Warn( p_input, "received unknown PSI in DemuxPSI" );
794     }
795
796     input_DeletePacket( p_input->p_method_data, p_data );
797 }
798 /*****************************************************************************
799  * MP4 specific functions
800  *****************************************************************************/
801 static int  MP4_DescriptorLength( int *pi_data, uint8_t **pp_data )
802 {
803     unsigned int i_b;
804     unsigned int i_len = 0;
805     do
806     {
807         i_b = **pp_data;
808         (*pp_data)++;
809         (*pi_data)--;
810         i_len = ( i_len << 7 ) + ( i_b&0x7f );
811
812     } while( i_b&0x80 );
813
814     return( i_len );
815 }
816 static int MP4_GetByte( int *pi_data, uint8_t **pp_data )
817 {
818     if( *pi_data > 0 )
819     {
820         int i_b = **pp_data;
821         (*pp_data)++;
822         (*pi_data)--;
823         return( i_b );
824     }
825     else
826     {
827         return( 0 );
828     }
829 }
830
831 static int MP4_GetWord( int *pi_data, uint8_t **pp_data )
832 {
833     int i1, i2;
834     i1 = MP4_GetByte( pi_data, pp_data );
835     i2 = MP4_GetByte( pi_data, pp_data );
836     return( ( i1 << 8 ) | i2 );
837 }
838 static int MP4_Get3Bytes( int *pi_data, uint8_t **pp_data )
839 {
840     int i1, i2, i3;
841     i1 = MP4_GetByte( pi_data, pp_data );
842     i2 = MP4_GetByte( pi_data, pp_data );
843     i3 = MP4_GetByte( pi_data, pp_data );
844     return( ( i1 << 16 ) | ( i2 << 8) | i3 );
845 }
846
847 static uint32_t MP4_GetDWord( int *pi_data, uint8_t **pp_data )
848 {
849     uint32_t i1, i2;
850     i1 = MP4_GetWord( pi_data, pp_data );
851     i2 = MP4_GetWord( pi_data, pp_data );
852     return( ( i1 << 16 ) | i2 );
853 }
854
855 static char* MP4_GetURL( int *pi_data, uint8_t **pp_data )
856 {
857     char *url;
858     int i_url_len, i;
859
860     i_url_len = MP4_GetByte( pi_data, pp_data );
861     url = malloc( i_url_len + 1 );
862     for( i = 0; i < i_url_len; i++ )
863     {
864         url[i] = MP4_GetByte( pi_data, pp_data );
865     }
866     url[i_url_len] = '\0';
867     return( url );
868 }
869
870 static void MP4_IODParse( iod_descriptor_t *p_iod, int i_data, uint8_t *p_data )
871 {
872     int i;
873     int i_es_index;
874     uint8_t     i_flags;
875     vlc_bool_t  b_url;
876     int         i_iod_length;
877
878     fprintf( stderr, "\n************ IOD ************" );
879     for( i = 0; i < 255; i++ )
880     {
881         p_iod->es_descr[i].b_ok = 0;
882     }
883     i_es_index = 0;
884
885     if( i_data < 3 )
886     {
887         return;
888     }
889
890     p_iod->i_iod_label = MP4_GetByte( &i_data, &p_data );
891     fprintf( stderr, "\n* iod_label:%d", p_iod->i_iod_label );
892     fprintf( stderr, "\n* ===========" );
893     fprintf( stderr, "\n* tag:0x%x", p_data[0] );
894
895     if( MP4_GetByte( &i_data, &p_data ) != 0x02 )
896     {
897         fprintf( stderr, "\n ERR: tag != 0x02" );
898         return;
899     }
900
901     i_iod_length = MP4_DescriptorLength( &i_data, &p_data );
902     fprintf( stderr, "\n* length:%d", i_iod_length );
903     if( i_iod_length > i_data )
904     {
905         i_iod_length = i_data;
906     }
907
908     p_iod->i_od_id = ( MP4_GetByte( &i_data, &p_data ) << 2 );
909     i_flags = MP4_GetByte( &i_data, &p_data );
910     p_iod->i_od_id |= i_flags >> 6;
911     b_url = ( i_flags >> 5  )&0x01;
912
913     fprintf( stderr, "\n* od_id:%d", p_iod->i_od_id );
914     fprintf( stderr, "\n* url flag:%d", b_url );
915     fprintf( stderr, "\n* includeInlineProfileLevel flag:%d", ( i_flags >> 4 )&0x01 );
916
917     if( b_url )
918     {
919         p_iod->psz_url = MP4_GetURL( &i_data, &p_data );
920         fprintf( stderr, "\n* url string:%s", p_iod->psz_url );
921         fprintf( stderr, "\n*****************************\n" );
922         return;
923     }
924     else
925     {
926         p_iod->psz_url = NULL;
927     }
928
929     p_iod->i_ODProfileLevelIndication = MP4_GetByte( &i_data, &p_data );
930     p_iod->i_sceneProfileLevelIndication = MP4_GetByte( &i_data, &p_data );
931     p_iod->i_audioProfileLevelIndication = MP4_GetByte( &i_data, &p_data );
932     p_iod->i_visualProfileLevelIndication = MP4_GetByte( &i_data, &p_data );
933     p_iod->i_graphicsProfileLevelIndication = MP4_GetByte( &i_data, &p_data );
934
935     fprintf( stderr, "\n* ODProfileLevelIndication:%d", p_iod->i_ODProfileLevelIndication );
936     fprintf( stderr, "\n* sceneProfileLevelIndication:%d", p_iod->i_sceneProfileLevelIndication );
937     fprintf( stderr, "\n* audioProfileLevelIndication:%d", p_iod->i_audioProfileLevelIndication );
938     fprintf( stderr, "\n* visualProfileLevelIndication:%d", p_iod->i_visualProfileLevelIndication );
939     fprintf( stderr, "\n* graphicsProfileLevelIndication:%d", p_iod->i_graphicsProfileLevelIndication );
940
941
942     while( i_data > 0 && i_es_index < 255)
943     {
944         int i_tag, i_length;
945         int     i_data_sav;
946         uint8_t *p_data_sav;
947
948         i_tag = MP4_GetByte( &i_data, &p_data );
949         i_length = MP4_DescriptorLength( &i_data, &p_data );
950
951         i_data_sav = i_data;
952         p_data_sav = p_data;
953
954         i_data = i_length;
955
956         switch( i_tag )
957         {
958             case 0x03:
959                 {
960 #define es_descr    p_iod->es_descr[i_es_index]
961                     int i_decoderConfigDescr_length;
962                     fprintf( stderr, "\n* - ES_Descriptor length:%d", i_length );
963                     es_descr.b_ok = 1;
964
965                     es_descr.i_es_id = MP4_GetWord( &i_data, &p_data );
966                     i_flags = MP4_GetByte( &i_data, &p_data );
967                     es_descr.b_streamDependenceFlag = ( i_flags >> 7 )&0x01;
968                     b_url = ( i_flags >> 6 )&0x01;
969                     es_descr.b_OCRStreamFlag = ( i_flags >> 5 )&0x01;
970                     es_descr.i_streamPriority = i_flags & 0x1f;
971                     fprintf( stderr, "\n*   * streamDependenceFlag:%d", es_descr.b_streamDependenceFlag );
972                     fprintf( stderr, "\n*   * OCRStreamFlag:%d", es_descr.b_OCRStreamFlag );
973                     fprintf( stderr, "\n*   * streamPriority:%d", es_descr.i_streamPriority );
974
975                     if( es_descr.b_streamDependenceFlag )
976                     {
977                         es_descr.i_dependOn_es_id = MP4_GetWord( &i_data, &p_data );
978                         fprintf( stderr, "\n*   * dependOn_es_id:%d", es_descr.i_dependOn_es_id );
979                     }
980
981                     if( b_url )
982                     {
983                         es_descr.psz_url = MP4_GetURL( &i_data, &p_data );
984                         fprintf( stderr, "\n* url string:%s", es_descr.psz_url );
985                     }
986                     else
987                     {
988                         es_descr.psz_url = NULL;
989                     }
990
991                     if( es_descr.b_OCRStreamFlag )
992                     {
993                         es_descr.i_OCR_es_id = MP4_GetWord( &i_data, &p_data );
994                         fprintf( stderr, "\n*   * OCR_es_id:%d", es_descr.i_OCR_es_id );
995                     }
996
997                     if( MP4_GetByte( &i_data, &p_data ) != 0x04 )
998                     {
999                         fprintf( stderr, "\n* ERR missing DecoderConfigDescr" );
1000                         es_descr.b_ok = 0;
1001                         break;
1002                     }
1003                     i_decoderConfigDescr_length = MP4_DescriptorLength( &i_data, &p_data );
1004
1005                     fprintf( stderr, "\n*   - DecoderConfigDesc length:%d", i_decoderConfigDescr_length );
1006 #define dec_descr   es_descr.dec_descr
1007                     dec_descr.i_objectTypeIndication = MP4_GetByte( &i_data, &p_data );
1008                     i_flags = MP4_GetByte( &i_data, &p_data );
1009                     dec_descr.i_streamType = i_flags >> 2;
1010                     dec_descr.b_upStream = ( i_flags >> 1 )&0x01;
1011                     dec_descr.i_bufferSizeDB = MP4_Get3Bytes( &i_data, &p_data );
1012                     dec_descr.i_maxBitrate = MP4_GetDWord( &i_data, &p_data );
1013                     dec_descr.i_avgBitrate = MP4_GetDWord( &i_data, &p_data );
1014                     fprintf( stderr, "\n*     * objectTypeIndication:0x%x", dec_descr.i_objectTypeIndication  );
1015                     fprintf( stderr, "\n*     * streamType:0x%x", dec_descr.i_streamType );
1016                     fprintf( stderr, "\n*     * upStream:%d", dec_descr.b_upStream );
1017                     fprintf( stderr, "\n*     * bufferSizeDB:%d", dec_descr.i_bufferSizeDB );
1018                     fprintf( stderr, "\n*     * maxBitrate:%d", dec_descr.i_maxBitrate );
1019                     fprintf( stderr, "\n*     * avgBitrate:%d", dec_descr.i_avgBitrate );
1020                     if( i_decoderConfigDescr_length > 13 && MP4_GetByte( &i_data, &p_data ) == 0x05 )
1021                     {
1022                         int i;
1023                         dec_descr.i_decoder_specific_info_len =
1024                             MP4_DescriptorLength( &i_data, &p_data );
1025                         if( dec_descr.i_decoder_specific_info_len > 0 )
1026                         {
1027                             dec_descr.p_decoder_specific_info =
1028                                 malloc( dec_descr.i_decoder_specific_info_len );
1029                         }
1030                         for( i = 0; i < dec_descr.i_decoder_specific_info_len; i++ )
1031                         {
1032                             dec_descr.p_decoder_specific_info[i] = MP4_GetByte( &i_data, &p_data );
1033                         }
1034                     }
1035                     else
1036                     {
1037                         dec_descr.i_decoder_specific_info_len = 0;
1038                         dec_descr.p_decoder_specific_info = NULL;
1039                     }
1040                 }
1041 #undef  dec_descr
1042 #define sl_descr    es_descr.sl_descr
1043                 {
1044                     int i_SLConfigDescr_length;
1045                     int i_predefined;
1046
1047                     if( MP4_GetByte( &i_data, &p_data ) != 0x06 )
1048                     {
1049                         fprintf( stderr, "\n* ERR missing SLConfigDescr" );
1050                         es_descr.b_ok = 0;
1051                         break;
1052                     }
1053                     i_SLConfigDescr_length = MP4_DescriptorLength( &i_data, &p_data );
1054
1055                     fprintf( stderr, "\n*   - SLConfigDescr length:%d", i_SLConfigDescr_length );
1056                     i_predefined = MP4_GetByte( &i_data, &p_data );
1057                     fprintf( stderr, "\n*     * i_predefined:0x%x", i_predefined  );
1058                     switch( i_predefined )
1059                     {
1060                         case 0x01:
1061                             {
1062                                 sl_descr.b_useAccessUnitStartFlag   = 0;
1063                                 sl_descr.b_useAccessUnitEndFlag     = 0;
1064                                 sl_descr.b_useRandomAccessPointFlag = 0;
1065                                 //sl_descr.b_useRandomAccessUnitsOnlyFlag = 0;
1066                                 sl_descr.b_usePaddingFlag           = 0;
1067                                 sl_descr.b_useTimeStampsFlags       = 0;
1068                                 sl_descr.b_useIdleFlag              = 0;
1069                                 sl_descr.b_durationFlag     = 0;    // FIXME FIXME
1070                                 sl_descr.i_timeStampResolution      = 1000;
1071                                 sl_descr.i_OCRResolution    = 0;    // FIXME FIXME
1072                                 sl_descr.i_timeStampLength          = 32;
1073                                 sl_descr.i_OCRLength        = 0;    // FIXME FIXME
1074                                 sl_descr.i_AU_Length                = 0;
1075                                 sl_descr.i_instantBitrateLength= 0; // FIXME FIXME
1076                                 sl_descr.i_degradationPriorityLength= 0;
1077                                 sl_descr.i_AU_seqNumLength          = 0;
1078                                 sl_descr.i_packetSeqNumLength       = 0;
1079                                 if( sl_descr.b_durationFlag )
1080                                 {
1081                                     sl_descr.i_timeScale            = 0;    // FIXME FIXME
1082                                     sl_descr.i_accessUnitDuration   = 0;    // FIXME FIXME
1083                                     sl_descr.i_compositionUnitDuration= 0;    // FIXME FIXME
1084                                 }
1085                                 if( !sl_descr.b_useTimeStampsFlags )
1086                                 {
1087                                     sl_descr.i_startDecodingTimeStamp   = 0;    // FIXME FIXME
1088                                     sl_descr.i_startCompositionTimeStamp= 0;    // FIXME FIXME
1089                                 }
1090                             }
1091                             break;
1092                         default:
1093                             fprintf( stderr, "\n* ERR unsupported SLConfigDescr predefined" );
1094                             es_descr.b_ok = 0;
1095                             break;
1096                     }
1097                 }
1098                 break;
1099 #undef  sl_descr
1100 #undef  es_descr
1101             default:
1102                 fprintf( stderr, "\n* - OD tag:0x%x length:%d (Unsupported)", i_tag, i_length );
1103                 break;
1104         }
1105
1106         p_data = p_data_sav + i_length;
1107         i_data = i_data_sav - i_length;
1108         i_es_index++;
1109     }
1110
1111
1112     fprintf( stderr, "\n*****************************\n" );
1113 }
1114
1115 static void MP4_IODClean( iod_descriptor_t *p_iod )
1116 {
1117     int i;
1118
1119     if( p_iod->psz_url )
1120     {
1121         free( p_iod->psz_url );
1122         p_iod->psz_url = NULL;
1123         return;
1124     }
1125
1126     for( i = 0; i < 255; i++ )
1127     {
1128 #define es_descr p_iod->es_descr[i]
1129         if( es_descr.b_ok )
1130         {
1131             if( es_descr.psz_url )
1132             {
1133                 free( es_descr.psz_url );
1134                 es_descr.psz_url = NULL;
1135             }
1136             else
1137             {
1138                 if( es_descr.dec_descr.p_decoder_specific_info != NULL )
1139                 {
1140                     free( es_descr.dec_descr.p_decoder_specific_info );
1141                     es_descr.dec_descr.p_decoder_specific_info = NULL;
1142                     es_descr.dec_descr.i_decoder_specific_info_len = 0;
1143                 }
1144             }
1145         }
1146         es_descr.b_ok = 0;
1147 #undef  es_descr
1148     }
1149 }
1150
1151 /*****************************************************************************
1152  * HandlePAT: will treat a PAT returned by dvbpsi
1153  *****************************************************************************/
1154 static void TS_DVBPSI_HandlePAT( input_thread_t * p_input,
1155                                  dvbpsi_pat_t * p_new_pat )
1156 {
1157     dvbpsi_pat_program_t *      p_pgrm;
1158     pgrm_descriptor_t *         p_new_pgrm;
1159     pgrm_ts_data_t *            p_pgrm_demux;
1160     es_descriptor_t *           p_current_es;
1161     es_ts_data_t *              p_es_demux;
1162     stream_ts_data_t *          p_stream_data;
1163
1164     vlc_mutex_lock( &p_input->stream.stream_lock );
1165
1166     p_stream_data = (stream_ts_data_t *)p_input->stream.p_demux_data;
1167
1168     if ( ( p_new_pat->b_current_next && ( p_new_pat->i_version != p_stream_data->i_pat_version ) ) ||
1169             p_stream_data->i_pat_version == PAT_UNINITIALIZED  )
1170     {
1171         /* Delete all programs */
1172         while( p_input->stream.i_pgrm_number )
1173         {
1174             pgrm_ts_data_t *p_pgrm_demux_old =
1175                 (pgrm_ts_data_t *)p_input->stream.pp_programs[0]->p_demux_data;
1176
1177             if( p_pgrm_demux_old->b_mpeg4 )
1178             {
1179                 MP4_IODClean( &p_pgrm_demux_old->iod );
1180             }
1181
1182             input_DelProgram( p_input, p_input->stream.pp_programs[0] );
1183         }
1184
1185         /* treat the new programs list */
1186         p_pgrm = p_new_pat->p_first_program;
1187
1188         while( p_pgrm )
1189         {
1190             /* If program = 0, we're having info about NIT not PMT */
1191             if( p_pgrm->i_number )
1192             {
1193                 /* Add this program */
1194                 p_new_pgrm = input_AddProgram( p_input, p_pgrm->i_number,
1195                                             sizeof( pgrm_ts_data_t ) );
1196
1197                 p_pgrm_demux = (pgrm_ts_data_t *)p_new_pgrm->p_demux_data;
1198                 p_pgrm_demux->i_pmt_version = PMT_UNINITIALIZED;
1199
1200                 /* Add the PMT ES to this program */
1201                 p_current_es = input_AddES( p_input, p_new_pgrm,
1202                                             (u16) p_pgrm->i_pid,
1203                                             sizeof( es_ts_data_t) );
1204                 p_es_demux = (es_ts_data_t *)p_current_es->p_demux_data;
1205                 p_es_demux->b_psi = 1;
1206                 p_es_demux->i_psi_type = PSI_IS_PMT;
1207
1208                 p_es_demux->p_psi_section = malloc( sizeof( psi_section_t ) );
1209                 if ( p_es_demux->p_psi_section == NULL )
1210                 {
1211                     msg_Err( p_input, "out of memory" );
1212                     p_input->b_error = 1;
1213                     return;
1214                 }
1215
1216                 p_es_demux->p_psi_section->b_is_complete = 0;
1217                 p_es_demux->i_continuity_counter = 0xFF;
1218
1219                 /* Create a PMT decoder */
1220                 p_pgrm_demux->p_pmt_handle = (dvbpsi_handle *)
1221                     dvbpsi_AttachPMT( p_pgrm->i_number,
1222                             (dvbpsi_pmt_callback) &TS_DVBPSI_HandlePMT,
1223                             p_input );
1224
1225                 if( p_pgrm_demux->p_pmt_handle == NULL )
1226                 {
1227                     msg_Err( p_input, "could not create PMT decoder" );
1228                     p_input->b_error = 1;
1229                     return;
1230                 }
1231
1232             }
1233             p_pgrm = p_pgrm->p_next;
1234         }
1235
1236         p_stream_data->i_pat_version = p_new_pat->i_version;
1237     }
1238     vlc_mutex_unlock( &p_input->stream.stream_lock );
1239 }
1240
1241
1242 /*****************************************************************************
1243  * HandlePMT: will treat a PMT returned by dvbpsi
1244  *****************************************************************************/
1245 static void TS_DVBPSI_HandlePMT( input_thread_t * p_input,
1246                                  dvbpsi_pmt_t * p_new_pmt )
1247 {
1248     dvbpsi_pmt_es_t *       p_es;
1249     pgrm_descriptor_t *     p_pgrm;
1250     es_descriptor_t *       p_new_es;
1251     pgrm_ts_data_t *        p_pgrm_demux;
1252     vlc_bool_t b_vls_compat = config_GetInt( p_input, "vls-backwards-compat" );
1253
1254     vlc_mutex_lock( &p_input->stream.stream_lock );
1255
1256     p_pgrm = input_FindProgram( p_input, p_new_pmt->i_program_number );
1257
1258     if( p_pgrm == NULL )
1259     {
1260         msg_Warn( p_input, "PMT of unreferenced program found" );
1261         return;
1262     }
1263
1264     p_pgrm_demux = (pgrm_ts_data_t *)p_pgrm->p_demux_data;
1265     p_pgrm_demux->i_pcr_pid = p_new_pmt->i_pcr_pid;
1266
1267     if( ( p_new_pmt->b_current_next && ( p_new_pmt->i_version != p_pgrm_demux->i_pmt_version ) ) ||
1268             p_pgrm_demux->i_pmt_version == PMT_UNINITIALIZED )
1269     {
1270         dvbpsi_descriptor_t *p_dr = p_new_pmt->p_first_descriptor;
1271         /* IOD */
1272         while( p_dr && ( p_dr->i_tag != 0x1d ) )
1273             p_dr = p_dr->p_next;
1274         if( p_dr)
1275         {
1276             msg_Warn( p_input, "found IOD descriptor" );
1277             MP4_IODParse( &p_pgrm_demux->iod, p_dr->i_length, p_dr->p_data );
1278         }
1279
1280         p_es = p_new_pmt->p_first_es;
1281         while( p_es )
1282         {
1283             /* Add this ES */
1284             p_new_es = input_AddES( p_input, p_pgrm,
1285                             (u16)p_es->i_pid, sizeof( es_ts_data_t ) );
1286             if( p_new_es == NULL )
1287             {
1288                 msg_Err( p_input, "could not add ES %d", p_es->i_pid );
1289                 p_input->b_error = 1;
1290                 return;
1291             }
1292             ((es_ts_data_t *)p_new_es->p_demux_data)->i_continuity_counter = 0xFF;
1293
1294             switch( p_es->i_type )
1295             {
1296                 case MPEG1_VIDEO_ES:
1297                 case MPEG2_VIDEO_ES:
1298                     p_new_es->i_fourcc = VLC_FOURCC('m','p','g','v');
1299                     p_new_es->i_cat = VIDEO_ES;
1300                     break;
1301                 case MPEG1_AUDIO_ES:
1302                 case MPEG2_AUDIO_ES:
1303                     p_new_es->i_fourcc = VLC_FOURCC('m','p','g','a');
1304                     p_new_es->i_cat = AUDIO_ES;
1305                     break;
1306                 case A52_AUDIO_ES:
1307                 case A52DVB_AUDIO_ES:
1308                     if ( !b_vls_compat )
1309                         p_new_es->i_fourcc = VLC_FOURCC('a','5','2',' ');
1310                     else
1311                         p_new_es->i_fourcc = VLC_FOURCC('a','5','2','b');
1312                     p_new_es->i_cat = AUDIO_ES;
1313                     p_new_es->i_stream_id = 0xBD;
1314                     break;
1315                 case DVD_SPU_ES:
1316                     if ( !b_vls_compat )
1317                         p_new_es->i_fourcc = VLC_FOURCC('s','p','u',' ');
1318                     else
1319                         p_new_es->i_fourcc = VLC_FOURCC('s','p','u','b');
1320                     p_new_es->i_cat = SPU_ES;
1321                     p_new_es->i_stream_id = 0xBD;
1322                     break;
1323                 case LPCM_AUDIO_ES:
1324                     p_new_es->i_fourcc = VLC_FOURCC('l','p','c','m');
1325                     p_new_es->i_cat = AUDIO_ES;
1326                     p_new_es->i_stream_id = 0xBD;
1327                     break;
1328                 case SDDS_AUDIO_ES:
1329                     p_new_es->i_fourcc = VLC_FOURCC('s','d','d','s');
1330                     p_new_es->i_stream_id = 0xBD;
1331                     p_new_es->i_cat = AUDIO_ES;
1332                     break;
1333                 case DTS_AUDIO_ES:
1334                     p_new_es->i_fourcc = VLC_FOURCC('d','t','s',' ');
1335                     p_new_es->i_stream_id = 0xBD;
1336                     p_new_es->i_cat = AUDIO_ES;
1337                     break;
1338                 case A52B_AUDIO_ES:
1339                     p_new_es->i_fourcc = VLC_FOURCC('a','5','2','b');
1340                     p_new_es->i_cat = AUDIO_ES;
1341                     p_new_es->i_stream_id = 0xBD;
1342                     break;
1343                 case DVDB_SPU_ES:
1344                     p_new_es->i_fourcc = VLC_FOURCC('s','p','u','b');
1345                     p_new_es->i_cat = SPU_ES;
1346                     p_new_es->i_stream_id = 0xBD;
1347                     break;
1348                 case LPCMB_AUDIO_ES:
1349                     p_new_es->i_fourcc = VLC_FOURCC('l','p','c','b');
1350                     p_new_es->i_cat = AUDIO_ES;
1351                     p_new_es->i_stream_id = 0xBD;
1352                     break;
1353                 case MPEG4_VIDEO_ES:
1354                     p_new_es->i_fourcc = VLC_FOURCC('m','p','4','v');
1355                     p_new_es->i_cat = VIDEO_ES;
1356                     p_new_es->i_stream_id = 0xfa;
1357                     break;
1358                 case MPEG4_AUDIO_ES:
1359                     p_new_es->i_fourcc = VLC_FOURCC('m','p','4','a');
1360                     p_new_es->i_cat = AUDIO_ES;
1361                     p_new_es->i_stream_id = 0xfa;
1362                     break;
1363                 case MSCODEC_VIDEO_ES:
1364                     p_new_es->i_fourcc = VLC_FOURCC(0,0,0,0);   // fixed later
1365                     p_new_es->i_cat = VIDEO_ES;
1366                     p_new_es->i_stream_id = 0xa0;
1367                     break;
1368                 default:
1369                     p_new_es->i_fourcc = 0;
1370                     p_new_es->i_cat = UNKNOWN_ES;
1371             }
1372
1373             if( p_es->i_type == MPEG4_VIDEO_ES || p_es->i_type == MPEG4_AUDIO_ES )
1374             {
1375                 /* mpeg4 stream, search sl_descriptor */
1376                 dvbpsi_descriptor_t *p_dr = p_es->p_first_descriptor;
1377                 es_ts_data_t        *p_es_demux =
1378                                         (es_ts_data_t*)p_new_es->p_demux_data;
1379
1380                 while( p_dr && ( p_dr->i_tag != 0x1f ) )
1381                     p_dr = p_dr->p_next;
1382                 if( p_dr && p_dr->i_length == 2 )
1383                 {
1384                     int i_es_descr_index;
1385
1386                     p_es_demux->i_es_id =
1387                         ( p_dr->p_data[0] << 8 ) | p_dr->p_data[1];
1388                     p_es_demux->p_es_descr = NULL;
1389
1390                     msg_Warn( p_input, "found SL_descriptor" );
1391                     for( i_es_descr_index = 0; i_es_descr_index < 255; i_es_descr_index++ )
1392                     {
1393                         if( p_pgrm_demux->iod.es_descr[i_es_descr_index].b_ok &&
1394                             p_pgrm_demux->iod.es_descr[i_es_descr_index].i_es_id == p_es_demux->i_es_id )
1395                         {
1396                             p_es_demux->p_es_descr = &p_pgrm_demux->iod.es_descr[i_es_descr_index];
1397                             break;
1398                         }
1399                     }
1400                 }
1401                 if( p_es_demux->p_es_descr != NULL )
1402                 {
1403                     vlc_fourcc_t i_fourcc;
1404                     int          i_cat;
1405                     p_es_demux->b_mpeg4 = 1;
1406
1407                     /* fix fourcc */
1408                     switch( p_es_demux->p_es_descr->dec_descr.i_streamType )
1409                     {
1410                         case 0x04:  /* VisualStream */
1411                             i_cat = VIDEO_ES;
1412                             switch( p_es_demux->p_es_descr->dec_descr.i_objectTypeIndication )
1413                             {
1414                                 case 0x20:
1415                                     i_fourcc = VLC_FOURCC('m','p','4','v');     // mpeg4
1416                                     break;
1417                                 case 0x60:
1418                                 case 0x61:
1419                                 case 0x62:
1420                                 case 0x63:
1421                                 case 0x64:
1422                                 case 0x65:
1423                                     i_fourcc = VLC_FOURCC( 'm','p','g','v' );   // mpeg2
1424                                     break;
1425                                 case 0x6a:
1426                                     i_fourcc = VLC_FOURCC( 'm','p','g','v' );   // mpeg1
1427                                     break;
1428                                 case 0x6c:
1429                                     i_fourcc = VLC_FOURCC( 'j','p','e','g' );   // mpeg1
1430                                     break;
1431                                 default:
1432                                     i_fourcc = 0;
1433                                     break;
1434                             }
1435                             break;
1436                         case 0x05:  /* AudioStream */
1437                             i_cat = AUDIO_ES;
1438                             switch( p_es_demux->p_es_descr->dec_descr.i_objectTypeIndication )
1439                             {
1440                                 case 0x40:
1441                                     i_fourcc = VLC_FOURCC('m','p','4','a');     // mpeg4
1442                                     break;
1443                                 case 0x66:
1444                                 case 0x67:
1445                                 case 0x68:
1446                                     i_fourcc = VLC_FOURCC('m','p','4','a');     // mpeg2 aac
1447                                     break;
1448                                 case 0x69:
1449                                     i_fourcc = VLC_FOURCC('m','p','g','a');     // mpeg2
1450                                     break;
1451                                 case 0x6b:
1452                                     i_fourcc = VLC_FOURCC('m','p','g','a');     // mpeg1
1453                                     break;
1454                                 default:
1455                                     i_fourcc = 0;
1456                                     break;
1457                             }
1458                             break;
1459                         default:
1460                             i_cat = UNKNOWN_ES;
1461                             i_fourcc = 0;
1462                             break;
1463                     }
1464
1465                     p_new_es->i_fourcc = i_fourcc;
1466                     p_new_es->i_cat    = i_cat;
1467                     switch( i_cat )
1468                     {
1469                         case VIDEO_ES:
1470                             {
1471                                 int i_size;
1472                                 BITMAPINFOHEADER *p_bih;
1473
1474                                 i_size = sizeof( BITMAPINFOHEADER ) +
1475                                                  p_es_demux->p_es_descr->dec_descr.i_decoder_specific_info_len;
1476                                 p_new_es->p_bitmapinfoheader = (void*)p_bih = malloc( i_size );
1477                                 p_bih->biSize = i_size;
1478                                 p_bih->biWidth = 0;
1479                                 p_bih->biHeight = 0;
1480                                 p_bih->biPlanes = 1;
1481                                 p_bih->biBitCount = 0;
1482                                 p_bih->biCompression = 0;
1483                                 p_bih->biSizeImage = 0;
1484                                 p_bih->biXPelsPerMeter = 0;
1485                                 p_bih->biYPelsPerMeter = 0;
1486                                 p_bih->biClrUsed = 0;
1487                                 p_bih->biClrImportant = 0;
1488                                 memcpy( &p_bih[1],
1489                                         p_es_demux->p_es_descr->dec_descr.p_decoder_specific_info,
1490                                         p_es_demux->p_es_descr->dec_descr.i_decoder_specific_info_len );
1491                             }
1492                             break;
1493                         case AUDIO_ES:
1494                             {
1495                                 int i_size;
1496                                 WAVEFORMATEX *p_wf;
1497
1498                                 i_size = sizeof( WAVEFORMATEX ) +
1499                                                  p_es_demux->p_es_descr->dec_descr.i_decoder_specific_info_len;
1500                                 p_new_es->p_waveformatex = (void*)p_wf = malloc( i_size );
1501                                 p_wf->wFormatTag = 0xffff;
1502                                 p_wf->nChannels = 0;
1503                                 p_wf->nSamplesPerSec = 0;
1504                                 p_wf->nAvgBytesPerSec = 0;
1505                                 p_wf->nBlockAlign = 1;
1506                                 p_wf->wBitsPerSample = 0;
1507                                 p_wf->cbSize = p_es_demux->p_es_descr->dec_descr.i_decoder_specific_info_len;
1508                                 memcpy( &p_wf[1],
1509                                         p_es_demux->p_es_descr->dec_descr.p_decoder_specific_info,
1510                                         p_es_demux->p_es_descr->dec_descr.i_decoder_specific_info_len );
1511                             }
1512                             break;
1513                         default:
1514                             break;
1515                     }
1516                 }
1517                 else
1518                 {
1519                     msg_Warn( p_input, "mpeg4 stream without (valid) sl_descriptor" );
1520                     p_es_demux->b_mpeg4 = 0;
1521                 }
1522
1523             }
1524             else if( p_es->i_type == MSCODEC_VIDEO_ES )
1525             {
1526                 /* crapy ms codec stream, search private descriptor */
1527                 dvbpsi_descriptor_t *p_dr = p_es->p_first_descriptor;
1528                 es_ts_data_t        *p_es_demux =
1529                                         (es_ts_data_t*)p_new_es->p_demux_data;
1530
1531                 while( p_dr && ( p_dr->i_tag != 0xa0 ) )
1532                     p_dr = p_dr->p_next;
1533                 if( p_dr && p_dr->i_length >= 8 )
1534                 {
1535                     int i_size;
1536                     int i_bih_size;
1537                     BITMAPINFOHEADER *p_bih;
1538
1539                     p_new_es->i_fourcc = ( p_dr->p_data[0] << 24 )| ( p_dr->p_data[1] << 16 )|
1540                                          ( p_dr->p_data[2] <<  8 )| ( p_dr->p_data[3] );
1541
1542                     i_bih_size = ( ( p_dr->p_data[8] << 8)|( p_dr->p_data[9] ) );
1543                     i_size = sizeof( BITMAPINFOHEADER ) + i_bih_size;
1544
1545                     p_new_es->p_bitmapinfoheader = (void*)p_bih = malloc( i_size );
1546                     p_bih->biSize = i_size;
1547                     p_bih->biWidth = ( p_dr->p_data[4] << 8 )|p_dr->p_data[5];
1548                     p_bih->biHeight = ( p_dr->p_data[6] << 8 )|p_dr->p_data[7];
1549                     p_bih->biPlanes = 1;
1550                     p_bih->biBitCount = 0;
1551                     p_bih->biCompression = 0;
1552                     p_bih->biSizeImage = 0;
1553                     p_bih->biXPelsPerMeter = 0;
1554                     p_bih->biYPelsPerMeter = 0;
1555                     p_bih->biClrUsed = 0;
1556                     p_bih->biClrImportant = 0;
1557                     memcpy( &p_bih[1],
1558                             &p_dr->p_data[10],
1559                             i_bih_size );
1560                 }
1561                 else
1562                 {
1563                     msg_Warn( p_input, "private ms-codec stream without bih private sl_descriptor" );
1564                     p_new_es->i_fourcc = 0;
1565                     p_new_es->i_cat = UNKNOWN_ES;
1566                 }
1567             }
1568
1569             if(    ( p_new_es->i_cat == AUDIO_ES )
1570                 || (p_new_es->i_cat == SPU_ES ) )
1571             {
1572                 dvbpsi_descriptor_t *p_dr = p_es->p_first_descriptor;
1573                 while( p_dr && ( p_dr->i_tag != 0x0a ) )
1574                     p_dr = p_dr->p_next;
1575                 if( p_dr )
1576                 {
1577                     dvbpsi_iso639_dr_t *p_decoded =
1578                                                 dvbpsi_DecodeISO639Dr( p_dr );
1579                     if( p_decoded->i_code_count > 0 )
1580                     {
1581                         const iso639_lang_t * p_iso;
1582                         p_iso = GetLang_2T((char*)p_decoded->i_iso_639_code);
1583                         if(p_iso)
1584                         {
1585                             if(p_iso->psz_native_name[0])
1586                                 strcpy( p_new_es->psz_desc,
1587                                         p_iso->psz_native_name );
1588                             else
1589                                 strcpy( p_new_es->psz_desc,
1590                                         p_iso->psz_eng_name );
1591                         }
1592                         else
1593                         {
1594                             strncpy( p_new_es->psz_desc,
1595                                      p_decoded->i_iso_639_code, 3 );
1596                         }
1597                     }
1598                 }
1599                 switch( p_es->i_type )
1600                 {
1601                     case MPEG1_AUDIO_ES:
1602                     case MPEG2_AUDIO_ES:
1603                         strcat( p_new_es->psz_desc, " (mpeg)" );
1604                         break;
1605                     case LPCM_AUDIO_ES:
1606                     case LPCMB_AUDIO_ES:
1607                         strcat( p_new_es->psz_desc, " (lpcm)" );
1608                         break;
1609                     case A52_AUDIO_ES:
1610                     case A52DVB_AUDIO_ES:
1611                     case A52B_AUDIO_ES:
1612                         strcat( p_new_es->psz_desc, " (A52)" );
1613                         break;
1614                     case MPEG4_AUDIO_ES:
1615                         strcat( p_new_es->psz_desc, " (aac)" );
1616                         break;
1617                 }
1618             }
1619
1620             p_es = p_es->p_next;
1621         }
1622
1623         /* if no program is selected :*/
1624         if( !p_input->stream.p_selected_program )
1625         {
1626             pgrm_descriptor_t *     p_pgrm_to_select;
1627             u16 i_id = (u16)config_GetInt( p_input, "program" );
1628
1629             if( i_id != 0 ) /* if user specified a program */
1630             {
1631                 p_pgrm_to_select = input_FindProgram( p_input, i_id );
1632
1633                 if( p_pgrm_to_select && p_pgrm_to_select == p_pgrm )
1634                     p_input->pf_set_program( p_input, p_pgrm_to_select );
1635             }
1636             else
1637                     p_input->pf_set_program( p_input, p_pgrm );
1638         }
1639         /* if the pmt belongs to the currently selected program, we
1640          * reselect it to update its ES */
1641         else if( p_pgrm == p_input->stream.p_selected_program )
1642         {
1643             p_input->pf_set_program( p_input, p_pgrm );
1644         }
1645
1646         p_pgrm_demux->i_pmt_version = p_new_pmt->i_version;
1647         p_input->stream.b_changed = 1;
1648     }
1649     vlc_mutex_unlock( &p_input->stream.stream_lock );
1650 }
1651 #endif