ts.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:136k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * ts.c: Transport Stream input module for VLC.
  3.  *****************************************************************************
  4.  * Copyright (C) 2004-2005 the VideoLAN team
  5.  * $Id: b36dc4f95c879180c1d0893655b12ff7590b9f81 $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Jean-Paul Saman <jpsaman #_at_# m2x.nl>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_plugin.h>
  32. #include <ctype.h>
  33. #include <assert.h>
  34. #include <vlc_access.h> /* DVB-specific things */
  35. #include <vlc_demux.h>
  36. #include <vlc_meta.h>
  37. #include <vlc_epg.h>
  38. #include <vlc_iso_lang.h>
  39. #include <vlc_network.h>
  40. #include <vlc_charset.h>
  41. #include "../mux/mpeg/csa.h"
  42. /* Include dvbpsi headers */
  43. #ifdef HAVE_DVBPSI_DR_H
  44. #   include <dvbpsi/dvbpsi.h>
  45. #   include <dvbpsi/demux.h>
  46. #   include <dvbpsi/descriptor.h>
  47. #   include <dvbpsi/pat.h>
  48. #   include <dvbpsi/pmt.h>
  49. #   include <dvbpsi/sdt.h>
  50. #   include <dvbpsi/dr.h>
  51. #   include <dvbpsi/psi.h>
  52. #else
  53. #   include "dvbpsi.h"
  54. #   include "demux.h"
  55. #   include "descriptor.h"
  56. #   include "tables/pat.h"
  57. #   include "tables/pmt.h"
  58. #   include "tables/sdt.h"
  59. #   include "descriptors/dr.h"
  60. #   include "psi.h"
  61. #endif
  62. /* EIT support */
  63. #ifdef _DVBPSI_DR_4D_H_
  64. #   define TS_USE_DVB_SI 1
  65. #   ifdef HAVE_DVBPSI_DR_H
  66. #       include <dvbpsi/eit.h>
  67. #   else
  68. #       include "tables/eit.h"
  69. #   endif
  70. #endif
  71. #include <time.h>
  72. #undef TS_DEBUG
  73. /*****************************************************************************
  74.  * Module descriptor
  75.  *****************************************************************************/
  76. static int  Open  ( vlc_object_t * );
  77. static void Close ( vlc_object_t * );
  78. /* TODO
  79.  * - Rename "extra pmt" to "user pmt"
  80.  * - Update extra pmt description
  81.  *      pmt_pid[:pmt_number][=pid_description[,pid_description]]
  82.  *      where pid_description could take 3 forms:
  83.  *          1. pid:pcr (to force the pcr pid)
  84.  *          2. pid:stream_type
  85.  *          3. pid:type=fourcc where type=(video|audio|spu)
  86.  */
  87. #define PMT_TEXT N_("Extra PMT")
  88. #define PMT_LONGTEXT N_( 
  89.   "Allows a user to specify an extra pmt (pmt_pid=pid:stream_type[,...])." )
  90. #define PID_TEXT N_("Set id of ES to PID")
  91. #define PID_LONGTEXT N_("Set the internal ID of each elementary stream" 
  92.                        " handled by VLC to the same value as the PID in" 
  93.                        " the TS stream, instead of 1, 2, 3, etc. Useful to" 
  94.                        " do '#duplicate{..., select="es=<pid>"}'.")
  95. #define TSOUT_TEXT N_("Fast udp streaming")
  96. #define TSOUT_LONGTEXT N_( 
  97.   "Sends TS to specific ip:port by udp (you must know what you are doing).")
  98. #define MTUOUT_TEXT N_("MTU for out mode")
  99. #define MTUOUT_LONGTEXT N_("MTU for out mode.")
  100. #define CSA_TEXT N_("CSA ck")
  101. #define CSA_LONGTEXT N_("Control word for the CSA encryption algorithm")
  102. #define CSA2_TEXT N_("Second CSA Key")
  103. #define CSA2_LONGTEXT N_("The even CSA encryption key. This must be a " 
  104.   "16 char string (8 hexadecimal bytes).")
  105. #define SILENT_TEXT N_("Silent mode")
  106. #define SILENT_LONGTEXT N_("Do not complain on encrypted PES.")
  107. #define CAPMT_SYSID_TEXT N_("CAPMT System ID")
  108. #define CAPMT_SYSID_LONGTEXT N_("Only forward descriptors from this SysID to the CAM.")
  109. #define CPKT_TEXT N_("Packet size in bytes to decrypt")
  110. #define CPKT_LONGTEXT N_("Specify the size of the TS packet to decrypt. " 
  111.     "The decryption routines subtract the TS-header from the value before " 
  112.     "decrypting. " )
  113. #define TSDUMP_TEXT N_("Filename of dump")
  114. #define TSDUMP_LONGTEXT N_("Specify a filename where to dump the TS in.")
  115. #define APPEND_TEXT N_("Append")
  116. #define APPEND_LONGTEXT N_( 
  117.     "If the file exists and this option is selected, the existing file " 
  118.     "will not be overwritten." )
  119. #define DUMPSIZE_TEXT N_("Dump buffer size")
  120. #define DUMPSIZE_LONGTEXT N_( 
  121.     "Tweak the buffer size for reading and writing an integer number of packets." 
  122.     "Specify the size of the buffer here and not the number of packets." )
  123. vlc_module_begin ()
  124.     set_description( N_("MPEG Transport Stream demuxer") )
  125.     set_shortname ( "MPEG-TS" )
  126.     set_category( CAT_INPUT )
  127.     set_subcategory( SUBCAT_INPUT_DEMUX )
  128.     add_string( "ts-extra-pmt", NULL, NULL, PMT_TEXT, PMT_LONGTEXT, true )
  129.     add_bool( "ts-es-id-pid", 1, NULL, PID_TEXT, PID_LONGTEXT, true )
  130.     add_string( "ts-out", NULL, NULL, TSOUT_TEXT, TSOUT_LONGTEXT, true )
  131.     add_integer( "ts-out-mtu", 1400, NULL, MTUOUT_TEXT,
  132.                  MTUOUT_LONGTEXT, true )
  133.     add_string( "ts-csa-ck", NULL, NULL, CSA_TEXT, CSA_LONGTEXT, true )
  134.     add_string( "ts-csa2-ck", NULL, NULL, CSA_TEXT, CSA_LONGTEXT, true )
  135.     add_integer( "ts-csa-pkt", 188, NULL, CPKT_TEXT, CPKT_LONGTEXT, true )
  136.     add_bool( "ts-silent", 0, NULL, SILENT_TEXT, SILENT_LONGTEXT, true )
  137.     add_file( "ts-dump-file", NULL, NULL, TSDUMP_TEXT, TSDUMP_LONGTEXT, false )
  138.     add_bool( "ts-dump-append", 0, NULL, APPEND_TEXT, APPEND_LONGTEXT, false )
  139.     add_integer( "ts-dump-size", 16384, NULL, DUMPSIZE_TEXT,
  140.                  DUMPSIZE_LONGTEXT, true )
  141.     set_capability( "demux", 10 )
  142.     set_callbacks( Open, Close )
  143.     add_shortcut( "ts" )
  144. vlc_module_end ()
  145. /*****************************************************************************
  146.  * Local prototypes
  147.  *****************************************************************************/
  148. static const char *const ppsz_teletext_type[] = {
  149.  "",
  150.  N_("Teletext"),
  151.  N_("Teletext subtitles"),
  152.  N_("Teletext: additional information"),
  153.  N_("Teletext: program schedule"),
  154.  N_("Teletext subtitles: hearing impaired")
  155. };
  156. typedef struct
  157. {
  158.     uint8_t                 i_objectTypeIndication;
  159.     uint8_t                 i_streamType;
  160.     bool                    b_upStream;
  161.     uint32_t                i_bufferSizeDB;
  162.     uint32_t                i_maxBitrate;
  163.     uint32_t                i_avgBitrate;
  164.     int                     i_decoder_specific_info_len;
  165.     uint8_t                 *p_decoder_specific_info;
  166. } decoder_config_descriptor_t;
  167. typedef struct
  168. {
  169.     bool                    b_useAccessUnitStartFlag;
  170.     bool                    b_useAccessUnitEndFlag;
  171.     bool                    b_useRandomAccessPointFlag;
  172.     bool                    b_useRandomAccessUnitsOnlyFlag;
  173.     bool                    b_usePaddingFlag;
  174.     bool                    b_useTimeStampsFlags;
  175.     bool                    b_useIdleFlag;
  176.     bool                    b_durationFlag;
  177.     uint32_t                i_timeStampResolution;
  178.     uint32_t                i_OCRResolution;
  179.     uint8_t                 i_timeStampLength;
  180.     uint8_t                 i_OCRLength;
  181.     uint8_t                 i_AU_Length;
  182.     uint8_t                 i_instantBitrateLength;
  183.     uint8_t                 i_degradationPriorityLength;
  184.     uint8_t                 i_AU_seqNumLength;
  185.     uint8_t                 i_packetSeqNumLength;
  186.     uint32_t                i_timeScale;
  187.     uint16_t                i_accessUnitDuration;
  188.     uint16_t                i_compositionUnitDuration;
  189.     uint64_t                i_startDecodingTimeStamp;
  190.     uint64_t                i_startCompositionTimeStamp;
  191. } sl_config_descriptor_t;
  192. typedef struct
  193. {
  194.     bool                    b_ok;
  195.     uint16_t                i_es_id;
  196.     bool                    b_streamDependenceFlag;
  197.     bool                    b_OCRStreamFlag;
  198.     uint8_t                 i_streamPriority;
  199.     char                    *psz_url;
  200.     uint16_t                i_dependOn_es_id;
  201.     uint16_t                i_OCR_es_id;
  202.     decoder_config_descriptor_t    dec_descr;
  203.     sl_config_descriptor_t         sl_descr;
  204. } es_mpeg4_descriptor_t;
  205. typedef struct
  206. {
  207.     uint8_t                 i_iod_label, i_iod_label_scope;
  208.     /* IOD */
  209.     uint16_t                i_od_id;
  210.     char                    *psz_url;
  211.     uint8_t                 i_ODProfileLevelIndication;
  212.     uint8_t                 i_sceneProfileLevelIndication;
  213.     uint8_t                 i_audioProfileLevelIndication;
  214.     uint8_t                 i_visualProfileLevelIndication;
  215.     uint8_t                 i_graphicsProfileLevelIndication;
  216.     es_mpeg4_descriptor_t   es_descr[255];
  217. } iod_descriptor_t;
  218. typedef struct
  219. {
  220.     dvbpsi_handle   handle;
  221.     int             i_version;
  222.     int             i_number;
  223.     int             i_pid_pcr;
  224.     int             i_pid_pmt;
  225.     /* IOD stuff (mpeg4) */
  226.     iod_descriptor_t *iod;
  227. } ts_prg_psi_t;
  228. typedef struct
  229. {
  230.     /* for special PAT/SDT case */
  231.     dvbpsi_handle   handle; /* PAT/SDT/EIT */
  232.     int             i_pat_version;
  233.     int             i_sdt_version;
  234.     /* For PMT */
  235.     int             i_prg;
  236.     ts_prg_psi_t    **prg;
  237. } ts_psi_t;
  238. typedef struct
  239. {
  240.     es_format_t  fmt;
  241.     es_out_id_t *id;
  242.     int         i_pes_size;
  243.     int         i_pes_gathered;
  244.     block_t     *p_pes;
  245.     block_t     **pp_last;
  246.     es_mpeg4_descriptor_t *p_mpeg4desc;
  247.     int         b_gather;
  248. } ts_es_t;
  249. typedef struct
  250. {
  251.     int         i_pid;
  252.     bool        b_seen;
  253.     bool        b_valid;
  254.     int         i_cc;   /* countinuity counter */
  255.     bool        b_scrambled;
  256.     /* PSI owner (ie PMT -> PAT, ES -> PMT */
  257.     ts_psi_t   *p_owner;
  258.     int         i_owner_number;
  259.     /* */
  260.     ts_psi_t    *psi;
  261.     ts_es_t     *es;
  262.     /* Some private streams encapsulate several ES (eg. DVB subtitles)*/
  263.     ts_es_t     **extra_es;
  264.     int         i_extra_es;
  265. } ts_pid_t;
  266. struct demux_sys_t
  267. {
  268.     vlc_mutex_t     csa_lock;
  269.     /* TS packet size (188, 192, 204) */
  270.     int         i_packet_size;
  271.     /* how many TS packet we read at once */
  272.     int         i_ts_read;
  273.     /* All pid */
  274.     ts_pid_t    pid[8192];
  275.     /* All PMT */
  276.     bool        b_user_pmt;
  277.     int         i_pmt;
  278.     ts_pid_t    **pmt;
  279.     /* */
  280.     bool        b_es_id_pid;
  281.     csa_t       *csa;
  282.     int         i_csa_pkt_size;
  283.     bool        b_silent;
  284.     bool        b_udp_out;
  285.     int         fd; /* udp socket */
  286.     uint8_t     *buffer;
  287.     /* */
  288.     bool        b_access_control;
  289.     /* */
  290.     bool        b_dvb_meta;
  291.     int64_t     i_dvb_start;
  292.     int64_t     i_dvb_length;
  293.     /* */
  294.     int         i_current_program;
  295.     vlc_list_t  *p_programs_list;
  296.     /* TS dump */
  297.     char        *psz_file;  /* file to dump data in */
  298.     FILE        *p_file;    /* filehandle */
  299.     uint64_t    i_write;    /* bytes written */
  300.     bool        b_file_out; /* dump mode enabled */
  301.     /* */
  302.     bool        b_start_record;
  303. };
  304. static int i_broken_epg;
  305. static int Demux    ( demux_t *p_demux );
  306. static int DemuxFile( demux_t *p_demux );
  307. static int Control( demux_t *p_demux, int i_query, va_list args );
  308. static void PIDInit ( ts_pid_t *pid, bool b_psi, ts_psi_t *p_owner );
  309. static void PIDClean( es_out_t *out, ts_pid_t *pid );
  310. static int  PIDFillFormat( ts_pid_t *pid, int i_stream_type );
  311. static void PATCallBack( demux_t *, dvbpsi_pat_t * );
  312. static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt );
  313. #ifdef TS_USE_DVB_SI
  314. static void PSINewTableCallBack( demux_t *, dvbpsi_handle,
  315.                                  uint8_t  i_table_id, uint16_t i_extension );
  316. #endif
  317. static int ChangeKeyCallback( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
  318. static inline int PIDGet( block_t *p )
  319. {
  320.     return ( (p->p_buffer[1]&0x1f)<<8 )|p->p_buffer[2];
  321. }
  322. static bool GatherPES( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk );
  323. static void PCRHandle( demux_t *p_demux, ts_pid_t *, block_t * );
  324. static iod_descriptor_t *IODNew( int , uint8_t * );
  325. static void              IODFree( iod_descriptor_t * );
  326. #define TS_USER_PMT_NUMBER (0)
  327. static int UserPmt( demux_t *p_demux, const char * );
  328. #define TS_PACKET_SIZE_188 188
  329. #define TS_PACKET_SIZE_192 192
  330. #define TS_PACKET_SIZE_204 204
  331. #define TS_PACKET_SIZE_MAX 204
  332. #define TS_TOPFIELD_HEADER 1320
  333. /*****************************************************************************
  334.  * Open
  335.  *****************************************************************************/
  336. static int Open( vlc_object_t *p_this )
  337. {
  338.     demux_t     *p_demux = (demux_t*)p_this;
  339.     demux_sys_t *p_sys;
  340.     const uint8_t *p_peek;
  341.     int          i_sync, i_peek, i;
  342.     int          i_packet_size;
  343.     ts_pid_t    *pat;
  344.     const char  *psz_mode;
  345.     bool         b_append;
  346.     bool         b_topfield = false;
  347.     if( stream_Peek( p_demux->s, &p_peek, TS_PACKET_SIZE_MAX ) <
  348.         TS_PACKET_SIZE_MAX ) return VLC_EGENERIC;
  349.     if( memcmp( p_peek, "TFrc", 4 ) == 0 )
  350.     {
  351.         b_topfield = true;
  352.         msg_Dbg( p_demux, "this is a topfield file" );
  353.     }
  354.     /* Search first sync byte */
  355.     for( i_sync = 0; i_sync < TS_PACKET_SIZE_MAX; i_sync++ )
  356.     {
  357.         if( p_peek[i_sync] == 0x47 ) break;
  358.     }
  359.     if( i_sync >= TS_PACKET_SIZE_MAX && !b_topfield )
  360.     {
  361.         if( !p_demux->b_force )
  362.             return VLC_EGENERIC;
  363.         msg_Warn( p_demux, "this does not look like a TS stream, continuing" );
  364.     }
  365.     if( b_topfield )
  366.     {
  367.         /* Read the entire Topfield header */
  368.         i_peek = TS_TOPFIELD_HEADER;
  369.     }
  370.     else
  371.     {
  372.         /* Check next 3 sync bytes */
  373.         i_peek = TS_PACKET_SIZE_MAX * 3 + i_sync + 1;
  374.     }
  375.     if( ( stream_Peek( p_demux->s, &p_peek, i_peek ) ) < i_peek )
  376.     {
  377.         msg_Err( p_demux, "cannot peek" );
  378.         return VLC_EGENERIC;
  379.     }
  380.     if( p_peek[i_sync + TS_PACKET_SIZE_188] == 0x47 &&
  381.         p_peek[i_sync + 2 * TS_PACKET_SIZE_188] == 0x47 &&
  382.         p_peek[i_sync + 3 * TS_PACKET_SIZE_188] == 0x47 )
  383.     {
  384.         i_packet_size = TS_PACKET_SIZE_188;
  385.     }
  386.     else if( p_peek[i_sync + TS_PACKET_SIZE_192] == 0x47 &&
  387.              p_peek[i_sync + 2 * TS_PACKET_SIZE_192] == 0x47 &&
  388.              p_peek[i_sync + 3 * TS_PACKET_SIZE_192] == 0x47 )
  389.     {
  390.         i_packet_size = TS_PACKET_SIZE_192;
  391.     }
  392.     else if( p_peek[i_sync + TS_PACKET_SIZE_204] == 0x47 &&
  393.              p_peek[i_sync + 2 * TS_PACKET_SIZE_204] == 0x47 &&
  394.              p_peek[i_sync + 3 * TS_PACKET_SIZE_204] == 0x47 )
  395.     {
  396.         i_packet_size = TS_PACKET_SIZE_204;
  397.     }
  398.     else if( p_demux->b_force )
  399.     {
  400.         i_packet_size = TS_PACKET_SIZE_188;
  401.     }
  402.     else if( b_topfield )
  403.     {
  404.         i_packet_size = TS_PACKET_SIZE_188;
  405. #if 0
  406.         /* I used the TF5000PVR 2004 Firmware .doc header documentation,
  407.          * http://www.i-topfield.com/data/product/firmware/Structure%20of%20Recorded%20File%20in%20TF5000PVR%20(Feb%2021%202004).doc
  408.          * but after the filename the offsets seem to be incorrect.  - DJ */
  409.         int i_duration, i_name;
  410.         char *psz_name = malloc(25);
  411.         char *psz_event_name;
  412.         char *psz_event_text = malloc(130);
  413.         char *psz_ext_text = malloc(1025);
  414.         // 2 bytes version Uimsbf (4,5)
  415.         // 2 bytes reserved (6,7)
  416.         // 2 bytes duration in minutes Uimsbf (8,9(
  417.         i_duration = (int) (p_peek[8] << 8) | p_peek[9];
  418.         msg_Dbg( p_demux, "Topfield recording length: +/- %d minutes", i_duration);
  419.         // 2 bytes service number in channel list (10, 11)
  420.         // 2 bytes service type Bslbf 0=TV 1=Radio Bslb (12, 13)
  421.         // 4 bytes of reserved + tuner info (14,15,16,17)
  422.         // 2 bytes of Service ID  Bslbf (18,19)
  423.         // 2 bytes of PMT PID  Uimsbf (20,21)
  424.         // 2 bytes of PCR PID  Uimsbf (22,23)
  425.         // 2 bytes of Video PID  Uimsbf (24,25)
  426.         // 2 bytes of Audio PID  Uimsbf (26,27)
  427.         // 24 bytes filename Bslbf
  428.         memcpy( psz_name, &p_peek[28], 24 );
  429.         psz_name[24] = '';
  430.         msg_Dbg( p_demux, "recordingname=%s", psz_name );
  431.         // 1 byte of sat index Uimsbf  (52)
  432.         // 3 bytes (1 bit of polarity Bslbf +23 bits reserved)
  433.         // 4 bytes of freq. Uimsbf (56,57,58,59)
  434.         // 2 bytes of symbol rate Uimsbf (60,61)
  435.         // 2 bytes of TS stream ID Uimsbf (62,63)
  436.         // 4 bytes reserved
  437.         // 2 bytes reserved
  438.         // 2 bytes duration Uimsbf (70,71)
  439.         //i_duration = (int) (p_peek[70] << 8) | p_peek[71];
  440.         //msg_Dbg( p_demux, "Topfield 2nd duration field: +/- %d minutes", i_duration);
  441.         // 4 bytes EventID Uimsbf (72-75)
  442.         // 8 bytes of Start and End time info (76-83)
  443.         // 1 byte reserved (84)
  444.         // 1 byte event name length Uimsbf (89)
  445.         i_name = (int)(p_peek[89]&~0x81);
  446.         msg_Dbg( p_demux, "event name length = %d", i_name);
  447.         psz_event_name = malloc( i_name+1 );
  448.         // 1 byte parental rating (90)
  449.         // 129 bytes of event text
  450.         memcpy( psz_event_name, &p_peek[91], i_name );
  451.         psz_event_name[i_name] = '';
  452.         memcpy( psz_event_text, &p_peek[91+i_name], 129-i_name );
  453.         psz_event_text[129-i_name] = '';
  454.         msg_Dbg( p_demux, "event name=%s", psz_event_name );
  455.         msg_Dbg( p_demux, "event text=%s", psz_event_text );
  456.         // 12 bytes reserved (220)
  457.         // 6 bytes reserved
  458.         // 2 bytes Event Text Length Uimsbf
  459.         // 4 bytes EventID Uimsbf
  460.         // FIXME We just have 613 bytes. not enough for this entire text
  461.         // 1024 bytes Extended Event Text Bslbf
  462.         memcpy( psz_ext_text, p_peek+372, 1024 );
  463.         psz_ext_text[1024] = '';
  464.         msg_Dbg( p_demux, "extended event text=%s", psz_ext_text );
  465.         // 52 bytes reserved Bslbf
  466. #endif
  467.     }
  468.     else
  469.     {
  470.         msg_Warn( p_demux, "TS module discarded (lost sync)" );
  471.         return VLC_EGENERIC;
  472.     }
  473.     p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) );
  474.     if( !p_sys )
  475.         return VLC_ENOMEM;
  476.     memset( p_sys, 0, sizeof( demux_sys_t ) );
  477.     p_sys->i_packet_size = i_packet_size;
  478.     vlc_mutex_init( &p_sys->csa_lock );
  479.     /* Fill dump mode fields */
  480.     p_sys->i_write = 0;
  481.     p_sys->buffer = NULL;
  482.     p_sys->p_file = NULL;
  483.     p_sys->b_file_out = false;
  484.     p_sys->psz_file = var_CreateGetString( p_demux, "ts-dump-file" );
  485.     if( *p_sys->psz_file != '' )
  486.     {
  487.         p_sys->b_file_out = true;
  488.         b_append = var_CreateGetBool( p_demux, "ts-dump-append" );
  489.         if ( b_append )
  490.             psz_mode = "ab";
  491.         else
  492.             psz_mode = "wb";
  493.         if( !strcmp( p_sys->psz_file, "-" ) )
  494.         {
  495.             msg_Info( p_demux, "dumping raw stream to standard output" );
  496.             p_sys->p_file = stdout;
  497.         }
  498.         else if( ( p_sys->p_file = utf8_fopen( p_sys->psz_file, psz_mode ) ) == NULL )
  499.         {
  500.             msg_Err( p_demux, "cannot create `%s' for writing", p_sys->psz_file );
  501.             p_sys->b_file_out = false;
  502.         }
  503.         if( p_sys->b_file_out )
  504.         {
  505.             /* Determine how many packets to read. */
  506.             int bufsize = var_CreateGetInteger( p_demux, "ts-dump-size" );
  507.             p_sys->i_ts_read = (int) (bufsize / p_sys->i_packet_size);
  508.             if( p_sys->i_ts_read <= 0 )
  509.             {
  510.                 p_sys->i_ts_read = 1500 / p_sys->i_packet_size;
  511.             }
  512.             p_sys->buffer = malloc( p_sys->i_packet_size * p_sys->i_ts_read );
  513.             msg_Info( p_demux, "%s raw stream to file `%s' reading packets %d",
  514.                       b_append ? "appending" : "dumping", p_sys->psz_file,
  515.                       p_sys->i_ts_read );
  516.         }
  517.     }
  518.     /* Fill p_demux field */
  519.     if( p_sys->b_file_out )
  520.         p_demux->pf_demux = DemuxFile;
  521.     else
  522.         p_demux->pf_demux = Demux;
  523.     p_demux->pf_control = Control;
  524.     /* Init p_sys field */
  525.     p_sys->b_dvb_meta = true;
  526.     p_sys->b_access_control = true;
  527.     p_sys->i_current_program = 0;
  528.     p_sys->i_dvb_start = 0;
  529.     p_sys->i_dvb_length = 0;
  530.     for( i = 0; i < 8192; i++ )
  531.     {
  532.         ts_pid_t *pid = &p_sys->pid[i];
  533.         pid->i_pid      = i;
  534.         pid->b_seen     = false;
  535.         pid->b_valid    = false;
  536.     }
  537.     /* PID 8191 is padding */
  538.     p_sys->pid[8191].b_seen = true;
  539.     p_sys->i_packet_size = i_packet_size;
  540.     p_sys->b_udp_out = false;
  541.     p_sys->fd = -1;
  542.     p_sys->i_ts_read = 50;
  543.     p_sys->csa = NULL;
  544.     p_sys->b_start_record = false;
  545.     /* Init PAT handler */
  546.     pat = &p_sys->pid[0];
  547.     PIDInit( pat, true, NULL );
  548.     pat->psi->handle = dvbpsi_AttachPAT( (dvbpsi_pat_callback)PATCallBack,
  549.                                          p_demux );
  550. #ifdef TS_USE_DVB_SI
  551.     if( p_sys->b_dvb_meta )
  552.     {
  553.         ts_pid_t *sdt = &p_sys->pid[0x11];
  554.         ts_pid_t *eit = &p_sys->pid[0x12];
  555.         PIDInit( sdt, true, NULL );
  556.         sdt->psi->handle =
  557.             dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t)PSINewTableCallBack,
  558.                                 p_demux );
  559.         PIDInit( eit, true, NULL );
  560.         eit->psi->handle =
  561.             dvbpsi_AttachDemux( (dvbpsi_demux_new_cb_t)PSINewTableCallBack,
  562.                                 p_demux );
  563.         if( p_sys->b_access_control )
  564.         {
  565.             if( stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
  566.                                 ACCESS_SET_PRIVATE_ID_STATE, 0x11, true ) ||
  567.                 stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
  568.                                 ACCESS_SET_PRIVATE_ID_STATE, 0x12, true ) )
  569.                 p_sys->b_access_control = false;
  570.         }
  571.     }
  572. #endif
  573.     /* Init PMT array */
  574.     TAB_INIT( p_sys->i_pmt, p_sys->pmt );
  575.     /* Read config */
  576.     p_sys->b_es_id_pid = var_CreateGetBool( p_demux, "ts-es-id-pid" );
  577.     char* psz_string = var_CreateGetString( p_demux, "ts-out" );
  578.     if( psz_string && *psz_string && !p_sys->b_file_out )
  579.     {
  580.         char *psz = strchr( psz_string, ':' );
  581.         int   i_port = 0;
  582.         p_sys->b_udp_out = true;
  583.         if( psz )
  584.         {
  585.             *psz++ = '';
  586.             i_port = atoi( psz );
  587.         }
  588.         if( i_port <= 0 ) i_port  = 1234;
  589.         msg_Dbg( p_demux, "resend ts to '%s:%d'", psz_string, i_port );
  590.         p_sys->fd = net_ConnectUDP( VLC_OBJECT(p_demux), psz_string, i_port, -1 );
  591.         if( p_sys->fd < 0 )
  592.         {
  593.             msg_Err( p_demux, "failed to open udp socket, send disabled" );
  594.             p_sys->b_udp_out = false;
  595.         }
  596.         else
  597.         {
  598.             int i_mtu = var_CreateGetInteger( p_demux, "ts-out-mtu" );
  599.             p_sys->i_ts_read = i_mtu / p_sys->i_packet_size;
  600.             if( p_sys->i_ts_read <= 0 )
  601.             {
  602.                 p_sys->i_ts_read = 1500 / p_sys->i_packet_size;
  603.             }
  604.             p_sys->buffer = malloc( p_sys->i_packet_size * p_sys->i_ts_read );
  605.         }
  606.     }
  607.     free( psz_string );
  608.     /* We handle description of an extra PMT */
  609.     psz_string = var_CreateGetString( p_demux, "ts-extra-pmt" );
  610.     p_sys->b_user_pmt = false;
  611.     if( psz_string && *psz_string )
  612.         UserPmt( p_demux, psz_string );
  613.     free( psz_string );
  614.     psz_string = var_CreateGetStringCommand( p_demux, "ts-csa-ck" );
  615.     if( psz_string && *psz_string )
  616.     {
  617.         int i_res;
  618.         char* psz_csa2;
  619.         p_sys->csa = csa_New();
  620.         psz_csa2 = var_CreateGetStringCommand( p_demux, "ts-csa2-ck" );
  621.         i_res = csa_SetCW( (vlc_object_t*)p_demux, p_sys->csa, psz_string, true );
  622.         if( i_res == VLC_SUCCESS && psz_csa2 && *psz_csa2 )
  623.         {
  624.             if( csa_SetCW( (vlc_object_t*)p_demux, p_sys->csa, psz_csa2, false ) != VLC_SUCCESS )
  625.             {
  626.                 csa_SetCW( (vlc_object_t*)p_demux, p_sys->csa, psz_string, false );
  627.             }
  628.         }
  629.         else if ( i_res == VLC_SUCCESS )
  630.         {
  631.             csa_SetCW( (vlc_object_t*)p_demux, p_sys->csa, psz_string, false );
  632.         }
  633.         else
  634.         {
  635.             csa_Delete( p_sys->csa );
  636.             p_sys->csa = NULL;
  637.         }
  638.         if( p_sys->csa )
  639.         {
  640.             var_AddCallback( p_demux, "ts-csa-ck", ChangeKeyCallback, (void *)1 );
  641.             var_AddCallback( p_demux, "ts-csa2-ck", ChangeKeyCallback, NULL );
  642.             int i_pkt = var_CreateGetInteger( p_demux, "ts-csa-pkt" );
  643.             if( i_pkt < 4 || i_pkt > 188 )
  644.             {
  645.                 msg_Err( p_demux, "wrong packet size %d specified.", i_pkt );
  646.                 msg_Warn( p_demux, "using default packet size of 188 bytes" );
  647.                 p_sys->i_csa_pkt_size = 188;
  648.             }
  649.             else
  650.                 p_sys->i_csa_pkt_size = i_pkt;
  651.             msg_Dbg( p_demux, "decrypting %d bytes of packet", p_sys->i_csa_pkt_size );
  652.         }
  653.         free( psz_csa2 );
  654.     }
  655.     free( psz_string );
  656.     p_sys->b_silent = var_CreateGetBool( p_demux, "ts-silent" );
  657.     return VLC_SUCCESS;
  658. }
  659. /*****************************************************************************
  660.  * Close
  661.  *****************************************************************************/
  662. static void Close( vlc_object_t *p_this )
  663. {
  664.     demux_t     *p_demux = (demux_t*)p_this;
  665.     demux_sys_t *p_sys = p_demux->p_sys;
  666.     msg_Dbg( p_demux, "pid list:" );
  667.     for( int i = 0; i < 8192; i++ )
  668.     {
  669.         ts_pid_t *pid = &p_sys->pid[i];
  670.         if( pid->b_valid && pid->psi )
  671.         {
  672.             switch( pid->i_pid )
  673.             {
  674.             case 0: /* PAT */
  675.                 dvbpsi_DetachPAT( pid->psi->handle );
  676.                 free( pid->psi );
  677.                 break;
  678.             case 1: /* CAT */
  679.                 free( pid->psi );
  680.                 break;
  681.             default:
  682.                 if( p_sys->b_dvb_meta && ( pid->i_pid == 0x11 || pid->i_pid == 0x12 ) )
  683.                 {
  684.                     /* SDT or EIT */
  685.                     dvbpsi_DetachDemux( pid->psi->handle );
  686.                     free( pid->psi );
  687.                 }
  688.                 else
  689.                 {
  690.                     PIDClean( p_demux->out, pid );
  691.                 }
  692.                 break;
  693.             }
  694.         }
  695.         else if( pid->b_valid && pid->es )
  696.         {
  697.             PIDClean( p_demux->out, pid );
  698.         }
  699.         if( pid->b_seen )
  700.         {
  701.             msg_Dbg( p_demux, "  - pid[%d] seen", pid->i_pid );
  702.         }
  703.         if( p_sys->b_access_control && pid->i_pid > 0 )
  704.         {
  705.             /* too much */
  706.             stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
  707.                             ACCESS_SET_PRIVATE_ID_STATE, pid->i_pid,
  708.                             false );
  709.         }
  710.     }
  711.     vlc_mutex_lock( &p_sys->csa_lock );
  712.     if( p_sys->csa )
  713.     {
  714.         var_DelCallback( p_demux, "ts-csa-ck", ChangeKeyCallback, NULL );
  715.         var_DelCallback( p_demux, "ts-csa2-ck", ChangeKeyCallback, NULL );
  716.         csa_Delete( p_sys->csa );
  717.     }
  718.     vlc_mutex_unlock( &p_sys->csa_lock );
  719.     TAB_CLEAN( p_sys->i_pmt, p_sys->pmt );
  720.     if( p_sys->p_programs_list )
  721.     {
  722.         vlc_value_t val;
  723.         val.p_list = p_sys->p_programs_list;
  724.         var_Change( p_demux, "programs", VLC_VAR_FREELIST, &val, NULL );
  725.     }
  726.     /* If in dump mode, then close the file */
  727.     if( p_sys->b_file_out )
  728.     {
  729.         msg_Info( p_demux ,"closing %s (%"PRId64" Kbytes dumped)",
  730.                   p_sys->psz_file, p_sys->i_write / 1024 );
  731.         if( p_sys->p_file != stdout )
  732.         {
  733.             fclose( p_sys->p_file );
  734.         }
  735.     }
  736.     /* When streaming, close the port */
  737.     if( p_sys->fd > -1 )
  738.     {
  739.         net_Close( p_sys->fd );
  740.     }
  741.     free( p_sys->buffer );
  742.     free( p_sys->psz_file );
  743.     vlc_mutex_destroy( &p_sys->csa_lock );
  744.     free( p_sys );
  745. }
  746. /*****************************************************************************
  747.  * ChangeKeyCallback: called when changing the odd encryption key on the fly.
  748.  *****************************************************************************/
  749. static int ChangeKeyCallback( vlc_object_t *p_this, char const *psz_cmd,
  750.                            vlc_value_t oldval, vlc_value_t newval,
  751.                            void *p_data )
  752. {
  753.     VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval);
  754.     demux_t     *p_demux = (demux_t*)p_this;
  755.     demux_sys_t *p_sys = p_demux->p_sys;
  756.     int         i_tmp = (intptr_t)p_data;
  757.     vlc_mutex_lock( &p_sys->csa_lock );
  758.     if ( i_tmp )
  759.         i_tmp = csa_SetCW( p_this, p_sys->csa, newval.psz_string, true );
  760.     else
  761.         i_tmp = csa_SetCW( p_this, p_sys->csa, newval.psz_string, false );
  762.     vlc_mutex_unlock( &p_sys->csa_lock );
  763.     return i_tmp;
  764. }
  765. /*****************************************************************************
  766.  * DemuxFile:
  767.  *****************************************************************************/
  768. static int DemuxFile( demux_t *p_demux )
  769. {
  770.     demux_sys_t *p_sys = p_demux->p_sys;
  771.     const int i_bufsize = p_sys->i_packet_size * p_sys->i_ts_read;
  772.     uint8_t   *p_buffer = p_sys->buffer; /* Put first on sync byte */
  773.     const int i_data = stream_Read( p_demux->s, p_sys->buffer, i_bufsize );
  774.     if( i_data <= 0 && i_data < p_sys->i_packet_size )
  775.     {
  776.         msg_Dbg( p_demux, "error reading malformed packets" );
  777.         return i_data;
  778.     }
  779.     /* Test continuity counter */
  780.     for( int i_pos = 0; i_pos < i_data;  )
  781.     {
  782.         if( p_sys->buffer[i_pos] != 0x47 )
  783.         {
  784.             msg_Warn( p_demux, "lost sync" );
  785.             while( vlc_object_alive (p_demux) && (i_pos < i_data) )
  786.             {
  787.                 i_pos++;
  788.                 if( p_sys->buffer[i_pos] == 0x47 )
  789.                     break;
  790.             }
  791.             if( vlc_object_alive (p_demux) )
  792.                 msg_Warn( p_demux, "sync found" );
  793.         }
  794.         /* continuous when (one of this):
  795.          * diff == 1
  796.          * diff == 0 and payload == 0
  797.          * diff == 0 and duplicate packet (playload != 0) <- should we
  798.          *   test the content ?
  799.          */
  800.         const int i_cc  = p_buffer[i_pos+3]&0x0f;
  801.         const bool b_payload = p_buffer[i_pos+3]&0x10;
  802.         const bool b_adaptation = p_buffer[i_pos+3]&0x20;
  803.         /* Get the PID */
  804.         ts_pid_t *p_pid = &p_sys->pid[ ((p_buffer[i_pos+1]&0x1f)<<8)|p_buffer[i_pos+2] ];
  805.         /* Detect discontinuity indicator in adaptation field */
  806.         if( b_adaptation && p_buffer[i_pos + 4] > 0 )
  807.         {
  808.             if( p_buffer[i_pos+5]&0x80 )
  809.                 msg_Warn( p_demux, "discontinuity indicator (pid=%d) ", p_pid->i_pid );
  810.             if( p_buffer[i_pos+5]&0x40 )
  811.                 msg_Warn( p_demux, "random access indicator (pid=%d) ", p_pid->i_pid );
  812.         }
  813.         const int i_diff = ( i_cc - p_pid->i_cc )&0x0f;
  814.         if( b_payload && i_diff == 1 )
  815.         {
  816.             p_pid->i_cc = ( p_pid->i_cc + 1 ) & 0xf;
  817.         }
  818.         else
  819.         {
  820.             if( p_pid->i_cc == 0xff )
  821.             {
  822.                 msg_Warn( p_demux, "first packet for pid=%d cc=0x%x",
  823.                         p_pid->i_pid, i_cc );
  824.                 p_pid->i_cc = i_cc;
  825.             }
  826.             else if( i_diff != 0 )
  827.             {
  828.                 /* FIXME what to do when discontinuity_indicator is set ? */
  829.                 msg_Warn( p_demux, "transport error detected 0x%x instead of 0x%x",
  830.                           i_cc, ( p_pid->i_cc + 1 )&0x0f );
  831.                 p_pid->i_cc = i_cc;
  832.                 /* Mark transport error in the TS packet. */
  833.                 p_buffer[i_pos+1] |= 0x80;
  834.             }
  835.         }
  836.         /* Test if user wants to decrypt it first */
  837.         if( p_sys->csa )
  838.         {
  839.             vlc_mutex_lock( &p_sys->csa_lock );
  840.             csa_Decrypt( p_demux->p_sys->csa, &p_buffer[i_pos], p_demux->p_sys->i_csa_pkt_size );
  841.             vlc_mutex_unlock( &p_sys->csa_lock );
  842.         }
  843.         i_pos += p_sys->i_packet_size;
  844.     }
  845.     /* Then write */
  846.     const int i_write = fwrite( p_sys->buffer, 1, i_data, p_sys->p_file );
  847.     if( i_write < 0 )
  848.     {
  849.         msg_Err( p_demux, "failed to write data" );
  850.         return -1;
  851.     }
  852.     p_sys->i_write += i_write;
  853.     return 1;
  854. }
  855. /*****************************************************************************
  856.  * Demux:
  857.  *****************************************************************************/
  858. static int Demux( demux_t *p_demux )
  859. {
  860.     demux_sys_t *p_sys = p_demux->p_sys;
  861.     /* We read at most 100 TS packet or until a frame is completed */
  862.     for( int i_pkt = 0; i_pkt < p_sys->i_ts_read; i_pkt++ )
  863.     {
  864.         bool         b_frame = false;
  865.         block_t     *p_pkt;
  866.         /* Get a new TS packet */
  867.         if( !( p_pkt = stream_Block( p_demux->s, p_sys->i_packet_size ) ) )
  868.         {
  869.             msg_Dbg( p_demux, "eof ?" );
  870.             return 0;
  871.         }
  872.         /* Check sync byte and re-sync if needed */
  873.         if( p_pkt->p_buffer[0] != 0x47 )
  874.         {
  875.             msg_Warn( p_demux, "lost synchro" );
  876.             block_Release( p_pkt );
  877.             while( vlc_object_alive (p_demux) )
  878.             {
  879.                 const uint8_t *p_peek;
  880.                 int i_peek, i_skip = 0;
  881.                 i_peek = stream_Peek( p_demux->s, &p_peek,
  882.                                       p_sys->i_packet_size * 10 );
  883.                 if( i_peek < p_sys->i_packet_size + 1 )
  884.                 {
  885.                     msg_Dbg( p_demux, "eof ?" );
  886.                     return 0;
  887.                 }
  888.                 while( i_skip < i_peek - p_sys->i_packet_size )
  889.                 {
  890.                     if( p_peek[i_skip] == 0x47 &&
  891.                         p_peek[i_skip + p_sys->i_packet_size] == 0x47 )
  892.                     {
  893.                         break;
  894.                     }
  895.                     i_skip++;
  896.                 }
  897.                 msg_Dbg( p_demux, "skipping %d bytes of garbage", i_skip );
  898.                 stream_Read( p_demux->s, NULL, i_skip );
  899.                 if( i_skip < i_peek - p_sys->i_packet_size )
  900.                 {
  901.                     break;
  902.                 }
  903.             }
  904.             if( !( p_pkt = stream_Block( p_demux->s, p_sys->i_packet_size ) ) )
  905.             {
  906.                 msg_Dbg( p_demux, "eof ?" );
  907.                 return 0;
  908.             }
  909.         }
  910.         if( p_sys->b_start_record )
  911.         {
  912.             /* Enable recording once synchronized */
  913.             stream_Control( p_demux->s, STREAM_SET_RECORD_STATE, true, "ts" );
  914.             p_sys->b_start_record = false;
  915.         }
  916.         if( p_sys->b_udp_out )
  917.         {
  918.             memcpy( &p_sys->buffer[i_pkt * p_sys->i_packet_size],
  919.                     p_pkt->p_buffer, p_sys->i_packet_size );
  920.         }
  921.         /* Parse the TS packet */
  922.         ts_pid_t *p_pid = &p_sys->pid[PIDGet( p_pkt )];
  923.         if( p_pid->b_valid )
  924.         {
  925.             if( p_pid->psi )
  926.             {
  927.                 if( p_pid->i_pid == 0 || ( p_sys->b_dvb_meta && ( p_pid->i_pid == 0x11 || p_pid->i_pid == 0x12 ) ) )
  928.                 {
  929.                     dvbpsi_PushPacket( p_pid->psi->handle, p_pkt->p_buffer );
  930.                 }
  931.                 else
  932.                 {
  933.                     for( int i_prg = 0; i_prg < p_pid->psi->i_prg; i_prg++ )
  934.                     {
  935.                         dvbpsi_PushPacket( p_pid->psi->prg[i_prg]->handle,
  936.                                            p_pkt->p_buffer );
  937.                     }
  938.                 }
  939.                 block_Release( p_pkt );
  940.             }
  941.             else if( !p_sys->b_udp_out )
  942.             {
  943.                 b_frame = GatherPES( p_demux, p_pid, p_pkt );
  944.             }
  945.             else
  946.             {
  947.                 PCRHandle( p_demux, p_pid, p_pkt );
  948.                 block_Release( p_pkt );
  949.             }
  950.         }
  951.         else
  952.         {
  953.             if( !p_pid->b_seen )
  954.             {
  955.                 msg_Dbg( p_demux, "pid[%d] unknown", p_pid->i_pid );
  956.             }
  957.             /* We have to handle PCR if present */
  958.             PCRHandle( p_demux, p_pid, p_pkt );
  959.             block_Release( p_pkt );
  960.         }
  961.         p_pid->b_seen = true;
  962.         if( b_frame )
  963.             break;
  964.     }
  965.     if( p_sys->b_udp_out )
  966.     {
  967.         /* Send the complete block */
  968.         net_Write( p_demux, p_sys->fd, NULL, p_sys->buffer,
  969.                    p_sys->i_ts_read * p_sys->i_packet_size );
  970.     }
  971.     return 1;
  972. }
  973. /*****************************************************************************
  974.  * Control:
  975.  *****************************************************************************/
  976. static int DVBEventInformation( demux_t *p_demux, int64_t *pi_time, int64_t *pi_length )
  977. {
  978.     demux_sys_t *p_sys = p_demux->p_sys;
  979.     if( pi_length )
  980.         *pi_length = 0;
  981.     if( pi_time )
  982.         *pi_time = 0;
  983.     if( p_sys->b_access_control && p_sys->i_dvb_length > 0 )
  984.     {
  985.         /* FIXME we should not use time() but read the date from the tdt */
  986.         const time_t t = time( NULL );
  987.         if( p_sys->i_dvb_start <= t && t < p_sys->i_dvb_start + p_sys->i_dvb_length )
  988.         {
  989.             if( pi_length )
  990.                 *pi_length = p_sys->i_dvb_length * INT64_C(1000000);
  991.             if( pi_time )
  992.                 *pi_time   = (t - p_sys->i_dvb_start) * INT64_C(1000000);
  993.             return VLC_SUCCESS;
  994.         }
  995.     }
  996.     return VLC_EGENERIC;
  997. }
  998. static int Control( demux_t *p_demux, int i_query, va_list args )
  999. {
  1000.     demux_sys_t *p_sys = p_demux->p_sys;
  1001.     double f, *pf;
  1002.     bool b_bool, *pb_bool;
  1003.     int64_t i64;
  1004.     int64_t *pi64;
  1005.     int i_int;
  1006.     if( p_sys->b_file_out )
  1007.         return demux_vaControlHelper( p_demux->s, 0, -1, 0, 1, i_query, args );
  1008.     switch( i_query )
  1009.     {
  1010.     case DEMUX_GET_POSITION:
  1011.         pf = (double*) va_arg( args, double* );
  1012.         i64 = stream_Size( p_demux->s );
  1013.         if( i64 > 0 )
  1014.         {
  1015.             *pf = (double)stream_Tell( p_demux->s ) / (double)i64;
  1016.         }
  1017.         else
  1018.         {
  1019.             int64_t i_time, i_length;
  1020.             if( !DVBEventInformation( p_demux, &i_time, &i_length ) && i_length > 0 )
  1021.                 *pf = (double)i_time/(double)i_length;
  1022.             else
  1023.                 *pf = 0.0;
  1024.         }
  1025.         return VLC_SUCCESS;
  1026.     case DEMUX_SET_POSITION:
  1027.         f = (double) va_arg( args, double );
  1028.         i64 = stream_Size( p_demux->s );
  1029.         if( stream_Seek( p_demux->s, (int64_t)(i64 * f) ) )
  1030.             return VLC_EGENERIC;
  1031.         return VLC_SUCCESS;
  1032. #if 0
  1033.     case DEMUX_GET_TIME:
  1034.         pi64 = (int64_t*)va_arg( args, int64_t * );
  1035.         if( p_sys->i_time < 0 )
  1036.         {
  1037.             *pi64 = 0;
  1038.             return VLC_EGENERIC;
  1039.         }
  1040.         *pi64 = p_sys->i_time;
  1041.         return VLC_SUCCESS;
  1042.     case DEMUX_GET_LENGTH:
  1043.         pi64 = (int64_t*)va_arg( args, int64_t * );
  1044.         if( p_sys->i_mux_rate > 0 )
  1045.         {
  1046.             *pi64 = INT64_C(1000000) * ( stream_Size( p_demux->s ) / 50 ) /
  1047.                     p_sys->i_mux_rate;
  1048.             return VLC_SUCCESS;
  1049.         }
  1050.         *pi64 = 0;
  1051.         return VLC_EGENERIC;
  1052. #else
  1053.     case DEMUX_GET_TIME:
  1054.         pi64 = (int64_t*)va_arg( args, int64_t * );
  1055.         if( DVBEventInformation( p_demux, pi64, NULL ) )
  1056.             *pi64 = 0;
  1057.         return VLC_SUCCESS;
  1058.     case DEMUX_GET_LENGTH:
  1059.         pi64 = (int64_t*)va_arg( args, int64_t * );
  1060.         if( DVBEventInformation( p_demux, NULL, pi64 ) )
  1061.             *pi64 = 0;
  1062.         return VLC_SUCCESS;
  1063. #endif
  1064.     case DEMUX_SET_GROUP:
  1065.     {
  1066.         uint16_t i_vpid = 0, i_apid1 = 0, i_apid2 = 0, i_apid3 = 0;
  1067.         ts_prg_psi_t *p_prg = NULL;
  1068.         vlc_list_t *p_list;
  1069.         i_int = (int)va_arg( args, int );
  1070.         p_list = (vlc_list_t *)va_arg( args, vlc_list_t * );
  1071.         msg_Dbg( p_demux, "DEMUX_SET_GROUP %d %p", i_int, p_list );
  1072.         if( p_sys->b_access_control && i_int > 0 && i_int != p_sys->i_current_program )
  1073.         {
  1074.             int i_pmt_pid = -1;
  1075.             /* Search pmt to be unselected */
  1076.             for( int i = 0; i < p_sys->i_pmt; i++ )
  1077.             {
  1078.                 ts_pid_t *pmt = p_sys->pmt[i];
  1079.                 for( int i_prg = 0; i_prg < pmt->psi->i_prg; i_prg++ )
  1080.                 {
  1081.                     if( pmt->psi->prg[i_prg]->i_number == p_sys->i_current_program )
  1082.                     {
  1083.                         i_pmt_pid = p_sys->pmt[i]->i_pid;
  1084.                         break;
  1085.                     }
  1086.                 }
  1087.                 if( i_pmt_pid > 0 ) break;
  1088.             }
  1089.             if( i_pmt_pid > 0 )
  1090.             {
  1091.                 stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
  1092.                                 ACCESS_SET_PRIVATE_ID_STATE, i_pmt_pid,
  1093.                                 false );
  1094.                 /* All ES */
  1095.                 for( int i = 2; i < 8192; i++ )
  1096.                 {
  1097.                     ts_pid_t *pid = &p_sys->pid[i];
  1098.                     if( !pid->b_valid || pid->psi )
  1099.                         continue;
  1100.                     for( int i_prg = 0; i_prg < pid->p_owner->i_prg; i_prg++ )
  1101.                     {
  1102.                         if( pid->p_owner->prg[i_prg]->i_pid_pmt == i_pmt_pid && pid->es->id )
  1103.                         {
  1104.                             /* We only remove es that aren't defined by extra pmt */
  1105.                             stream_Control( p_demux->s,
  1106.                                             STREAM_CONTROL_ACCESS,
  1107.                                             ACCESS_SET_PRIVATE_ID_STATE,
  1108.                                             i, false );
  1109.                             break;
  1110.                         }
  1111.                     }
  1112.                 }
  1113.             }
  1114.             /* select new program */
  1115.             p_sys->i_current_program = i_int;
  1116.             i_pmt_pid = -1;
  1117.             for( int i = 0; i < p_sys->i_pmt; i++ )
  1118.             {
  1119.                 ts_pid_t *pmt = p_sys->pmt[i];
  1120.                 for( int i_prg = 0; i_prg < pmt->psi->i_prg; i_prg++ )
  1121.                 {
  1122.                     if( pmt->psi->prg[i_prg]->i_number == i_int )
  1123.                     {
  1124.                         i_pmt_pid = p_sys->pmt[i]->i_pid;
  1125.                         p_prg = p_sys->pmt[i]->psi->prg[i_prg];
  1126.                         break;
  1127.                     }
  1128.                 }
  1129.                 if( i_pmt_pid > 0 )
  1130.                     break;
  1131.             }
  1132.             if( i_pmt_pid > 0 )
  1133.             {
  1134.                 stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
  1135.                                 ACCESS_SET_PRIVATE_ID_STATE, i_pmt_pid,
  1136.                                 true );
  1137.                 stream_Control( p_demux->s, STREAM_CONTROL_ACCESS,
  1138.                                 ACCESS_SET_PRIVATE_ID_STATE, p_prg->i_pid_pcr,
  1139.                                 true );
  1140.                 for( int i = 2; i < 8192; i++ )
  1141.                 {
  1142.                     ts_pid_t *pid = &p_sys->pid[i];
  1143.                     if( !pid->b_valid || pid->psi )
  1144.                         continue;
  1145.                     for( int i_prg = 0; i_prg < pid->p_owner->i_prg; i_prg++ )
  1146.                     {
  1147.                         if( pid->p_owner->prg[i_prg]->i_pid_pmt == i_pmt_pid && pid->es->id )
  1148.                         {
  1149.                             if ( pid->es->fmt.i_cat == VIDEO_ES && !i_vpid )
  1150.                                 i_vpid = i;
  1151.                             if ( pid->es->fmt.i_cat == AUDIO_ES && !i_apid1 )
  1152.                                 i_apid1 = i;
  1153.                             else if ( pid->es->fmt.i_cat == AUDIO_ES && !i_apid2 )
  1154.                                 i_apid2 = i;
  1155.                             else if ( pid->es->fmt.i_cat == AUDIO_ES && !i_apid3 )
  1156.                                 i_apid3 = i;
  1157.                             stream_Control( p_demux->s,
  1158.                                             STREAM_CONTROL_ACCESS,
  1159.                                             ACCESS_SET_PRIVATE_ID_STATE,
  1160.                                             i, true );
  1161.                             break;
  1162.                         }
  1163.                     }
  1164.                 }
  1165.             }
  1166.         }
  1167.         else
  1168.         {
  1169.             p_sys->i_current_program = -1;
  1170.             p_sys->p_programs_list = p_list;
  1171.         }
  1172.         return VLC_SUCCESS;
  1173.     }
  1174.     case DEMUX_CAN_RECORD:
  1175.         pb_bool = (bool*)va_arg( args, bool * );
  1176.         *pb_bool = true;
  1177.         return VLC_SUCCESS;
  1178.     case DEMUX_SET_RECORD_STATE:
  1179.         b_bool = (bool)va_arg( args, int );
  1180.         if( !b_bool )
  1181.             stream_Control( p_demux->s, STREAM_SET_RECORD_STATE, false );
  1182.         p_sys->b_start_record = b_bool;
  1183.         return VLC_SUCCESS;
  1184.     case DEMUX_GET_FPS:
  1185.     case DEMUX_SET_TIME:
  1186.     default:
  1187.         return VLC_EGENERIC;
  1188.     }
  1189. }
  1190. /*****************************************************************************
  1191.  *
  1192.  *****************************************************************************/
  1193. static int UserPmt( demux_t *p_demux, const char *psz_fmt )
  1194. {
  1195.     demux_sys_t *p_sys = p_demux->p_sys;
  1196.     char *psz_dup = strdup( psz_fmt );
  1197.     char *psz = psz_dup;
  1198.     int  i_pid;
  1199.     int  i_number;
  1200.     if( !psz_dup )
  1201.         return VLC_ENOMEM;
  1202.     /* Parse PID */
  1203.     i_pid = strtol( psz, &psz, 0 );
  1204.     if( i_pid < 2 || i_pid >= 8192 )
  1205.         goto error;
  1206.     /* Parse optional program number */
  1207.     i_number = 0;
  1208.     if( *psz == ':' )
  1209.         i_number = strtol( &psz[1], &psz, 0 );
  1210.     /* */
  1211.     ts_pid_t *pmt = &p_sys->pid[i_pid];
  1212.     ts_prg_psi_t *prg;
  1213.     msg_Dbg( p_demux, "user pmt specified (pid=%d,number=%d)", i_pid, i_number );
  1214.     PIDInit( pmt, true, NULL );
  1215.     /* Dummy PMT */
  1216.     prg = malloc( sizeof( ts_prg_psi_t ) );
  1217.     if( !prg )
  1218.         goto error;
  1219.     memset( prg, 0, sizeof( ts_prg_psi_t ) );
  1220.     prg->i_pid_pcr  = -1;
  1221.     prg->i_pid_pmt  = -1;
  1222.     prg->i_version  = -1;
  1223.     prg->i_number   = i_number != 0 ? i_number : TS_USER_PMT_NUMBER;
  1224.     prg->handle     = dvbpsi_AttachPMT( i_number != TS_USER_PMT_NUMBER ? i_number : 1, (dvbpsi_pmt_callback)PMTCallBack, p_demux );
  1225.     TAB_APPEND( pmt->psi->i_prg, pmt->psi->prg, prg );
  1226.     psz = strchr( psz, '=' );
  1227.     if( psz )
  1228.         psz++;
  1229.     while( psz && *psz )
  1230.     {
  1231.         char *psz_next = strchr( psz, ',' );
  1232.         int i_pid;
  1233.         if( psz_next )
  1234.             *psz_next++ = '';
  1235.         i_pid = strtol( psz, &psz, 0 );
  1236.         if( *psz != ':' || i_pid < 2 || i_pid >= 8192 )
  1237.             goto next;
  1238.         char *psz_opt = &psz[1];
  1239.         if( !strcmp( psz_opt, "pcr" ) )
  1240.         {
  1241.             prg->i_pid_pcr = i_pid;
  1242.         }
  1243.         else if( !p_sys->pid[i_pid].b_valid )
  1244.         {
  1245.             ts_pid_t *pid = &p_sys->pid[i_pid];
  1246.             char *psz_arg = strchr( psz_opt, '=' );
  1247.             if( psz_arg )
  1248.                 *psz_arg++ = '';
  1249.             PIDInit( pid, false, pmt->psi);
  1250.             if( prg->i_pid_pcr <= 0 )
  1251.                 prg->i_pid_pcr = i_pid;
  1252.             if( psz_arg && strlen( psz_arg ) == 4 )
  1253.             {
  1254.                 const vlc_fourcc_t i_codec = VLC_FOURCC( psz_arg[0], psz_arg[1],
  1255.                                                          psz_arg[2], psz_arg[3] );
  1256.                 int i_cat = UNKNOWN_ES;
  1257.                 es_format_t *fmt = &pid->es->fmt;
  1258.                 if( !strcmp( psz_opt, "video" ) )
  1259.                     i_cat = VIDEO_ES;
  1260.                 else if( !strcmp( psz_opt, "audio" ) )
  1261.                     i_cat = AUDIO_ES;
  1262.                 else if( !strcmp( psz_opt, "spu" ) )
  1263.                     i_cat = SPU_ES;
  1264.                 es_format_Init( fmt, i_cat, i_codec );
  1265.                 fmt->b_packetized = false;
  1266.             }
  1267.             else
  1268.             {
  1269.                 const int i_stream_type = strtol( psz_opt, NULL, 0 );
  1270.                 PIDFillFormat( pid, i_stream_type );
  1271.             }
  1272.             pid->es->fmt.i_group = i_number;
  1273.             if( p_sys->b_es_id_pid )
  1274.                 pid->es->fmt.i_id = i_pid;
  1275.             if( pid->es->fmt.i_cat != UNKNOWN_ES )
  1276.             {
  1277.                 msg_Dbg( p_demux, "  * es pid=%d fcc=%4.4s", i_pid,
  1278.                          (char*)&pid->es->fmt.i_codec );
  1279.                 pid->es->id = es_out_Add( p_demux->out,
  1280.                                           &pid->es->fmt );
  1281.             }
  1282.         }
  1283.     next:
  1284.         psz = psz_next;
  1285.     }
  1286.     p_sys->b_user_pmt = true;
  1287.     TAB_APPEND( p_sys->i_pmt, p_sys->pmt, pmt );
  1288.     free( psz_dup );
  1289.     return VLC_SUCCESS;
  1290. error:
  1291.     free( psz_dup );
  1292.     return VLC_EGENERIC;
  1293. }
  1294. static void PIDInit( ts_pid_t *pid, bool b_psi, ts_psi_t *p_owner )
  1295. {
  1296.     bool b_old_valid = pid->b_valid;
  1297.     pid->b_valid    = true;
  1298.     pid->i_cc       = 0xff;
  1299.     pid->b_scrambled = false;
  1300.     pid->p_owner    = p_owner;
  1301.     pid->i_owner_number = 0;
  1302.     TAB_INIT( pid->i_extra_es, pid->extra_es );
  1303.     if( b_psi )
  1304.     {
  1305.         pid->es  = NULL;
  1306.         if( !b_old_valid )
  1307.         {
  1308.             pid->psi = malloc( sizeof( ts_psi_t ) );
  1309.             if( pid->psi )
  1310.             {
  1311.                 pid->psi->handle = NULL;
  1312.                 TAB_INIT( pid->psi->i_prg, pid->psi->prg );
  1313.             }
  1314.         }
  1315.         assert( pid->psi );
  1316.         pid->psi->i_pat_version  = -1;
  1317.         pid->psi->i_sdt_version  = -1;
  1318.         if( p_owner )
  1319.         {
  1320.             ts_prg_psi_t *prg = malloc( sizeof( ts_prg_psi_t ) );
  1321.             if( prg )
  1322.             {
  1323.                 /* PMT */
  1324.                 prg->i_version  = -1;
  1325.                 prg->i_number   = -1;
  1326.                 prg->i_pid_pcr  = -1;
  1327.                 prg->i_pid_pmt  = -1;
  1328.                 prg->iod        = NULL;
  1329.                 prg->handle     = NULL;
  1330.                 TAB_APPEND( pid->psi->i_prg, pid->psi->prg, prg );
  1331.             }
  1332.         }
  1333.     }
  1334.     else
  1335.     {
  1336.         pid->psi = NULL;
  1337.         pid->es  = malloc( sizeof( ts_es_t ) );
  1338.         if( pid->es )
  1339.         {
  1340.             es_format_Init( &pid->es->fmt, UNKNOWN_ES, 0 );
  1341.             pid->es->id      = NULL;
  1342.             pid->es->p_pes   = NULL;
  1343.             pid->es->i_pes_size= 0;
  1344.             pid->es->i_pes_gathered= 0;
  1345.             pid->es->pp_last = &pid->es->p_pes;
  1346.             pid->es->p_mpeg4desc = NULL;
  1347.             pid->es->b_gather = false;
  1348.         }
  1349.     }
  1350. }
  1351. static void PIDClean( es_out_t *out, ts_pid_t *pid )
  1352. {
  1353.     if( pid->psi )
  1354.     {
  1355.         if( pid->psi->handle )
  1356.             dvbpsi_DetachPMT( pid->psi->handle );
  1357.         for( int i = 0; i < pid->psi->i_prg; i++ )
  1358.         {
  1359.             if( pid->psi->prg[i]->iod )
  1360.                 IODFree( pid->psi->prg[i]->iod );
  1361.             if( pid->psi->prg[i]->handle )
  1362.                 dvbpsi_DetachPMT( pid->psi->prg[i]->handle );
  1363.             free( pid->psi->prg[i] );
  1364.         }
  1365.         free( pid->psi->prg );
  1366.         free( pid->psi );
  1367.     }
  1368.     else
  1369.     {
  1370.         if( pid->es->id )
  1371.             es_out_Del( out, pid->es->id );
  1372.         if( pid->es->p_pes )
  1373.             block_ChainRelease( pid->es->p_pes );
  1374.         es_format_Clean( &pid->es->fmt );
  1375.         free( pid->es );
  1376.         for( int i = 0; i < pid->i_extra_es; i++ )
  1377.         {
  1378.             if( pid->extra_es[i]->id )
  1379.                 es_out_Del( out, pid->extra_es[i]->id );
  1380.             if( pid->extra_es[i]->p_pes )
  1381.                 block_ChainRelease( pid->extra_es[i]->p_pes );
  1382.             es_format_Clean( &pid->extra_es[i]->fmt );
  1383.             free( pid->extra_es[i] );
  1384.         }
  1385.         if( pid->i_extra_es )
  1386.             free( pid->extra_es );
  1387.     }
  1388.     pid->b_valid = false;
  1389. }
  1390. /****************************************************************************
  1391.  * gathering stuff
  1392.  ****************************************************************************/
  1393. static void ParsePES( demux_t *p_demux, ts_pid_t *pid )
  1394. {
  1395.     block_t *p_pes = pid->es->p_pes;
  1396.     uint8_t header[34];
  1397.     int     i_pes_size = 0;
  1398.     int     i_skip = 0;
  1399.     mtime_t i_dts = -1;
  1400.     mtime_t i_pts = -1;
  1401.     mtime_t i_length = 0;
  1402.     /* remove the pes from pid */
  1403.     pid->es->p_pes = NULL;
  1404.     pid->es->i_pes_size= 0;
  1405.     pid->es->i_pes_gathered= 0;
  1406.     pid->es->pp_last = &pid->es->p_pes;
  1407.     /* FIXME find real max size */
  1408.     const int i_max = block_ChainExtract( p_pes, header, 34 );
  1409.     if( header[0] != 0 || header[1] != 0 || header[2] != 1 )
  1410.     {
  1411.         if( !p_demux->p_sys->b_silent )
  1412.             msg_Warn( p_demux, "invalid header [0x%x:%x:%x:%x] (pid: %d)",
  1413.                       header[0], header[1],header[2],header[3], pid->i_pid );
  1414.         block_ChainRelease( p_pes );
  1415.         return;
  1416.     }
  1417.     /* TODO check size */
  1418.     switch( header[3] )
  1419.     {
  1420.     case 0xBC:  /* Program stream map */
  1421.     case 0xBE:  /* Padding */
  1422.     case 0xBF:  /* Private stream 2 */
  1423.     case 0xF0:  /* ECM */
  1424.     case 0xF1:  /* EMM */
  1425.     case 0xFF:  /* Program stream directory */
  1426.     case 0xF2:  /* DSMCC stream */
  1427.     case 0xF8:  /* ITU-T H.222.1 type E stream */
  1428.         i_skip = 6;
  1429.         break;
  1430.     default:
  1431.         if( ( header[6]&0xC0 ) == 0x80 )
  1432.         {
  1433.             /* mpeg2 PES */
  1434.             i_skip = header[8] + 9;
  1435.             if( header[7]&0x80 )    /* has pts */
  1436.             {
  1437.                 i_pts = ((mtime_t)(header[ 9]&0x0e ) << 29)|
  1438.                          (mtime_t)(header[10] << 22)|
  1439.                         ((mtime_t)(header[11]&0xfe) << 14)|
  1440.                          (mtime_t)(header[12] << 7)|
  1441.                          (mtime_t)(header[13] >> 1);
  1442.                 if( header[7]&0x40 )    /* has dts */
  1443.                 {
  1444.                      i_dts = ((mtime_t)(header[14]&0x0e ) << 29)|
  1445.                              (mtime_t)(header[15] << 22)|
  1446.                             ((mtime_t)(header[16]&0xfe) << 14)|
  1447.                              (mtime_t)(header[17] << 7)|
  1448.                              (mtime_t)(header[18] >> 1);
  1449.                 }
  1450.             }
  1451.         }
  1452.         else
  1453.         {
  1454.             i_skip = 6;
  1455.             while( i_skip < 23 && header[i_skip] == 0xff )
  1456.             {
  1457.                 i_skip++;
  1458.             }
  1459.             if( i_skip == 23 )
  1460.             {
  1461.                 msg_Err( p_demux, "too much MPEG-1 stuffing" );
  1462.                 block_ChainRelease( p_pes );
  1463.                 return;
  1464.             }
  1465.             if( ( header[i_skip] & 0xC0 ) == 0x40 )
  1466.             {
  1467.                 i_skip += 2;
  1468.             }
  1469.             if(  header[i_skip]&0x20 )
  1470.             {
  1471.                  i_pts = ((mtime_t)(header[i_skip]&0x0e ) << 29)|
  1472.                           (mtime_t)(header[i_skip+1] << 22)|
  1473.                          ((mtime_t)(header[i_skip+2]&0xfe) << 14)|
  1474.                           (mtime_t)(header[i_skip+3] << 7)|
  1475.                           (mtime_t)(header[i_skip+4] >> 1);
  1476.                 if( header[i_skip]&0x10 )    /* has dts */
  1477.                 {
  1478.                      i_dts = ((mtime_t)(header[i_skip+5]&0x0e ) << 29)|
  1479.                               (mtime_t)(header[i_skip+6] << 22)|
  1480.                              ((mtime_t)(header[i_skip+7]&0xfe) << 14)|
  1481.                               (mtime_t)(header[i_skip+8] << 7)|
  1482.                               (mtime_t)(header[i_skip+9] >> 1);
  1483.                      i_skip += 10;
  1484.                 }
  1485.                 else
  1486.                 {
  1487.                     i_skip += 5;
  1488.                 }
  1489.             }
  1490.             else
  1491.             {
  1492.                 i_skip += 1;
  1493.             }
  1494.         }
  1495.         break;
  1496.     }
  1497.     if( pid->es->fmt.i_codec == VLC_FOURCC( 'a', '5', '2', 'b' ) ||
  1498.         pid->es->fmt.i_codec == VLC_FOURCC( 'd', 't', 's', 'b' ) )
  1499.     {
  1500.         i_skip += 4;
  1501.     }
  1502.     else if( pid->es->fmt.i_codec == VLC_FOURCC( 'l', 'p', 'c', 'b' ) ||
  1503.              pid->es->fmt.i_codec == VLC_FOURCC( 's', 'p', 'u', 'b' ) ||
  1504.              pid->es->fmt.i_codec == VLC_FOURCC( 's', 'd', 'd', 'b' ) )
  1505.     {
  1506.         i_skip += 1;
  1507.     }
  1508.     else if( pid->es->fmt.i_codec == VLC_FOURCC( 's', 'u', 'b', 't' ) &&
  1509.              pid->es->p_mpeg4desc )
  1510.     {
  1511.         decoder_config_descriptor_t *dcd = &pid->es->p_mpeg4desc->dec_descr;
  1512.         if( dcd->i_decoder_specific_info_len > 2 &&
  1513.             dcd->p_decoder_specific_info[0] == 0x10 &&
  1514.             ( dcd->p_decoder_specific_info[1]&0x10 ) )
  1515.         {
  1516.             /* display length */
  1517.             if( p_pes->i_buffer + 2 <= i_skip )
  1518.             {
  1519.                 i_length = GetWBE( &p_pes->p_buffer[i_skip] );
  1520.             }
  1521.             i_skip += 2;
  1522.         }
  1523.         if( p_pes->i_buffer + 2 <= i_skip )
  1524.         {
  1525.             i_pes_size = GetWBE( &p_pes->p_buffer[i_skip] );
  1526.         }
  1527.         /* */
  1528.         i_skip += 2;
  1529.     }
  1530. #ifdef ZVBI_COMPILED
  1531.     else if( pid->es->fmt.i_codec == VLC_FOURCC( 't', 'e', 'l', 'x' ) )
  1532.         i_skip = 0; /*hack for zvbi support */
  1533. #endif
  1534.     /* skip header */
  1535.     while( p_pes && i_skip > 0 )
  1536.     {
  1537.         if( p_pes->i_buffer <= i_skip )
  1538.         {
  1539.             block_t *p_next = p_pes->p_next;
  1540.             i_skip -= p_pes->i_buffer;
  1541.             block_Release( p_pes );
  1542.             p_pes = p_next;
  1543.         }
  1544.         else
  1545.         {
  1546.             p_pes->i_buffer -= i_skip;
  1547.             p_pes->p_buffer += i_skip;
  1548.             break;
  1549.         }
  1550.     }
  1551.     /* ISO/IEC 13818-1 2.7.5: if no pts and no dts, then dts == pts */
  1552.     if( i_pts >= 0 && i_dts < 0 )
  1553.         i_dts = i_pts;
  1554.     if( p_pes )
  1555.     {
  1556.         block_t *p_block;
  1557.         int i;
  1558.         if( i_dts >= 0 )
  1559.         {
  1560.             p_pes->i_dts = i_dts * 100 / 9;
  1561.         }
  1562.         if( i_pts >= 0 )
  1563.         {
  1564.             p_pes->i_pts = i_pts * 100 / 9;
  1565.         }
  1566.         p_pes->i_length = i_length * 100 / 9;
  1567.         p_block = block_ChainGather( p_pes );
  1568.         if( pid->es->fmt.i_codec == VLC_FOURCC( 's', 'u', 'b', 't' ) )
  1569.         {
  1570.             if( i_pes_size > 0 && p_block->i_buffer > i_pes_size )
  1571.             {
  1572.                 p_block->i_buffer = i_pes_size;
  1573.             }
  1574.             /* Append a  */
  1575.             p_block = block_Realloc( p_block, 0, p_block->i_buffer + 1 );
  1576.             p_block->p_buffer[p_block->i_buffer -1] = '';
  1577.         }
  1578.         for( i = 0; i < pid->i_extra_es; i++ )
  1579.         {
  1580.             es_out_Send( p_demux->out, pid->extra_es[i]->id,
  1581.                          block_Duplicate( p_block ) );
  1582.         }
  1583.         es_out_Send( p_demux->out, pid->es->id, p_block );
  1584.     }
  1585.     else
  1586.     {
  1587.         msg_Warn( p_demux, "empty pes" );
  1588.     }
  1589. }
  1590. static void PCRHandle( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
  1591. {
  1592.     demux_sys_t   *p_sys = p_demux->p_sys;
  1593.     const uint8_t *p = p_bk->p_buffer;
  1594.     if( ( p[3]&0x20 ) && /* adaptation */
  1595.         ( p[5]&0x10 ) &&
  1596.         ( p[4] >= 7 ) )
  1597.     {
  1598.         /* PCR is 33 bits */
  1599.         const mtime_t i_pcr = ( (mtime_t)p[6] << 25 ) |
  1600.                               ( (mtime_t)p[7] << 17 ) |
  1601.                               ( (mtime_t)p[8] << 9 ) |
  1602.                               ( (mtime_t)p[9] << 1 ) |
  1603.                               ( (mtime_t)p[10] >> 7 );
  1604.         /* Search program and set the PCR */
  1605.         for( int i = 0; i < p_sys->i_pmt; i++ )
  1606.         {
  1607.             for( int i_prg = 0; i_prg < p_sys->pmt[i]->psi->i_prg; i_prg++ )
  1608.             {
  1609.                 if( pid->i_pid == p_sys->pmt[i]->psi->prg[i_prg]->i_pid_pcr )
  1610.                 {
  1611.                     es_out_Control( p_demux->out, ES_OUT_SET_GROUP_PCR,
  1612.                                     (int)p_sys->pmt[i]->psi->prg[i_prg]->i_number,
  1613.                                     (int64_t)(i_pcr * 100 / 9) );
  1614.                 }
  1615.             }
  1616.         }
  1617.     }
  1618. }
  1619. static bool GatherPES( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
  1620. {
  1621.     const uint8_t *p = p_bk->p_buffer;
  1622.     const bool b_unit_start = p[1]&0x40;
  1623.     const bool b_scrambled  = p[3]&0x80;
  1624.     const bool b_adaptation = p[3]&0x20;
  1625.     const bool b_payload    = p[3]&0x10;
  1626.     const int  i_cc         = p[3]&0x0f; /* continuity counter */
  1627.     bool       b_discontinuity = false;  /* discontinuity */
  1628.     /* transport_scrambling_control is ignored */
  1629.     int         i_skip = 0;
  1630.     bool        i_ret  = false;
  1631. #if 0
  1632.     msg_Dbg( p_demux, "pid=%d unit_start=%d adaptation=%d payload=%d "
  1633.              "cc=0x%x", pid->i_pid, b_unit_start, b_adaptation,
  1634.              b_payload, i_cc );
  1635. #endif
  1636.     /* For now, ignore additional error correction
  1637.      * TODO: handle Reed-Solomon 204,188 error correction */
  1638.     p_bk->i_buffer = TS_PACKET_SIZE_188;
  1639.     if( p[1]&0x80 )
  1640.     {
  1641.         msg_Dbg( p_demux, "transport_error_indicator set (pid=%d)",
  1642.                  pid->i_pid );
  1643.         if( pid->es->p_pes ) //&& pid->es->fmt.i_cat == VIDEO_ES )
  1644.             pid->es->p_pes->i_flags |= BLOCK_FLAG_CORRUPTED;
  1645.     }
  1646.     if( p_demux->p_sys->csa )
  1647.     {
  1648.         vlc_mutex_lock( &p_demux->p_sys->csa_lock );
  1649.         csa_Decrypt( p_demux->p_sys->csa, p_bk->p_buffer, p_demux->p_sys->i_csa_pkt_size );
  1650.         vlc_mutex_unlock( &p_demux->p_sys->csa_lock );
  1651.     }
  1652.     if( !b_adaptation )
  1653.     {
  1654.         /* We don't have any adaptation_field, so payload starts
  1655.          * immediately after the 4 byte TS header */
  1656.         i_skip = 4;
  1657.     }
  1658.     else
  1659.     {
  1660.         /* p[4] is adaptation_field_length minus one */
  1661.         i_skip = 5 + p[4];
  1662.         if( p[4] > 0 )
  1663.         {
  1664.             /* discontinuity indicator found in stream */
  1665.             b_discontinuity = (p[5]&0x80) ? true : false;
  1666.             if( b_discontinuity && pid->es->p_pes )
  1667.             {
  1668.                 msg_Warn( p_demux, "discontinuity indicator (pid=%d) ",
  1669.                             pid->i_pid );
  1670.                 /* pid->es->p_pes->i_flags |= BLOCK_FLAG_DISCONTINUITY; */
  1671.             }
  1672. #if 0
  1673.             if( p[5]&0x40 )
  1674.                 msg_Dbg( p_demux, "random access indicator (pid=%d) ", pid->i_pid );
  1675. #endif
  1676.         }
  1677.     }
  1678.     /* Test continuity counter */
  1679.     /* continuous when (one of this):
  1680.         * diff == 1
  1681.         * diff == 0 and payload == 0
  1682.         * diff == 0 and duplicate packet (playload != 0) <- should we
  1683.         *   test the content ?
  1684.      */
  1685.     const int i_diff = ( i_cc - pid->i_cc )&0x0f;
  1686.     if( b_payload && i_diff == 1 )
  1687.     {
  1688.         pid->i_cc = ( pid->i_cc + 1 ) & 0xf;
  1689.     }
  1690.     else
  1691.     {
  1692.         if( pid->i_cc == 0xff )
  1693.         {
  1694.             msg_Warn( p_demux, "first packet for pid=%d cc=0x%x",
  1695.                       pid->i_pid, i_cc );
  1696.             pid->i_cc = i_cc;
  1697.         }
  1698.         else if( i_diff != 0 && !b_discontinuity )
  1699.         {
  1700.             msg_Warn( p_demux, "discontinuity received 0x%x instead of 0x%x (pid=%d)",
  1701.                       i_cc, ( pid->i_cc + 1 )&0x0f, pid->i_pid );
  1702.             pid->i_cc = i_cc;
  1703.             if( pid->es->p_pes && pid->es->fmt.i_cat != VIDEO_ES )
  1704.             {
  1705.                 /* Small video artifacts are usually better then
  1706.                  * dropping full frames */
  1707.                 pid->es->p_pes->i_flags |= BLOCK_FLAG_CORRUPTED;
  1708.             }
  1709.         }
  1710.     }
  1711.     PCRHandle( p_demux, pid, p_bk );
  1712.     if( i_skip >= 188 || pid->es->id == NULL || p_demux->p_sys->b_udp_out )
  1713.     {
  1714.         block_Release( p_bk );
  1715.         return i_ret;
  1716.     }
  1717.     /* */
  1718.     if( !pid->b_scrambled != !b_scrambled )
  1719.     {
  1720.         msg_Warn( p_demux, "scrambled state changed on pid %d (%d->%d)",
  1721.                   pid->i_pid, pid->b_scrambled, b_scrambled );
  1722.         pid->b_scrambled = b_scrambled;
  1723.         for( int i = 0; i < pid->i_extra_es; i++ )
  1724.         {
  1725.             es_out_Control( p_demux->out, ES_OUT_SET_ES_SCRAMBLED_STATE,
  1726.                             pid->extra_es[i]->id, b_scrambled );
  1727.         }
  1728.         es_out_Control( p_demux->out, ES_OUT_SET_ES_SCRAMBLED_STATE,
  1729.                         pid->es->id, b_scrambled );
  1730.     }
  1731.     /* We have to gather it */
  1732.     p_bk->p_buffer += i_skip;
  1733.     p_bk->i_buffer -= i_skip;
  1734.     if( b_unit_start )
  1735.     {
  1736.         if( pid->es->p_pes )
  1737.         {
  1738.             ParsePES( p_demux, pid );
  1739.             i_ret = true;
  1740.         }
  1741.         block_ChainLastAppend( &pid->es->pp_last, p_bk );
  1742.         if( p_bk->i_buffer > 6 )
  1743.         {
  1744.             pid->es->i_pes_size = GetWBE( &p_bk->p_buffer[4] );
  1745.             if( pid->es->i_pes_size > 0 )
  1746.             {
  1747.                 pid->es->i_pes_size += 6;
  1748.             }
  1749.         }
  1750.         pid->es->i_pes_gathered += p_bk->i_buffer;
  1751.         if( pid->es->i_pes_size > 0 &&
  1752.             pid->es->i_pes_gathered >= pid->es->i_pes_size )
  1753.         {
  1754.             ParsePES( p_demux, pid );
  1755.             i_ret = true;
  1756.         }
  1757.     }
  1758.     else
  1759.     {
  1760.         if( pid->es->p_pes == NULL )
  1761.         {
  1762.             /* msg_Dbg( p_demux, "broken packet" ); */
  1763.             block_Release( p_bk );
  1764.         }
  1765.         else
  1766.         {
  1767.             block_ChainLastAppend( &pid->es->pp_last, p_bk );
  1768.             pid->es->i_pes_gathered += p_bk->i_buffer;
  1769.             if( pid->es->i_pes_size > 0 &&
  1770.                 pid->es->i_pes_gathered >= pid->es->i_pes_size )
  1771.             {
  1772.                 ParsePES( p_demux, pid );
  1773.                 i_ret = true;
  1774.             }
  1775.         }
  1776.     }
  1777.     return i_ret;
  1778. }
  1779. static int PIDFillFormat( ts_pid_t *pid, int i_stream_type )
  1780. {
  1781.     es_format_t *fmt = &pid->es->fmt;
  1782.     switch( i_stream_type )
  1783.     {
  1784.     case 0x01:  /* MPEG-1 video */
  1785.     case 0x02:  /* MPEG-2 video */
  1786.     case 0x80:  /* MPEG-2 MOTO video */
  1787.         es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'm', 'p', 'g', 'v' ) );
  1788.         break;
  1789.     case 0x03:  /* MPEG-1 audio */
  1790.     case 0x04:  /* MPEG-2 audio */
  1791.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'm', 'p', 'g', 'a' ) );
  1792.         break;
  1793.     case 0x11:  /* MPEG4 (audio) */
  1794.     case 0x0f:  /* ISO/IEC 13818-7 Audio with ADTS transport syntax */
  1795.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'm', 'p', '4', 'a' ) );
  1796.         break;
  1797.     case 0x10:  /* MPEG4 (video) */
  1798.         es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'm', 'p', '4', 'v' ) );
  1799.         pid->es->b_gather = true;
  1800.         break;
  1801.     case 0x1B:  /* H264 <- check transport syntax/needed descriptor */
  1802.         es_format_Init( fmt, VIDEO_ES, VLC_FOURCC( 'h', '2', '6', '4' ) );
  1803.         break;
  1804.     case 0x81:  /* A52 (audio) */
  1805.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'a', '5', '2', ' ' ) );
  1806.         break;
  1807.     case 0x82:  /* DVD_SPU (sub) */
  1808.         es_format_Init( fmt, SPU_ES, VLC_FOURCC( 's', 'p', 'u', ' ' ) );
  1809.         break;
  1810.     case 0x83:  /* LPCM (audio) */
  1811.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'l', 'p', 'c', 'm' ) );
  1812.         break;
  1813.     case 0x84:  /* SDDS (audio) */
  1814.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 's', 'd', 'd', 's' ) );
  1815.         break;
  1816.     case 0x85:  /* DTS (audio) */
  1817.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'd', 't', 's', ' ' ) );
  1818.         break;
  1819.     case 0x87: /* E-AC3 */
  1820.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'e', 'a', 'c', '3' ) );
  1821.         break;
  1822.     case 0x91:  /* A52 vls (audio) */
  1823.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'a', '5', '2', 'b' ) );
  1824.         break;
  1825.     case 0x92:  /* DVD_SPU vls (sub) */
  1826.         es_format_Init( fmt, SPU_ES, VLC_FOURCC( 's', 'p', 'u', 'b' ) );
  1827.         break;
  1828.     case 0x94:  /* SDDS (audio) */
  1829.         es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 's', 'd', 'd', 'b' ) );
  1830.         break;
  1831.     case 0xa0:  /* MSCODEC vlc (video) (fixed later) */
  1832.         es_format_Init( fmt, UNKNOWN_ES, 0 );
  1833.         pid->es->b_gather = true;
  1834.         break;
  1835.     case 0x06:  /* PES_PRIVATE  (fixed later) */
  1836.     case 0x12:  /* MPEG-4 generic (sub/scene/...) (fixed later) */
  1837.     case 0xEA:  /* Privately managed ES (VC-1) (fixed later */
  1838.     default:
  1839.         es_format_Init( fmt, UNKNOWN_ES, 0 );
  1840.         break;
  1841.     }
  1842.     /* PES packets usually contain truncated frames */
  1843.     fmt->b_packetized = false;
  1844.     return fmt->i_cat == UNKNOWN_ES ? VLC_EGENERIC : VLC_SUCCESS ;
  1845. }
  1846. /*****************************************************************************
  1847.  * MP4 specific functions (IOD parser)
  1848.  *****************************************************************************/
  1849. static int  IODDescriptorLength( int *pi_data, uint8_t **pp_data )
  1850. {
  1851.     unsigned int i_b;
  1852.     unsigned int i_len = 0;
  1853.     do
  1854.     {
  1855.         i_b = **pp_data;
  1856.         (*pp_data)++;
  1857.         (*pi_data)--;
  1858.         i_len = ( i_len << 7 ) + ( i_b&0x7f );
  1859.     } while( i_b&0x80 );