X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmux%2Fmpeg%2Fts.c;h=eb0ce1243aa75823a414a7c191ca0d4a4eabbd0e;hb=48f5522f911068f93f9985fc5aa04fbd4ac3a368;hp=82737fc4f33d99cf768d1da9532498fb3cf5e471;hpb=74e5a0727b83ea8bd5ee87dbce7596b990ef14c1;p=vlc diff --git a/modules/mux/mpeg/ts.c b/modules/mux/mpeg/ts.c index 82737fc4f3..eb0ce1243a 100644 --- a/modules/mux/mpeg/ts.c +++ b/modules/mux/mpeg/ts.c @@ -37,8 +37,8 @@ #include #include #include -#include #include +#include #include @@ -143,7 +143,7 @@ static void Close ( vlc_object_t * ); "of the shaping algorithm, since I frames are usually the biggest " \ "frames in the stream.") -#define PCR_TEXT N_("PCR delay (ms)") +#define PCR_TEXT N_("PCR interval (ms)") #define PCR_LONGTEXT N_("Set at which interval " \ "PCRs (Program Clock Reference) will be sent (in milliseconds). " \ "This value should be below 100ms. (default is 70ms).") @@ -210,7 +210,7 @@ vlc_module_begin () #endif add_string( SOUT_CFG_PREFIX "program-pmt", NULL, NULL, PMTPROG_TEXT, PMTPROG_LONGTEXT, true ) - add_bool( SOUT_CFG_PREFIX "es-id-pid", 0, NULL, PID_TEXT, PID_LONGTEXT, + add_bool( SOUT_CFG_PREFIX "es-id-pid", false, NULL, PID_TEXT, PID_LONGTEXT, true ) add_string( SOUT_CFG_PREFIX "muxpmt", NULL, NULL, MUXPMT_TEXT, MUXPMT_LONGTEXT, true ) #ifdef HAVE_DVBPSI_SDT @@ -520,7 +520,6 @@ static int Open( vlc_object_t *p_this ) p_mux->pf_mux = Mux; p_mux->p_sys = p_sys; - srand( (uint32_t)mdate() ); for ( i = 0; i < MAX_PMT; i++ ) p_sys->sdt_descriptors[i].psz_service_name = p_sys->sdt_descriptors[i].psz_provider = NULL; @@ -529,8 +528,7 @@ static int Open( vlc_object_t *p_this ) p_sys->i_audio_bound = 0; p_sys->i_video_bound = 0; - var_Get( p_mux, SOUT_CFG_PREFIX "es-id-pid", &val ); - p_sys->b_es_id_pid = val.b_bool; + p_sys->b_es_id_pid = var_GetBool( p_mux, SOUT_CFG_PREFIX "es-id-pid" ); var_Get( p_mux, SOUT_CFG_PREFIX "muxpmt", &val ); /* @@ -583,7 +581,9 @@ static int Open( vlc_object_t *p_this ) } free( val.psz_string ); - p_sys->i_pat_version_number = rand() % 32; + unsigned short subi[3]; + vlc_rand_bytes(subi, sizeof(subi)); + p_sys->i_pat_version_number = nrand48(subi) & 0x1f; p_sys->pat.i_pid = 0; p_sys->pat.i_continuity_counter = 0; p_sys->pat.b_discontinuity = false; @@ -592,16 +592,16 @@ static int Open( vlc_object_t *p_this ) if ( val.i_int ) p_sys->i_tsid = val.i_int; else - p_sys->i_tsid = rand() % 65536; + p_sys->i_tsid = nrand48(subi) & 0xffff; - p_sys->i_netid = rand() % 65536; + p_sys->i_netid = nrand48(subi) & 0xffff; #ifdef HAVE_DVBPSI_SDT var_Get( p_mux, SOUT_CFG_PREFIX "netid", &val ); if ( val.i_int ) p_sys->i_netid = val.i_int; #endif - p_sys->i_pmt_version_number = rand() % 32; + p_sys->i_pmt_version_number = nrand48(subi) & 0x1f; for( i = 0; i < p_sys->i_num_pmt; i++ ) { p_sys->pmt[i].i_continuity_counter = 0; @@ -651,8 +651,7 @@ static int Open( vlc_object_t *p_this ) p_sys->b_sdt = false; #endif - var_Get( p_mux, SOUT_CFG_PREFIX "alignment", &val ); - p_sys->b_data_alignment = val.b_bool; + p_sys->b_data_alignment = var_GetBool( p_mux, SOUT_CFG_PREFIX "alignment" ); var_Get( p_mux, SOUT_CFG_PREFIX "program-pmt", &val ); if( val.psz_string && *val.psz_string ) @@ -706,22 +705,19 @@ static int Open( vlc_object_t *p_this ) p_sys->i_pid_free = p_sys->pmt[p_sys->i_num_pmt - 1].i_pid + 1; - var_Get( p_mux, SOUT_CFG_PREFIX "pid-video", &val ); - p_sys->i_pid_video = val.i_int; + p_sys->i_pid_video = var_GetInteger( p_mux, SOUT_CFG_PREFIX "pid-video" ); if ( p_sys->i_pid_video > p_sys->i_pid_free ) { p_sys->i_pid_free = p_sys->i_pid_video + 1; } - var_Get( p_mux, SOUT_CFG_PREFIX "pid-audio", &val ); - p_sys->i_pid_audio = val.i_int; + p_sys->i_pid_audio = var_GetInteger( p_mux, SOUT_CFG_PREFIX "pid-audio" ); if ( p_sys->i_pid_audio > p_sys->i_pid_free ) { p_sys->i_pid_free = p_sys->i_pid_audio + 1; } - var_Get( p_mux, SOUT_CFG_PREFIX "pid-spu", &val ); - p_sys->i_pid_spu = val.i_int; + p_sys->i_pid_spu = var_GetInteger( p_mux, SOUT_CFG_PREFIX "pid-spu" ); if ( p_sys->i_pid_spu > p_sys->i_pid_free ) { p_sys->i_pid_free = p_sys->i_pid_spu + 1; @@ -735,11 +731,9 @@ static int Open( vlc_object_t *p_this ) p_sys->i_null_continuity_counter = 0; /* Allow to create constrained stream */ - var_Get( p_mux, SOUT_CFG_PREFIX "bmin", &val ); - p_sys->i_bitrate_min = val.i_int; + p_sys->i_bitrate_min = var_GetInteger( p_mux, SOUT_CFG_PREFIX "bmin" ); - var_Get( p_mux, SOUT_CFG_PREFIX "bmax", &val ); - p_sys->i_bitrate_max = val.i_int; + p_sys->i_bitrate_max = var_GetInteger( p_mux, SOUT_CFG_PREFIX "bmax" ); if( p_sys->i_bitrate_min > 0 && p_sys->i_bitrate_max > 0 && p_sys->i_bitrate_min > p_sys->i_bitrate_max ) @@ -782,8 +776,7 @@ static int Open( vlc_object_t *p_this ) msg_Dbg( p_mux, "shaping=%"PRId64" pcr=%"PRId64" dts_delay=%"PRId64, p_sys->i_shaping_delay, p_sys->i_pcr_delay, p_sys->i_dts_delay ); - var_Get( p_mux, SOUT_CFG_PREFIX "use-key-frames", &val ); - p_sys->b_use_key_frames = val.b_bool; + p_sys->b_use_key_frames = var_GetBool( p_mux, SOUT_CFG_PREFIX "use-key-frames" ); /* for TS generation */ p_sys->i_pcr = 0; @@ -837,7 +830,8 @@ static int Open( vlc_object_t *p_this ) var_Get( p_mux, SOUT_CFG_PREFIX "csa-pkt", &pkt_val ); if( pkt_val.i_int < 12 || pkt_val.i_int > 188 ) { - msg_Err( p_mux, "wrong packet size %d specified.", pkt_val.i_int ); + msg_Err( p_mux, "wrong packet size %"PRId64" specified.", + pkt_val.i_int ); msg_Warn( p_mux, "using default packet size of 188 bytes" ); p_sys->i_csa_pkt_size = 188; } @@ -848,11 +842,9 @@ static int Open( vlc_object_t *p_this ) } free( val.psz_string ); - var_Get( p_mux, SOUT_CFG_PREFIX "crypt-audio", &val ); - p_sys->b_crypt_audio = val.b_bool; + p_sys->b_crypt_audio = var_GetBool( p_mux, SOUT_CFG_PREFIX "crypt-audio" ); - var_Get( p_mux, SOUT_CFG_PREFIX "crypt-video", &val ); - p_sys->b_crypt_video = val.b_bool; + p_sys->b_crypt_video = var_GetBool( p_mux, SOUT_CFG_PREFIX "crypt-video" ); return VLC_SUCCESS; } @@ -866,16 +858,13 @@ static void Close( vlc_object_t * p_this ) sout_mux_sys_t *p_sys = p_mux->p_sys; int i; - vlc_mutex_lock( &p_sys->csa_lock ); if( p_sys->csa ) { var_DelCallback( p_mux, SOUT_CFG_PREFIX "csa-ck", ChangeKeyCallback, NULL ); var_DelCallback( p_mux, SOUT_CFG_PREFIX "csa2-ck", ChangeKeyCallback, NULL ); var_DelCallback( p_mux, SOUT_CFG_PREFIX "csa-use", ActiveKeyCallback, NULL ); csa_Delete( p_sys->csa ); - p_sys->csa = NULL; } - vlc_mutex_unlock( &p_sys->csa_lock ); for( i = 0; i < MAX_PMT; i++ ) { @@ -1054,6 +1043,10 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) p_stream->i_stream_type = 0x81; p_stream->i_stream_id = 0xbd; break; + case VLC_CODEC_EAC3: + p_stream->i_stream_type = 0x06; + p_stream->i_stream_id = 0xbd; + break; case VLC_CODEC_DVD_LPCM: p_stream->i_stream_type = 0x83; p_stream->i_stream_id = 0xbd; @@ -1396,7 +1389,6 @@ static int Mux( sout_mux_t *p_mux ) block_FifoEmpty( p_mux->pp_inputs[i]->p_fifo ); } msg_Dbg( p_mux, "waiting for PCR streams" ); - msleep( 1000 ); return VLC_SUCCESS; } p_pcr_stream = (ts_stream_t*)p_sys->p_pcr_input->p_sys; @@ -1765,6 +1757,7 @@ static int Mux( sout_mux_t *p_mux ) #define STD_PES_PAYLOAD 170 static block_t *FixPES( sout_mux_t *p_mux, block_fifo_t *p_fifo ) { + VLC_UNUSED(p_mux); block_t *p_data; size_t i_size; @@ -2003,6 +1996,7 @@ static void TSDate( sout_mux_t *p_mux, sout_buffer_chain_t *p_chain_ts, static block_t *TSNew( sout_mux_t *p_mux, ts_stream_t *p_stream, bool b_pcr ) { + VLC_UNUSED(p_mux); block_t *p_pes = p_stream->chain_pes.p_first; block_t *p_ts; @@ -2025,6 +2019,12 @@ static block_t *TSNew( sout_mux_t *p_mux, ts_stream_t *p_stream, } p_ts = block_New( p_mux, 188 ); + + if (b_new_pes && !(p_pes->i_flags & BLOCK_FLAG_NO_KEYFRAME) && p_pes->i_flags & BLOCK_FLAG_TYPE_I) + { + p_ts->i_flags |= BLOCK_FLAG_TYPE_I; + } + p_ts->i_dts = p_pes->i_dts; p_ts->p_buffer[0] = 0x47; @@ -2222,6 +2222,7 @@ static void PEStoTS( sout_instance_t *p_sout, sout_buffer_chain_t *c, block_t *p_pes, ts_stream_t *p_stream ) { + VLC_UNUSED(p_sout); uint8_t *p_data; int i_size; int b_new_pes; @@ -2313,6 +2314,7 @@ static void PEStoTS( sout_instance_t *p_sout, static block_t *WritePSISection( sout_instance_t *p_sout, dvbpsi_psi_section_t* p_section ) { + VLC_UNUSED(p_sout); block_t *p_psi, *p_first = NULL; while( p_section ) @@ -2694,6 +2696,11 @@ static void GetPMT( sout_mux_t *p_mux, sout_buffer_chain_t *c ) uint8_t data[4] = { 0x44, 0x54, 0x53, 0x32 }; dvbpsi_PMTESAddDescriptor( p_es, 0x05, 4, data ); } + else if( p_stream->i_codec == VLC_CODEC_EAC3 ) + { + uint8_t data[1] = { 0x00 }; + dvbpsi_PMTESAddDescriptor( p_es, 0x7a, 1, data ); + } else if( p_stream->i_codec == VLC_CODEC_TELETEXT ) { if( p_stream->i_decoder_specific_info )