[vlc-devel] [RFC] libvlc: support setting seek mode
Jean-Baptiste Kempf
jb at videolan.org
Thu Jun 14 17:01:17 CEST 2018
I kind of agree here with Rem.
On Thu, 14 Jun 2018, at 13:10, Rémi Denis-Courmont wrote:
> It would be far simpler to just add a flag to seek functions.
>
> Le 14 juin 2018 14:00:10 GMT+03:00, Zhao Zhili
> <quinkblack at foxmail.com> a écrit :>> ---
>>
>> include/vlc/libvlc_media_player.h | 17 ++++++++++++++---
>>
>> include/vlc_input.h | 9 +++++++++
>>
>> lib/media_player.c | 17 +++++++++++++++--
>>
>> src/input/input.c | 25 ++++++++++++++++++++++---
>>>> src/input/var.c | 3 +++
>>
>> 5 files changed, 63 insertions(+), 8 deletions(-)
>>
>>
>>
>> diff --git a/include/vlc/libvlc_media_player.h
>> b/include/vlc/libvlc_media_player.h
>>>> index 9ef1dde..eb4d0ab 100644
>>
>> --- a/include/vlc/libvlc_media_player.h
>>
>> +++ b/include/vlc/libvlc_media_player.h
>>
>> @@ -780,14 +780,22 @@ LIBVLC_API libvlc_time_t
>> libvlc_media_player_get_length( libvlc_media_player_t *
>>>> */
>>
>> LIBVLC_API libvlc_time_t libvlc_media_player_get_time(
>> libvlc_media_player_t *p_mi );
>>>>
>>
>> +typedef enum libvlc_media_player_seek_mode_t {
>>
>> + libvlc_seek_mode_auto = 0,
>>
>> + libvlc_seek_mode_precise,
>>
>> + libvlc_seek_mode_fast
>>
>> +} libvlc_media_player_seek_mode_t;
>>
>> +
>>
>> /**
>>
>> * Set the movie time (in ms). This has no effect if no media is
>> being played.
>>>> - * Not all formats and protocols support this.
>>
>> + * Not all formats and protocols support this. i_seek_mode is only a
>> hint.
>>>> *
>>
>> * \param p_mi the Media Player
>>
>> + * \param i_seek_mode values of libvlc_media_player_seek_mode_t
>>>> * \param i_time the movie time (in ms).
>>
>> */
>>
>> -LIBVLC_API void libvlc_media_player_set_time( libvlc_media_player_t
>> *p_mi, libvlc_time_t i_time );
>>>> +LIBVLC_API void libvlc_media_player_set_time(
>> libvlc_media_player_t *p_mi,
>>>> + libvlc_time_t i_time,
>> int i_seek_mode );
>>>>
>>
>> /**
>>
>> * Get movie position as percentage between 0.0 and 1.0.
>>
>> @@ -801,11 +809,14 @@ LIBVLC_API float
>> libvlc_media_player_get_position( libvlc_media_player_t *p_mi )
>>>> * Set movie position as percentage between 0.0 and 1.0.
>>
>> * This has no effect if playback is not enabled.
>>
>> * This might not work depending on the underlying input format and
>> protocol.
>>>> + * i_seek_mode is only a hint.
>>
>> *
>>
>> * \param p_mi the Media Player
>>
>> + * \param i_seek_mode values of libvlc_media_player_seek_mode_t
>>>> * \param f_pos the position
>>
>> */
>>
>> -LIBVLC_API void libvlc_media_player_set_position(
>> libvlc_media_player_t *p_mi, float f_pos );
>>>> +LIBVLC_API void libvlc_media_player_set_position(
>> libvlc_media_player_t *p_mi,
>>>> + float f_pos, int
>> i_seek_mode );
>>>>
>>
>> /**
>>
>> * Set movie chapter (if applicable).
>>
>> diff --git a/include/vlc_input.h b/include/vlc_input.h
>>
>> index 16c566a..ed1f542 100644
>>
>> --- a/include/vlc_input.h
>>
>> +++ b/include/vlc_input.h
>>
>> @@ -490,6 +490,15 @@ enum input_query_e
>>
>> INPUT_MODIFY_PCR_SYSTEM,/* arg1=int absolute, arg2=mtime_t
>> res=can fail */
>>>> };
>>
>>
>>
>> +/**
>>
>> + * Input seek mode
>>
>> + */
>>
>> +enum input_seek_mode_e {
>>
>> + INPUT_SEEK_MODE_AUTO = 0,
>>
>> + INPUT_SEEK_MODE_PRECISE,
>>
>> + INPUT_SEEK_MODE_FAST
>>
>> +};
>>
>> +
>>
>> /** @}*/
>>
>>
>>
>> /******************************************************************-
>> ***********
>>>> diff --git a/lib/media_player.c b/lib/media_player.c
>>
>> index cd9d3ee..3bd8f07 100644
>>
>> --- a/lib/media_player.c
>>
>> +++ b/lib/media_player.c
>>
>> @@ -1325,8 +1325,14 @@ libvlc_time_t libvlc_media_player_get_time(
>> libvlc_media_player_t *p_mi )
>>>> return i_time;
>>
>> }
>>
>>
>>
>> +static_assert(libvlc_seek_mode_auto == (int)INPUT_SEEK_MODE_AUTO &&
>>>> + libvlc_seek_mode_precise == (int)INPUT_SEEK_MODE_PRECISE &&
>>>> + libvlc_seek_mode_fast == (int)INPUT_SEEK_MODE_FAST,
>>
>> + "Mismatch between libvlc_media_player_seek_mode_t and
>> input_seek_mode_e");
>>>> +
>>
>> void libvlc_media_player_set_time( libvlc_media_player_t *p_mi,
>>>> - libvlc_time_t i_time )
>>
>> + libvlc_time_t i_time,
>>
>> + int i_seek_mode )
>>
>> {
>>
>> input_thread_t *p_input_thread;
>>
>>
>>
>> @@ -1334,12 +1340,16 @@ void libvlc_media_player_set_time(
>> libvlc_media_player_t *p_mi,
>>>> if( !p_input_thread )
>>
>> return;
>>
>>
>>
>> + assert(i_seek_mode >= libvlc_seek_mode_auto &&
>>
>> + i_seek_mode <= libvlc_seek_mode_fast);
>>
>> + var_SetInteger( p_input_thread, "seek-mode", i_seek_mode );
>>>> var_SetInteger( p_input_thread, "time", to_mtime(i_time) );
>>>> vlc_object_release( p_input_thread );
>>
>> }
>>
>>
>>
>> void libvlc_media_player_set_position( libvlc_media_player_t *p_mi,
>>>> - float position )
>>
>> + float position,
>>
>> + int i_seek_mode )
>>
>> {
>>
>> input_thread_t *p_input_thread;
>>
>>
>>
>> @@ -1347,6 +1357,9 @@ void libvlc_media_player_set_position(
>> libvlc_media_player_t *p_mi,
>>>> if( !p_input_thread )
>>
>> return;
>>
>>
>>
>> + assert(i_seek_mode >= libvlc_seek_mode_auto &&
>>
>> + i_seek_mode <= libvlc_seek_mode_fast);
>>
>> + var_SetInteger( p_input_thread, "seek-mode", i_seek_mode );
>>>> var_SetFloat( p_input_thread, "position", position );
>>
>> vlc_object_release( p_input_thread );
>>
>> }
>>
>> diff --git a/src/input/input.c b/src/input/input.c
>>
>> index a413683..e075be4 100644
>>
>> --- a/src/input/input.c
>>
>> +++ b/src/input/input.c
>>
>> @@ -1854,10 +1854,20 @@ static bool Control( input_thread_t *p_input,
>>>> f_pos = 0.f;
>>
>> else if( f_pos > 1.f )
>>
>> f_pos = 1.f;
>>
>> +
>>
>> + bool b_precise;
>>
>> + int seek_mode = var_GetInteger( p_input, "seek-mode" );
>>>> + if( seek_mode == INPUT_SEEK_MODE_PRECISE )
>>
>> + b_precise = true;
>>
>> + else if( seek_mode == INPUT_SEEK_MODE_FAST )
>>
>> + b_precise = false;
>>
>> + else
>>
>> + b_precise = !input_priv(p_input)->b_fast_seek;
>>
>> +
>>
>> /* Reset the decoders states and clock sync (before
>> calling the demuxer */
>>>> es_out_Control( input_priv(p_input)->p_es_out,
>> ES_OUT_RESET_PCR );
>>>> if( demux_Control( input_priv(p_input)->master->p_demux,
>> DEMUX_SET_POSITION,
>>>> - (double) f_pos, !input_priv(p_input)-
>> >b_fast_seek ) )
>>>> + (double) f_pos, b_precise ) )
>>
>> {
>>
>> msg_Err( p_input, "INPUT_CONTROL_SET_POSITION "
>>>> "%2.1f%% failed", (double)(f_pos * 100.f)
>> );
>>>> @@ -1888,12 +1898,21 @@ static bool Control( input_thread_t *p_input,
>>>> if( i_time < 0 )
>>
>> i_time = 0;
>>
>>
>>
>> + bool b_precise;
>>
>> + int seek_mode = var_GetInteger( p_input, "seek-mode" );
>>>> + if( seek_mode == INPUT_SEEK_MODE_PRECISE )
>>
>> + b_precise = true;
>>
>> + else if( seek_mode == INPUT_SEEK_MODE_FAST )
>>
>> + b_precise = false;
>>
>> + else
>>
>> + b_precise = !input_priv(p_input)->b_fast_seek;
>>
>> +
>>
>> /* Reset the decoders states and clock sync (before
>> calling the demuxer */
>>>> es_out_Control( input_priv(p_input)->p_es_out,
>> ES_OUT_RESET_PCR );
>>>>
>>
>> i_ret = demux_Control( input_priv(p_input)->master-
>> >p_demux,
>>>> DEMUX_SET_TIME, i_time,
>>
>> - !input_priv(p_input)->b_fast_seek
>> );
>>>> + b_precise );
>>
>> if( i_ret )
>>
>> {
>>
>> int64_t i_length;
>>
>> @@ -1905,7 +1924,7 @@ static bool Control( input_thread_t *p_input,
>>>> double f_pos = (double)i_time /
>> (double)i_length;
>>>> i_ret = demux_Control( input_priv(p_input)->master-
>> >p_demux,
>>>> DEMUX_SET_POSITION,
>> f_pos,
>>>> - !input_priv(p_input)-
>> >b_fast_seek );
>>>> + b_precise );
>>
>> }
>>
>> }
>>
>> if( i_ret )
>>
>> diff --git a/src/input/var.c b/src/input/var.c
>>
>> index 04c8cb0..ea6a961 100644
>>
>> --- a/src/input/var.c
>>
>> +++ b/src/input/var.c
>>
>> @@ -147,6 +147,9 @@ void input_ControlVarInit ( input_thread_t
>> *p_input )
>>>> var_Create( p_input, "time", VLC_VAR_INTEGER );
>>
>> var_Create( p_input, "time-offset", VLC_VAR_INTEGER ); /*
>> relative */
>>>>
>>
>> + var_Create( p_input, "seek-mode", VLC_VAR_INTEGER );
>>
>> + var_SetInteger( p_input, "seek-mode", INPUT_SEEK_MODE_AUTO );
>>>> +
>>
>> /* Bookmark */
>>
>> var_Create( p_input, "bookmark", VLC_VAR_INTEGER |
>> VLC_VAR_ISCOMMAND );
>>>> var_Change( p_input, "bookmark", VLC_VAR_SETTEXT, _("Bookmark")
>> );
>>>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
> excuser ma brièveté.> _________________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
--
Jean-Baptiste Kempf - President
+33 672 704 734
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20180614/3e5e849a/attachment.html>
More information about the vlc-devel
mailing list