1 /*****************************************************************************
2 * ts.c: Transport Stream input module for VLC.
3 *****************************************************************************
4 * Copyright (C) 2004-2005 the VideoLAN team
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Jean-Paul Saman <jpsaman #_at_# m2x.nl>
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.
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.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
38 #include <vlc_access.h> /* DVB-specific things */
39 #include <vlc_demux.h>
43 #include <vlc_iso_lang.h>
44 #include <vlc_network.h>
45 #include <vlc_charset.h>
47 #include "../mux/mpeg/csa.h"
49 /* Include dvbpsi headers */
50 #ifdef HAVE_DVBPSI_DR_H
51 # include <dvbpsi/dvbpsi.h>
52 # include <dvbpsi/demux.h>
53 # include <dvbpsi/descriptor.h>
54 # include <dvbpsi/pat.h>
55 # include <dvbpsi/pmt.h>
56 # include <dvbpsi/sdt.h>
57 # include <dvbpsi/dr.h>
58 # include <dvbpsi/psi.h>
62 # include "descriptor.h"
63 # include "tables/pat.h"
64 # include "tables/pmt.h"
65 # include "tables/sdt.h"
66 # include "descriptors/dr.h"
71 #ifdef _DVBPSI_DR_4D_H_
72 # define TS_USE_DVB_SI 1
73 # ifdef HAVE_DVBPSI_DR_H
74 # include <dvbpsi/eit.h>
76 # include "tables/eit.h"
85 * - XXX: do not mark options message to be translated, they are too osbcure for now ...
90 /*****************************************************************************
92 *****************************************************************************/
93 static int ChangeKeyCallback ( vlc_object_t
*, char const *, vlc_value_t
, vlc_value_t
, void * );
95 /*****************************************************************************
97 *****************************************************************************/
98 static int Open ( vlc_object_t
* );
99 static void Close ( vlc_object_t
* );
102 * - Rename "extra pmt" to "user pmt"
103 * - Update extra pmt description
104 * pmt_pid[:pmt_number][=pid_description[,pid_description]]
105 * where pid_description could take 3 forms:
106 * 1. pid:pcr (to force the pcr pid)
108 * 3. pid:type=fourcc where type=(video|audio|spu)
110 #define PMT_TEXT N_("Extra PMT")
111 #define PMT_LONGTEXT N_( \
112 "Allows a user to specify an extra pmt (pmt_pid=pid:stream_type[,...])." )
114 #define PID_TEXT N_("Set id of ES to PID")
115 #define PID_LONGTEXT N_("Set the internal ID of each elementary stream" \
116 " handled by VLC to the same value as the PID in" \
117 " the TS stream, instead of 1, 2, 3, etc. Useful to" \
118 " do \'#duplicate{..., select=\"es=<pid>\"}\'.")
120 #define TSOUT_TEXT N_("Fast udp streaming")
121 #define TSOUT_LONGTEXT N_( \
122 "Sends TS to specific ip:port by udp (you must know what you are doing).")
124 #define MTUOUT_TEXT N_("MTU for out mode")
125 #define MTUOUT_LONGTEXT N_("MTU for out mode.")
127 #define CSA_TEXT N_("CSA ck")
128 #define CSA_LONGTEXT N_("Control word for the CSA encryption algorithm")
130 #define CSA2_TEXT N_("Second CSA Key")
131 #define CSA2_LONGTEXT N_("The even CSA encryption key. This must be a " \
132 "16 char string (8 hexadecimal bytes).")
134 #define SILENT_TEXT N_("Silent mode")
135 #define SILENT_LONGTEXT N_("Do not complain on encrypted PES.")
137 #define CAPMT_SYSID_TEXT N_("CAPMT System ID")
138 #define CAPMT_SYSID_LONGTEXT N_("Only forward descriptors from this SysID to the CAM.")
140 #define CPKT_TEXT N_("Packet size in bytes to decrypt")
141 #define CPKT_LONGTEXT N_("Specify the size of the TS packet to decrypt. " \
142 "The decryption routines subtract the TS-header from the value before " \
145 #define TSDUMP_TEXT N_("Filename of dump")
146 #define TSDUMP_LONGTEXT N_("Specify a filename where to dump the TS in.")
148 #define APPEND_TEXT N_("Append")
149 #define APPEND_LONGTEXT N_( \
150 "If the file exists and this option is selected, the existing file " \
151 "will not be overwritten." )
153 #define DUMPSIZE_TEXT N_("Dump buffer size")
154 #define DUMPSIZE_LONGTEXT N_( \
155 "Tweak the buffer size for reading and writing an integer number of packets." \
156 "Specify the size of the buffer here and not the number of packets." )
159 set_description( N_("MPEG Transport Stream demuxer") );
160 set_shortname ( "MPEG-TS" );
161 set_category( CAT_INPUT
);
162 set_subcategory( SUBCAT_INPUT_DEMUX
);
164 add_string( "ts-extra-pmt", NULL
, NULL
, PMT_TEXT
, PMT_LONGTEXT
, true );
165 add_bool( "ts-es-id-pid", 1, NULL
, PID_TEXT
, PID_LONGTEXT
, true );
166 add_string( "ts-out", NULL
, NULL
, TSOUT_TEXT
, TSOUT_LONGTEXT
, true );
167 add_integer( "ts-out-mtu", 1400, NULL
, MTUOUT_TEXT
,
168 MTUOUT_LONGTEXT
, true );
169 add_string( "ts-csa-ck", NULL
, NULL
, CSA_TEXT
, CSA_LONGTEXT
, true );
170 add_string( "ts-csa2-ck", NULL
, NULL
, CSA_TEXT
, CSA_LONGTEXT
, true );
171 add_integer( "ts-csa-pkt", 188, NULL
, CPKT_TEXT
, CPKT_LONGTEXT
, true );
172 add_bool( "ts-silent", 0, NULL
, SILENT_TEXT
, SILENT_LONGTEXT
, true );
174 add_file( "ts-dump-file", NULL
, NULL
, TSDUMP_TEXT
, TSDUMP_LONGTEXT
, false );
175 add_bool( "ts-dump-append", 0, NULL
, APPEND_TEXT
, APPEND_LONGTEXT
, false );
176 add_integer( "ts-dump-size", 16384, NULL
, DUMPSIZE_TEXT
,
177 DUMPSIZE_LONGTEXT
, true );
179 set_capability( "demux", 10 );
180 set_callbacks( Open
, Close
);
181 add_shortcut( "ts" );
184 /*****************************************************************************
186 *****************************************************************************/
187 static const char *const ppsz_teletext_type
[] = {
190 N_("Teletext subtitles"),
191 N_("Teletext: additional information"),
192 N_("Teletext: program schedule"),
193 N_("Teletext subtitles: hearing impaired")
198 uint8_t i_objectTypeIndication
;
199 uint8_t i_streamType
;
201 uint32_t i_bufferSizeDB
;
202 uint32_t i_maxBitrate
;
203 uint32_t i_avgBitrate
;
205 int i_decoder_specific_info_len
;
206 uint8_t *p_decoder_specific_info
;
208 } decoder_config_descriptor_t
;
212 bool b_useAccessUnitStartFlag
;
213 bool b_useAccessUnitEndFlag
;
214 bool b_useRandomAccessPointFlag
;
215 bool b_useRandomAccessUnitsOnlyFlag
;
216 bool b_usePaddingFlag
;
217 bool b_useTimeStampsFlags
;
220 uint32_t i_timeStampResolution
;
221 uint32_t i_OCRResolution
;
222 uint8_t i_timeStampLength
;
225 uint8_t i_instantBitrateLength
;
226 uint8_t i_degradationPriorityLength
;
227 uint8_t i_AU_seqNumLength
;
228 uint8_t i_packetSeqNumLength
;
230 uint32_t i_timeScale
;
231 uint16_t i_accessUnitDuration
;
232 uint16_t i_compositionUnitDuration
;
234 uint64_t i_startDecodingTimeStamp
;
235 uint64_t i_startCompositionTimeStamp
;
237 } sl_config_descriptor_t
;
244 bool b_streamDependenceFlag
;
245 bool b_OCRStreamFlag
;
246 uint8_t i_streamPriority
;
250 uint16_t i_dependOn_es_id
;
251 uint16_t i_OCR_es_id
;
253 decoder_config_descriptor_t dec_descr
;
254 sl_config_descriptor_t sl_descr
;
256 } es_mpeg4_descriptor_t
;
260 uint8_t i_iod_label
, i_iod_label_scope
;
266 uint8_t i_ODProfileLevelIndication
;
267 uint8_t i_sceneProfileLevelIndication
;
268 uint8_t i_audioProfileLevelIndication
;
269 uint8_t i_visualProfileLevelIndication
;
270 uint8_t i_graphicsProfileLevelIndication
;
272 es_mpeg4_descriptor_t es_descr
[255];
278 dvbpsi_handle handle
;
284 /* IOD stuff (mpeg4) */
285 iod_descriptor_t
*iod
;
291 /* for special PAT/SDT case */
292 dvbpsi_handle handle
; /* PAT/SDT/EIT */
311 es_mpeg4_descriptor_t
*p_mpeg4desc
;
322 int i_cc
; /* countinuity counter */
324 /* PSI owner (ie PMT -> PAT, ES -> PMT */
332 /* Some private streams encapsulate several ES (eg. DVB subtitles)*/
340 vlc_mutex_t csa_lock
;
342 /* TS packet size (188, 192, 204) */
345 /* how many TS packet we read at once */
363 int fd
; /* udp socket */
369 int64_t i_dvb_length
;
370 vlc_list_t
*p_programs_list
;
373 char *psz_file
; /* file to dump data in */
374 FILE *p_file
; /* filehandle */
375 uint64_t i_write
; /* bytes written */
376 bool b_file_out
; /* dump mode enabled */
385 static int Demux ( demux_t
*p_demux
);
386 static int DemuxFile( demux_t
*p_demux
);
387 static int Control( demux_t
*p_demux
, int i_query
, va_list args
);
389 static void PIDInit ( ts_pid_t
*pid
, bool b_psi
, ts_psi_t
*p_owner
);
390 static void PIDClean( es_out_t
*out
, ts_pid_t
*pid
);
391 static int PIDFillFormat( ts_pid_t
*pid
, int i_stream_type
);
393 static void PATCallBack( demux_t
*, dvbpsi_pat_t
* );
394 static void PMTCallBack( demux_t
*p_demux
, dvbpsi_pmt_t
*p_pmt
);
396 static void PSINewTableCallBack( demux_t
*, dvbpsi_handle
,
397 uint8_t i_table_id
, uint16_t i_extension
);
400 static inline int PIDGet( block_t
*p
)
402 return ( (p
->p_buffer
[1]&0x1f)<<8 )|p
->p_buffer
[2];
405 static bool GatherPES( demux_t
*p_demux
, ts_pid_t
*pid
, block_t
*p_bk
);
407 static void PCRHandle( demux_t
*p_demux
, ts_pid_t
*, block_t
* );
409 static iod_descriptor_t
*IODNew( int , uint8_t * );
410 static void IODFree( iod_descriptor_t
* );
412 #define TS_USER_PMT_NUMBER (0)
413 static int UserPmt( demux_t
*p_demux
, const char * );
415 #define TS_PACKET_SIZE_188 188
416 #define TS_PACKET_SIZE_192 192
417 #define TS_PACKET_SIZE_204 204
418 #define TS_PACKET_SIZE_MAX 204
419 #define TS_TOPFIELD_HEADER 1320
421 /*****************************************************************************
423 *****************************************************************************/
424 static int Open( vlc_object_t
*p_this
)
426 demux_t
*p_demux
= (demux_t
*)p_this
;
429 const uint8_t *p_peek
;
430 int i_sync
, i_peek
, i
;
434 const char *psz_mode
;
436 bool b_topfield
= false;
440 if( stream_Peek( p_demux
->s
, &p_peek
, TS_PACKET_SIZE_MAX
) <
441 TS_PACKET_SIZE_MAX
) return VLC_EGENERIC
;
443 if( memcmp( p_peek
, "TFrc", 4 ) == 0 )
446 msg_Dbg( p_demux
, "this is a topfield file" );
449 /* Search first sync byte */
450 for( i_sync
= 0; i_sync
< TS_PACKET_SIZE_MAX
; i_sync
++ )
452 if( p_peek
[i_sync
] == 0x47 ) break;
454 if( i_sync
>= TS_PACKET_SIZE_MAX
&& !b_topfield
)
456 if( !p_demux
->b_force
)
458 msg_Warn( p_demux
, "this does not look like a TS stream, continuing" );
463 /* Read the entire Topfield header */
464 i_peek
= TS_TOPFIELD_HEADER
;
468 /* Check next 3 sync bytes */
469 i_peek
= TS_PACKET_SIZE_MAX
* 3 + i_sync
+ 1;
472 if( ( stream_Peek( p_demux
->s
, &p_peek
, i_peek
) ) < i_peek
)
474 msg_Err( p_demux
, "cannot peek" );
477 if( p_peek
[i_sync
+ TS_PACKET_SIZE_188
] == 0x47 &&
478 p_peek
[i_sync
+ 2 * TS_PACKET_SIZE_188
] == 0x47 &&
479 p_peek
[i_sync
+ 3 * TS_PACKET_SIZE_188
] == 0x47 )
481 i_packet_size
= TS_PACKET_SIZE_188
;
483 else if( p_peek
[i_sync
+ TS_PACKET_SIZE_192
] == 0x47 &&
484 p_peek
[i_sync
+ 2 * TS_PACKET_SIZE_192
] == 0x47 &&
485 p_peek
[i_sync
+ 3 * TS_PACKET_SIZE_192
] == 0x47 )
487 i_packet_size
= TS_PACKET_SIZE_192
;
489 else if( p_peek
[i_sync
+ TS_PACKET_SIZE_204
] == 0x47 &&
490 p_peek
[i_sync
+ 2 * TS_PACKET_SIZE_204
] == 0x47 &&
491 p_peek
[i_sync
+ 3 * TS_PACKET_SIZE_204
] == 0x47 )
493 i_packet_size
= TS_PACKET_SIZE_204
;
495 else if( p_demux
->b_force
)
497 i_packet_size
= TS_PACKET_SIZE_188
;
499 else if( b_topfield
)
501 i_packet_size
= TS_PACKET_SIZE_188
;
503 /* I used the TF5000PVR 2004 Firmware .doc header documentation,
504 * http://www.i-topfield.com/data/product/firmware/Structure%20of%20Recorded%20File%20in%20TF5000PVR%20(Feb%2021%202004).doc
505 * but after the filename the offsets seem to be incorrect. - DJ */
506 int i_duration
, i_name
;
507 char *psz_name
= malloc(25);
508 char *psz_event_name
;
509 char *psz_event_text
= malloc(130);
510 char *psz_ext_text
= malloc(1025);
512 // 2 bytes version Uimsbf (4,5)
513 // 2 bytes reserved (6,7)
514 // 2 bytes duration in minutes Uimsbf (8,9(
515 i_duration
= (int) (p_peek
[8] << 8) | p_peek
[9];
516 msg_Dbg( p_demux
, "Topfield recording length: +/- %d minutes", i_duration
);
517 // 2 bytes service number in channel list (10, 11)
518 // 2 bytes service type Bslbf 0=TV 1=Radio Bslb (12, 13)
519 // 4 bytes of reserved + tuner info (14,15,16,17)
520 // 2 bytes of Service ID Bslbf (18,19)
521 // 2 bytes of PMT PID Uimsbf (20,21)
522 // 2 bytes of PCR PID Uimsbf (22,23)
523 // 2 bytes of Video PID Uimsbf (24,25)
524 // 2 bytes of Audio PID Uimsbf (26,27)
525 // 24 bytes filename Bslbf
526 memcpy( psz_name
, &p_peek
[28], 24 );
528 msg_Dbg( p_demux
, "recordingname=%s", psz_name
);
529 // 1 byte of sat index Uimsbf (52)
530 // 3 bytes (1 bit of polarity Bslbf +23 bits reserved)
531 // 4 bytes of freq. Uimsbf (56,57,58,59)
532 // 2 bytes of symbol rate Uimsbf (60,61)
533 // 2 bytes of TS stream ID Uimsbf (62,63)
536 // 2 bytes duration Uimsbf (70,71)
537 //i_duration = (int) (p_peek[70] << 8) | p_peek[71];
538 //msg_Dbg( p_demux, "Topfield 2nd duration field: +/- %d minutes", i_duration);
539 // 4 bytes EventID Uimsbf (72-75)
540 // 8 bytes of Start and End time info (76-83)
541 // 1 byte reserved (84)
542 // 1 byte event name length Uimsbf (89)
543 i_name
= (int)(p_peek
[89]&~0x81);
544 msg_Dbg( p_demux
, "event name length = %d", i_name
);
545 psz_event_name
= malloc( i_name
+1 );
546 // 1 byte parental rating (90)
547 // 129 bytes of event text
548 memcpy( psz_event_name
, &p_peek
[91], i_name
);
549 psz_event_name
[i_name
] = '\0';
550 memcpy( psz_event_text
, &p_peek
[91+i_name
], 129-i_name
);
551 psz_event_text
[129-i_name
] = '\0';
552 msg_Dbg( p_demux
, "event name=%s", psz_event_name
);
553 msg_Dbg( p_demux
, "event text=%s", psz_event_text
);
554 // 12 bytes reserved (220)
556 // 2 bytes Event Text Length Uimsbf
557 // 4 bytes EventID Uimsbf
558 // FIXME We just have 613 bytes. not enough for this entire text
559 // 1024 bytes Extended Event Text Bslbf
560 memcpy( psz_ext_text
, p_peek
+372, 1024 );
561 psz_ext_text
[1024] = '\0';
562 msg_Dbg( p_demux
, "extended event text=%s", psz_ext_text
);
563 // 52 bytes reserved Bslbf
568 msg_Warn( p_demux
, "TS module discarded (lost sync)" );
572 p_demux
->p_sys
= p_sys
= malloc( sizeof( demux_sys_t
) );
575 memset( p_sys
, 0, sizeof( demux_sys_t
) );
576 p_sys
->i_packet_size
= i_packet_size
;
577 vlc_mutex_init( &p_sys
->csa_lock
);
579 /* Fill dump mode fields */
581 p_sys
->buffer
= NULL
;
582 p_sys
->p_file
= NULL
;
583 p_sys
->b_file_out
= false;
584 p_sys
->psz_file
= var_CreateGetString( p_demux
, "ts-dump-file" );
585 if( *p_sys
->psz_file
!= '\0' )
587 p_sys
->b_file_out
= true;
589 var_Create( p_demux
, "ts-dump-append", VLC_VAR_BOOL
|VLC_VAR_DOINHERIT
);
590 var_Get( p_demux
, "ts-dump-append", &val
);
591 b_append
= val
.b_bool
;
597 if( !strcmp( p_sys
->psz_file
, "-" ) )
599 msg_Info( p_demux
, "dumping raw stream to standard output" );
600 p_sys
->p_file
= stdout
;
602 else if( ( p_sys
->p_file
= utf8_fopen( p_sys
->psz_file
, psz_mode
) ) == NULL
)
604 msg_Err( p_demux
, "cannot create `%s' for writing", p_sys
->psz_file
);
605 p_sys
->b_file_out
= false;
608 if( p_sys
->b_file_out
)
612 /* Determine how many packets to read. */
613 var_Create( p_demux
, "ts-dump-size",
614 VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
615 var_Get( p_demux
, "ts-dump-size", &bufsize
);
616 p_sys
->i_ts_read
= (int) (bufsize
.i_int
/ p_sys
->i_packet_size
);
617 if( p_sys
->i_ts_read
<= 0 )
619 p_sys
->i_ts_read
= 1500 / p_sys
->i_packet_size
;
621 p_sys
->buffer
= malloc( p_sys
->i_packet_size
* p_sys
->i_ts_read
);
622 msg_Info( p_demux
, "%s raw stream to file `%s' reading packets %d",
623 b_append
? "appending" : "dumping", p_sys
->psz_file
,
628 /* Fill p_demux field */
629 if( p_sys
->b_file_out
)
630 p_demux
->pf_demux
= DemuxFile
;
632 p_demux
->pf_demux
= Demux
;
633 p_demux
->pf_control
= Control
;
635 /* Init p_sys field */
636 p_sys
->b_meta
= true;
637 p_sys
->b_dvb_control
= true;
638 p_sys
->i_dvb_program
= 0;
639 p_sys
->i_dvb_start
= 0;
640 p_sys
->i_dvb_length
= 0;
642 for( i
= 0; i
< 8192; i
++ )
644 ts_pid_t
*pid
= &p_sys
->pid
[i
];
648 pid
->b_valid
= false;
650 /* PID 8191 is padding */
651 p_sys
->pid
[8191].b_seen
= true;
652 p_sys
->i_packet_size
= i_packet_size
;
653 p_sys
->b_udp_out
= false;
655 p_sys
->i_ts_read
= 50;
657 p_sys
->b_start_record
= false;
659 /* Init PAT handler */
660 pat
= &p_sys
->pid
[0];
661 PIDInit( pat
, true, NULL
);
662 pat
->psi
->handle
= dvbpsi_AttachPAT( (dvbpsi_pat_callback
)PATCallBack
,
667 ts_pid_t
*sdt
= &p_sys
->pid
[0x11];
668 ts_pid_t
*eit
= &p_sys
->pid
[0x12];
670 PIDInit( sdt
, true, NULL
);
672 dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t
)PSINewTableCallBack
,
674 PIDInit( eit
, true, NULL
);
676 dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t
)PSINewTableCallBack
,
678 if( p_sys
->b_dvb_control
)
680 if( stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
681 ACCESS_SET_PRIVATE_ID_STATE
, 0x11, true ) ||
682 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
683 ACCESS_SET_PRIVATE_ID_STATE
, 0x12, true ) )
684 p_sys
->b_dvb_control
= false;
690 TAB_INIT( p_sys
->i_pmt
, p_sys
->pmt
);
693 var_Create( p_demux
, "ts-es-id-pid", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
694 var_Get( p_demux
, "ts-es-id-pid", &val
);
695 p_sys
->b_es_id_pid
= val
.b_bool
;
697 var_Create( p_demux
, "ts-out", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
698 var_Get( p_demux
, "ts-out", &val
);
699 if( val
.psz_string
&& *val
.psz_string
&& !p_sys
->b_file_out
)
702 char *psz
= strchr( val
.psz_string
, ':' );
705 p_sys
->b_udp_out
= true;
710 i_port
= atoi( psz
);
712 if( i_port
<= 0 ) i_port
= 1234;
713 msg_Dbg( p_demux
, "resend ts to '%s:%d'", val
.psz_string
, i_port
);
715 p_sys
->fd
= net_ConnectUDP( VLC_OBJECT(p_demux
), val
.psz_string
, i_port
, -1 );
718 msg_Err( p_demux
, "failed to open udp socket, send disabled" );
719 p_sys
->b_udp_out
= false;
723 var_Create( p_demux
, "ts-out-mtu",
724 VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
725 var_Get( p_demux
, "ts-out-mtu", &mtu
);
726 p_sys
->i_ts_read
= mtu
.i_int
/ p_sys
->i_packet_size
;
727 if( p_sys
->i_ts_read
<= 0 )
729 p_sys
->i_ts_read
= 1500 / p_sys
->i_packet_size
;
731 p_sys
->buffer
= malloc( p_sys
->i_packet_size
* p_sys
->i_ts_read
);
734 free( val
.psz_string
);
736 /* We handle description of an extra PMT */
737 var_Create( p_demux
, "ts-extra-pmt", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
);
738 var_Get( p_demux
, "ts-extra-pmt", &val
);
739 p_sys
->b_user_pmt
= false;
740 if( val
.psz_string
&& *val
.psz_string
)
741 UserPmt( p_demux
, val
.psz_string
);
742 free( val
.psz_string
);
744 var_Create( p_demux
, "ts-csa-ck", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
| VLC_VAR_ISCOMMAND
);
745 var_Get( p_demux
, "ts-csa-ck", &val
);
746 if( val
.psz_string
&& *val
.psz_string
)
751 p_sys
->csa
= csa_New();
753 var_Create( p_demux
, "ts-csa2-ck", VLC_VAR_STRING
| VLC_VAR_DOINHERIT
| VLC_VAR_ISCOMMAND
);
754 var_Get( p_demux
, "ts-csa2-ck", &csa2
);
755 i_res
= csa_SetCW( (vlc_object_t
*)p_demux
, p_sys
->csa
, val
.psz_string
, true );
756 if( i_res
== VLC_SUCCESS
&& csa2
.psz_string
&& *csa2
.psz_string
)
758 if( csa_SetCW( (vlc_object_t
*)p_demux
, p_sys
->csa
, csa2
.psz_string
, false ) != VLC_SUCCESS
)
760 csa_SetCW( (vlc_object_t
*)p_demux
, p_sys
->csa
, val
.psz_string
, false );
763 else if ( i_res
== VLC_SUCCESS
)
765 csa_SetCW( (vlc_object_t
*)p_demux
, p_sys
->csa
, val
.psz_string
, false );
769 csa_Delete( p_sys
->csa
);
777 var_AddCallback( p_demux
, "ts-csa-ck", ChangeKeyCallback
, (void *)1 );
778 var_AddCallback( p_demux
, "ts-csa2-ck", ChangeKeyCallback
, NULL
);
780 var_Create( p_demux
, "ts-csa-pkt", VLC_VAR_INTEGER
| VLC_VAR_DOINHERIT
);
781 var_Get( p_demux
, "ts-csa-pkt", &pkt_val
);
782 if( pkt_val
.i_int
< 4 || pkt_val
.i_int
> 188 )
784 msg_Err( p_demux
, "wrong packet size %d specified.", pkt_val
.i_int
);
785 msg_Warn( p_demux
, "using default packet size of 188 bytes" );
786 p_sys
->i_csa_pkt_size
= 188;
788 else p_sys
->i_csa_pkt_size
= pkt_val
.i_int
;
789 msg_Dbg( p_demux
, "decrypting %d bytes of packet", p_sys
->i_csa_pkt_size
);
791 free( csa2
.psz_string
);
793 free( val
.psz_string
);
795 var_Create( p_demux
, "ts-silent", VLC_VAR_BOOL
| VLC_VAR_DOINHERIT
);
796 var_Get( p_demux
, "ts-silent", &val
);
797 p_sys
->b_silent
= val
.b_bool
;
802 /*****************************************************************************
804 *****************************************************************************/
805 static void Close( vlc_object_t
*p_this
)
807 demux_t
*p_demux
= (demux_t
*)p_this
;
808 demux_sys_t
*p_sys
= p_demux
->p_sys
;
812 msg_Dbg( p_demux
, "pid list:" );
813 for( i
= 0; i
< 8192; i
++ )
815 ts_pid_t
*pid
= &p_sys
->pid
[i
];
817 if( pid
->b_valid
&& pid
->psi
)
822 dvbpsi_DetachPAT( pid
->psi
->handle
);
830 dvbpsi_DetachDemux( pid
->psi
->handle
);
834 PIDClean( p_demux
->out
, pid
);
838 else if( pid
->b_valid
&& pid
->es
)
840 PIDClean( p_demux
->out
, pid
);
845 msg_Dbg( p_demux
, " - pid[%d] seen", pid
->i_pid
);
848 if( p_sys
->b_dvb_control
&& pid
->i_pid
> 0 )
851 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
852 ACCESS_SET_PRIVATE_ID_STATE
, pid
->i_pid
,
858 vlc_mutex_lock( &p_sys
->csa_lock
);
861 var_DelCallback( p_demux
, "ts-csa-ck", ChangeKeyCallback
, NULL
);
862 var_DelCallback( p_demux
, "ts-csa2-ck", ChangeKeyCallback
, NULL
);
863 csa_Delete( p_sys
->csa
);
865 vlc_mutex_unlock( &p_sys
->csa_lock
);
867 TAB_CLEAN( p_sys
->i_pmt
, p_sys
->pmt
);
869 if ( p_sys
->p_programs_list
)
872 val
.p_list
= p_sys
->p_programs_list
;
873 var_Change( p_demux
, "programs", VLC_VAR_FREELIST
, &val
, NULL
);
876 /* If in dump mode, then close the file */
877 if( p_sys
->b_file_out
)
879 msg_Info( p_demux
,"closing %s (%"PRId64
" Kbytes dumped)",
880 p_sys
->psz_file
, p_sys
->i_write
/ 1024 );
882 if( p_sys
->p_file
!= stdout
)
884 fclose( p_sys
->p_file
);
887 /* When streaming, close the port */
890 net_Close( p_sys
->fd
);
893 free( p_sys
->buffer
);
894 free( p_sys
->psz_file
);
896 vlc_mutex_destroy( &p_sys
->csa_lock
);
900 /*****************************************************************************
901 * ChangeKeyCallback: called when changing the odd encryption key on the fly.
902 *****************************************************************************/
903 static int ChangeKeyCallback( vlc_object_t
*p_this
, char const *psz_cmd
,
904 vlc_value_t oldval
, vlc_value_t newval
,
907 VLC_UNUSED(psz_cmd
); VLC_UNUSED(oldval
);
908 demux_t
*p_demux
= (demux_t
*)p_this
;
909 demux_sys_t
*p_sys
= p_demux
->p_sys
;
910 int i_tmp
= (intptr_t)p_data
;
912 vlc_mutex_lock( &p_sys
->csa_lock
);
914 i_tmp
= csa_SetCW( p_this
, p_sys
->csa
, newval
.psz_string
, true );
916 i_tmp
= csa_SetCW( p_this
, p_sys
->csa
, newval
.psz_string
, false );
918 vlc_mutex_unlock( &p_sys
->csa_lock
);
922 /*****************************************************************************
924 *****************************************************************************/
925 static int DemuxFile( demux_t
*p_demux
)
927 demux_sys_t
*p_sys
= p_demux
->p_sys
;
928 uint8_t *p_buffer
= p_sys
->buffer
; /* Put first on sync byte */
932 int i_bufsize
= p_sys
->i_packet_size
* p_sys
->i_ts_read
;
934 i_data
= stream_Read( p_demux
->s
, p_sys
->buffer
, i_bufsize
);
935 if( (i_data
<= 0) && (i_data
< p_sys
->i_packet_size
) )
937 msg_Dbg( p_demux
, "error reading malformed packets" );
941 /* Test continuity counter */
942 while( i_pos
< i_data
)
944 ts_pid_t
*p_pid
; /* point to a PID structure */
945 bool b_payload
; /* indicates a packet with payload */
946 bool b_adaptation
; /* adaptation field */
947 int i_cc
= 0; /* continuity counter */
949 if( p_sys
->buffer
[i_pos
] != 0x47 )
951 msg_Warn( p_demux
, "lost sync" );
952 while( vlc_object_alive (p_demux
) && (i_pos
< i_data
) )
955 if( p_sys
->buffer
[i_pos
] == 0x47 )
958 if( vlc_object_alive (p_demux
) )
959 msg_Warn( p_demux
, "sync found" );
962 /* continuous when (one of this):
964 * diff == 0 and payload == 0
965 * diff == 0 and duplicate packet (playload != 0) <- should we
968 i_cc
= p_buffer
[i_pos
+3]&0x0f;
969 b_payload
= p_buffer
[i_pos
+3]&0x10;
970 b_adaptation
= p_buffer
[i_pos
+3]&0x20;
973 p_pid
= &p_sys
->pid
[ ((p_buffer
[i_pos
+1]&0x1f)<<8)|p_buffer
[i_pos
+2] ];
975 /* Detect discontinuity indicator in adaptation field */
976 if( b_adaptation
&& p_buffer
[i_pos
+ 4] > 0 )
978 if( p_buffer
[i_pos
+5]&0x80 )
979 msg_Warn( p_demux
, "discontinuity indicator (pid=%d) ", p_pid
->i_pid
);
980 if( p_buffer
[i_pos
+5]&0x40 )
981 msg_Warn( p_demux
, "random access indicator (pid=%d) ", p_pid
->i_pid
);
984 i_diff
= ( i_cc
- p_pid
->i_cc
)&0x0f;
985 if( b_payload
&& i_diff
== 1 )
987 p_pid
->i_cc
= ( p_pid
->i_cc
+ 1 ) & 0xf;
991 if( p_pid
->i_cc
== 0xff )
993 msg_Warn( p_demux
, "first packet for pid=%d cc=0x%x",
994 p_pid
->i_pid
, i_cc
);
997 else if( i_diff
!= 0 )
999 /* FIXME what to do when discontinuity_indicator is set ? */
1000 msg_Warn( p_demux
, "transport error detected 0x%x instead of 0x%x",
1001 i_cc
, ( p_pid
->i_cc
+ 1 )&0x0f );
1004 /* Mark transport error in the TS packet. */
1005 p_buffer
[i_pos
+1] |= 0x80;
1009 /* Test if user wants to decrypt it first */
1012 vlc_mutex_lock( &p_sys
->csa_lock
);
1013 csa_Decrypt( p_demux
->p_sys
->csa
, &p_buffer
[i_pos
], p_demux
->p_sys
->i_csa_pkt_size
);
1014 vlc_mutex_unlock( &p_sys
->csa_lock
);
1017 i_pos
+= p_sys
->i_packet_size
;
1021 i_data
= fwrite( p_sys
->buffer
, 1, i_data
, p_sys
->p_file
);
1024 msg_Err( p_demux
, "failed to write data" );
1028 msg_Dbg( p_demux
, "dumped %d bytes", i_data
);
1031 p_sys
->i_write
+= i_data
;
1035 /*****************************************************************************
1037 *****************************************************************************/
1038 static int Demux( demux_t
*p_demux
)
1040 demux_sys_t
*p_sys
= p_demux
->p_sys
;
1043 /* We read at most 100 TS packet or until a frame is completed */
1044 for( i_pkt
= 0; i_pkt
< p_sys
->i_ts_read
; i_pkt
++ )
1046 bool b_frame
= false;
1050 /* Get a new TS packet */
1051 if( !( p_pkt
= stream_Block( p_demux
->s
, p_sys
->i_packet_size
) ) )
1053 msg_Dbg( p_demux
, "eof ?" );
1057 /* Check sync byte and re-sync if needed */
1058 if( p_pkt
->p_buffer
[0] != 0x47 )
1060 msg_Warn( p_demux
, "lost synchro" );
1061 block_Release( p_pkt
);
1063 while( vlc_object_alive (p_demux
) )
1065 const uint8_t *p_peek
;
1066 int i_peek
, i_skip
= 0;
1068 i_peek
= stream_Peek( p_demux
->s
, &p_peek
,
1069 p_sys
->i_packet_size
* 10 );
1070 if( i_peek
< p_sys
->i_packet_size
+ 1 )
1072 msg_Dbg( p_demux
, "eof ?" );
1076 while( i_skip
< i_peek
- p_sys
->i_packet_size
)
1078 if( p_peek
[i_skip
] == 0x47 &&
1079 p_peek
[i_skip
+ p_sys
->i_packet_size
] == 0x47 )
1086 msg_Dbg( p_demux
, "skipping %d bytes of garbage", i_skip
);
1087 stream_Read( p_demux
->s
, NULL
, i_skip
);
1089 if( i_skip
< i_peek
- p_sys
->i_packet_size
)
1095 if( !( p_pkt
= stream_Block( p_demux
->s
, p_sys
->i_packet_size
) ) )
1097 msg_Dbg( p_demux
, "eof ?" );
1102 if( p_sys
->b_start_record
)
1104 /* Enable recording once synchronized */
1105 stream_Control( p_demux
->s
, STREAM_SET_RECORD_STATE
, true, "ts" );
1106 p_sys
->b_start_record
= false;
1109 if( p_sys
->b_udp_out
)
1111 memcpy( &p_sys
->buffer
[i_pkt
* p_sys
->i_packet_size
],
1112 p_pkt
->p_buffer
, p_sys
->i_packet_size
);
1115 /* Parse the TS packet */
1116 p_pid
= &p_sys
->pid
[PIDGet( p_pkt
)];
1118 if( p_pid
->b_valid
)
1122 if( p_pid
->i_pid
== 0 || p_pid
->i_pid
== 0x11 || p_pid
->i_pid
== 0x12 )
1124 dvbpsi_PushPacket( p_pid
->psi
->handle
, p_pkt
->p_buffer
);
1129 for( i_prg
= 0; i_prg
< p_pid
->psi
->i_prg
; i_prg
++ )
1131 dvbpsi_PushPacket( p_pid
->psi
->prg
[i_prg
]->handle
,
1135 block_Release( p_pkt
);
1137 else if( !p_sys
->b_udp_out
)
1139 b_frame
= GatherPES( p_demux
, p_pid
, p_pkt
);
1143 PCRHandle( p_demux
, p_pid
, p_pkt
);
1144 block_Release( p_pkt
);
1149 if( !p_pid
->b_seen
)
1151 msg_Dbg( p_demux
, "pid[%d] unknown", p_pid
->i_pid
);
1153 /* We have to handle PCR if present */
1154 PCRHandle( p_demux
, p_pid
, p_pkt
);
1155 block_Release( p_pkt
);
1157 p_pid
->b_seen
= true;
1165 if( p_sys
->b_udp_out
)
1167 /* Send the complete block */
1168 net_Write( p_demux
, p_sys
->fd
, NULL
, p_sys
->buffer
,
1169 p_sys
->i_ts_read
* p_sys
->i_packet_size
);
1175 /*****************************************************************************
1177 *****************************************************************************/
1178 static int DVBEventInformation( demux_t
*p_demux
, int64_t *pi_time
, int64_t *pi_length
)
1180 demux_sys_t
*p_sys
= p_demux
->p_sys
;
1187 if( p_sys
->b_dvb_control
&& p_sys
->i_dvb_length
> 0 )
1189 /* FIXME we should not use time() but read the date from the tdt */
1190 const time_t t
= time( NULL
);
1191 if( p_sys
->i_dvb_start
<= t
&& t
< p_sys
->i_dvb_start
+ p_sys
->i_dvb_length
)
1194 *pi_length
= p_sys
->i_dvb_length
* INT64_C(1000000);
1196 *pi_time
= (t
- p_sys
->i_dvb_start
) * INT64_C(1000000);
1201 return VLC_EGENERIC
;
1204 static int Control( demux_t
*p_demux
, int i_query
, va_list args
)
1206 demux_sys_t
*p_sys
= p_demux
->p_sys
;
1208 bool b_bool
, *pb_bool
;
1213 if( p_sys
->b_file_out
)
1214 return demux_vaControlHelper( p_demux
->s
, 0, -1, 0, 1, i_query
, args
);
1218 case DEMUX_GET_POSITION
:
1219 pf
= (double*) va_arg( args
, double* );
1220 i64
= stream_Size( p_demux
->s
);
1223 *pf
= (double)stream_Tell( p_demux
->s
) / (double)i64
;
1227 int64_t i_time
, i_length
;
1228 if( !DVBEventInformation( p_demux
, &i_time
, &i_length
) && i_length
> 0 )
1229 *pf
= (double)i_time
/(double)i_length
;
1234 case DEMUX_SET_POSITION
:
1235 f
= (double) va_arg( args
, double );
1236 i64
= stream_Size( p_demux
->s
);
1238 if( stream_Seek( p_demux
->s
, (int64_t)(i64
* f
) ) )
1239 return VLC_EGENERIC
;
1244 case DEMUX_GET_TIME
:
1245 pi64
= (int64_t*)va_arg( args
, int64_t * );
1246 if( p_sys
->i_time
< 0 )
1249 return VLC_EGENERIC
;
1251 *pi64
= p_sys
->i_time
;
1254 case DEMUX_GET_LENGTH
:
1255 pi64
= (int64_t*)va_arg( args
, int64_t * );
1256 if( p_sys
->i_mux_rate
> 0 )
1258 *pi64
= INT64_C(1000000) * ( stream_Size( p_demux
->s
) / 50 ) /
1263 return VLC_EGENERIC
;
1265 case DEMUX_GET_TIME
:
1266 pi64
= (int64_t*)va_arg( args
, int64_t * );
1267 if( DVBEventInformation( p_demux
, pi64
, NULL
) )
1271 case DEMUX_GET_LENGTH
:
1272 pi64
= (int64_t*)va_arg( args
, int64_t * );
1273 if( DVBEventInformation( p_demux
, NULL
, pi64
) )
1277 case DEMUX_SET_GROUP
:
1279 uint16_t i_vpid
= 0, i_apid1
= 0, i_apid2
= 0, i_apid3
= 0;
1280 ts_prg_psi_t
*p_prg
= NULL
;
1283 i_int
= (int)va_arg( args
, int );
1284 p_list
= (vlc_list_t
*)va_arg( args
, vlc_list_t
* );
1285 msg_Dbg( p_demux
, "DEMUX_SET_GROUP %d %p", i_int
, p_list
);
1287 if( p_sys
->b_dvb_control
&& i_int
> 0 && i_int
!= p_sys
->i_dvb_program
)
1292 /* Search pmt to be unselected */
1293 for( i
= 0; i
< p_sys
->i_pmt
; i
++ )
1295 ts_pid_t
*pmt
= p_sys
->pmt
[i
];
1298 for( i_prg
= 0; i_prg
< pmt
->psi
->i_prg
; i_prg
++ )
1300 if( pmt
->psi
->prg
[i_prg
]->i_number
== p_sys
->i_dvb_program
)
1302 i_pmt_pid
= p_sys
->pmt
[i
]->i_pid
;
1306 if( i_pmt_pid
> 0 ) break;
1311 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
1312 ACCESS_SET_PRIVATE_ID_STATE
, i_pmt_pid
,
1315 for( i
= 2; i
< 8192; i
++ )
1317 ts_pid_t
*pid
= &p_sys
->pid
[i
];
1320 if( !pid
->b_valid
|| pid
->psi
) continue;
1322 for( i_prg
= 0; i_prg
< pid
->p_owner
->i_prg
; i_prg
++ )
1324 if( pid
->p_owner
->prg
[i_prg
]->i_pid_pmt
== i_pmt_pid
&& pid
->es
->id
)
1326 /* We only remove es that aren't defined by extra pmt */
1327 stream_Control( p_demux
->s
,
1328 STREAM_CONTROL_ACCESS
,
1329 ACCESS_SET_PRIVATE_ID_STATE
,
1337 /* select new program */
1338 p_sys
->i_dvb_program
= i_int
;
1340 for( i
= 0; i
< p_sys
->i_pmt
; i
++ )
1342 ts_pid_t
*pmt
= p_sys
->pmt
[i
];
1345 for( i_prg
= 0; i_prg
< pmt
->psi
->i_prg
; i_prg
++ )
1347 if( pmt
->psi
->prg
[i_prg
]->i_number
== i_int
)
1349 i_pmt_pid
= p_sys
->pmt
[i
]->i_pid
;
1350 p_prg
= p_sys
->pmt
[i
]->psi
->prg
[i_prg
];
1354 if( i_pmt_pid
> 0 ) break;
1358 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
1359 ACCESS_SET_PRIVATE_ID_STATE
, i_pmt_pid
,
1361 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
1362 ACCESS_SET_PRIVATE_ID_STATE
, p_prg
->i_pid_pcr
,
1365 for( i
= 2; i
< 8192; i
++ )
1367 ts_pid_t
*pid
= &p_sys
->pid
[i
];
1370 if( !pid
->b_valid
|| pid
->psi
) continue;
1372 for( i_prg
= 0; i_prg
< pid
->p_owner
->i_prg
; i_prg
++ )
1374 if( pid
->p_owner
->prg
[i_prg
]->i_pid_pmt
== i_pmt_pid
&& pid
->es
->id
)
1376 if ( pid
->es
->fmt
.i_cat
== VIDEO_ES
&& !i_vpid
)
1378 if ( pid
->es
->fmt
.i_cat
== AUDIO_ES
&& !i_apid1
)
1380 else if ( pid
->es
->fmt
.i_cat
== AUDIO_ES
&& !i_apid2
)
1382 else if ( pid
->es
->fmt
.i_cat
== AUDIO_ES
&& !i_apid3
)
1385 stream_Control( p_demux
->s
,
1386 STREAM_CONTROL_ACCESS
,
1387 ACCESS_SET_PRIVATE_ID_STATE
,
1397 p_sys
->i_dvb_program
= -1;
1398 p_sys
->p_programs_list
= p_list
;
1403 case DEMUX_CAN_RECORD
:
1404 pb_bool
= (bool*)va_arg( args
, bool * );
1408 case DEMUX_SET_RECORD_STATE
:
1409 b_bool
= (bool)va_arg( args
, int );
1412 stream_Control( p_demux
->s
, STREAM_SET_RECORD_STATE
, false );
1413 p_sys
->b_start_record
= b_bool
;
1417 case DEMUX_SET_TIME
:
1419 return VLC_EGENERIC
;
1423 /*****************************************************************************
1425 *****************************************************************************/
1426 static int UserPmt( demux_t
*p_demux
, const char *psz_fmt
)
1428 demux_sys_t
*p_sys
= p_demux
->p_sys
;
1429 char *psz_dup
= strdup( psz_fmt
);
1430 char *psz
= psz_dup
;
1438 i_pid
= strtol( psz
, &psz
, 0 );
1439 if( i_pid
< 2 || i_pid
>= 8192 )
1442 /* Parse optional program number */
1445 i_number
= strtol( &psz
[1], &psz
, 0 );
1448 ts_pid_t
*pmt
= &p_sys
->pid
[i_pid
];
1451 msg_Dbg( p_demux
, "user pmt specified (pid=%d,number=%d)", i_pid
, i_number
);
1452 PIDInit( pmt
, true, NULL
);
1455 prg
= malloc( sizeof( ts_prg_psi_t
) );
1459 memset( prg
, 0, sizeof( ts_prg_psi_t
) );
1460 prg
->i_pid_pcr
= -1;
1461 prg
->i_pid_pmt
= -1;
1462 prg
->i_version
= -1;
1463 prg
->i_number
= i_number
!= 0 ? i_number
: TS_USER_PMT_NUMBER
;
1464 prg
->handle
= dvbpsi_AttachPMT( i_number
!= TS_USER_PMT_NUMBER
? i_number
: 1, (dvbpsi_pmt_callback
)PMTCallBack
, p_demux
);
1465 TAB_APPEND( pmt
->psi
->i_prg
, pmt
->psi
->prg
, prg
);
1467 psz
= strchr( psz
, '=' );
1470 while( psz
&& *psz
)
1472 char *psz_next
= strchr( psz
, ',' );
1478 i_pid
= strtol( psz
, &psz
, 0 );
1479 if( *psz
!= ':' || i_pid
< 2 || i_pid
>= 8192 )
1482 char *psz_opt
= &psz
[1];
1483 if( !strcmp( psz_opt
, "pcr" ) )
1485 prg
->i_pid_pcr
= i_pid
;
1487 else if( !p_sys
->pid
[i_pid
].b_valid
)
1489 ts_pid_t
*pid
= &p_sys
->pid
[i_pid
];
1491 char *psz_arg
= strchr( psz_opt
, '=' );
1495 PIDInit( pid
, false, pmt
->psi
);
1496 if( prg
->i_pid_pcr
<= 0 )
1497 prg
->i_pid_pcr
= i_pid
;
1499 if( psz_arg
&& strlen( psz_arg
) == 4 )
1501 const vlc_fourcc_t i_codec
= VLC_FOURCC( psz_arg
[0], psz_arg
[1],
1502 psz_arg
[2], psz_arg
[3] );
1503 int i_cat
= UNKNOWN_ES
;
1504 es_format_t
*fmt
= &pid
->es
->fmt
;
1506 if( !strcmp( psz_opt
, "video" ) )
1508 else if( !strcmp( psz_opt
, "audio" ) )
1510 else if( !strcmp( psz_opt
, "spu" ) )
1513 es_format_Init( fmt
, i_cat
, i_codec
);
1514 fmt
->b_packetized
= false;
1518 const int i_stream_type
= strtol( psz_opt
, NULL
, 0 );
1519 PIDFillFormat( pid
, i_stream_type
);
1521 pid
->es
->fmt
.i_group
= i_number
;
1522 if( p_sys
->b_es_id_pid
)
1523 pid
->es
->fmt
.i_id
= i_pid
;
1525 if( pid
->es
->fmt
.i_cat
!= UNKNOWN_ES
)
1527 msg_Dbg( p_demux
, " * es pid=%d fcc=%4.4s", i_pid
,
1528 (char*)&pid
->es
->fmt
.i_codec
);
1529 pid
->es
->id
= es_out_Add( p_demux
->out
,
1538 p_sys
->b_user_pmt
= true;
1539 TAB_APPEND( p_sys
->i_pmt
, p_sys
->pmt
, pmt
);
1545 return VLC_EGENERIC
;
1548 static void PIDInit( ts_pid_t
*pid
, bool b_psi
, ts_psi_t
*p_owner
)
1550 bool b_old_valid
= pid
->b_valid
;
1552 pid
->b_valid
= true;
1554 pid
->p_owner
= p_owner
;
1555 pid
->i_owner_number
= 0;
1557 TAB_INIT( pid
->i_extra_es
, pid
->extra_es
);
1566 pid
->psi
= malloc( sizeof( ts_psi_t
) );
1569 pid
->psi
->handle
= NULL
;
1570 pid
->psi
->i_prg
= 0;
1571 pid
->psi
->prg
= NULL
;
1574 pid
->psi
->i_pat_version
= -1;
1575 pid
->psi
->i_sdt_version
= -1;
1578 ts_prg_psi_t
*prg
= malloc( sizeof( ts_prg_psi_t
) );
1582 prg
->i_version
= -1;
1584 prg
->i_pid_pcr
= -1;
1585 prg
->i_pid_pmt
= -1;
1589 TAB_APPEND( pid
->psi
->i_prg
, pid
->psi
->prg
, prg
);
1596 pid
->es
= malloc( sizeof( ts_es_t
) );
1599 es_format_Init( &pid
->es
->fmt
, UNKNOWN_ES
, 0 );
1601 pid
->es
->p_pes
= NULL
;
1602 pid
->es
->i_pes_size
= 0;
1603 pid
->es
->i_pes_gathered
= 0;
1604 pid
->es
->pp_last
= &pid
->es
->p_pes
;
1605 pid
->es
->p_mpeg4desc
= NULL
;
1606 pid
->es
->b_gather
= false;
1611 static void PIDClean( es_out_t
*out
, ts_pid_t
*pid
)
1617 if( pid
->psi
->handle
) dvbpsi_DetachPMT( pid
->psi
->handle
);
1618 for( i
= 0; i
< pid
->psi
->i_prg
; i
++ )
1620 if( pid
->psi
->prg
[i
]->iod
)
1621 IODFree( pid
->psi
->prg
[i
]->iod
);
1622 if( pid
->psi
->prg
[i
]->handle
)
1623 dvbpsi_DetachPMT( pid
->psi
->prg
[i
]->handle
);
1624 free( pid
->psi
->prg
[i
] );
1626 free( pid
->psi
->prg
);
1634 es_out_Del( out
, pid
->es
->id
);
1636 if( pid
->es
->p_pes
)
1637 block_ChainRelease( pid
->es
->p_pes
);
1639 es_format_Clean( &pid
->es
->fmt
);
1643 for( i
= 0; i
< pid
->i_extra_es
; i
++ )
1645 if( pid
->extra_es
[i
]->id
)
1646 es_out_Del( out
, pid
->extra_es
[i
]->id
);
1648 if( pid
->extra_es
[i
]->p_pes
)
1649 block_ChainRelease( pid
->extra_es
[i
]->p_pes
);
1651 es_format_Clean( &pid
->extra_es
[i
]->fmt
);
1653 free( pid
->extra_es
[i
] );
1655 if( pid
->i_extra_es
) free( pid
->extra_es
);
1658 pid
->b_valid
= false;
1661 /****************************************************************************
1663 ****************************************************************************/
1664 static void ParsePES( demux_t
*p_demux
, ts_pid_t
*pid
)
1666 block_t
*p_pes
= pid
->es
->p_pes
;
1672 mtime_t i_length
= 0;
1675 /* remove the pes from pid */
1676 pid
->es
->p_pes
= NULL
;
1677 pid
->es
->i_pes_size
= 0;
1678 pid
->es
->i_pes_gathered
= 0;
1679 pid
->es
->pp_last
= &pid
->es
->p_pes
;
1681 /* FIXME find real max size */
1682 i_max
= block_ChainExtract( p_pes
, header
, 34 );
1685 if( header
[0] != 0 || header
[1] != 0 || header
[2] != 1 )
1687 if( !p_demux
->p_sys
->b_silent
)
1688 msg_Warn( p_demux
, "invalid header [0x%x:%x:%x:%x] (pid: %d)",
1689 header
[0], header
[1],header
[2],header
[3], pid
->i_pid
);
1690 block_ChainRelease( p_pes
);
1694 /* TODO check size */
1697 case 0xBC: /* Program stream map */
1698 case 0xBE: /* Padding */
1699 case 0xBF: /* Private stream 2 */
1700 case 0xF0: /* ECM */
1701 case 0xF1: /* EMM */
1702 case 0xFF: /* Program stream directory */
1703 case 0xF2: /* DSMCC stream */
1704 case 0xF8: /* ITU-T H.222.1 type E stream */
1708 if( ( header
[6]&0xC0 ) == 0x80 )
1711 i_skip
= header
[8] + 9;
1713 if( header
[7]&0x80 ) /* has pts */
1715 i_pts
= ((mtime_t
)(header
[ 9]&0x0e ) << 29)|
1716 (mtime_t
)(header
[10] << 22)|
1717 ((mtime_t
)(header
[11]&0xfe) << 14)|
1718 (mtime_t
)(header
[12] << 7)|
1719 (mtime_t
)(header
[13] >> 1);
1721 if( header
[7]&0x40 ) /* has dts */
1723 i_dts
= ((mtime_t
)(header
[14]&0x0e ) << 29)|
1724 (mtime_t
)(header
[15] << 22)|
1725 ((mtime_t
)(header
[16]&0xfe) << 14)|
1726 (mtime_t
)(header
[17] << 7)|
1727 (mtime_t
)(header
[18] >> 1);
1734 while( i_skip
< 23 && header
[i_skip
] == 0xff )
1740 msg_Err( p_demux
, "too much MPEG-1 stuffing" );
1741 block_ChainRelease( p_pes
);
1744 if( ( header
[i_skip
] & 0xC0 ) == 0x40 )
1749 if( header
[i_skip
]&0x20 )
1751 i_pts
= ((mtime_t
)(header
[i_skip
]&0x0e ) << 29)|
1752 (mtime_t
)(header
[i_skip
+1] << 22)|
1753 ((mtime_t
)(header
[i_skip
+2]&0xfe) << 14)|
1754 (mtime_t
)(header
[i_skip
+3] << 7)|
1755 (mtime_t
)(header
[i_skip
+4] >> 1);
1757 if( header
[i_skip
]&0x10 ) /* has dts */
1759 i_dts
= ((mtime_t
)(header
[i_skip
+5]&0x0e ) << 29)|
1760 (mtime_t
)(header
[i_skip
+6] << 22)|
1761 ((mtime_t
)(header
[i_skip
+7]&0xfe) << 14)|
1762 (mtime_t
)(header
[i_skip
+8] << 7)|
1763 (mtime_t
)(header
[i_skip
+9] >> 1);
1779 if( pid
->es
->fmt
.i_codec
== VLC_FOURCC( 'a', '5', '2', 'b' ) ||
1780 pid
->es
->fmt
.i_codec
== VLC_FOURCC( 'd', 't', 's', 'b' ) )
1784 else if( pid
->es
->fmt
.i_codec
== VLC_FOURCC( 'l', 'p', 'c', 'b' ) ||
1785 pid
->es
->fmt
.i_codec
== VLC_FOURCC( 's', 'p', 'u', 'b' ) ||
1786 pid
->es
->fmt
.i_codec
== VLC_FOURCC( 's', 'd', 'd', 'b' ) )
1790 else if( pid
->es
->fmt
.i_codec
== VLC_FOURCC( 's', 'u', 'b', 't' ) &&
1791 pid
->es
->p_mpeg4desc
)
1793 decoder_config_descriptor_t
*dcd
= &pid
->es
->p_mpeg4desc
->dec_descr
;
1795 if( dcd
->i_decoder_specific_info_len
> 2 &&
1796 dcd
->p_decoder_specific_info
[0] == 0x10 &&
1797 ( dcd
->p_decoder_specific_info
[1]&0x10 ) )
1799 /* display length */
1800 if( p_pes
->i_buffer
+ 2 <= i_skip
)
1802 i_length
= GetWBE( &p_pes
->p_buffer
[i_skip
] );
1807 if( p_pes
->i_buffer
+ 2 <= i_skip
)
1809 i_pes_size
= GetWBE( &p_pes
->p_buffer
[i_skip
] );
1814 #ifdef ZVBI_COMPILED
1815 else if( pid
->es
->fmt
.i_codec
== VLC_FOURCC( 't', 'e', 'l', 'x' ) )
1816 i_skip
= 0; /*hack for zvbi support */
1819 while( p_pes
&& i_skip
> 0 )
1821 if( p_pes
->i_buffer
<= i_skip
)
1823 block_t
*p_next
= p_pes
->p_next
;
1825 i_skip
-= p_pes
->i_buffer
;
1826 block_Release( p_pes
);
1831 p_pes
->i_buffer
-= i_skip
;
1832 p_pes
->p_buffer
+= i_skip
;
1837 /* ISO/IEC 13818-1 2.7.5: if no pts and no dts, then dts == pts */
1838 if( i_pts
>= 0 && i_dts
< 0 )
1848 p_pes
->i_dts
= i_dts
* 100 / 9;
1852 p_pes
->i_pts
= i_pts
* 100 / 9;
1854 p_pes
->i_length
= i_length
* 100 / 9;
1856 p_block
= block_ChainGather( p_pes
);
1857 if( pid
->es
->fmt
.i_codec
== VLC_FOURCC( 's', 'u', 'b', 't' ) )
1859 if( i_pes_size
> 0 && p_block
->i_buffer
> i_pes_size
)
1861 p_block
->i_buffer
= i_pes_size
;
1864 p_block
= block_Realloc( p_block
, 0, p_block
->i_buffer
+ 1 );
1865 p_block
->p_buffer
[p_block
->i_buffer
-1] = '\0';
1868 for( i
= 0; i
< pid
->i_extra_es
; i
++ )
1870 es_out_Send( p_demux
->out
, pid
->extra_es
[i
]->id
,
1871 block_Duplicate( p_block
) );
1874 es_out_Send( p_demux
->out
, pid
->es
->id
, p_block
);
1878 msg_Warn( p_demux
, "empty pes" );
1882 static void PCRHandle( demux_t
*p_demux
, ts_pid_t
*pid
, block_t
*p_bk
)
1884 demux_sys_t
*p_sys
= p_demux
->p_sys
;
1885 const uint8_t *p
= p_bk
->p_buffer
;
1887 if( ( p
[3]&0x20 ) && /* adaptation */
1892 mtime_t i_pcr
; /* 33 bits */
1894 i_pcr
= ( (mtime_t
)p
[6] << 25 ) |
1895 ( (mtime_t
)p
[7] << 17 ) |
1896 ( (mtime_t
)p
[8] << 9 ) |
1897 ( (mtime_t
)p
[9] << 1 ) |
1898 ( (mtime_t
)p
[10] >> 7 );
1900 /* Search program and set the PCR */
1901 for( i
= 0; i
< p_sys
->i_pmt
; i
++ )
1904 for( i_prg
= 0; i_prg
< p_sys
->pmt
[i
]->psi
->i_prg
; i_prg
++ )
1906 if( pid
->i_pid
== p_sys
->pmt
[i
]->psi
->prg
[i_prg
]->i_pid_pcr
)
1908 es_out_Control( p_demux
->out
, ES_OUT_SET_GROUP_PCR
,
1909 (int)p_sys
->pmt
[i
]->psi
->prg
[i_prg
]->i_number
,
1910 (int64_t)(i_pcr
* 100 / 9) );
1917 static bool GatherPES( demux_t
*p_demux
, ts_pid_t
*pid
, block_t
*p_bk
)
1919 const uint8_t *p
= p_bk
->p_buffer
;
1920 const bool b_unit_start
= p
[1]&0x40;
1921 const bool b_adaptation
= p
[3]&0x20;
1922 const bool b_payload
= p
[3]&0x10;
1923 const int i_cc
= p
[3]&0x0f; /* continuity counter */
1924 bool b_discontinuity
= false;/* discontinuity */
1926 /* transport_scrambling_control is ignored */
1932 msg_Dbg( p_demux
, "pid=%d unit_start=%d adaptation=%d payload=%d "
1933 "cc=0x%x", pid
->i_pid
, b_unit_start
, b_adaptation
,
1937 /* For now, ignore additional error correction
1938 * TODO: handle Reed-Solomon 204,188 error correction */
1939 p_bk
->i_buffer
= TS_PACKET_SIZE_188
;
1943 msg_Dbg( p_demux
, "transport_error_indicator set (pid=%d)",
1945 if( pid
->es
->p_pes
) //&& pid->es->fmt.i_cat == VIDEO_ES )
1946 pid
->es
->p_pes
->i_flags
|= BLOCK_FLAG_CORRUPTED
;
1949 if( p_demux
->p_sys
->csa
)
1951 vlc_mutex_lock( &p_demux
->p_sys
->csa_lock
);
1952 csa_Decrypt( p_demux
->p_sys
->csa
, p_bk
->p_buffer
, p_demux
->p_sys
->i_csa_pkt_size
);
1953 vlc_mutex_unlock( &p_demux
->p_sys
->csa_lock
);
1958 /* We don't have any adaptation_field, so payload starts
1959 * immediately after the 4 byte TS header */
1964 /* p[4] is adaptation_field_length minus one */
1968 /* discontinuity indicator found in stream */
1969 b_discontinuity
= (p
[5]&0x80) ? true : false;
1970 if( b_discontinuity
&& pid
->es
->p_pes
)
1972 msg_Warn( p_demux
, "discontinuity indicator (pid=%d) ",
1974 /* pid->es->p_pes->i_flags |= BLOCK_FLAG_DISCONTINUITY; */
1978 msg_Dbg( p_demux
, "random access indicator (pid=%d) ", pid
->i_pid
);
1983 /* Test continuity counter */
1984 /* continuous when (one of this):
1986 * diff == 0 and payload == 0
1987 * diff == 0 and duplicate packet (playload != 0) <- should we
1988 * test the content ?
1990 i_diff
= ( i_cc
- pid
->i_cc
)&0x0f;
1991 if( b_payload
&& i_diff
== 1 )
1993 pid
->i_cc
= ( pid
->i_cc
+ 1 ) & 0xf;
1997 if( pid
->i_cc
== 0xff )
1999 msg_Warn( p_demux
, "first packet for pid=%d cc=0x%x",
2003 else if( i_diff
!= 0 && !b_discontinuity
)
2005 msg_Warn( p_demux
, "discontinuity received 0x%x instead of 0x%x (pid=%d)",
2006 i_cc
, ( pid
->i_cc
+ 1 )&0x0f, pid
->i_pid
);
2009 if( pid
->es
->p_pes
&& pid
->es
->fmt
.i_cat
!= VIDEO_ES
)
2011 /* Small video artifacts are usually better then
2012 * dropping full frames */
2013 pid
->es
->p_pes
->i_flags
|= BLOCK_FLAG_CORRUPTED
;
2018 PCRHandle( p_demux
, pid
, p_bk
);
2020 if( i_skip
>= 188 || pid
->es
->id
== NULL
|| p_demux
->p_sys
->b_udp_out
)
2022 block_Release( p_bk
);
2026 /* We have to gather it */
2027 p_bk
->p_buffer
+= i_skip
;
2028 p_bk
->i_buffer
-= i_skip
;
2032 if( pid
->es
->p_pes
)
2034 ParsePES( p_demux
, pid
);
2038 block_ChainLastAppend( &pid
->es
->pp_last
, p_bk
);
2039 if( p_bk
->i_buffer
> 6 )
2041 pid
->es
->i_pes_size
= GetWBE( &p_bk
->p_buffer
[4] );
2042 if( pid
->es
->i_pes_size
> 0 )
2044 pid
->es
->i_pes_size
+= 6;
2047 pid
->es
->i_pes_gathered
+= p_bk
->i_buffer
;
2048 if( pid
->es
->i_pes_size
> 0 &&
2049 pid
->es
->i_pes_gathered
>= pid
->es
->i_pes_size
)
2051 ParsePES( p_demux
, pid
);
2057 if( pid
->es
->p_pes
== NULL
)
2059 /* msg_Dbg( p_demux, "broken packet" ); */
2060 block_Release( p_bk
);
2064 block_ChainLastAppend( &pid
->es
->pp_last
, p_bk
);
2065 pid
->es
->i_pes_gathered
+= p_bk
->i_buffer
;
2066 if( pid
->es
->i_pes_size
> 0 &&
2067 pid
->es
->i_pes_gathered
>= pid
->es
->i_pes_size
)
2069 ParsePES( p_demux
, pid
);
2078 static int PIDFillFormat( ts_pid_t
*pid
, int i_stream_type
)
2080 es_format_t
*fmt
= &pid
->es
->fmt
;
2082 switch( i_stream_type
)
2084 case 0x01: /* MPEG-1 video */
2085 case 0x02: /* MPEG-2 video */
2086 case 0x80: /* MPEG-2 MOTO video */
2087 es_format_Init( fmt
, VIDEO_ES
, VLC_FOURCC( 'm', 'p', 'g', 'v' ) );
2089 case 0x03: /* MPEG-1 audio */
2090 case 0x04: /* MPEG-2 audio */
2091 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 'm', 'p', 'g', 'a' ) );
2093 case 0x11: /* MPEG4 (audio) */
2094 case 0x0f: /* ISO/IEC 13818-7 Audio with ADTS transport syntax */
2095 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 'm', 'p', '4', 'a' ) );
2097 case 0x10: /* MPEG4 (video) */
2098 es_format_Init( fmt
, VIDEO_ES
, VLC_FOURCC( 'm', 'p', '4', 'v' ) );
2099 pid
->es
->b_gather
= true;
2101 case 0x1B: /* H264 <- check transport syntax/needed descriptor */
2102 es_format_Init( fmt
, VIDEO_ES
, VLC_FOURCC( 'h', '2', '6', '4' ) );
2105 case 0x81: /* A52 (audio) */
2106 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 'a', '5', '2', ' ' ) );
2108 case 0x82: /* DVD_SPU (sub) */
2109 es_format_Init( fmt
, SPU_ES
, VLC_FOURCC( 's', 'p', 'u', ' ' ) );
2111 case 0x83: /* LPCM (audio) */
2112 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 'l', 'p', 'c', 'm' ) );
2114 case 0x84: /* SDDS (audio) */
2115 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 's', 'd', 'd', 's' ) );
2117 case 0x85: /* DTS (audio) */
2118 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 'd', 't', 's', ' ' ) );
2121 case 0x91: /* A52 vls (audio) */
2122 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 'a', '5', '2', 'b' ) );
2124 case 0x92: /* DVD_SPU vls (sub) */
2125 es_format_Init( fmt
, SPU_ES
, VLC_FOURCC( 's', 'p', 'u', 'b' ) );
2128 case 0x94: /* SDDS (audio) */
2129 es_format_Init( fmt
, AUDIO_ES
, VLC_FOURCC( 's', 'd', 'd', 'b' ) );
2132 case 0xa0: /* MSCODEC vlc (video) (fixed later) */
2133 es_format_Init( fmt
, UNKNOWN_ES
, 0 );
2134 pid
->es
->b_gather
= true;
2137 case 0x06: /* PES_PRIVATE (fixed later) */
2138 case 0x12: /* MPEG-4 generic (sub/scene/...) (fixed later) */
2139 case 0xEA: /* Privately managed ES (VC-1) (fixed later */
2141 es_format_Init( fmt
, UNKNOWN_ES
, 0 );
2145 /* PES packets usually contain truncated frames */
2146 fmt
->b_packetized
= false;
2148 return fmt
->i_cat
== UNKNOWN_ES
? VLC_EGENERIC
: VLC_SUCCESS
;
2151 /*****************************************************************************
2152 * MP4 specific functions (IOD parser)
2153 *****************************************************************************/
2154 static int IODDescriptorLength( int *pi_data
, uint8_t **pp_data
)
2157 unsigned int i_len
= 0;
2163 i_len
= ( i_len
<< 7 ) + ( i_b
&0x7f );
2165 } while( i_b
&0x80 );
2170 static int IODGetByte( int *pi_data
, uint8_t **pp_data
)
2174 const int i_b
= **pp_data
;
2182 static int IODGetWord( int *pi_data
, uint8_t **pp_data
)
2184 const int i1
= IODGetByte( pi_data
, pp_data
);
2185 const int i2
= IODGetByte( pi_data
, pp_data
);
2186 return( ( i1
<< 8 ) | i2
);
2189 static int IODGet3Bytes( int *pi_data
, uint8_t **pp_data
)
2191 const int i1
= IODGetByte( pi_data
, pp_data
);
2192 const int i2
= IODGetByte( pi_data
, pp_data
);
2193 const int i3
= IODGetByte( pi_data
, pp_data
);
2195 return( ( i1
<< 16 ) | ( i2
<< 8) | i3
);
2198 static uint32_t IODGetDWord( int *pi_data
, uint8_t **pp_data
)
2200 const uint32_t i1
= IODGetWord( pi_data
, pp_data
);
2201 const uint32_t i2
= IODGetWord( pi_data
, pp_data
);
2202 return( ( i1
<< 16 ) | i2
);
2205 static char* IODGetURL( int *pi_data
, uint8_t **pp_data
)
2210 i_url_len
= IODGetByte( pi_data
, pp_data
);
2211 url
= malloc( i_url_len
+ 1 );
2212 if( !url
) return NULL
;
2213 for( i
= 0; i
< i_url_len
; i
++ )
2215 url
[i
] = IODGetByte( pi_data
, pp_data
);
2217 url
[i_url_len
] = '\0';
2221 static iod_descriptor_t
*IODNew( int i_data
, uint8_t *p_data
)
2223 iod_descriptor_t
*p_iod
;
2226 uint8_t i_flags
, i_iod_tag
, byte1
, byte2
, byte3
;
2230 p_iod
= malloc( sizeof( iod_descriptor_t
) );
2231 if( !p_iod
) return NULL
;
2232 memset( p_iod
, 0, sizeof( iod_descriptor_t
) );
2235 fprintf( stderr
, "\n************ IOD ************" );
2237 for( i
= 0; i
< 255; i
++ )
2239 p_iod
->es_descr
[i
].b_ok
= 0;
2248 byte1
= IODGetByte( &i_data
, &p_data
);
2249 byte2
= IODGetByte( &i_data
, &p_data
);
2250 byte3
= IODGetByte( &i_data
, &p_data
);
2251 if( byte2
== 0x02 ) //old vlc's buggy implementation of the IOD_descriptor
2253 p_iod
->i_iod_label_scope
= 0x11;
2254 p_iod
->i_iod_label
= byte1
;
2257 else //correct implementation of the IOD_descriptor
2259 p_iod
->i_iod_label_scope
= byte1
;
2260 p_iod
->i_iod_label
= byte2
;
2264 fprintf( stderr
, "\n* iod_label:%d", p_iod
->i_iod_label
);
2265 fprintf( stderr
, "\n* ===========" );
2266 fprintf( stderr
, "\n* tag:0x%x", i_iod_tag
);
2268 if( i_iod_tag
!= 0x02 )
2271 fprintf( stderr
, "\n ERR: tag %02x != 0x02", i_iod_tag
);
2276 i_iod_length
= IODDescriptorLength( &i_data
, &p_data
);
2278 fprintf( stderr
, "\n* length:%d", i_iod_length
);
2280 if( i_iod_length
> i_data
)
2282 i_iod_length
= i_data
;
2285 p_iod
->i_od_id
= ( IODGetByte( &i_data
, &p_data
) << 2 );
2286 i_flags
= IODGetByte( &i_data
, &p_data
);
2287 p_iod
->i_od_id
|= i_flags
>> 6;
2288 b_url
= ( i_flags
>> 5 )&0x01;
2290 fprintf( stderr
, "\n* od_id:%d", p_iod
->i_od_id
);
2291 fprintf( stderr
, "\n* url flag:%d", b_url
);
2292 fprintf( stderr
, "\n* includeInlineProfileLevel flag:%d", ( i_flags
>> 4 )&0x01 );
2296 p_iod
->psz_url
= IODGetURL( &i_data
, &p_data
);
2298 fprintf( stderr
, "\n* url string:%s", p_iod
->psz_url
);
2299 fprintf( stderr
, "\n*****************************\n" );
2305 p_iod
->psz_url
= NULL
;
2308 p_iod
->i_ODProfileLevelIndication
= IODGetByte( &i_data
, &p_data
);
2309 p_iod
->i_sceneProfileLevelIndication
= IODGetByte( &i_data
, &p_data
);
2310 p_iod
->i_audioProfileLevelIndication
= IODGetByte( &i_data
, &p_data
);
2311 p_iod
->i_visualProfileLevelIndication
= IODGetByte( &i_data
, &p_data
);
2312 p_iod
->i_graphicsProfileLevelIndication
= IODGetByte( &i_data
, &p_data
);
2314 fprintf( stderr
, "\n* ODProfileLevelIndication:%d", p_iod
->i_ODProfileLevelIndication
);
2315 fprintf( stderr
, "\n* sceneProfileLevelIndication:%d", p_iod
->i_sceneProfileLevelIndication
);
2316 fprintf( stderr
, "\n* audioProfileLevelIndication:%d", p_iod
->i_audioProfileLevelIndication
);
2317 fprintf( stderr
, "\n* visualProfileLevelIndication:%d", p_iod
->i_visualProfileLevelIndication
);
2318 fprintf( stderr
, "\n* graphicsProfileLevelIndication:%d", p_iod
->i_graphicsProfileLevelIndication
);
2321 while( i_data
> 0 && i_es_index
< 255)
2323 int i_tag
, i_length
;
2325 uint8_t *p_data_sav
;
2327 i_tag
= IODGetByte( &i_data
, &p_data
);
2328 i_length
= IODDescriptorLength( &i_data
, &p_data
);
2330 i_data_sav
= i_data
;
2331 p_data_sav
= p_data
;
2339 #define es_descr p_iod->es_descr[i_es_index]
2340 int i_decoderConfigDescr_length
;
2342 fprintf( stderr
, "\n* - ES_Descriptor length:%d", i_length
);
2346 es_descr
.i_es_id
= IODGetWord( &i_data
, &p_data
);
2347 i_flags
= IODGetByte( &i_data
, &p_data
);
2348 es_descr
.b_streamDependenceFlag
= ( i_flags
>> 7 )&0x01;
2349 b_url
= ( i_flags
>> 6 )&0x01;
2350 es_descr
.b_OCRStreamFlag
= ( i_flags
>> 5 )&0x01;
2351 es_descr
.i_streamPriority
= i_flags
& 0x1f;
2353 fprintf( stderr
, "\n* * streamDependenceFlag:%d", es_descr
.b_streamDependenceFlag
);
2354 fprintf( stderr
, "\n* * OCRStreamFlag:%d", es_descr
.b_OCRStreamFlag
);
2355 fprintf( stderr
, "\n* * streamPriority:%d", es_descr
.i_streamPriority
);
2357 if( es_descr
.b_streamDependenceFlag
)
2359 es_descr
.i_dependOn_es_id
= IODGetWord( &i_data
, &p_data
);
2361 fprintf( stderr
, "\n* * dependOn_es_id:%d", es_descr
.i_dependOn_es_id
);
2367 es_descr
.psz_url
= IODGetURL( &i_data
, &p_data
);
2369 fprintf( stderr
, "\n* url string:%s", es_descr
.psz_url
);
2374 es_descr
.psz_url
= NULL
;
2377 if( es_descr
.b_OCRStreamFlag
)
2379 es_descr
.i_OCR_es_id
= IODGetWord( &i_data
, &p_data
);
2381 fprintf( stderr
, "\n* * OCR_es_id:%d", es_descr
.i_OCR_es_id
);
2385 if( IODGetByte( &i_data
, &p_data
) != 0x04 )
2388 fprintf( stderr
, "\n* ERR missing DecoderConfigDescr" );
2393 i_decoderConfigDescr_length
= IODDescriptorLength( &i_data
, &p_data
);
2395 fprintf( stderr
, "\n* - DecoderConfigDesc length:%d", i_decoderConfigDescr_length
);
2397 #define dec_descr es_descr.dec_descr
2398 dec_descr
.i_objectTypeIndication
= IODGetByte( &i_data
, &p_data
);
2399 i_flags
= IODGetByte( &i_data
, &p_data
);
2400 dec_descr
.i_streamType
= i_flags
>> 2;
2401 dec_descr
.b_upStream
= ( i_flags
>> 1 )&0x01;
2402 dec_descr
.i_bufferSizeDB
= IODGet3Bytes( &i_data
, &p_data
);
2403 dec_descr
.i_maxBitrate
= IODGetDWord( &i_data
, &p_data
);
2404 dec_descr
.i_avgBitrate
= IODGetDWord( &i_data
, &p_data
);
2406 fprintf( stderr
, "\n* * objectTypeIndication:0x%x", dec_descr
.i_objectTypeIndication
);
2407 fprintf( stderr
, "\n* * streamType:0x%x", dec_descr
.i_streamType
);
2408 fprintf( stderr
, "\n* * upStream:%d", dec_descr
.b_upStream
);
2409 fprintf( stderr
, "\n* * bufferSizeDB:%d", dec_descr
.i_bufferSizeDB
);
2410 fprintf( stderr
, "\n* * maxBitrate:%d", dec_descr
.i_maxBitrate
);
2411 fprintf( stderr
, "\n* * avgBitrate:%d", dec_descr
.i_avgBitrate
);
2413 if( i_decoderConfigDescr_length
> 13 && IODGetByte( &i_data
, &p_data
) == 0x05 )
2416 dec_descr
.i_decoder_specific_info_len
=
2417 IODDescriptorLength( &i_data
, &p_data
);
2418 if( dec_descr
.i_decoder_specific_info_len
> 0 )
2420 dec_descr
.p_decoder_specific_info
=
2421 malloc( dec_descr
.i_decoder_specific_info_len
);
2423 for( i
= 0; i
< dec_descr
.i_decoder_specific_info_len
; i
++ )
2425 dec_descr
.p_decoder_specific_info
[i
] = IODGetByte( &i_data
, &p_data
);
2430 dec_descr
.i_decoder_specific_info_len
= 0;
2431 dec_descr
.p_decoder_specific_info
= NULL
;
2435 #define sl_descr es_descr.sl_descr
2437 int i_SLConfigDescr_length
;
2440 if( IODGetByte( &i_data
, &p_data
) != 0x06 )
2443 fprintf( stderr
, "\n* ERR missing SLConfigDescr" );
2448 i_SLConfigDescr_length
= IODDescriptorLength( &i_data
, &p_data
);
2450 fprintf( stderr
, "\n* - SLConfigDescr length:%d", i_SLConfigDescr_length
);
2452 i_predefined
= IODGetByte( &i_data
, &p_data
);
2454 fprintf( stderr
, "\n* * i_predefined:0x%x", i_predefined
);
2456 switch( i_predefined
)
2460 sl_descr
.b_useAccessUnitStartFlag
= 0;
2461 sl_descr
.b_useAccessUnitEndFlag
= 0;
2462 sl_descr
.b_useRandomAccessPointFlag
= 0;
2463 //sl_descr.b_useRandomAccessUnitsOnlyFlag = 0;
2464 sl_descr
.b_usePaddingFlag
= 0;
2465 sl_descr
.b_useTimeStampsFlags
= 0;
2466 sl_descr
.b_useIdleFlag
= 0;
2467 sl_descr
.b_durationFlag
= 0; // FIXME FIXME
2468 sl_descr
.i_timeStampResolution
= 1000;
2469 sl_descr
.i_OCRResolution
= 0; // FIXME FIXME
2470 sl_descr
.i_timeStampLength
= 32;
2471 sl_descr
.i_OCRLength
= 0; // FIXME FIXME
2472 sl_descr
.i_AU_Length
= 0;
2473 sl_descr
.i_instantBitrateLength
= 0; // FIXME FIXME
2474 sl_descr
.i_degradationPriorityLength
= 0;
2475 sl_descr
.i_AU_seqNumLength
= 0;
2476 sl_descr
.i_packetSeqNumLength
= 0;
2477 if( sl_descr
.b_durationFlag
)
2479 sl_descr
.i_timeScale
= 0; // FIXME FIXME
2480 sl_descr
.i_accessUnitDuration
= 0; // FIXME FIXME
2481 sl_descr
.i_compositionUnitDuration
= 0; // FIXME FIXME
2483 if( !sl_descr
.b_useTimeStampsFlags
)
2485 sl_descr
.i_startDecodingTimeStamp
= 0; // FIXME FIXME
2486 sl_descr
.i_startCompositionTimeStamp
= 0; // FIXME FIXME
2492 fprintf( stderr
, "\n* ERR unsupported SLConfigDescr predefined" );
2503 fprintf( stderr
, "\n* - OD tag:0x%x length:%d (Unsupported)", i_tag
, i_length
);
2508 p_data
= p_data_sav
+ i_length
;
2509 i_data
= i_data_sav
- i_length
;
2513 fprintf( stderr
, "\n*****************************\n" );
2518 static void IODFree( iod_descriptor_t
*p_iod
)
2522 if( p_iod
->psz_url
)
2524 free( p_iod
->psz_url
);
2525 p_iod
->psz_url
= NULL
;
2530 for( i
= 0; i
< 255; i
++ )
2532 #define es_descr p_iod->es_descr[i]
2535 if( es_descr
.psz_url
)
2537 free( es_descr
.psz_url
);
2538 es_descr
.psz_url
= NULL
;
2542 free( es_descr
.dec_descr
.p_decoder_specific_info
);
2543 es_descr
.dec_descr
.p_decoder_specific_info
= NULL
;
2544 es_descr
.dec_descr
.i_decoder_specific_info_len
= 0;
2553 /****************************************************************************
2554 ****************************************************************************
2555 ** libdvbpsi callbacks
2556 ****************************************************************************
2557 ****************************************************************************/
2558 static bool DVBProgramIsSelected( demux_t
*p_demux
, uint16_t i_pgrm
)
2560 demux_sys_t
*p_sys
= p_demux
->p_sys
;
2562 if ( !p_sys
->b_dvb_control
) return false;
2563 if ( (p_sys
->i_dvb_program
== -1 && p_sys
->p_programs_list
== NULL
)
2564 || p_sys
->i_dvb_program
== 0 )
2566 if ( p_sys
->i_dvb_program
== i_pgrm
) return true;
2568 if ( p_sys
->p_programs_list
!= NULL
)
2571 for ( i
= 0; i
< p_sys
->p_programs_list
->i_count
; i
++ )
2573 if ( i_pgrm
== p_sys
->p_programs_list
->p_values
[i
].i_int
)
2580 #ifdef TS_USE_DVB_SI
2581 static void SDTCallBack( demux_t
*p_demux
, dvbpsi_sdt_t
*p_sdt
)
2583 demux_sys_t
*p_sys
= p_demux
->p_sys
;
2584 ts_pid_t
*sdt
= &p_sys
->pid
[0x11];
2585 dvbpsi_sdt_service_t
*p_srv
;
2587 msg_Dbg( p_demux
, "SDTCallBack called" );
2589 if( sdt
->psi
->i_sdt_version
!= -1 &&
2590 ( !p_sdt
->b_current_next
||
2591 p_sdt
->i_version
== sdt
->psi
->i_sdt_version
) )
2593 dvbpsi_DeleteSDT( p_sdt
);
2597 msg_Dbg( p_demux
, "new SDT ts_id=%d version=%d current_next=%d "
2599 p_sdt
->i_ts_id
, p_sdt
->i_version
, p_sdt
->b_current_next
,
2600 p_sdt
->i_network_id
);
2602 for( p_srv
= p_sdt
->p_first_service
; p_srv
; p_srv
= p_srv
->p_next
)
2605 dvbpsi_descriptor_t
*p_dr
;
2607 const char *psz_type
= NULL
;
2608 const char *psz_status
= NULL
;
2610 msg_Dbg( p_demux
, " * service id=%d eit schedule=%d present=%d "
2611 "running=%d free_ca=%d",
2612 p_srv
->i_service_id
, p_srv
->b_eit_schedule
,
2613 p_srv
->b_eit_present
, p_srv
->i_running_status
,
2616 if( p_sys
->i_dvb_program
!= -1 && p_sys
->i_dvb_program
!= p_srv
->i_service_id
)
2619 p_meta
= vlc_meta_New();
2620 for( p_dr
= p_srv
->p_first_descriptor
; p_dr
; p_dr
= p_dr
->p_next
)
2622 if( p_dr
->i_tag
== 0x48 )
2624 static const char *ppsz_type
[17] = {
2626 "Digital television service",
2627 "Digital radio sound service",
2629 "NVOD reference service",
2630 "NVOD time-shifted service",
2633 "SECAM coded signal",
2636 "NTSC coded signal",
2637 "Data broadcast service",
2638 "Reserved for Common Interface Usage",
2639 "RCS Map (see EN 301 790 [35])",
2640 "RCS FLS (see EN 301 790 [35])",
2643 dvbpsi_service_dr_t
*pD
= dvbpsi_DecodeServiceDr( p_dr
);
2647 memcpy( str1
, pD
->i_service_provider_name
,
2648 pD
->i_service_provider_name_length
);
2649 str1
[pD
->i_service_provider_name_length
] = '\0';
2650 memcpy( str2
, pD
->i_service_name
, pD
->i_service_name_length
);
2651 str2
[pD
->i_service_name_length
] = '\0';
2653 msg_Dbg( p_demux
, " - type=%d provider=%s name=%s",
2654 pD
->i_service_type
, str1
, str2
);
2656 vlc_meta_SetTitle( p_meta
, str2
);
2657 vlc_meta_SetPublisher( p_meta
, str1
);
2658 if( pD
->i_service_type
>= 0x01 && pD
->i_service_type
<= 0x10 )
2659 psz_type
= ppsz_type
[pD
->i_service_type
];
2663 if( p_srv
->i_running_status
>= 0x01 && p_srv
->i_running_status
<= 0x04 )
2665 static const char *ppsz_status
[5] = {
2668 "Starts in a few seconds",
2672 psz_status
= ppsz_status
[p_srv
->i_running_status
];
2676 vlc_meta_AddExtra( p_meta
, "Type", psz_type
);
2678 vlc_meta_AddExtra( p_meta
, "Status", psz_status
);
2680 es_out_Control( p_demux
->out
, ES_OUT_SET_GROUP_META
,
2681 p_srv
->i_service_id
, p_meta
);
2682 vlc_meta_Delete( p_meta
);
2685 sdt
->psi
->i_sdt_version
= p_sdt
->i_version
;
2686 dvbpsi_DeleteSDT( p_sdt
);
2689 /* i_year: year - 1900 i_month: 0-11 i_mday: 1-31 i_hour: 0-23 i_minute: 0-59 i_second: 0-59 */
2690 static int64_t vlc_timegm( int i_year
, int i_month
, int i_mday
, int i_hour
, int i_minute
, int i_second
)
2692 static const int pn_day
[12+1] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
2697 i_month
< 0 || i_month
> 11 || i_mday
< 1 || i_mday
> 31 ||
2698 i_hour
< 0 || i_hour
> 23 || i_minute
< 0 || i_minute
> 59 || i_second
< 0 || i_second
> 59 )
2701 /* Count the number of days */
2702 i_day
= 365 * (i_year
-70) + pn_day
[i_month
] + i_mday
- 1;
2703 #define LEAP(y) ( ((y)%4) == 0 && (((y)%100) != 0 || ((y)%400) == 0) ? 1 : 0)
2704 for( i
= 70; i
< i_year
; i
++ )
2705 i_day
+= LEAP(1900+i
);
2707 i_day
+= LEAP(1900+i_year
);
2710 return ((24*i_day
+ i_hour
)*60 + i_minute
)*60 + i_second
;
2713 static void EITDecodeMjd( int i_mjd
, int *p_y
, int *p_m
, int *p_d
)
2715 const int yp
= (int)( ( (double)i_mjd
- 15078.2)/365.25 );
2716 const int mp
= (int)( ((double)i_mjd
- 14956.1 - (int)(yp
* 365.25)) / 30.6001 );
2717 const int c
= ( mp
== 14 || mp
== 15 ) ? 1 : 0;
2719 *p_y
= 1900 + yp
+ c
*1;
2720 *p_m
= mp
- 1 - c
*12;
2721 *p_d
= i_mjd
- 14956 - (int)(yp
*365.25) - (int)(mp
*30.6001);
2723 #define CVT_FROM_BCD(v) ((((v) >> 4)&0xf)*10 + ((v)&0xf))
2724 static int64_t EITConvertStartTime( uint64_t i_date
)
2726 const int i_mjd
= i_date
>> 24;
2727 const int i_hour
= CVT_FROM_BCD(i_date
>> 16);
2728 const int i_minute
= CVT_FROM_BCD(i_date
>> 8);
2729 const int i_second
= CVT_FROM_BCD(i_date
);
2734 /* if all 40 bits are 1, the start is unknown */
2735 if( i_date
== UINT64_C(0xffffffffff) )
2738 EITDecodeMjd( i_mjd
, &i_year
, &i_month
, &i_day
);
2739 return vlc_timegm( i_year
- 1900, i_month
- 1, i_day
, i_hour
, i_minute
, i_second
);
2741 static int EITConvertDuration( uint32_t i_duration
)
2743 return CVT_FROM_BCD(i_duration
>> 16) * 3600 +
2744 CVT_FROM_BCD(i_duration
>> 8 ) * 60 +
2745 CVT_FROM_BCD(i_duration
);
2749 /* FIXME same than dvbsi_to_utf8 from dvb access */
2750 static char *EITConvertToUTF8( const unsigned char *psz_instring
,
2753 const char *psz_encoding
;
2754 char *psz_outstring
;
2755 char psz_encbuf
[sizeof( "ISO_8859-123" )];
2756 size_t i_in
, i_out
, offset
= 1;
2757 vlc_iconv_t iconv_handle
;
2759 if( i_length
< 1 ) return NULL
;
2760 if( psz_instring
[0] >= 0x20 )
2762 psz_encoding
= "ISO_8859-1";
2763 /* According to the specification, this should be ISO6937,
2764 * but it seems Latin-1 is used instead. */
2767 else switch( psz_instring
[0] )
2770 psz_encoding
= "ISO_8859-5";
2773 psz_encoding
= "ISO_8859-6";
2776 psz_encoding
= "ISO_8859-7";
2779 psz_encoding
= "ISO_8859-8";
2782 psz_encoding
= "ISO_8859-9";
2785 psz_encoding
= "ISO_8859-10";
2788 psz_encoding
= "ISO_8859-11";
2791 psz_encoding
= "ISO_8859-12";
2794 psz_encoding
= "ISO_8859-13";
2797 psz_encoding
= "ISO_8859-14";
2800 psz_encoding
= "ISO_8859-15";
2803 #warning Is Latin-10 (psz_instring[2] == 16) really illegal?
2804 if( i_length
< 3 || psz_instring
[1] != 0x00 || psz_instring
[2] > 15
2805 || psz_instring
[2] == 0 )
2807 psz_encoding
= "UTF-8";
2812 sprintf( psz_encbuf
, "ISO_8859-%u", psz_instring
[2] );
2813 psz_encoding
= psz_encbuf
;
2818 #warning Is there a BOM or do we use a fixed endianess?
2819 psz_encoding
= "UTF-16";
2822 psz_encoding
= "KSC5601-1987";
2825 psz_encoding
= "GB2312"; /* GB-2312-1980 */
2828 psz_encoding
= "BIG-5";
2831 psz_encoding
= "UTF-8";
2835 psz_encoding
= "UTF-8";
2839 i_in
= i_length
- offset
;
2840 i_out
= i_in
* 6 + 1;
2842 psz_outstring
= malloc( i_out
);
2843 if( !psz_outstring
)
2848 iconv_handle
= vlc_iconv_open( "UTF-8", psz_encoding
);
2849 if( iconv_handle
== (vlc_iconv_t
)(-1) )
2851 /* Invalid character set (e.g. ISO_8859-12) */
2852 memcpy( psz_outstring
, &psz_instring
[offset
], i_in
);
2853 psz_outstring
[i_in
] = '\0';
2854 EnsureUTF8( psz_outstring
);
2858 const char *psz_in
= (const char *)&psz_instring
[offset
];
2859 char *psz_out
= psz_outstring
;
2861 while( vlc_iconv( iconv_handle
, &psz_in
, &i_in
,
2862 &psz_out
, &i_out
) == (size_t)(-1) )
2864 /* skip naughty byte. This may fail terribly for multibyte stuff,
2865 * but what can we do anyway? */
2868 vlc_iconv( iconv_handle
, NULL
, NULL
, NULL
, NULL
); /* reset */
2870 vlc_iconv_close( iconv_handle
);
2874 return psz_outstring
;
2877 static void EITCallBack( demux_t
*p_demux
, dvbpsi_eit_t
*p_eit
)
2879 demux_sys_t
*p_sys
= p_demux
->p_sys
;
2880 dvbpsi_eit_event_t
*p_evt
;
2883 msg_Dbg( p_demux
, "EITCallBack called" );
2884 if( !p_eit
->b_current_next
|| ( p_sys
->i_dvb_program
!= -1 && p_sys
->i_dvb_program
!= p_eit
->i_service_id
) )
2886 dvbpsi_DeleteEIT( p_eit
);
2890 msg_Dbg( p_demux
, "new EIT service_id=%d version=%d current_next=%d "
2891 "ts_id=%d network_id=%d segment_last_section_number=%d "
2893 p_eit
->i_service_id
, p_eit
->i_version
, p_eit
->b_current_next
,
2894 p_eit
->i_ts_id
, p_eit
->i_network_id
,
2895 p_eit
->i_segment_last_section_number
, p_eit
->i_last_table_id
);
2897 p_epg
= vlc_epg_New( NULL
);
2898 for( p_evt
= p_eit
->p_first_event
; p_evt
; p_evt
= p_evt
->p_next
)
2900 dvbpsi_descriptor_t
*p_dr
;
2901 char *psz_name
= NULL
;
2902 char *psz_text
= NULL
;
2903 char *psz_extra
= strdup("");
2907 i_start
= EITConvertStartTime( p_evt
->i_start_time
);
2908 i_duration
= EITConvertDuration( p_evt
->i_duration
);
2910 msg_Dbg( p_demux
, " * event id=%d start_time:%d duration=%d "
2911 "running=%d free_ca=%d",
2912 p_evt
->i_event_id
, (int)i_start
, (int)i_duration
,
2913 p_evt
->i_running_status
, p_evt
->b_free_ca
);
2915 for( p_dr
= p_evt
->p_first_descriptor
; p_dr
; p_dr
= p_dr
->p_next
)
2917 if( p_dr
->i_tag
== 0x4d )
2919 dvbpsi_short_event_dr_t
*pE
= dvbpsi_DecodeShortEventDr( p_dr
);
2923 psz_name
= EITConvertToUTF8( pE
->i_event_name
, pE
->i_event_name_length
);
2924 psz_text
= EITConvertToUTF8( pE
->i_text
, pE
->i_text_length
);
2925 msg_Dbg( p_demux
, " - short event lang=%3.3s '%s' : '%s'",
2926 pE
->i_iso_639_code
, psz_name
, psz_text
);
2929 else if( p_dr
->i_tag
== 0x4e )
2931 dvbpsi_extended_event_dr_t
*pE
= dvbpsi_DecodeExtendedEventDr( p_dr
);
2935 msg_Dbg( p_demux
, " - extended event lang=%3.3s [%d/%d]",
2937 pE
->i_descriptor_number
, pE
->i_last_descriptor_number
);
2939 if( pE
->i_text_length
> 0 )
2941 char *psz_text
= EITConvertToUTF8( pE
->i_text
, pE
->i_text_length
);
2944 msg_Dbg( p_demux
, " - text='%s'", psz_text
);
2946 psz_extra
= realloc( psz_extra
, strlen(psz_extra
) + strlen(psz_text
) + 1 );
2947 strcat( psz_extra
, psz_text
);
2952 for( i
= 0; i
< pE
->i_entry_count
; i
++ )
2954 char *psz_dsc
= EITConvertToUTF8( pE
->i_item_description
[i
],
2955 pE
->i_item_description_length
[i
] );
2956 char *psz_itm
= EITConvertToUTF8( pE
->i_item
[i
], pE
->i_item_length
[i
] );
2958 if( psz_dsc
&& psz_itm
)
2960 msg_Dbg( p_demux
, " - desc='%s' item='%s'", psz_dsc
, psz_itm
);
2962 psz_extra
= realloc( psz_extra
, strlen(psz_extra
) + strlen(psz_dsc
) + strlen(psz_itm
) + 3 + 1 );
2963 strcat( psz_extra
, "(" );
2964 strcat( psz_extra
, psz_dsc
);
2965 strcat( psz_extra
, " " );
2966 strcat( psz_extra
, psz_itm
);
2967 strcat( psz_extra
, ")" );
2976 msg_Dbg( p_demux
, " - tag=0x%x(%d)", p_dr
->i_tag
, p_dr
->i_tag
);
2982 vlc_epg_AddEvent( p_epg
, i_start
, i_duration
, psz_name
, psz_text
, psz_extra
);
2984 /* Update "now playing" field */
2985 if( p_evt
->i_running_status
== 0x04 && i_start
> 0 )
2986 vlc_epg_SetCurrent( p_epg
, i_start
);
2993 if( p_epg
->i_event
> 0 )
2995 if( p_eit
->i_service_id
== p_sys
->i_dvb_program
)
2997 p_sys
->i_dvb_length
= 0;
2998 p_sys
->i_dvb_start
= 0;
3000 if( p_epg
->p_current
)
3002 p_sys
->i_dvb_start
= p_epg
->p_current
->i_start
;
3003 p_sys
->i_dvb_length
= p_epg
->p_current
->i_duration
;
3006 es_out_Control( p_demux
->out
, ES_OUT_SET_GROUP_EPG
, p_eit
->i_service_id
, p_epg
);
3008 vlc_epg_Delete( p_epg
);
3010 dvbpsi_DeleteEIT( p_eit
);
3013 static void PSINewTableCallBack( demux_t
*p_demux
, dvbpsi_handle h
,
3014 uint8_t i_table_id
, uint16_t i_extension
)
3017 msg_Dbg( p_demux
, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
3018 i_table_id
, i_table_id
, i_extension
, i_extension
);
3020 if( p_demux
->p_sys
->pid
[0].psi
->i_pat_version
!= -1 && i_table_id
== 0x42 )
3022 msg_Dbg( p_demux
, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
3023 i_table_id
, i_table_id
, i_extension
, i_extension
);
3025 dvbpsi_AttachSDT( h
, i_table_id
, i_extension
,
3026 (dvbpsi_sdt_callback
)SDTCallBack
, p_demux
);
3028 else if( p_demux
->p_sys
->pid
[0x11].psi
->i_sdt_version
!= -1 &&
3029 ( i_table_id
== 0x4e || /* Current/Following */
3030 (i_table_id
>= 0x50 && i_table_id
<= 0x5f) ) ) /* Schedule */
3032 msg_Dbg( p_demux
, "PSINewTableCallBack: table 0x%x(%d) ext=0x%x(%d)",
3033 i_table_id
, i_table_id
, i_extension
, i_extension
);
3035 dvbpsi_AttachEIT( h
, i_table_id
, i_extension
,
3036 (dvbpsi_eit_callback
)EITCallBack
, p_demux
);
3041 static void PMTCallBack( demux_t
*p_demux
, dvbpsi_pmt_t
*p_pmt
)
3043 demux_sys_t
*p_sys
= p_demux
->p_sys
;
3044 dvbpsi_descriptor_t
*p_dr
;
3045 dvbpsi_pmt_es_t
*p_es
;
3047 ts_pid_t
*pmt
= NULL
;
3048 ts_prg_psi_t
*prg
= NULL
;
3050 ts_pid_t
**pp_clean
= NULL
;
3052 bool b_hdmv
= false;
3054 msg_Dbg( p_demux
, "PMTCallBack called" );
3056 /* First find this PMT declared in PAT */
3057 for( i
= 0; i
< p_sys
->i_pmt
; i
++ )
3060 for( i_prg
= 0; i_prg
< p_sys
->pmt
[i
]->psi
->i_prg
; i_prg
++ )
3062 const int i_pmt_number
= p_sys
->pmt
[i
]->psi
->prg
[i_prg
]->i_number
;
3063 if( i_pmt_number
!= TS_USER_PMT_NUMBER
&& i_pmt_number
== p_pmt
->i_program_number
)
3065 pmt
= p_sys
->pmt
[i
];
3066 prg
= p_sys
->pmt
[i
]->psi
->prg
[i_prg
];
3075 msg_Warn( p_demux
, "unreferenced program (broken stream)" );
3076 dvbpsi_DeletePMT(p_pmt
);
3080 if( prg
->i_version
!= -1 &&
3081 ( !p_pmt
->b_current_next
|| prg
->i_version
== p_pmt
->i_version
) )
3083 dvbpsi_DeletePMT( p_pmt
);
3087 /* Clean this program (remove all es) */
3088 for( i
= 0; i
< 8192; i
++ )
3090 ts_pid_t
*pid
= &p_sys
->pid
[i
];
3092 if( pid
->b_valid
&& pid
->p_owner
== pmt
->psi
&&
3093 pid
->i_owner_number
== prg
->i_number
&& pid
->psi
== NULL
)
3095 TAB_APPEND( i_clean
, pp_clean
, pid
);
3100 IODFree( prg
->iod
);
3104 msg_Dbg( p_demux
, "new PMT program number=%d version=%d pid_pcr=%d",
3105 p_pmt
->i_program_number
, p_pmt
->i_version
, p_pmt
->i_pcr_pid
);
3106 prg
->i_pid_pcr
= p_pmt
->i_pcr_pid
;
3107 prg
->i_version
= p_pmt
->i_version
;
3109 if( DVBProgramIsSelected( p_demux
, prg
->i_number
) )
3111 /* Set demux filter */
3112 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
3113 ACCESS_SET_PRIVATE_ID_STATE
, prg
->i_pid_pcr
,
3116 else if ( p_sys
->b_dvb_control
)
3118 msg_Warn( p_demux
, "skipping program (not selected)" );
3119 dvbpsi_DeletePMT(p_pmt
);
3123 /* Parse descriptor */
3124 for( p_dr
= p_pmt
->p_first_descriptor
; p_dr
!= NULL
; p_dr
= p_dr
->p_next
)
3126 if( p_dr
->i_tag
== 0x1d )
3128 /* We have found an IOD descriptor */
3129 msg_Dbg( p_demux
, " * descriptor : IOD (0x1d)" );
3131 prg
->iod
= IODNew( p_dr
->i_length
, p_dr
->p_data
);
3133 else if( p_dr
->i_tag
== 0x9 )
3135 uint16_t i_sysid
= ((uint16_t)p_dr
->p_data
[0] << 8)
3137 msg_Dbg( p_demux
, " * descriptor : CA (0x9) SysID 0x%x", i_sysid
);
3139 else if( p_dr
->i_tag
== 0x05 )
3141 if( p_dr
->i_tag
== 0x05 )
3143 /* Registration Descriptor */
3144 if( p_dr
->i_length
!= 4 )
3146 msg_Warn( p_demux
, "invalid Registration Descriptor" );
3150 msg_Dbg( p_demux
, " * descriptor : registration %4.4s", p_dr
->p_data
);
3151 if( !memcmp( p_dr
->p_data
, "HDMV", 4 ) )
3161 msg_Dbg( p_demux
, " * descriptor : unknown (0x%x)", p_dr
->i_tag
);
3165 for( p_es
= p_pmt
->p_first_es
; p_es
!= NULL
; p_es
= p_es
->p_next
)
3167 ts_pid_t tmp_pid
, *old_pid
= 0, *pid
= &tmp_pid
;
3169 /* Find out if the PID was already declared */
3170 for( i
= 0; i
< i_clean
; i
++ )
3172 if( pp_clean
[i
] == &p_sys
->pid
[p_es
->i_pid
] )
3174 old_pid
= pp_clean
[i
];
3179 if( !old_pid
&& p_sys
->pid
[p_es
->i_pid
].b_valid
)
3181 ts_pid_t
*pid
= &p_sys
->pid
[p_es
->i_pid
];
3182 if( ( pid
->i_pid
== 0x11 /* SDT */ ||
3183 pid
->i_pid
== 0x12 /* EDT */ ) && pid
->psi
)
3185 /* This doesn't look like a DVB stream so don't try
3186 * parsing the SDT/EDT */
3187 dvbpsi_DetachDemux( pid
->psi
->handle
);
3193 msg_Warn( p_demux
, "pmt error: pid=%d already defined",
3199 PIDInit( pid
, false, pmt
->psi
);
3200 PIDFillFormat( pid
, p_es
->i_type
);
3201 pid
->i_owner_number
= prg
->i_number
;
3202 pid
->i_pid
= p_es
->i_pid
;
3203 pid
->b_seen
= p_sys
->pid
[p_es
->i_pid
].b_seen
;
3205 if( p_es
->i_type
== 0x10 || p_es
->i_type
== 0x11 ||
3206 p_es
->i_type
== 0x12 || p_es
->i_type
== 0x0f )
3208 /* MPEG-4 stream: search SL_DESCRIPTOR */
3209 dvbpsi_descriptor_t
*p_dr
= p_es
->p_first_descriptor
;;
3211 while( p_dr
&& ( p_dr
->i_tag
!= 0x1f ) ) p_dr
= p_dr
->p_next
;
3213 if( p_dr
&& p_dr
->i_length
== 2 )
3215 int i_es_id
= ( p_dr
->p_data
[0] << 8 ) | p_dr
->p_data
[1];
3217 msg_Warn( p_demux
, "found SL_descriptor es_id=%d", i_es_id
);
3219 pid
->es
->p_mpeg4desc
= NULL
;
3221 for( i
= 0; i
< 255; i
++ )
3223 iod_descriptor_t
*iod
= prg
->iod
;
3225 if( iod
->es_descr
[i
].b_ok
&&
3226 iod
->es_descr
[i
].i_es_id
== i_es_id
)
3228 pid
->es
->p_mpeg4desc
= &iod
->es_descr
[i
];
3234 if( pid
->es
->p_mpeg4desc
!= NULL
)
3236 decoder_config_descriptor_t
*dcd
=
3237 &pid
->es
->p_mpeg4desc
->dec_descr
;
3239 if( dcd
->i_streamType
== 0x04 ) /* VisualStream */
3241 pid
->es
->fmt
.i_cat
= VIDEO_ES
;
3242 switch( dcd
->i_objectTypeIndication
)
3244 case 0x0B: /* mpeg4 sub */
3245 pid
->es
->fmt
.i_cat
= SPU_ES
;
3246 pid
->es
->fmt
.i_codec
= VLC_FOURCC('s','u','b','t');
3249 case 0x20: /* mpeg4 */
3250 pid
->es
->fmt
.i_codec
= VLC_FOURCC('m','p','4','v');
3252 case 0x21: /* h264 */
3253 pid
->es
->fmt
.i_codec
= VLC_FOURCC('h','2','6','4');
3260 case 0x65: /* mpeg2 */
3261 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'm','p','g','v' );
3263 case 0x6a: /* mpeg1 */
3264 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'm','p','g','v' );
3266 case 0x6c: /* mpeg1 */
3267 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'j','p','e','g' );
3270 pid
->es
->fmt
.i_cat
= UNKNOWN_ES
;
3274 else if( dcd
->i_streamType
== 0x05 ) /* AudioStream */
3276 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3277 switch( dcd
->i_objectTypeIndication
)
3279 case 0x40: /* mpeg4 */
3280 pid
->es
->fmt
.i_codec
= VLC_FOURCC('m','p','4','a');
3284 case 0x68: /* mpeg2 aac */
3285 pid
->es
->fmt
.i_codec
= VLC_FOURCC('m','p','4','a');
3287 case 0x69: /* mpeg2 */
3288 pid
->es
->fmt
.i_codec
= VLC_FOURCC('m','p','g','a');
3290 case 0x6b: /* mpeg1 */
3291 pid
->es
->fmt
.i_codec
= VLC_FOURCC('m','p','g','a');
3294 pid
->es
->fmt
.i_cat
= UNKNOWN_ES
;
3300 pid
->es
->fmt
.i_cat
= UNKNOWN_ES
;
3303 if( pid
->es
->fmt
.i_cat
!= UNKNOWN_ES
)
3305 pid
->es
->fmt
.i_extra
= dcd
->i_decoder_specific_info_len
;
3306 if( pid
->es
->fmt
.i_extra
> 0 )
3308 pid
->es
->fmt
.p_extra
= malloc( pid
->es
->fmt
.i_extra
);
3309 if( pid
->es
->fmt
.p_extra
)
3310 memcpy( pid
->es
->fmt
.p_extra
,
3311 dcd
->p_decoder_specific_info
,
3312 pid
->es
->fmt
.i_extra
);
3317 else if( p_es
->i_type
== 0x06 )
3319 dvbpsi_descriptor_t
*p_dr
;
3321 for( p_dr
= p_es
->p_first_descriptor
; p_dr
!= NULL
;
3322 p_dr
= p_dr
->p_next
)
3324 msg_Dbg( p_demux
, " * es pid=%d type=%d dr->i_tag=0x%x",
3325 p_es
->i_pid
, p_es
->i_type
, p_dr
->i_tag
);
3327 if( p_dr
->i_tag
== 0x05 )
3329 /* Registration Descriptor */
3330 if( p_dr
->i_length
!= 4 )
3332 msg_Warn( p_demux
, "invalid Registration Descriptor" );
3336 if( !memcmp( p_dr
->p_data
, "AC-3", 4 ) )
3338 /* ATSC with stream_type 0x81 (but this descriptor
3339 * is then not mandatory */
3340 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3341 pid
->es
->fmt
.i_codec
= VLC_FOURCC('a','5','2',' ');
3343 else if( !memcmp( p_dr
->p_data
, "DTS1", 4 ) ||
3344 !memcmp( p_dr
->p_data
, "DTS2", 4 ) ||
3345 !memcmp( p_dr
->p_data
, "DTS3", 4 ) )
3347 /*registration descriptor(ETSI TS 101 154 Annex F)*/
3348 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3349 pid
->es
->fmt
.i_codec
= VLC_FOURCC('d','t','s',' ');
3351 else if( !memcmp( p_dr
->p_data
, "BSSD", 4 ) )
3353 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3354 pid
->es
->fmt
.b_packetized
= true;
3355 pid
->es
->fmt
.i_codec
= VLC_FOURCC('a','e','s','3');
3360 "unknown Registration Descriptor (%4.4s)",
3366 else if( p_dr
->i_tag
== 0x6a )
3368 /* DVB with stream_type 0x06 */
3369 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3370 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'a', '5', '2', ' ' );
3372 else if( p_dr
->i_tag
== 0x81 )
3374 /* ATSC with stream_type 0x06 */
3375 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3376 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'a', '5', '2', ' ' );
3378 else if( p_dr
->i_tag
== 0x7a )
3380 /* DVB with stream_type 0x06 (ETS EN 300 468) */
3381 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3382 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'e', 'a', 'c', '3' );
3384 else if( p_dr
->i_tag
== 0x73 )
3386 /* DTS audio descriptor (ETSI TS 101 154 Annex F) */
3387 msg_Dbg( p_demux
, " * DTS audio descriptor not decoded" );
3388 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3389 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'd', 't', 's', ' ' );
3391 else if( p_dr
->i_tag
== 0x45 )
3393 msg_Dbg( p_demux
, " * VBI Data descriptor" );
3394 /* FIXME : store the information somewhere */
3396 else if( p_dr
->i_tag
== 0x46 )
3398 msg_Dbg( p_demux
, " * VBI Teletext descriptor" );
3399 /* FIXME : store the information somewhere */
3401 #ifdef _DVBPSI_DR_52_H_
3402 else if( p_dr
->i_tag
== 0x52 )
3404 dvbpsi_stream_identifier_dr_t
*si
;
3405 si
= dvbpsi_DecodeStreamIdentifierDr( p_dr
);
3407 msg_Dbg( p_demux
, " * Stream Component Identifier: %d", si
->i_component_tag
);
3410 else if( p_dr
->i_tag
== 0x56 )
3412 msg_Dbg( p_demux
, " * EBU Teletext descriptor" );
3413 pid
->es
->fmt
.i_cat
= SPU_ES
;
3414 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 't', 'e', 'l', 'x' );
3415 pid
->es
->fmt
.i_extra
= p_dr
->i_length
;
3416 pid
->es
->fmt
.p_extra
= p_dr
->i_length
?
3417 malloc( p_dr
->i_length
) : NULL
;
3418 if( pid
->es
->fmt
.p_extra
)
3419 memcpy( pid
->es
->fmt
.p_extra
, p_dr
->p_data
,
3422 #if defined _DVBPSI_DR_56_H_ && defined DVBPSI_VERSION \
3423 && DVBPSI_VERSION_INT > ((0<<16)+(1<<8)+5)
3424 pid
->es
->fmt
.i_group
= p_pmt
->i_program_number
;
3426 /* In stream output mode, only enable descriptor
3428 if( !p_demux
->out
->b_sout
)
3431 dvbpsi_teletext_dr_t
*sub
;
3433 sub
= dvbpsi_DecodeTeletextDr( p_dr
);
3434 if( !sub
) continue;
3436 /* Each subtitle ES contains n languages,
3437 * We are going to create n ES for the n tracks */
3438 for( n
= 0; n
< sub
->i_pages_number
; n
++ )
3440 dvbpsi_teletextpage_t
*p_page
= &sub
->p_pages
[n
];
3441 if( p_page
->i_teletext_type
> 0x0 &&
3442 p_page
->i_teletext_type
< 0x6 )
3452 p_es
= malloc( sizeof( ts_es_t
) );
3455 es_format_Copy( &p_es
->fmt
, &pid
->es
->fmt
);
3456 free( p_es
->fmt
.psz_language
);
3457 free( p_es
->fmt
.psz_description
);
3458 p_es
->fmt
.psz_language
= NULL
;
3459 p_es
->fmt
.psz_description
= NULL
;
3462 p_es
->i_pes_size
= 0;
3463 p_es
->i_pes_gathered
= 0;
3464 p_es
->pp_last
= &p_es
->p_pes
;
3465 p_es
->p_mpeg4desc
= NULL
;
3467 TAB_APPEND( pid
->i_extra_es
, pid
->extra_es
,
3471 p_es
->fmt
.psz_language
= malloc( 4 );
3472 if( p_es
->fmt
.psz_language
)
3474 memcpy( p_es
->fmt
.psz_language
,
3475 p_page
->i_iso6392_language_code
, 3 );
3476 p_es
->fmt
.psz_language
[3] = 0;
3478 p_es
->fmt
.psz_description
= strdup(_(ppsz_teletext_type
[p_page
->i_teletext_type
]));
3481 " * ttxt type=%s lan=%s page=%d%02x",
3482 p_es
->fmt
.psz_description
,
3483 p_es
->fmt
.psz_language
,
3484 p_page
->i_teletext_magazine_number
,
3485 p_page
->i_teletext_page_number
);
3487 /* Hack, FIXME This stores the initial page for this track,
3488 so that it can be used by the telx and zvbi decoders. */
3489 p_es
->fmt
.subs
.dvb
.i_id
=
3490 p_page
->i_teletext_page_number
;
3491 p_es
->fmt
.subs
.dvb
.i_id
|=
3492 ((int)p_page
->i_teletext_magazine_number
<< 16);
3499 pid
->es
->fmt
.i_cat
= UNKNOWN_ES
;
3502 #endif /* defined _DVBPSI_DR_56_H_ && DVBPSI_VERSION(0,1,6) */
3504 pid
->es
->fmt
.subs
.dvb
.i_id
= -1;
3505 pid
->es
->fmt
.psz_description
= strdup( _(ppsz_teletext_type
[1]) );
3508 else if( p_dr
->i_tag
== 0x59 )
3511 pid
->es
->fmt
.i_cat
= SPU_ES
;
3512 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'd', 'v', 'b', 's' );
3513 pid
->es
->fmt
.i_extra
= p_dr
->i_length
;
3514 pid
->es
->fmt
.p_extra
= malloc( p_dr
->i_length
);
3515 if( pid
->es
->fmt
.p_extra
)
3516 memcpy( pid
->es
->fmt
.p_extra
, p_dr
->p_data
,
3519 #ifdef _DVBPSI_DR_59_H_
3520 pid
->es
->fmt
.i_group
= p_pmt
->i_program_number
;
3522 /* In stream output mode, only enable descriptor
3524 if( !p_demux
->out
->b_sout
)
3527 dvbpsi_subtitling_dr_t
*sub
;
3529 sub
= dvbpsi_DecodeSubtitlingDr( p_dr
);
3530 if( !sub
) continue;
3532 for( n
= 0; n
< sub
->i_subtitles_number
; n
++ )
3534 dvbpsi_subtitle_t
*p_sub
= &sub
->p_subtitle
[n
];
3543 p_es
= malloc( sizeof( ts_es_t
) );
3545 es_format_Copy( &p_es
->fmt
, &pid
->es
->fmt
);
3546 free( p_es
->fmt
.psz_language
); p_es
->fmt
.psz_language
= NULL
;
3547 free( p_es
->fmt
.psz_description
); p_es
->fmt
.psz_description
= NULL
;
3551 p_es
->i_pes_size
= 0;
3552 p_es
->i_pes_gathered
= 0;
3553 p_es
->pp_last
= &p_es
->p_pes
;
3554 p_es
->p_mpeg4desc
= NULL
;
3556 TAB_APPEND( pid
->i_extra_es
, pid
->extra_es
,
3560 p_es
->fmt
.psz_language
= malloc( 4 );
3561 if( p_es
->fmt
.psz_language
)
3563 memcpy( p_es
->fmt
.psz_language
,
3564 p_sub
->i_iso6392_language_code
, 3 );
3565 p_es
->fmt
.psz_language
[3] = 0;
3568 switch( p_sub
->i_subtitling_type
)
3570 case 0x10: /* unspec. */
3571 case 0x11: /* 4:3 */
3572 case 0x12: /* 16:9 */
3573 case 0x13: /* 2.21:1 */
3574 p_es
->fmt
.psz_description
=
3575 strdup(_("DVB subtitles"));
3577 case 0x20: /* Hearing impaired unspec. */
3578 case 0x21: /* h.i. 4:3 */
3579 case 0x22: /* h.i. 16:9 */
3580 case 0x23: /* h.i. 2.21:1 */
3581 p_es
->fmt
.psz_description
=
3582 strdup(_("DVB subtitles: hearing impaired"));
3588 p_es
->fmt
.subs
.dvb
.i_id
=
3589 p_sub
->i_composition_page_id
;
3591 p_es
->fmt
.subs
.dvb
.i_id
|=
3592 ((int)p_sub
->i_ancillary_page_id
<< 16);
3598 pid
->es
->fmt
.i_cat
= UNKNOWN_ES
;
3601 #endif /* _DVBPSI_DR_59_H_ */
3603 pid
->es
->fmt
.subs
.dvb
.i_id
= -1;
3604 pid
->es
->fmt
.psz_description
= strdup( _("DVB subtitles") );
3609 else if( p_es
->i_type
== 0xEA )
3611 dvbpsi_descriptor_t
*p_dr
;
3613 for( p_dr
= p_es
->p_first_descriptor
; p_dr
!= NULL
;
3614 p_dr
= p_dr
->p_next
)
3616 msg_Dbg( p_demux
, " * es pid=%d type=%d dr->i_tag=0x%x",
3617 p_es
->i_pid
, p_es
->i_type
, p_dr
->i_tag
);
3619 if( p_dr
->i_tag
== 0x05 )
3621 /* Registration Descriptor */
3622 if( p_dr
->i_length
< 4 ) // XXX VC-1 has extended this descriptor with sub-descriptor
3624 msg_Warn( p_demux
, "invalid Registration Descriptor" );
3628 if( !memcmp( p_dr
->p_data
, "VC-1", 4 ) )
3630 /* registration descriptor for VC-1 (SMPTE rp227) */
3631 pid
->es
->fmt
.i_cat
= VIDEO_ES
;
3632 pid
->es
->fmt
.i_codec
= VLC_FOURCC('W','V','C','1');
3634 /* XXX With Simple and Main profile the SEQUENCE
3635 * header is modified: video width and height are
3636 * inserted just after the start code as 2 int16_t
3637 * The packetizer will take care of that. */
3642 "unknown Registration Descriptor (%4.4s)",
3649 else if( p_es
->i_type
== 0xd1 )
3651 dvbpsi_descriptor_t
*p_dr
;
3653 for( p_dr
= p_es
->p_first_descriptor
; p_dr
!= NULL
;
3654 p_dr
= p_dr
->p_next
)
3656 msg_Dbg( p_demux
, " * es pid=%d type=%d dr->i_tag=0x%x",
3657 p_es
->i_pid
, p_es
->i_type
, p_dr
->i_tag
);
3659 if( p_dr
->i_tag
== 0x05 )
3661 /* Registration Descriptor */
3662 if( !memcmp( p_dr
->p_data
, "drac", 4 ) )
3664 /* registration descriptor for Dirac
3665 * (backwards compatable with VC-2 (SMPTE Sxxxx:2008)) */
3666 pid
->es
->fmt
.i_cat
= VIDEO_ES
;
3667 pid
->es
->fmt
.i_codec
= VLC_FOURCC('d','r','a','c');
3672 "unknown Registration Descriptor (%4.4s)",
3678 else if( p_es
->i_type
== 0xa0 )
3680 /* MSCODEC sent by vlc */
3681 dvbpsi_descriptor_t
*p_dr
= p_es
->p_first_descriptor
;
3683 while( p_dr
&& ( p_dr
->i_tag
!= 0xa0 ) ) p_dr
= p_dr
->p_next
;
3685 if( p_dr
&& p_dr
->i_length
>= 8 )
3687 pid
->es
->fmt
.i_cat
= VIDEO_ES
;
3688 pid
->es
->fmt
.i_codec
=
3689 VLC_FOURCC( p_dr
->p_data
[0], p_dr
->p_data
[1],
3690 p_dr
->p_data
[2], p_dr
->p_data
[3] );
3691 pid
->es
->fmt
.video
.i_width
=
3692 ( p_dr
->p_data
[4] << 8 ) | p_dr
->p_data
[5];
3693 pid
->es
->fmt
.video
.i_height
=
3694 ( p_dr
->p_data
[6] << 8 ) | p_dr
->p_data
[7];
3695 pid
->es
->fmt
.i_extra
=
3696 (p_dr
->p_data
[8] << 8) | p_dr
->p_data
[9];
3698 if( pid
->es
->fmt
.i_extra
> 0 )
3700 pid
->es
->fmt
.p_extra
= malloc( pid
->es
->fmt
.i_extra
);
3701 if( pid
->es
->fmt
.p_extra
)
3702 memcpy( pid
->es
->fmt
.p_extra
, &p_dr
->p_data
[10],
3703 pid
->es
->fmt
.i_extra
);
3708 msg_Warn( p_demux
, "private MSCODEC (vlc) without bih private "
3711 /* For such stream we will gather them ourself and don't launch a
3713 * Yes it's ugly but it's the only way to have DIV3 working */
3714 pid
->es
->fmt
.b_packetized
= true;
3718 /* Blu-Ray mapping */
3719 switch( p_es
->i_type
)
3722 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3723 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'l', 'p', 'c', 'm' );
3726 case 0x85: /* DTS-HD High resolution audio */
3727 case 0x86: /* DTS-HD Master audio */
3728 case 0xA2: /* Secondary DTS audio */
3729 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3730 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'd', 't', 's', ' ' );
3732 case 0x83: /* TrueHD AC3 */
3733 case 0x84: /* E-AC3 */
3734 case 0x87: /* E-AC3 */
3735 case 0xA1: /* Secondary E-AC3 */
3736 pid
->es
->fmt
.i_cat
= AUDIO_ES
;
3737 pid
->es
->fmt
.i_codec
= VLC_FOURCC( 'e', 'a', 'c', '3' );
3739 case 0x90: /* Presentation graphics */
3740 case 0x91: /* Interactive graphics */
3741 case 0x92: /* Subtitle */
3747 if( pid
->es
->fmt
.i_cat
== AUDIO_ES
||
3748 ( pid
->es
->fmt
.i_cat
== SPU_ES
&&
3749 pid
->es
->fmt
.i_codec
!= VLC_FOURCC('d','v','b','s') &&
3750 pid
->es
->fmt
.i_codec
!= VLC_FOURCC('t','e','l','x') ) )
3752 /* get language descriptor */
3753 dvbpsi_descriptor_t
*p_dr
= p_es
->p_first_descriptor
;
3754 while( p_dr
&& ( p_dr
->i_tag
!= 0x0a ) ) p_dr
= p_dr
->p_next
;
3758 dvbpsi_iso639_dr_t
*p_decoded
= dvbpsi_DecodeISO639Dr( p_dr
);
3762 #if defined(DR_0A_API_VER) && (DR_0A_API_VER >= 2)
3763 pid
->es
->fmt
.psz_language
= malloc( 4 );
3764 if( pid
->es
->fmt
.psz_language
)
3766 memcpy( pid
->es
->fmt
.psz_language
,
3767 p_decoded
->code
[0].iso_639_code
, 3 );
3768 pid
->es
->fmt
.psz_language
[3] = 0;
3769 msg_Dbg( p_demux
, "found language: %s", pid
->es
->fmt
.psz_language
);
3771 switch( p_decoded
->code
[0].i_audio_type
) {
3773 pid
->es
->fmt
.psz_description
= NULL
;
3776 pid
->es
->fmt
.psz_description
=
3777 strdup(_("clean effects"));
3780 pid
->es
->fmt
.psz_description
=
3781 strdup(_("hearing impaired"));
3784 pid
->es
->fmt
.psz_description
=
3785 strdup(_("visual impaired commentary"));
3788 msg_Dbg( p_demux
, "unknown audio type: %d",
3789 p_decoded
->code
[0].i_audio_type
);
3790 pid
->es
->fmt
.psz_description
= NULL
;
3793 pid
->es
->fmt
.i_extra_languages
= p_decoded
->i_code_count
-1;
3794 if( pid
->es
->fmt
.i_extra_languages
> 0 )
3795 pid
->es
->fmt
.p_extra_languages
=
3796 malloc( sizeof(*pid
->es
->fmt
.p_extra_languages
) *
3797 pid
->es
->fmt
.i_extra_languages
);
3798 if( pid
->es
->fmt
.p_extra_languages
)
3800 for( i
= 0; i
< pid
->es
->fmt
.i_extra_languages
; i
++ )
3802 msg_Dbg( p_demux
, "bang" );
3803 pid
->es
->fmt
.p_extra_languages
[i
].psz_language
=
3805 if( pid
->es
->fmt
.p_extra_languages
[i
].psz_language
)
3807 memcpy( pid
->es
->fmt
.p_extra_languages
[i
].psz_language
,
3808 p_decoded
->code
[i
+1].iso_639_code
, 3 );
3809 pid
->es
->fmt
.p_extra_languages
[i
].psz_language
[3] = '\0';
3811 switch( p_decoded
->code
[i
].i_audio_type
) {
3813 pid
->es
->fmt
.p_extra_languages
[i
].psz_description
=
3817 pid
->es
->fmt
.p_extra_languages
[i
].psz_description
=
3818 strdup(_("clean effects"));
3821 pid
->es
->fmt
.p_extra_languages
[i
].psz_description
=
3822 strdup(_("hearing impaired"));
3825 pid
->es
->fmt
.p_extra_languages
[i
].psz_description
=
3826 strdup(_("visual impaired commentary"));
3829 msg_Dbg( p_demux
, "unknown audio type: %d",
3830 p_decoded
->code
[i
].i_audio_type
);
3831 pid
->es
->fmt
.psz_description
= NULL
;
3838 pid
->es
->fmt
.psz_language
= malloc( 4 );
3839 if( pid
->es
->fmt
.psz_language
)
3841 memcpy( pid
->es
->fmt
.psz_language
,
3842 p_decoded
->i_iso_639_code
, 3 );
3843 pid
->es
->fmt
.psz_language
[3] = 0;
3850 pid
->es
->fmt
.i_group
= p_pmt
->i_program_number
;
3851 if( pid
->es
->fmt
.i_cat
== UNKNOWN_ES
)
3853 msg_Dbg( p_demux
, " * es pid=%d type=%d *unknown*",
3854 p_es
->i_pid
, p_es
->i_type
);
3856 else if( !p_sys
->b_udp_out
)
3858 msg_Dbg( p_demux
, " * es pid=%d type=%d fcc=%4.4s",
3859 p_es
->i_pid
, p_es
->i_type
, (char*)&pid
->es
->fmt
.i_codec
);
3861 if( p_sys
->b_es_id_pid
) pid
->es
->fmt
.i_id
= p_es
->i_pid
;
3863 /* Check if we can avoid restarting the ES */
3865 pid
->es
->fmt
.i_codec
== old_pid
->es
->fmt
.i_codec
&&
3866 pid
->es
->fmt
.i_extra
== old_pid
->es
->fmt
.i_extra
&&
3867 pid
->es
->fmt
.i_extra
== 0 &&
3868 pid
->i_extra_es
== old_pid
->i_extra_es
&&
3869 ( ( !pid
->es
->fmt
.psz_language
&&
3870 !old_pid
->es
->fmt
.psz_language
) ||
3871 ( pid
->es
->fmt
.psz_language
&&
3872 old_pid
->es
->fmt
.psz_language
&&
3873 !strcmp( pid
->es
->fmt
.psz_language
,
3874 old_pid
->es
->fmt
.psz_language
) ) ) )
3876 pid
->es
->id
= old_pid
->es
->id
;
3877 old_pid
->es
->id
= NULL
;
3878 for( i
= 0; i
< pid
->i_extra_es
; i
++ )
3880 pid
->extra_es
[i
]->id
= old_pid
->extra_es
[i
]->id
;
3881 old_pid
->extra_es
[i
]->id
= NULL
;
3888 PIDClean( p_demux
->out
, old_pid
);
3889 TAB_REMOVE( i_clean
, pp_clean
, old_pid
);
3893 pid
->es
->id
= es_out_Add( p_demux
->out
, &pid
->es
->fmt
);
3894 for( i
= 0; i
< pid
->i_extra_es
; i
++ )
3896 pid
->extra_es
[i
]->id
=
3897 es_out_Add( p_demux
->out
, &pid
->extra_es
[i
]->fmt
);
3902 /* Add ES to the list */
3905 PIDClean( p_demux
->out
, old_pid
);
3906 TAB_REMOVE( i_clean
, pp_clean
, old_pid
);
3908 p_sys
->pid
[p_es
->i_pid
] = *pid
;
3910 for( p_dr
= p_es
->p_first_descriptor
; p_dr
!= NULL
;
3911 p_dr
= p_dr
->p_next
)
3913 if( p_dr
->i_tag
== 0x9 )
3915 uint16_t i_sysid
= ((uint16_t)p_dr
->p_data
[0] << 8)
3917 msg_Dbg( p_demux
, " * descriptor : CA (0x9) SysID 0x%x",
3922 if( DVBProgramIsSelected( p_demux
, prg
->i_number
)
3923 && (pid
->es
->id
!= NULL
|| p_sys
->b_udp_out
) )
3925 /* Set demux filter */
3926 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
3927 ACCESS_SET_PRIVATE_ID_STATE
, p_es
->i_pid
,
3932 if( DVBProgramIsSelected( p_demux
, prg
->i_number
) )
3934 /* Set CAM descrambling */
3935 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
3936 ACCESS_SET_PRIVATE_ID_CA
, p_pmt
);
3940 dvbpsi_DeletePMT( p_pmt
);
3943 for ( i
= 0; i
< i_clean
; i
++ )
3945 if( DVBProgramIsSelected( p_demux
, prg
->i_number
) )
3947 stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
3948 ACCESS_SET_PRIVATE_ID_STATE
, pp_clean
[i
]->i_pid
,
3952 PIDClean( p_demux
->out
, pp_clean
[i
] );
3954 if( i_clean
) free( pp_clean
);
3957 static void PATCallBack( demux_t
*p_demux
, dvbpsi_pat_t
*p_pat
)
3959 demux_sys_t
*p_sys
= p_demux
->p_sys
;
3960 dvbpsi_pat_program_t
*p_program
;
3961 ts_pid_t
*pat
= &p_sys
->pid
[0];
3964 msg_Dbg( p_demux
, "PATCallBack called" );
3966 if( ( pat
->psi
->i_pat_version
!= -1 &&
3967 ( !p_pat
->b_current_next
||
3968 p_pat
->i_version
== pat
->psi
->i_pat_version
) ) ||
3971 dvbpsi_DeletePAT( p_pat
);
3975 msg_Dbg( p_demux
, "new PAT ts_id=%d version=%d current_next=%d",
3976 p_pat
->i_ts_id
, p_pat
->i_version
, p_pat
->b_current_next
);
3979 if( p_sys
->i_pmt
> 0 )
3982 ts_pid_t
**pmt_rm
= NULL
;
3984 /* Search pmt to be deleted */
3985 for( i
= 0; i
< p_sys
->i_pmt
; i
++ )
3987 ts_pid_t
*pmt
= p_sys
->pmt
[i
];
3988 bool b_keep
= false;
3990 for( p_program
= p_pat
->p_first_program
; p_program
!= NULL
;
3991 p_program
= p_program
->p_next
)
3993 if( p_program
->i_pid
== pmt
->i_pid
)
3996 for( i_prg
= 0; i_prg
< pmt
->psi
->i_prg
; i_prg
++ )
3998 if( p_program
->i_number
==
3999 pmt
->psi
->prg
[i_prg
]->i_number
)
4011 TAB_APPEND( i_pmt_rm
, pmt_rm
, pmt
);
4015 /* Delete all ES attached to thoses PMT */
4016 for( i
= 2; i
< 8192; i
++ )
4018 ts_pid_t
*pid
= &p_sys
->pid
[i
];
4020 if( !pid
->b_valid
|| pid
->psi
) continue;
4022 for( j
= 0; j
< i_pmt_rm
&& pid
->b_valid
; j
++ )
4025 for( i_prg
= 0; i_prg
< pid
->p_owner
->i_prg
; i_prg
++ )
4027 /* We only remove es that aren't defined by extra pmt */
4028 if( pid
->p_owner
->prg
[i_prg
]->i_pid_pmt
!=
4029 pmt_rm
[j
]->i_pid
) continue;
4031 if( p_sys
->b_dvb_control
&& pid
->es
->id
)
4033 if( stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
4034 ACCESS_SET_PRIVATE_ID_STATE
, i
,
4036 p_sys
->b_dvb_control
= false;
4039 PIDClean( p_demux
->out
, pid
);
4045 /* Delete PMT pid */
4046 for( i
= 0; i
< i_pmt_rm
; i
++ )
4049 if( p_sys
->b_dvb_control
)
4051 if( stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
4052 ACCESS_SET_PRIVATE_ID_STATE
,
4053 pmt_rm
[i
]->i_pid
, false ) )
4054 p_sys
->b_dvb_control
= false;
4057 for( i_prg
= 0; i_prg
< pmt_rm
[i
]->psi
->i_prg
; i_prg
++ )
4059 const int i_number
= pmt_rm
[i
]->psi
->prg
[i_prg
]->i_number
;
4060 es_out_Control( p_demux
->out
, ES_OUT_DEL_GROUP
, i_number
);
4063 PIDClean( p_demux
->out
, &p_sys
->pid
[pmt_rm
[i
]->i_pid
] );
4064 TAB_REMOVE( p_sys
->i_pmt
, p_sys
->pmt
, pmt_rm
[i
] );
4070 /* now create programs */
4071 for( p_program
= p_pat
->p_first_program
; p_program
!= NULL
;
4072 p_program
= p_program
->p_next
)
4074 msg_Dbg( p_demux
, " * number=%d pid=%d", p_program
->i_number
,
4076 if( p_program
->i_number
!= 0 )
4078 ts_pid_t
*pmt
= &p_sys
->pid
[p_program
->i_pid
];
4084 for( i_prg
= 0; i_prg
< pmt
->psi
->i_prg
; i_prg
++ )
4086 if( pmt
->psi
->prg
[i_prg
]->i_number
== p_program
->i_number
)
4095 TAB_APPEND( p_sys
->i_pmt
, p_sys
->pmt
, pmt
);
4100 PIDInit( pmt
, true, pat
->psi
);
4101 pmt
->psi
->prg
[pmt
->psi
->i_prg
-1]->handle
=
4102 dvbpsi_AttachPMT( p_program
->i_number
,
4103 (dvbpsi_pmt_callback
)PMTCallBack
,
4105 pmt
->psi
->prg
[pmt
->psi
->i_prg
-1]->i_number
=
4106 p_program
->i_number
;
4107 pmt
->psi
->prg
[pmt
->psi
->i_prg
-1]->i_pid_pmt
=
4110 /* Now select PID at access level */
4111 if( p_sys
->b_dvb_control
)
4113 if( DVBProgramIsSelected( p_demux
, p_program
->i_number
) )
4115 if( p_sys
->i_dvb_program
== 0 )
4116 p_sys
->i_dvb_program
= p_program
->i_number
;
4118 if( stream_Control( p_demux
->s
, STREAM_CONTROL_ACCESS
,
4119 ACCESS_SET_PRIVATE_ID_STATE
,
4120 p_program
->i_pid
, true ) )
4121 p_sys
->b_dvb_control
= false;
4127 pat
->psi
->i_pat_version
= p_pat
->i_version
;
4129 dvbpsi_DeletePAT( p_pat
);