[vlc-commits] [Git][videolan/vlc][master] 4 commits: input: add input_CanPaceControl()
Hugo Beauzée-Luyssen
gitlab at videolan.org
Fri May 7 09:39:11 UTC 2021
Hugo Beauzée-Luyssen pushed to branch master at VideoLAN / VLC
Commits:
ea0fb027 by Thomas Guillem at 2021-05-07T08:51:35+00:00
input: add input_CanPaceControl()
- - - - -
704e8b08 by Thomas Guillem at 2021-05-07T08:51:35+00:00
es_out: use input_CanPaceControl()
- - - - -
5ab5fbe1 by Thomas Guillem at 2021-05-07T08:51:35+00:00
input: don't duplicate properties from the master source
- - - - -
58ba0326 by Thomas Guillem at 2021-05-07T08:51:35+00:00
input: don't override item and capabilities from the slave
InputSourceInit() is called to initialize the master and all slaves
inputs. Some initialisation concerned only the master, so move them out to a
new function: InitProperties().
This fixes the input slaves overriding some item properties
(attachment) and the master capabilities.
- - - - -
4 changed files:
- src/input/es_out.c
- src/input/es_out_timeshift.c
- src/input/input.c
- src/input/input_internal.h
Changes:
=====================================
src/input/es_out.c
=====================================
@@ -703,9 +703,9 @@ static vlc_tick_t EsOutGetWakeup( es_out_t *out )
/* We do not have a wake up date if the input cannot have its speed
* controlled or sout is imposing its own or while buffering
*
- * FIXME for !input_priv(p_input)->b_can_pace_control a wake-up time is still needed
+ * FIXME for !input_CanPaceControl() a wake-up time is still needed
* to avoid too heavy buffering */
- if( !input_priv(p_input)->b_can_pace_control ||
+ if( !input_CanPaceControl(p_input) ||
input_priv(p_input)->b_out_pace_control ||
p_sys->b_buffering )
return 0;
@@ -1278,14 +1278,13 @@ static void EsOutProgramHandleClockSource( es_out_t *out, es_out_pgrm_t *p_pgrm
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
input_thread_t *p_input = p_sys->p_input;
- input_thread_private_t *priv = input_priv(p_input);
- /* XXX: The clock source selection depends on priv->b_can_pace_control but
+ /* XXX: The clock source selection depends on input_CanPaceControl() but
* this variable is only initialized from the input_thread_t after the
* demux is opened. Programs and ES tracks can be created from the demux
* open callback or midstream (from the demux callback). Therefore, we
* can't handle the clock source selection after the program is created
- * since priv->b_can_pace_control might not be initialized. To fix this
+ * since input_CanPaceControl() might not be initialized. To fix this
* issue, handle clock source selection when the first PCR is sent (from
* ES_OUT_SET_PCR). */
assert( p_sys->b_active );
@@ -1293,7 +1292,7 @@ static void EsOutProgramHandleClockSource( es_out_t *out, es_out_pgrm_t *p_pgrm
switch( p_sys->clock_source )
{
case VLC_CLOCK_MASTER_AUTO:
- if (priv->b_can_pace_control)
+ if (input_CanPaceControl(p_input))
{
p_pgrm->active_clock_source = VLC_CLOCK_MASTER_AUDIO;
break;
@@ -3300,7 +3299,7 @@ static int EsOutVaControlLocked( es_out_t *out, input_source_t *source,
bool b_extra_buffering_allowed = !b_low_delay && EsOutIsExtraBufferingAllowed( out );
vlc_tick_t i_late = input_clock_Update(
p_pgrm->p_input_clock, VLC_OBJECT(p_sys->p_input),
- priv->b_can_pace_control || p_sys->b_buffering,
+ input_CanPaceControl(p_sys->p_input) || p_sys->b_buffering,
b_extra_buffering_allowed,
i_pcr, vlc_tick_now() );
=====================================
src/input/es_out_timeshift.c
=====================================
@@ -546,7 +546,7 @@ static int ControlLockedGetWakeup( es_out_t *p_out, vlc_tick_t *pi_wakeup )
if( p_sys->b_delayed )
{
- assert( !input_priv(p_sys->p_input)->b_can_pace_control );
+ assert( !input_CanPaceControl( p_sys->p_input ) );
*pi_wakeup = 0;
}
else
@@ -579,7 +579,7 @@ static int ControlLockedSetPauseState( es_out_t *p_out, bool b_source_paused, bo
else
{
i_ret = VLC_EGENERIC;
- if( !input_priv(p_sys->p_input)->b_can_pace_control )
+ if( !input_CanPaceControl( p_sys->p_input ) )
{
if( !p_sys->b_delayed )
TsStart( p_out );
@@ -614,7 +614,7 @@ static int ControlLockedSetRate( es_out_t *p_out, float src_rate, float rate )
else
{
i_ret = VLC_EGENERIC;
- if( !input_priv(p_sys->p_input)->b_can_pace_control )
+ if( !input_CanPaceControl( p_sys->p_input ) )
{
if( !p_sys->b_delayed )
TsStart( p_out );
=====================================
src/input/input.c
=====================================
@@ -304,7 +304,6 @@ static input_thread_t *Create( vlc_object_t *p_parent,
priv->events_data = events_data;
priv->b_preparsing = option == INPUT_CREATE_OPTION_PREPARSING;
priv->b_thumbnailing = option == INPUT_CREATE_OPTION_THUMBNAILING;
- priv->b_can_pace_control = true;
priv->i_start = 0;
priv->i_stop = 0;
priv->i_title_offset = input_priv(p_input)->i_seekpoint_offset = 0;
@@ -466,7 +465,7 @@ static void *Run( void *data )
if( !Init( p_input ) )
{
- if( priv->b_can_pace_control && priv->b_out_pace_control )
+ if( priv->master->b_can_pace_control && priv->b_out_pace_control )
{
/* We don't want a high input priority here or we'll
* end-up sucking up all the CPU time */
@@ -704,7 +703,7 @@ static void MainLoop( input_thread_t *p_input, bool b_interactive )
}
/* Pause after eof only if the input is pausable.
* This way we won't trigger timeshifting for nothing */
- else if( b_pause_after_eof && input_priv(p_input)->b_can_pause )
+ else if( b_pause_after_eof && input_priv(p_input)->master->b_can_pause )
{
if( b_paused_at_eof )
break;
@@ -826,6 +825,55 @@ static int InitSout( input_thread_t * p_input )
}
#endif
+static void InitProperties( input_thread_t *input )
+{
+ input_thread_private_t *priv = input_priv(input);
+ input_source_t *master = priv->master;
+ assert(master);
+
+ int capabilites = 0;
+ bool b_can_seek;
+
+ if( demux_Control( master->p_demux, DEMUX_CAN_SEEK, &b_can_seek ) )
+ b_can_seek = false;
+ if( b_can_seek )
+ capabilites |= VLC_INPUT_CAPABILITIES_SEEKABLE;
+
+ if( master->b_can_pause || !master->b_can_pace_control )
+ capabilites |= VLC_INPUT_CAPABILITIES_PAUSEABLE;
+ if( !master->b_can_pace_control || master->b_can_rate_control )
+ capabilites |= VLC_INPUT_CAPABILITIES_CHANGE_RATE;
+ if( !master->b_rescale_ts && !master->b_can_pace_control && master->b_can_rate_control )
+ capabilites |= VLC_INPUT_CAPABILITIES_REWINDABLE;
+
+#ifdef ENABLE_SOUT
+ capabilites |= VLC_INPUT_CAPABILITIES_RECORDABLE;
+#else
+ if( master->b_can_stream_record )
+ capabilites |= VLC_INPUT_CAPABILITIES_RECORDABLE;
+#endif
+
+ input_SendEventCapabilities( input, capabilites );
+
+ int i_attachment;
+ input_attachment_t **attachment;
+ if( !demux_Control( master->p_demux, DEMUX_GET_ATTACHMENTS,
+ &attachment, &i_attachment ) )
+ {
+ vlc_mutex_lock( &priv->p_item->lock );
+ AppendAttachment( input, i_attachment, attachment );
+ vlc_mutex_unlock( &priv->p_item->lock );
+ }
+
+ int input_type;
+ if( !demux_Control( master->p_demux, DEMUX_GET_TYPE, &input_type ) )
+ {
+ vlc_mutex_lock( &priv->p_item->lock );
+ priv->p_item->i_type = input_type;
+ vlc_mutex_unlock( &priv->p_item->lock );
+ }
+}
+
static void InitTitle( input_thread_t * p_input, bool had_titles )
{
input_thread_private_t *priv = input_priv(p_input);
@@ -837,11 +885,6 @@ static void InitTitle( input_thread_t * p_input, bool had_titles )
vlc_mutex_lock( &priv->p_item->lock );
priv->i_title_offset = p_master->i_title_offset;
priv->i_seekpoint_offset = p_master->i_seekpoint_offset;
-
- /* Global flag */
- priv->b_can_pace_control = p_master->b_can_pace_control;
- priv->b_can_pause = p_master->b_can_pause;
- priv->b_can_rate_control = p_master->b_can_rate_control;
vlc_mutex_unlock( &priv->p_item->lock );
/* Send event only if the count is valid or if titles are gone */
@@ -1302,6 +1345,8 @@ static int Init( input_thread_t * p_input )
goto error;
}
+ InitProperties( p_input );
+
InitTitle( p_input, false );
/* Load master infos */
@@ -1646,7 +1691,7 @@ static void ControlPause( input_thread_t *p_input, vlc_tick_t i_control_date )
{
int i_state = PAUSE_S;
- if( input_priv(p_input)->b_can_pause )
+ if( input_priv(p_input)->master->b_can_pause )
{
demux_t *p_demux = input_priv(p_input)->master->p_demux;
@@ -1658,7 +1703,8 @@ static void ControlPause( input_thread_t *p_input, vlc_tick_t i_control_date )
}
/* */
- if( es_out_SetPauseState( input_priv(p_input)->p_es_out, input_priv(p_input)->b_can_pause,
+ if( es_out_SetPauseState( input_priv(p_input)->p_es_out,
+ input_priv(p_input)->master->b_can_pause,
true, i_control_date ) )
{
msg_Warn( p_input, "cannot set pause state at es_out level" );
@@ -1671,7 +1717,7 @@ static void ControlPause( input_thread_t *p_input, vlc_tick_t i_control_date )
static void ControlUnpause( input_thread_t *p_input, vlc_tick_t i_control_date )
{
- if( input_priv(p_input)->b_can_pause )
+ if( input_priv(p_input)->master->b_can_pause )
{
demux_t *p_demux = input_priv(p_input)->master->p_demux;
@@ -2073,14 +2119,14 @@ static bool Control( input_thread_t *p_input,
}
if( rate != 1.f &&
- ( ( !priv->b_can_rate_control && !priv->master->b_rescale_ts ) ||
+ ( ( !priv->master->b_can_rate_control && !priv->master->b_rescale_ts ) ||
( priv->p_sout && !priv->b_out_pace_control ) ) )
{
msg_Dbg( p_input, "cannot change rate" );
rate = 1.f;
}
if( rate != priv->rate &&
- !priv->b_can_pace_control && priv->b_can_rate_control )
+ !priv->master->b_can_pace_control && priv->master->b_can_rate_control )
{
if( !priv->master->b_rescale_ts )
es_out_Control( priv->p_es_out, ES_OUT_RESET_PCR );
@@ -2101,7 +2147,8 @@ static bool Control( input_thread_t *p_input,
if( priv->master->b_rescale_ts )
{
- const float rate_source = (priv->b_can_pace_control || priv->b_can_rate_control ) ? rate : 1.f;
+ const float rate_source = (priv->master->b_can_pace_control ||
+ priv->master->b_can_rate_control ) ? rate : 1.f;
es_out_SetRate( priv->p_es_out, rate_source, rate );
}
@@ -2733,13 +2780,6 @@ static int InputSourceInit( input_source_t *in, input_thread_t *p_input,
}
/* Get infos from (access_)demux */
- int capabilites = 0;
- bool b_can_seek;
- if( demux_Control( in->p_demux, DEMUX_CAN_SEEK, &b_can_seek ) )
- b_can_seek = false;
- if( b_can_seek )
- capabilites |= VLC_INPUT_CAPABILITIES_SEEKABLE;
-
if( demux_Control( in->p_demux, DEMUX_CAN_CONTROL_PACE,
&in->b_can_pace_control ) )
in->b_can_pace_control = false;
@@ -2764,28 +2804,15 @@ static int InputSourceInit( input_source_t *in, input_thread_t *p_input,
in->b_rescale_ts = true;
}
- demux_Control( in->p_demux, DEMUX_CAN_PAUSE, &in->b_can_pause );
-
- if( in->b_can_pause || !in->b_can_pace_control )
- capabilites |= VLC_INPUT_CAPABILITIES_PAUSEABLE;
- if( !in->b_can_pace_control || in->b_can_rate_control )
- capabilites |= VLC_INPUT_CAPABILITIES_CHANGE_RATE;
- if( !in->b_rescale_ts && !in->b_can_pace_control && in->b_can_rate_control )
- capabilites |= VLC_INPUT_CAPABILITIES_REWINDABLE;
-
/* Set record capabilities */
if( demux_Control( in->p_demux, DEMUX_CAN_RECORD, &in->b_can_stream_record ) )
in->b_can_stream_record = false;
#ifdef ENABLE_SOUT
if( !var_GetBool( p_input, "input-record-native" ) )
in->b_can_stream_record = false;
- capabilites |= VLC_INPUT_CAPABILITIES_RECORDABLE;
-#else
- if( in->b_can_stream_record )
- capabilites |= VLC_INPUT_CAPABILITIES_RECORDABLE;
#endif
- input_SendEventCapabilities( p_input, capabilites );
+ demux_Control( in->p_demux, DEMUX_CAN_PAUSE, &in->b_can_pause );
/* get attachment
* FIXME improve for b_preparsing: move it after GET_META and check psz_arturl */
@@ -2809,27 +2836,9 @@ static int InputSourceInit( input_source_t *in, input_thread_t *p_input,
in->i_pts_delay = 0;
}
- int i_attachment;
- input_attachment_t **attachment;
- if( !demux_Control( in->p_demux, DEMUX_GET_ATTACHMENTS,
- &attachment, &i_attachment ) )
- {
- vlc_mutex_lock( &input_priv(p_input)->p_item->lock );
- AppendAttachment( p_input, i_attachment, attachment );
- vlc_mutex_unlock( &input_priv(p_input)->p_item->lock );
- }
-
if( demux_Control( in->p_demux, DEMUX_GET_FPS, &in->f_fps ) )
in->f_fps = 0.f;
- int input_type;
- if( !demux_Control( in->p_demux, DEMUX_GET_TYPE, &input_type ) )
- {
- vlc_mutex_lock( &input_priv(p_input)->p_item->lock );
- input_priv(p_input)->p_item->i_type = input_type;
- vlc_mutex_unlock( &input_priv(p_input)->p_item->lock );
- }
-
if( var_GetInteger( p_input, "clock-synchro" ) != -1 )
in->b_can_pace_control = !var_GetInteger( p_input, "clock-synchro" );
@@ -3550,3 +3559,9 @@ input_attachment_t *input_GetAttachment(input_thread_t *input, const char *name)
vlc_mutex_unlock( &priv->p_item->lock );
return NULL;
}
+
+bool input_CanPaceControl(input_thread_t *input)
+{
+ input_thread_private_t *priv = input_priv(input);
+ return priv->master->b_can_pace_control;
+}
=====================================
src/input/input_internal.h
=====================================
@@ -471,9 +471,6 @@ typedef struct input_thread_private_t
/* Global properties */
bool b_preparsing;
- bool b_can_pause;
- bool b_can_rate_control;
- bool b_can_pace_control;
/* Current state */
int i_state;
@@ -658,6 +655,8 @@ int input_GetAttachments(input_thread_t *input, input_attachment_t ***attachment
input_attachment_t *input_GetAttachment(input_thread_t *input, const char *name);
+bool input_CanPaceControl(input_thread_t *input);
+
/**
* Hold the input_source_t
*/
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/b48fd310931f8c84e6b976ee2b0feef700aa8c09...58ba03262380d4ce7e1f2aa72caa6f3bf024db8a
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/b48fd310931f8c84e6b976ee2b0feef700aa8c09...58ba03262380d4ce7e1f2aa72caa6f3bf024db8a
You're receiving this email because of your account on code.videolan.org.
More information about the vlc-commits
mailing list