]> git.sesse.net Git - vlc/blobdiff - src/video_output/vout_intf.c
Fix warning.
[vlc] / src / video_output / vout_intf.c
index b5728235eb2ec391a4921efed53a47d90767340f..417e5ce1defa685c9ba4d12f0caa490725810e3f 100644 (file)
 #include <stdlib.h>                                                /* free() */
 #include <sys/types.h>                                          /* opendir() */
 #include <dirent.h>                                             /* opendir() */
+#include <assert.h>
 
 #include <vlc_interface.h>
 #include <vlc_block.h>
 #include <vlc_playlist.h>
 
 #include <vlc_vout.h>
+#include <vlc_window.h>
 #include <vlc_image.h>
 #include <vlc_osd.h>
 #include <vlc_charset.h>
@@ -100,18 +102,59 @@ void *vout_RequestWindow( vout_thread_t *p_vout,
     int drawable = var_CreateGetInteger( p_vout, "drawable" );
     if( drawable ) return (void *)(intptr_t)drawable;
 
-   return NULL;
+    vout_window_t *wnd = vlc_custom_create (VLC_OBJECT(p_vout), sizeof (*wnd),
+                                            VLC_OBJECT_GENERIC, "window");
+    if (wnd == NULL)
+        return NULL;
+
+    wnd->vout = p_vout;
+    wnd->width = *pi_width_hint;
+    wnd->height = *pi_height_hint;
+    wnd->pos_x = *pi_x_hint;
+    wnd->pos_y = *pi_y_hint;
+    vlc_object_attach (wnd, p_vout);
+
+    wnd->module = module_Need (wnd, "vout window", 0, 0);
+    if (wnd->module == NULL)
+    {
+        msg_Dbg (wnd, "no window provider available");
+        vlc_object_release (wnd);
+        return NULL;
+    }
+    p_vout->p_window = wnd;
+    *pi_width_hint = wnd->width;
+    *pi_height_hint = wnd->height;
+    *pi_x_hint = wnd->pos_x;
+    *pi_y_hint = wnd->pos_y;
+    return wnd->handle;
 }
 
-void vout_ReleaseWindow( vout_thread_t *p_vout, void *p_window )
+void vout_ReleaseWindow( vout_thread_t *p_vout, void *dummy )
 {
-    (void)p_vout; (void)p_window;
+    vout_window_t *wnd = p_vout->p_window;
+
+    if (wnd == NULL)
+        return;
+    p_vout->p_window = NULL;
+
+    assert (wnd->module);
+    module_Unneed (wnd, wnd->module);
+
+    vlc_object_release (wnd);
+    (void)dummy;
 }
 
-int vout_ControlWindow( vout_thread_t *p_vout, void *p_window,
+int vout_ControlWindow( vout_thread_t *p_vout, void *dummy,
                         int i_query, va_list args )
 {
-    (void)p_vout; (void)p_window; (void)i_query; (void)args;
+    (void)dummy;
+    vout_window_t *wnd = p_vout->p_window;
+
+    if (wnd == NULL)
+        return VLC_EGENERIC;
+
+    assert (wnd->control);
+    return wnd->control (wnd, i_query, args);
 }
 
 /*****************************************************************************
@@ -134,16 +177,16 @@ static const struct
     const char *psz_label;
 } p_crop_values[] = {
     { "", N_("Default") },
-    { "1:1", "1:1" },
-    { "4:3", "4:3" },
-    { "16:9", "16:9" },
     { "16:10", "16:10" },
-    { "5:4", "5:4" },
-    { "5:3", "5:3" },
-    { "1.85:1", "1.85:1" },
+    { "16:9", "16:9" },
+    { "185:100", "1.85:1" },
     { "221:100", "2.21:1" },
     { "235:100", "2.35:1" },
     { "239:100", "2.39:1" },
+    { "5:3", "5:3" },
+    { "4:3", "4:3" },
+    { "5:4", "5:4" },
+    { "1:1", "1:1" },
     { NULL, NULL } };
 
 static const struct
@@ -442,16 +485,37 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
         /* Save the snapshot to a memory zone */
         fmt_in = p_vout->fmt_in;
         fmt_out.i_sar_num = fmt_out.i_sar_den = 1;
+        fmt_out.i_chroma = VLC_FOURCC( 'p','n','g',' ' );
+
         fmt_out.i_width = var_GetInteger( p_vout, "snapshot-width" );
         fmt_out.i_height = var_GetInteger( p_vout, "snapshot-height" );
-        fmt_out.i_chroma = VLC_FOURCC( 'p','n','g',' ' );
+        /* If snapshot-width and/or snapshot height were not specified,
+           use a default snapshot width of 320 */
+       if( fmt_out.i_width == 0 && fmt_out.i_height == 0 )
+        {
+            fmt_out.i_width = 320;
+        }
+
+       if( fmt_out.i_width == 0 && fmt_out.i_height > 0 )
+        {
+           fmt_out.i_width = (fmt_in.i_width * fmt_out.i_height) / fmt_in.i_height;
+        }
+       else if( fmt_out.i_height == 0 && fmt_out.i_width > 0 )
+        {
+           fmt_out.i_height = (fmt_in.i_height * fmt_out.i_width) / fmt_in.i_width;
+        }
+       else
+        {
+            fmt_out.i_width = fmt_in.i_width;
+            fmt_out.i_height = fmt_in.i_height;
+        }
 
         p_block = ( block_t* ) image_Write( p_image, p_pic, &fmt_in, &fmt_out );
         if( !p_block )
         {
             msg_Err( p_vout, "Could not get snapshot" );
             image_HandlerDelete( p_image );
-            vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+            vlc_object_signal( p_dest );
             vlc_object_release( p_dest );
             return VLC_EGENERIC;
         }
@@ -463,7 +527,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
         {
             block_Release( p_block );
             image_HandlerDelete( p_image );
-            vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+            vlc_object_signal( p_dest );
             vlc_object_release( p_dest );
             return VLC_ENOMEM;
         }
@@ -480,7 +544,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
             block_Release( p_block );
             free( p_snapshot );
             image_HandlerDelete( p_image );
-            vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+            vlc_object_signal( p_dest );
             vlc_object_release( p_dest );
             return VLC_ENOMEM;
         }
@@ -491,7 +555,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
         block_Release( p_block );
 
         /* Unlock the object */
-        vlc_object_signal_maybe( VLC_OBJECT(p_dest) );
+        vlc_object_signal( p_dest );
         vlc_object_release( p_dest );
 
         image_HandlerDelete( p_image );
@@ -544,16 +608,9 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
         }
 
         if( p_mypicturesdir == NULL )
-        {
-            if( asprintf( &val.psz_string, "%s", config_GetHomeDir() ) == -1 )
-                val.psz_string = NULL;
-        }
+            val.psz_string = strdup( config_GetHomeDir() );
         else
-        {
-            if( asprintf( &val.psz_string, p_mypicturesdir ) == -1 )
-                val.psz_string = NULL;
-            free( p_mypicturesdir );
-        }
+            val.psz_string = p_mypicturesdir;
     }
 
 #else
@@ -782,23 +839,17 @@ int vout_vaControlDefault( vout_thread_t *p_vout, int i_query, va_list args )
     {
     case VOUT_REPARENT:
     case VOUT_CLOSE:
-        if( p_vout->p_parent_intf )
-        {
-            vlc_object_release( p_vout->p_parent_intf );
-            p_vout->p_parent_intf = NULL;
-        }
+        vout_ReleaseWindow( p_vout, NULL );
         return VLC_SUCCESS;
-        break;
 
     case VOUT_SNAPSHOT:
         p_vout->b_snapshot = true;
         return VLC_SUCCESS;
-        break;
 
     default:
         msg_Dbg( p_vout, "control query not supported" );
-        return VLC_EGENERIC;
     }
+    return VLC_EGENERIC;
 }
 
 /*****************************************************************************
@@ -1090,23 +1141,25 @@ static int AspectCallback( vlc_object_t *p_this, char const *psz_cmd,
              i_aspect_num, i_aspect_den,
              p_vout->fmt_in.i_sar_num, p_vout->fmt_in.i_sar_den );
 
-    var_Get( p_vout, "crop", &val );
-    return CropCallback( p_this, "crop", val, val, 0 );
+    if( var_Get( p_vout, "crop", &val ) )
+        return VLC_EGENERIC;
+
+    int i_ret = CropCallback( p_this, "crop", val, val, 0 );
+    free( val.psz_string );
+    return i_ret;
 }
 
 static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd,
                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
-    playlist_t *p_playlist = pl_Yield( p_this );
     vout_Control( p_vout, VOUT_SET_STAY_ON_TOP, newval.b_bool );
     (void)psz_cmd; (void)oldval; (void)p_data;
 
-    /* Modify playlist as well because the vout might have to be restarted */
-    var_Create( p_playlist, "video-on-top", VLC_VAR_BOOL );
-    var_Set( p_playlist, "video-on-top", newval );
+    /* Modify libvlc as well because the vout might have to be restarted */
+    var_Create( p_vout->p_libvlc, "video-on-top", VLC_VAR_BOOL );
+    var_Set( p_vout->p_libvlc, "video-on-top", newval );
 
-    pl_Release( p_this );
     return VLC_SUCCESS;
 }
 
@@ -1115,15 +1168,13 @@ static int FullscreenCallback( vlc_object_t *p_this, char const *psz_cmd,
 {
     vout_thread_t *p_vout = (vout_thread_t *)p_this;
     vlc_value_t val;
-    playlist_t *p_playlist = pl_Yield( p_this );
     (void)psz_cmd; (void)oldval; (void)p_data;
 
     p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
 
-    /* Modify playlist as well because the vout might have to be restarted */
-    var_Create( p_playlist, "fullscreen", VLC_VAR_BOOL );
-    var_Set( p_playlist, "fullscreen", newval );
-    pl_Release( p_playlist );
+    /* Modify libvlc as well because the vout might have to be restarted */
+    var_Create( p_vout->p_libvlc, "fullscreen", VLC_VAR_BOOL );
+    var_Set( p_vout->p_libvlc, "fullscreen", newval );
 
     val.b_bool = true;
     var_Set( p_vout, "intf-change", val );