Commit 06f6d941 authored by François Cartegnie's avatar François Cartegnie 🤞
Browse files

demux: ts: unify standards and its options

parent 42cb58fa
......@@ -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++)
......
......@@ -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 );
......
......@@ -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, &registration_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 ) )
......
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment