[vlc-devel] [PATCH 1/2] libvlc: add libvlc_media_player_dump

Rémi Denis-Courmont remi at remlab.net
Thu May 19 17:46:53 CEST 2016


Le 2016-05-19 16:47, Thomas Guillem a écrit :
> ---
>  include/vlc/libvlc_media_player.h | 18 ++++++++++++++++++
>  lib/libvlc.sym                    |  1 +
>  lib/media_player.c                | 28 ++++++++++++++++++++++++++++
>  3 files changed, 47 insertions(+)
>
> diff --git a/include/vlc/libvlc_media_player.h
> b/include/vlc/libvlc_media_player.h
> index 456e99e..7b77af5 100644
> --- a/include/vlc/libvlc_media_player.h
> +++ b/include/vlc/libvlc_media_player.h
> @@ -961,6 +961,24 @@ LIBVLC_API void
> libvlc_media_player_set_video_title_display( libvlc_media_player
>   */
>  LIBVLC_API void libvlc_track_description_list_release(
> libvlc_track_description_t *p_track_description );
>
> +/**
> + * Dump the media attached to the Media Player into a local file
> + *
> + * \note You can't dump if the Media Player is already playing. The 
> dump is
> + * done asynchronously. Listen to \ref libvlc_MediaPlayerEndReached 
> and \ref
> + * libvlc_MediaPlayerEncounteredError events to be notified when the
> dump ends.
> + * You can call libvlc_media_player_stop() to abort the dump.
> + *
> + * \version LibVLC 3.0.0 and later.
> + *
> + * \param p_mi the Media Player
> + * \param psz_path local filesystem path where to dump the media
> + *
> + * \return -1 if an error was detected, 0 otherwise.
> + */
> +LIBVLC_API int libvlc_media_player_dump( libvlc_media_player_t 
> *p_mi,
> +                                         const char *psz_path );
> +
>  /** \defgroup libvlc_video LibVLC video controls
>   * @{
>   */
> diff --git a/lib/libvlc.sym b/lib/libvlc.sym
> index 816025d..be6872c 100644
> --- a/lib/libvlc.sym
> +++ b/lib/libvlc.sym
> @@ -149,6 +149,7 @@ libvlc_media_parse
>  libvlc_media_parse_async
>  libvlc_media_parse_with_options
>  libvlc_media_player_can_pause
> +libvlc_media_player_dump
>  libvlc_media_player_program_scrambled
>  libvlc_media_player_next_frame
>  libvlc_media_player_event_manager
> diff --git a/lib/media_player.c b/lib/media_player.c
> index 4761fee..f8aa6d6 100644
> --- a/lib/media_player.c
> +++ b/lib/media_player.c
> @@ -669,6 +669,10 @@ libvlc_media_player_new( libvlc_instance_t 
> *instance )
>      var_Create (mp, "equalizer-vlcfreqs", VLC_VAR_BOOL);
>      var_Create (mp, "equalizer-bands", VLC_VAR_STRING);
>
> +    /* Demux (for demuxdump) */
> +    var_Create (mp, "demux", VLC_VAR_STRING | VLC_VAR_DOINHERIT);
> +    var_Create (mp, "demuxdump-file", VLC_VAR_STRING | 
> VLC_VAR_DOINHERIT);
> +
>      mp->p_md = NULL;
>      mp->state = libvlc_NothingSpecial;
>      mp->p_libvlc_instance = instance;
> @@ -1014,6 +1018,8 @@ void libvlc_media_player_stop(
> libvlc_media_player_t *p_mi )
>
>      input_resource_Terminate( p_mi->input.p_resource );
>      unlock_input(p_mi);
> +
> +    var_SetString( p_mi, "demux", "" );
>  }
>
>
> @@ -1856,6 +1862,28 @@ void
> libvlc_media_player_set_video_title_display( libvlc_media_player_t
> *p_mi, l
>      }
>  }
>
> +int libvlc_media_player_dump( libvlc_media_player_t *p_mi, const
> char *psz_path )
> +{
> +    assert( p_mi != NULL && psz_path != NULL );
> +
> +    lock_input( p_mi );
> +    input_thread_t *p_input_thread = p_mi->input.p_thread;
> +    if( p_input_thread )
> +    {
> +        unlock_input( p_mi );
> +        libvlc_printerr( "can't dump while playing" );
> +        return -1;
> +    }
> +    unlock_input( p_mi );
> +
> +    var_SetString( p_mi, "demux", "dump,none" );
> +    var_SetString( p_mi, "demuxdump-file", psz_path );
> +
> +    int i_ret = libvlc_media_player_play( p_mi );
> +    if (i_ret != 0)
> +        var_SetString( p_mi, "demux", "" );
> +    return i_ret;
> +}
>  /**
>   * Maximum size of a formatted equalizer amplification band 
> frequency value.
>   *

The function seems rather pointless and impractical. And the 
implementation looks broken and racy.

-- 
Rémi Denis-Courmont
http://www.remlab.net/


More information about the vlc-devel mailing list