Browse Source

core/libvlc: implement ClearBuffer

Alexandre Janniaux 5 years ago
parent
commit
752927d2a3
  1. 1
      include/vlc/libvlc_events.h
  2. 2
      include/vlc/libvlc_media_player.h
  3. 4
      include/vlc_demux.h
  4. 1
      include/vlc_es_out.h
  5. 6
      include/vlc_player.h
  6. 2
      include/vlc_stream.h
  7. 1
      lib/libvlc.sym
  8. 20
      lib/media_player.c
  9. 3
      modules/demux/mpeg/ts.c
  10. 13
      modules/stream_filter/prefetch.c
  11. 2
      src/input/es_out_timeshift.c
  12. 7
      src/input/input.c
  13. 4
      src/input/input_internal.h
  14. 1
      src/libvlccore.sym
  15. 2
      src/player/input.c
  16. 11
      src/player/player.c

1
include/vlc/libvlc_events.h

@ -241,6 +241,7 @@ enum libvlc_event_e {
libvlc_VideoOutputFrameDisplayed,
libvlc_CaptionsToDisplay,
libvlc_MediaPlayerBufferCleared,
};
/**

2
include/vlc/libvlc_media_player.h

@ -2202,6 +2202,8 @@ LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi,
LIBVLC_API void libvlc_video_set_keep_last_frame( libvlc_media_player_t *p_mi,
bool keep_last_frame );
LIBVLC_API void libvlc_media_player_clear_buffer( libvlc_media_player_t *p_mi );
/** @} video */
/** \defgroup libvlc_audio LibVLC audio controls

4
include/vlc_demux.h

@ -276,7 +276,9 @@ enum demux_query_e
* work in future VLC versions, nor with all demux filters
*/
DEMUX_FILTER_ENABLE,
DEMUX_FILTER_DISABLE
DEMUX_FILTER_DISABLE,
DEMUX_CLEAR_BUFFER = 1000 /* SK extensions */
};
/*************************************************************************

1
include/vlc_es_out.h

@ -112,6 +112,7 @@ enum es_out_query_e
ES_OUT_SPU_SET_HIGHLIGHT, /* arg1= es_out_id_t* (spu es),
arg2= const vlc_spu_highlight_t *, res=can fail */
ES_OUT_CLEAR_BUFFER = 0x1000,
/* First value usable for private control */
ES_OUT_PRIVATE_START = 0x10000,

6
include/vlc_player.h

@ -3220,6 +3220,8 @@ struct vlc_player_cbs
* @param data opaque pointer set by vlc_player_AddListener()
*/
void (*on_playback_restore_queried)(vlc_player_t *player, void *data);
void (*on_buffer_cleared)(vlc_player_t *player, void *data);
};
/**
@ -3450,6 +3452,10 @@ vlc_player_timer_point_GetNextIntervalDate(const struct vlc_player_timer_point *
/** @} vlc_player__timer */
VLC_API void
vlc_player_ClearBuffer(vlc_player_t *player);
/** @} vlc_player */
#endif

2
include/vlc_stream.h

@ -171,6 +171,8 @@ enum stream_query_e
STREAM_SET_PRIVATE_ID_STATE = 0x1000, /* arg1= int i_private_data, bool b_selected res=can fail */
STREAM_SET_PRIVATE_ID_CA, /* arg1= void * */
STREAM_GET_PRIVATE_ID_STATE, /* arg1=int i_private_data arg2=bool * res=can fail */
STREAM_CLEAR_BUFFER = 0x10000, /* SK extension */
};
/**

1
lib/libvlc.sym

@ -299,3 +299,4 @@ libvlc_picture_list_count
libvlc_picture_list_destroy
libvlc_media_player_enable_avstat
libvlc_media_player_enable_clock_recovery
libvlc_media_player_clear_buffer

20
lib/media_player.c

@ -80,6 +80,16 @@ on_current_media_changed(vlc_player_t *player, input_item_t *new_media,
libvlc_event_send(&mp->event_manager, &event);
}
static void
on_buffer_cleared(vlc_player_t *player, void *data)
{
libvlc_media_player_t *mp = data;
libvlc_event_t event = {
.type = libvlc_MediaPlayerBufferCleared,
};
libvlc_event_send(&mp->event_manager, &event);
}
static void
on_state_changed(vlc_player_t *player, enum vlc_player_state new_state,
void *data)
@ -529,6 +539,7 @@ static const struct vlc_player_cbs vlc_player_cbs = {
.on_cork_changed = on_cork_changed,
.on_vout_changed = on_vout_changed,
.on_recording_changed = on_recording_changed,
.on_buffer_cleared = on_buffer_cleared,
};
static const struct vlc_player_aout_cbs vlc_player_aout_cbs = {
@ -2328,6 +2339,15 @@ void libvlc_media_player_set_stopped_action( libvlc_media_player_t *p_mi,
vlc_player_Unlock(player);
}
void libvlc_media_player_clear_buffer( libvlc_media_player_t *p_mi )
{
vlc_player_t *player = p_mi->player;
vlc_player_Lock(player);
vlc_player_ClearBuffer(player);
vlc_player_Unlock(player);
}
#include <vlc_vout_display.h>
/* make sure surface structures from libvlc can be passed as such to vlc

3
modules/demux/mpeg/ts.c

@ -957,6 +957,9 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
}
break;
case DEMUX_CLEAR_BUFFER:
return vlc_stream_Control( p_sys->stream, STREAM_CLEAR_BUFFER );
case DEMUX_SET_POSITION:
f = va_arg( args, double );
b_bool = (bool) va_arg( args, int ); /* precise */

13
modules/stream_filter/prefetch.c

@ -413,6 +413,19 @@ static int Control(stream_t *stream, int query, va_list args)
case STREAM_SET_PRIVATE_ID_CA:
case STREAM_GET_PRIVATE_ID_STATE:
return VLC_EGENERIC;
case STREAM_CLEAR_BUFFER:
vlc_mutex_lock(&sys->lock);
sys->buffer_offset = 0;
sys->stream_offset = 0;
sys->buffer_length = 0;
/* clear buffer */
vlc_stream_Control(stream->s, STREAM_CLEAR_BUFFER);
vlc_cond_signal(&sys->wait_space);
vlc_mutex_unlock (&sys->lock);
return VLC_SUCCESS;
default:
msg_Err(stream, "unimplemented query (%d) in control", query);
return VLC_EGENERIC;

2
src/input/es_out_timeshift.c

@ -754,6 +754,8 @@ static int ControlLocked( es_out_t *p_out, input_source_t *in, int i_query,
i_system );
}
case ES_OUT_CLEAR_BUFFER:
return VLC_SUCCESS;
default:
vlc_assert_unreachable();
return VLC_EGENERIC;

7
src/input/input.c

@ -1974,6 +1974,13 @@ static bool Control( input_thread_t *p_input,
switch( i_type )
{
case INPUT_CONTROL_CLEAR_BUFFER:
demux_Control( priv->master->p_demux, DEMUX_CLEAR_BUFFER );
es_out_Control( priv->p_es_out, ES_OUT_CLEAR_BUFFER );
input_SendEvent( p_input, &(const struct vlc_input_event){
.type = INPUT_EVENT_BUFFER_CLEARED
});
break;
case INPUT_CONTROL_SET_POSITION:
case INPUT_CONTROL_JUMP_POSITION:
{

4
src/input/input_internal.h

@ -143,6 +143,8 @@ typedef enum input_event_type_e
/* Thumbnail generation */
INPUT_EVENT_THUMBNAIL_READY,
INPUT_EVENT_BUFFER_CLEARED = 0x1000
} input_event_type_e;
#define VLC_INPUT_CAPABILITIES_SEEKABLE (1<<0)
@ -598,6 +600,8 @@ enum input_control_e
INPUT_CONTROL_SET_VBI_PAGE,
INPUT_CONTROL_SET_VBI_TRANSPARENCY,
INPUT_CONTROL_CLEAR_BUFFER = 0x1000,
};
/* Internal helpers */

1
src/libvlccore.sym

@ -991,3 +991,4 @@ vlc_executor_WaitIdle
vlc_input_attachment_Release
vlc_input_attachment_New
vlc_input_attachment_Hold
vlc_player_ClearBuffer

2
src/player/input.c

@ -858,6 +858,8 @@ input_thread_Events(input_thread_t *input_thread,
vlc_player_SendEvent(player, on_teletext_transparency_changed,
input->teletext_transparent);
break;
case INPUT_EVENT_BUFFER_CLEARED:
vlc_player_SendEvent(player, on_buffer_cleared);
default:
break;
}

11
src/player/player.c

@ -2075,3 +2075,14 @@ vlc_player_GetObject(vlc_player_t *player)
{
return VLC_OBJECT(player);
}
void
vlc_player_ClearBuffer(vlc_player_t *player)
{
struct vlc_player_input *input = vlc_player_get_input_locked(player);
if (!input)
return;
int ret = input_ControlPush(input->thread, INPUT_CONTROL_CLEAR_BUFFER, NULL);
(void)ret;
}

Loading…
Cancel
Save