vlc | branch: master | Thomas Guillem <[email protected]> | Wed Oct 17 14:43:14 2018 +0200| [709f745fbf14b9b6ef61cccdfd5b5cb7c951884d] | committer: Thomas Guillem
input: handle "sub-fps" with a new control We now change the slave demux rate according to the requested subtitle fps and the main demuxer fps. Example: Video is 24fps but the subtitle is 26fps. In that case, we want to slow down the subtitle demuxer. Setting "sub-fps" to 26 will change the rate of the subtitle demuxer to 0.92. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=709f745fbf14b9b6ef61cccdfd5b5cb7c951884d --- include/vlc_input.h | 5 +++++ src/input/event.h | 8 ++++++++ src/input/input.c | 31 +++++++++++++++++++++++++++++++ src/input/input_internal.h | 6 ++++++ 4 files changed, 50 insertions(+) diff --git a/include/vlc_input.h b/include/vlc_input.h index 3633d0121a..5d9fd5fadf 100644 --- a/include/vlc_input.h +++ b/include/vlc_input.h @@ -392,6 +392,9 @@ typedef enum input_event_type_e INPUT_EVENT_VBI_PAGE, /* vbi_transparent has changed */ INPUT_EVENT_VBI_TRANSPARENCY, + + /* subs_fps has changed */ + INPUT_EVENT_SUBS_FPS, } input_event_type_e; #define VLC_INPUT_CAPABILITIES_SEEKABLE (1<<0) @@ -523,6 +526,8 @@ struct vlc_input_event unsigned vbi_page; /* INPUT_EVENT_VBI_TRANSPARENCY */ bool vbi_transparent; + /* INPUT_EVENT_SUBS_FPS */ + float subs_fps; }; }; diff --git a/src/input/event.h b/src/input/event.h index 211be0bdcc..0f0aa0d606 100644 --- a/src/input/event.h +++ b/src/input/event.h @@ -182,6 +182,14 @@ static inline void input_SendEventMetaEpg(input_thread_t *p_input) }); } +static inline void input_SendEventSubsFPS(input_thread_t *p_input, float fps) +{ + input_SendEvent(p_input, &(struct vlc_input_event) { + .type = INPUT_EVENT_SUBS_FPS, + .subs_fps = fps, + }); +} + /***************************************************************************** * Event for es_out.c *****************************************************************************/ diff --git a/src/input/input.c b/src/input/input.c index 0595b8e73a..57e029ebb3 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -996,6 +996,16 @@ static bool SlaveExists( input_item_slave_t **pp_slaves, int i_slaves, return false; } +static void RequestSubRate( input_thread_t *p_input, float f_slave_fps ) +{ + input_thread_private_t *priv = input_priv(p_input); + const float f_fps = input_priv(p_input)->master->f_fps; + if( f_fps > 1.f && f_slave_fps > 1.f ) + priv->i_slave_subs_rate = INPUT_RATE_DEFAULT / ( f_fps / f_slave_fps ); + else if ( priv->i_slave_subs_rate != 0 ) + priv->i_slave_subs_rate = INPUT_RATE_DEFAULT; +} + static void SetSubtitlesOptions( input_thread_t *p_input ) { input_thread_private_t *priv = input_priv(p_input); @@ -1005,6 +1015,7 @@ static void SetSubtitlesOptions( input_thread_t *p_input ) if( f_fps > 1.f ) { var_SetFloat( p_input, "sub-original-fps", f_fps ); + RequestSubRate( p_input, var_InheritFloat( p_input, "sub-fps" ) ); } int64_t sub_delay = var_InheritInteger( p_input, "sub-delay" ); @@ -2229,6 +2240,10 @@ static bool Control( input_thread_t *p_input, } } break; + case INPUT_CONTROL_SET_SUBS_FPS: + RequestSubRate( p_input, param.val.f_float ); + input_SendEventSubsFPS( p_input, param.val.f_float ); + break; case INPUT_CONTROL_SET_RECORD_STATE: val = param.val; @@ -2846,6 +2861,7 @@ static void InputSourceMeta( input_thread_t *p_input, static void SlaveDemux( input_thread_t *p_input ) { + input_thread_private_t *priv = input_priv(p_input); vlc_tick_t i_time; int i; @@ -2863,6 +2879,19 @@ static void SlaveDemux( input_thread_t *p_input ) if( in->b_eof ) continue; + if( priv->i_slave_subs_rate != in->i_sub_rate ) + { + if( in->b_slave_sub && in->b_can_rate_control ) + { + if( in->i_sub_rate != 0 ) /* Don't reset when it's the first time */ + es_out_Control( priv->p_es_out, ES_OUT_RESET_PCR ); + int i_new_rate = priv->i_slave_subs_rate; + demux_Control( in->p_demux, DEMUX_SET_RATE, &i_new_rate ); + } + in->i_sub_rate = priv->i_slave_subs_rate; + } + + /* Call demux_Demux until we have read enough data */ if( demux_Control( in->p_demux, DEMUX_SET_NEXT_DEMUX_TIME, i_time ) ) { @@ -3344,6 +3373,8 @@ static int input_SlaveSourceAdd( input_thread_t *p_input, /* Get meta (access and demux) */ InputUpdateMeta( p_input, p_source->p_demux ); } + else + p_source->b_slave_sub = true; TAB_APPEND( priv->i_slave, priv->slave, p_source ); diff --git a/src/input/input_internal.h b/src/input/input_internal.h index bcc8f06a91..95d09528cf 100644 --- a/src/input/input_internal.h +++ b/src/input/input_internal.h @@ -69,6 +69,10 @@ typedef struct bool b_rescale_ts; double f_fps; + /* sub-fps handling */ + bool b_slave_sub; + unsigned i_sub_rate; + /* */ vlc_tick_t i_pts_delay; @@ -175,6 +179,7 @@ typedef struct input_thread_private_t /* Slave sources (subs, and others) */ int i_slave; input_source_t **slave; + unsigned i_slave_subs_rate; /* Last ES added */ enum es_format_category_e i_last_es_cat; @@ -252,6 +257,7 @@ enum input_control_e INPUT_CONTROL_SET_SPU_DELAY, INPUT_CONTROL_ADD_SLAVE, + INPUT_CONTROL_SET_SUBS_FPS, INPUT_CONTROL_SET_RECORD_STATE, _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
