[vlc-devel] [PATCH] gstdecode: add a switch to toggle direct rendering

Vikram Fugro vikram.fugro at gmail.com
Tue Jul 24 16:36:12 CEST 2018


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



More information about the vlc-devel mailing list