[vlc-devel] [PATCH] gstdecode: add a switch to toggle direct rendering
Vikram Fugro
vikram.fugro at gmail.com
Mon Jul 30 05:53:24 CEST 2018
Please review.
On Tue, Jul 24, 2018 at 8:06 PM, Vikram Fugro <vikram.fugro at gmail.com>
wrote:
> Currently, due to few changes in the gstreamer's buffer
> handling, the direct-rendering (i.e gstreamer decoders
> decoding directly into the downstream VLC provided buffers)
> is unstable.
>
> Hence, added a switch to toggle direct-rendering and is disabled
> by default. Works fine otherwise (i.e non direct-rendering)
> ---
> modules/codec/gstreamer/gstdecode.c | 17 +++++++++++++++--
> modules/codec/gstreamer/gstvlcvideosink.c | 21 +++++++++++++++++++--
> modules/codec/gstreamer/gstvlcvideosink.h | 1 +
> 3 files changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/modules/codec/gstreamer/gstdecode.c
> b/modules/codec/gstreamer/gstdecode.c
> index 3a90ad4e04..ee7d7900f7 100644
> --- a/modules/codec/gstreamer/gstdecode.c
> +++ b/modules/codec/gstreamer/gstdecode.c
> @@ -84,6 +84,13 @@ static void Flush( decoder_t * );
> "more info such as codec profile, level and other attributes, " \
> "in the form of GstCaps (Stream Capabilities) to decoder." )
>
> +#define USEVLCPOOL_TEXT N_("Use VLCPool")
> +#define USEVLCPOOL_LONGTEXT N_( \
> + "Allow the gstreamer decoders to directly decode (direct render) " \
> + "into the buffers provided and managed by the (downstream)VLC modules
> " \
> + "that follow. Note: Currently this feature is unstable, enable it at
> " \
> + "your own risk." )
> +
> vlc_module_begin( )
> set_shortname( "GstDecode" )
> add_shortcut( "gstdecode" )
> @@ -97,6 +104,8 @@ vlc_module_begin( )
> set_callbacks( OpenDecoder, CloseDecoder )
> add_bool( "use-decodebin", true, USEDECODEBIN_TEXT,
> USEDECODEBIN_LONGTEXT, false )
> + add_bool( "use-vlcpool", false, USEVLCPOOL_TEXT,
> + USEVLCPOOL_LONGTEXT, false )
> vlc_module_end( )
>
> void gst_vlc_dec_ensure_empty_queue( decoder_t *p_dec )
> @@ -448,7 +457,7 @@ static int OpenDecoder( vlc_object_t *p_this )
> GstAppSrcCallbacks cb;
> int i_rval = VLC_SUCCESS;
> GList *p_list;
> - bool dbin;
> + bool dbin, vlc_pool;
>
> #define VLC_GST_CHECK( r, v, s, t ) \
> { if( r == v ){ msg_Err( p_dec, s ); i_rval = t; goto fail; } }
> @@ -560,10 +569,14 @@ static int OpenDecoder( vlc_object_t *p_this )
> p_sys->p_decode_out = gst_element_factory_make( "vlcvideosink", NULL
> );
> VLC_GST_CHECK( p_sys->p_decode_out, NULL, "vlcvideosink not found",
> VLC_ENOMOD );
> +
> + vlc_pool = var_CreateGetBool( p_dec, "use-vlcpool" );
> + msg_Dbg( p_dec, "Using vlc pool? %s", vlc_pool ? "yes ":"no" );
> +
> p_sys->p_allocator = gst_vlc_picture_plane_allocator_new(
> (gpointer) p_dec );
> g_object_set( G_OBJECT( p_sys->p_decode_out ), "sync", FALSE,
> "allocator",
> - p_sys->p_allocator, "id", (gpointer) p_dec, NULL );
> + p_sys->p_allocator, "id", (gpointer) p_dec, "use-pool",
> vlc_pool, NULL );
> g_signal_connect( G_OBJECT( p_sys->p_decode_out ), "new-buffer",
> G_CALLBACK( frame_handoff_cb ), p_dec );
>
> diff --git a/modules/codec/gstreamer/gstvlcvideosink.c
> b/modules/codec/gstreamer/gstvlcvideosink.c
> index 6988e0d0a1..eff97f87dd 100644
> --- a/modules/codec/gstreamer/gstvlcvideosink.c
> +++ b/modules/codec/gstreamer/gstvlcvideosink.c
> @@ -40,7 +40,8 @@ enum
> {
> PROP_0,
> PROP_ALLOCATOR,
> - PROP_ID
> + PROP_ID,
> + PROP_USE_POOL
> };
>
> static guint gst_vlc_video_sink_signals[ LAST_SIGNAL ] = { 0 };
> @@ -84,6 +85,11 @@ static void gst_vlc_video_sink_class_init(
> GstVlcVideoSinkClass *p_klass )
> p_gobject_class->get_property = gst_vlc_video_sink_get_property;
> p_gobject_class->finalize = gst_vlc_video_sink_finalize;
>
> + g_object_class_install_property( G_OBJECT_CLASS( p_klass ),
> PROP_USE_POOL,
> + g_param_spec_boolean( "use-pool", "Use-Pool", "Use downstream
> VLC video output pool",
> + FALSE, G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY |
> + G_PARAM_STATIC_STRINGS ));
> +
> g_object_class_install_property( G_OBJECT_CLASS( p_klass ),
> PROP_ALLOCATOR,
> g_param_spec_pointer( "allocator", "Allocator",
> "VlcPictureAllocator",
> G_PARAM_READWRITE | GST_PARAM_MUTABLE_READY |
> @@ -162,6 +168,7 @@ static gboolean gst_vlc_video_sink_setcaps(
> GstBaseSink *p_basesink,
>
> static void gst_vlc_video_sink_init( GstVlcVideoSink *p_vlc_video_sink )
> {
> + p_vlc_video_sink->b_use_pool = FALSE;
> gst_base_sink_set_sync( GST_BASE_SINK( p_vlc_video_sink), FALSE );
> }
>
> @@ -211,7 +218,7 @@ static gboolean gst_vlc_video_sink_propose_allocation(
> GstBaseSink* p_bsink,
> if( p_caps == NULL )
> goto no_caps;
>
> - if( b_need_pool )
> + if( p_vsink->b_use_pool && b_need_pool )
> {
> GstVideoInfo info;
>
> @@ -294,6 +301,12 @@ static void gst_vlc_video_sink_set_property( GObject
> *p_object, guint i_prop_id,
> }
> break;
>
> + case PROP_USE_POOL:
> + {
> + p_vsink->b_use_pool = g_value_get_boolean( p_value );
> + }
> + break;
> +
> default:
> break;
> }
> @@ -312,6 +325,10 @@ static void gst_vlc_video_sink_get_property( GObject
> *p_object, guint i_prop_id,
> g_value_set_pointer( p_value, p_vsink->p_allocator );
> break;
>
> + case PROP_USE_POOL:
> + g_value_set_boolean( p_value, p_vsink->b_use_pool );
> + break;
> +
> default:
> break;
> }
> diff --git a/modules/codec/gstreamer/gstvlcvideosink.h
> b/modules/codec/gstreamer/gstvlcvideosink.h
> index 5ce0dd2f26..4ec92be880 100644
> --- a/modules/codec/gstreamer/gstvlcvideosink.h
> +++ b/modules/codec/gstreamer/gstvlcvideosink.h
> @@ -58,6 +58,7 @@ struct _GstVlcVideoSink
>
> GstAllocator *p_allocator;
> GstVideoInfo vinfo;
> + gboolean b_use_pool;
>
> decoder_t *p_dec;
>
> --
> 2.17.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20180730/870fbbe0/attachment.html>
More information about the vlc-devel
mailing list