]> git.sesse.net Git - vlc/blobdiff - src/input/resource.c
Gives the input_thread_t to use to vout_Request().
[vlc] / src / input / resource.c
index 5f5b0de690ba2b2fdbc98de14bf76acac325b28f..b015be8fba1cd7b9d9236a7ca90ad6de98167414 100644 (file)
 # include "config.h"
 #endif
 
+#include <assert.h>
+
 #include <vlc_common.h>
 #include <vlc_vout.h>
-#include <vlc_osd.h>
+#include <vlc_spu.h>
 #include <vlc_aout.h>
 #include <vlc_sout.h>
 #include "../libvlc.h"
@@ -51,7 +53,6 @@ struct input_resource_t
 
     sout_instance_t *p_sout;
     vout_thread_t   *p_vout_free;
-    aout_instance_t *p_aout;
 
     /* This lock is used to protect vout resources access (for hold)
      * It is a special case because of embed video (possible deadlock
@@ -61,8 +62,11 @@ struct input_resource_t
 
     /* You need lock+lock_hold to write to the following variables and
      * only lock or lock_hold to read them */
+
     int             i_vout;
     vout_thread_t   **pp_vout;
+
+    aout_instance_t *p_aout;
 };
 
 /* */
@@ -150,6 +154,7 @@ static void DestroyVout( input_resource_t *p_resource )
 }
 static vout_thread_t *DetachVout( input_resource_t *p_resource )
 {
+    vlc_assert_locked( &p_resource->lock );
     assert( p_resource->i_vout == 0 );
     vout_thread_t *p_vout = p_resource->p_vout_free;
     p_resource->p_vout_free = NULL;
@@ -203,6 +208,8 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
                                    vout_thread_t *p_vout, video_format_t *p_fmt,
                                    bool b_recycle )
 {
+    vlc_assert_locked( &p_resource->lock );
+
     if( !p_vout && !p_fmt )
     {
         if( p_resource->p_vout_free )
@@ -235,7 +242,12 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
         }
 
         /* */
-        p_vout = vout_Request( p_resource->p_input, p_vout, p_fmt );
+        vout_configuration_t cfg = {
+            .vout  = p_vout,
+            .input = VLC_OBJECT(p_resource->p_input),
+            .fmt   = p_fmt,
+        };
+        p_vout = vout_Request( p_resource->p_input, &cfg );
         if( !p_vout )
             return NULL;
 
@@ -266,9 +278,14 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource,
         {
             msg_Dbg( p_resource->p_input, "saving a free vout" );
             vout_Flush( p_vout, 1 );
-            spu_Control( vout_GetSpu( p_vout ), SPU_CHANNEL_CLEAR, -1 );
-
-            p_resource->p_vout_free = p_vout;
+            vout_FlushSubpictureChannel( p_vout, -1 );
+
+            vout_configuration_t cfg = {
+                .vout  = p_vout,
+                .input = NULL,
+                .fmt   = p_fmt,
+            };
+            p_resource->p_vout_free = vout_Request( p_resource->p_input, &cfg );
         }
         return NULL;
     }
@@ -286,7 +303,9 @@ static vout_thread_t *HoldVout( input_resource_t *p_resource )
 
     return p_vout;
 }
-static void HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout, int *pi_vout )
+
+static void HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout,
+                       size_t *pi_vout )
 {
     vout_thread_t **pp_vout;
 
@@ -298,7 +317,7 @@ static void HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout,
     if( p_resource->i_vout <= 0 )
         goto exit;
 
-    pp_vout = calloc( p_resource->i_vout, sizeof(*pp_vout) );
+    pp_vout = malloc( p_resource->i_vout * sizeof(*pp_vout) );
     if( !pp_vout )
         goto exit;
 
@@ -324,14 +343,20 @@ static void DestroyAout( input_resource_t *p_resource )
 }
 static aout_instance_t *DetachAout( input_resource_t *p_resource )
 {
+    vlc_assert_locked( &p_resource->lock );
+    vlc_mutex_lock( &p_resource->lock_hold );
+
     aout_instance_t *p_aout = p_resource->p_aout;
     p_resource->p_aout = NULL;
 
+    vlc_mutex_unlock( &p_resource->lock_hold );
+
     return p_aout;
 }
 
 static aout_instance_t *RequestAout( input_resource_t *p_resource, aout_instance_t *p_aout )
 {
+    vlc_assert_locked( &p_resource->lock );
     assert( p_resource->p_input );
 
     if( p_aout )
@@ -342,33 +367,39 @@ static aout_instance_t *RequestAout( input_resource_t *p_resource, aout_instance
     }
     else
     {
-        if( !p_resource->p_aout )
+        p_aout = p_resource->p_aout;
+        if( !p_aout )
         {
             msg_Dbg( p_resource->p_input, "creating aout" );
-            p_resource->p_aout = aout_New( p_resource->p_input );
+            p_aout = aout_New( p_resource->p_input );
+
+            vlc_mutex_lock( &p_resource->lock_hold );
+            p_resource->p_aout = p_aout;
+            vlc_mutex_unlock( &p_resource->lock_hold );
         }
         else
         {
             msg_Dbg( p_resource->p_input, "reusing aout" );
         }
 
-        if( !p_resource->p_aout )
+        if( !p_aout )
             return NULL;
 
-        vlc_object_detach( p_resource->p_aout );
-        vlc_object_attach( p_resource->p_aout, p_resource->p_input );
-        vlc_object_hold( p_resource->p_aout );
-        return p_resource->p_aout;
+        vlc_object_detach( p_aout );
+        vlc_object_attach( p_aout, p_resource->p_input );
+        vlc_object_hold( p_aout );
+        return p_aout;
     }
 }
 static aout_instance_t *HoldAout( input_resource_t *p_resource )
 {
-    if( !p_resource->p_aout )
-        return NULL;
+    vlc_mutex_lock( &p_resource->lock_hold );
 
     aout_instance_t *p_aout = p_resource->p_aout;
+    if( p_aout )
+        vlc_object_hold( p_aout );
 
-    vlc_object_hold( p_aout );
+    vlc_mutex_unlock( &p_resource->lock_hold );
 
     return p_aout;
 }
@@ -448,10 +479,13 @@ vout_thread_t *input_resource_HoldVout( input_resource_t *p_resource )
 {
     return HoldVout( p_resource );
 }
-void input_resource_HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout, int *pi_vout )
+
+void input_resource_HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout,
+                               size_t *pi_vout )
 {
     HoldVouts( p_resource, ppp_vout, pi_vout );
 }
+
 void input_resource_TerminateVout( input_resource_t *p_resource )
 {
     input_resource_RequestVout( p_resource, NULL, NULL, false );
@@ -477,11 +511,7 @@ aout_instance_t *input_resource_RequestAout( input_resource_t *p_resource, aout_
 }
 aout_instance_t *input_resource_HoldAout( input_resource_t *p_resource )
 {
-    vlc_mutex_lock( &p_resource->lock );
-    aout_instance_t *p_ret = HoldAout( p_resource );
-    vlc_mutex_unlock( &p_resource->lock );
-
-    return p_ret;
+    return HoldAout( p_resource );
 }
 /* */
 sout_instance_t *input_resource_RequestSout( input_resource_t *p_resource, sout_instance_t *p_sout, const char *psz_sout )