vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Mar 2 22:09:47 2016 +0100| [06f6d9418e18794223aeed1e3c62a8e54a3ddf82] | committer: Francois Cartegnie
demux: ts: unify standards and its options > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=06f6d9418e18794223aeed1e3c62a8e54a3ddf82 --- modules/demux/mpeg/ts.c | 58 +++++++++++++++++++++++++-------------- modules/demux/mpeg/ts.h | 19 ++++++++----- modules/demux/mpeg/ts_psi.c | 26 ++++++++++++++---- modules/demux/mpeg/ts_psi_eit.c | 5 ++-- 4 files changed, 74 insertions(+), 34 deletions(-) diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c index 12907f9..7ba3793 100644 --- a/modules/demux/mpeg/ts.c +++ b/modules/demux/mpeg/ts.c @@ -112,17 +112,14 @@ static void Close ( vlc_object_t * ); #define PCR_TEXT N_("Trust in-stream PCR") #define PCR_LONGTEXT N_("Use the stream PCR as a reference.") -static const int const arib_mode_list[] = - { ARIBMODE_AUTO, ARIBMODE_ENABLED, ARIBMODE_DISABLED }; -static const char *const arib_mode_list_text[] = - { N_("Auto"), N_("Enabled"), N_("Disabled") }; +static const char *const ts_standards_list[] = + { "auto", "mpeg", "dvb", "arib", "atsc", "tdmb" }; +static const char *const ts_standards_list_text[] = + { N_("Auto"), "MPEG", "DVB", "ARIB", "ATSC", "T-DMB" }; -#define SUPPORT_ARIB_TEXT N_("ARIB STD-B24 mode") -#define SUPPORT_ARIB_LONGTEXT N_( \ - "Forces ARIB STD-B24 mode for decoding characters." \ - "This feature affects EPG information and subtitles." ) - -#define ATSC_MODE_TEXT N_("ATSC") +#define STANDARD_TEXT N_("Digital TV Standard") +#define STANDARD_LONGTEXT N_( "Selects mode for digital TV standard." \ + "This feature affects EPG information and subtitles." ) vlc_module_begin () set_description( N_("MPEG Transport Stream demuxer") ) @@ -130,6 +127,9 @@ vlc_module_begin () set_category( CAT_INPUT ) set_subcategory( SUBCAT_INPUT_DEMUX ) + add_string( "ts-standard", "auto", STANDARD_TEXT, STANDARD_LONGTEXT, true ) + change_string_list( ts_standards_list, ts_standards_list_text ) + add_string( "ts-extra-pmt", NULL, PMT_TEXT, PMT_LONGTEXT, true ) add_bool( "ts-trust-pcr", true, PCR_TEXT, PCR_LONGTEXT, true ) change_safe() @@ -147,11 +147,6 @@ vlc_module_begin () add_bool( "ts-split-es", true, SPLIT_ES_TEXT, SPLIT_ES_LONGTEXT, false ) add_bool( "ts-seek-percent", false, SEEK_PERCENT_TEXT, SEEK_PERCENT_LONGTEXT, true ) - add_integer( "ts-arib", ARIBMODE_AUTO, SUPPORT_ARIB_TEXT, SUPPORT_ARIB_LONGTEXT, false ) - change_integer_list( arib_mode_list, arib_mode_list_text ) - - add_bool( "ts-atsc", false, ATSC_MODE_TEXT, NULL, false ) - add_obsolete_bool( "ts-silent" ); set_capability( "demux", 10 ) @@ -510,13 +505,28 @@ static int Open( vlc_object_t *p_this ) p_sys->b_canfastseek = false; p_sys->b_force_seek_per_percent = var_InheritBool( p_demux, "ts-seek-percent" ); - p_sys->b_atsc = var_InheritBool( p_demux, "ts-atsc" ); - if( !p_sys->b_atsc ) + p_sys->standard = TS_STANDARD_AUTO; + char *psz_standard = var_InheritString( p_demux, "ts-standard" ); + if( psz_standard ) { - p_sys->b_atsc = !strcmp( p_demux->psz_access, "atsc" ) || - !strcmp( p_demux->psz_access, "usdigital" ); + for( unsigned i=0; i<ARRAY_SIZE(ts_standards_list); i++ ) + { + if( !strcmp( psz_standard, ts_standards_list[i] ) ) + { + TsChangeStandard( p_sys, TS_STANDARD_AUTO + i ); + msg_Dbg( p_demux, "Standard set to %s", ts_standards_list_text[i] ); + break; + } + } + free( psz_standard ); + } + + if( p_sys->standard == TS_STANDARD_AUTO && + ( !strcmp( p_demux->psz_access, "atsc" ) || + !strcmp( p_demux->psz_access, "usdigital" ) ) ) + { + TsChangeStandard( p_sys, TS_STANDARD_ATSC ); } - p_sys->arib.e_mode = var_InheritInteger( p_demux, "ts-arib" ); stream_Control( p_sys->stream, STREAM_CAN_SEEK, &p_sys->b_canseek ); stream_Control( p_sys->stream, STREAM_CAN_FASTSEEK, &p_sys->b_canfastseek ); @@ -2417,6 +2427,14 @@ static bool GatherPESData( demux_t *p_demux, ts_pid_t *pid, block_t *p_pkt, return i_ret; } +void TsChangeStandard( demux_sys_t *p_sys, ts_standards_e v ) +{ + if( p_sys->standard != TS_STANDARD_AUTO && + p_sys->standard != v ) + return; /* TODO */ + p_sys->standard = v; +} + bool ProgramIsSelected( demux_sys_t *p_sys, uint16_t i_pgrm ) { for(int i=0; i<p_sys->programs.i_size; i++) diff --git a/modules/demux/mpeg/ts.h b/modules/demux/mpeg/ts.h index 0e8777d..952791f 100644 --- a/modules/demux/mpeg/ts.h +++ b/modules/demux/mpeg/ts.h @@ -32,12 +32,15 @@ typedef struct csa_t csa_t; #define TS_PSI_PAT_PID 0x00 -typedef enum arib_modes_e +typedef enum ts_standards_e { - ARIBMODE_AUTO = -1, - ARIBMODE_DISABLED = 0, - ARIBMODE_ENABLED = 1 -} arib_modes_e; + TS_STANDARD_AUTO = 0, + TS_STANDARD_MPEG, + TS_STANDARD_DVB, + TS_STANDARD_ARIB, + TS_STANDARD_ATSC, + TS_STANDARD_TDMB, +} ts_standards_e; typedef struct { @@ -62,10 +65,10 @@ struct demux_sys_t bool b_force_seek_per_percent; - bool b_atsc; + ts_standards_e standard; + struct { - arib_modes_e e_mode; #ifdef HAVE_ARIBB24 arib_instance_t *p_instance; #endif @@ -123,6 +126,8 @@ struct demux_sys_t bool b_start_record; }; +void TsChangeStandard( demux_sys_t *, ts_standards_e ); + bool ProgramIsSelected( demux_sys_t *, uint16_t i_pgrm ); void UpdatePESFilters( demux_t *p_demux, bool b_all ); diff --git a/modules/demux/mpeg/ts_psi.c b/modules/demux/mpeg/ts_psi.c index 824db6d..05676ea 100644 --- a/modules/demux/mpeg/ts_psi.c +++ b/modules/demux/mpeg/ts_psi.c @@ -282,12 +282,11 @@ static void ParsePMTRegistrations( demux_t *p_demux, const dvbpsi_descriptor_t } } - if ( p_sys->arib.e_mode == ARIBMODE_AUTO && + if ( p_sys->standard == TS_STANDARD_AUTO && registration_type == TS_PMT_REGISTRATION_NONE && i_arib_score_flags == 0x07 ) //0b111 { registration_type = TS_PMT_REGISTRATION_ARIB; - p_sys->arib.e_mode = ARIBMODE_ENABLED; } /* Now process private descriptors >= 0x40 */ @@ -874,7 +873,7 @@ static void PMTSetupEs0x06( demux_t *p_demux, ts_pes_t *p_pes, p_fmt->i_cat = VIDEO_ES; p_fmt->i_codec = VLC_CODEC_HEVC; } - else if ( p_demux->p_sys->arib.e_mode == ARIBMODE_ENABLED ) + else if ( p_demux->p_sys->standard == TS_STANDARD_ARIB ) { /* Lookup our data component descriptor first ARIB STD B10 6.4 */ dvbpsi_descriptor_t *p_dr = PMTEsFindDescriptor( p_dvbpsies, 0xFD ); @@ -1467,6 +1466,23 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_dvbpsipmt ) ts_pmt_registration_type_t registration_type = TS_PMT_REGISTRATION_NONE; ParsePMTRegistrations( p_demux, p_dvbpsipmt->p_first_descriptor, p_pmt, ®istration_type ); + if( p_sys->standard == TS_STANDARD_AUTO ) + { + switch( registration_type ) + { + case TS_PMT_REGISTRATION_BLURAY: + TsChangeStandard( p_sys, TS_STANDARD_MPEG ); + break; + case TS_PMT_REGISTRATION_ARIB: + TsChangeStandard( p_sys, TS_STANDARD_ARIB ); + break; + case TS_PMT_REGISTRATION_ATSC: + TsChangeStandard( p_sys, TS_STANDARD_ATSC ); + default: + break; + } + } + dvbpsi_pmt_es_t *p_dvbpsies; for( p_dvbpsies = p_dvbpsipmt->p_first_es; p_dvbpsies != NULL; p_dvbpsies = p_dvbpsies->p_next ) { @@ -1617,7 +1633,7 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_dvbpsipmt ) else if( stream_Control( p_sys->stream, STREAM_SET_PRIVATE_ID_CA, p_dvbpsipmt ) != VLC_SUCCESS ) { - if ( p_sys->arib.e_mode == ARIBMODE_ENABLED && !p_sys->arib.b25stream ) + if ( p_sys->standard == TS_STANDARD_ARIB && !p_sys->arib.b25stream ) { p_sys->arib.b25stream = stream_FilterNew( p_demux->s, "aribcam" ); p_sys->stream = ( p_sys->arib.b25stream ) ? p_sys->arib.b25stream : p_demux->s; @@ -1627,7 +1643,7 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_dvbpsipmt ) } /* Add arbitrary PID from here */ - if ( registration_type == TS_PMT_REGISTRATION_ATSC || p_sys->b_atsc ) + if ( p_sys->standard == TS_STANDARD_ATSC ) { ts_pid_t *atsc_base_pid = GetPID(p_sys, ATSC_BASE_PID); if ( PIDSetup( p_demux, TYPE_PSIP, atsc_base_pid, pmtpid ) ) diff --git a/modules/demux/mpeg/ts_psi_eit.c b/modules/demux/mpeg/ts_psi_eit.c index a807512..b1d73e9 100644 --- a/modules/demux/mpeg/ts_psi_eit.c +++ b/modules/demux/mpeg/ts_psi_eit.c @@ -79,7 +79,7 @@ static char *EITConvertToUTF8( demux_t *p_demux, { demux_sys_t *p_sys = p_demux->p_sys; #ifdef HAVE_ARIBB24 - if( p_sys->arib.e_mode == ARIBMODE_ENABLED ) + if( p_sys->standard == TS_STANDARD_ARIB ) { if ( !p_sys->arib.p_instance ) p_sys->arib.p_instance = arib_instance_new( p_demux ); @@ -364,7 +364,8 @@ static void EITCallBack( demux_t *p_demux, PSI_DEBUG_TIMESHIFT(i_start); i_duration = EITConvertDuration( p_evt->i_duration ); - if( p_sys->arib.e_mode == ARIBMODE_ENABLED ) + /* We have to fix ARIB-B10 as all timestamps are JST */ + if( p_sys->standard == TS_STANDARD_ARIB ) { time_t i_now = time(NULL); time_t i_tot_time = 0; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
