]> git.sesse.net Git - vlc/blobdiff - src/video_output/vout_intf.c
Enabling scaling activation/deactivation
[vlc] / src / video_output / vout_intf.c
index 0f837ff24485005b104d72c5b8ab957fa4288171..d008606ffe6a1c920d65a0276f5769f9807e57d6 100644 (file)
@@ -65,6 +65,8 @@ static int CropCallback( vlc_object_t *, char const *,
                          vlc_value_t, vlc_value_t, void * );
 static int AspectCallback( vlc_object_t *, char const *,
                            vlc_value_t, vlc_value_t, void * );
+static int ScalingCallback( vlc_object_t *, char const *,
+                            vlc_value_t, vlc_value_t, void * );
 static int OnTopCallback( vlc_object_t *, char const *,
                           vlc_value_t, vlc_value_t, void * );
 static int FullscreenCallback( vlc_object_t *, char const *,
@@ -397,6 +399,15 @@ void vout_IntfInit( vout_thread_t *p_vout )
         var_TriggerCallback( p_vout, "aspect-ratio" );
     free( old_val.psz_string );
 
+    /* Add a variable to indicate if scaling video is activated or not */
+    var_Create( p_vout, "scaling", VLC_VAR_BOOL | VLC_VAR_DOINHERIT
+                | VLC_VAR_ISCOMMAND );
+    text.psz_string = _("Scaling video");
+    var_Change( p_vout, "scaling", VLC_VAR_SETTEXT, &text, NULL );
+    var_AddCallback( p_vout, "scaling", ScalingCallback, NULL );
+    var_Get( p_vout, "scaling", &val );
+    p_vout->b_scale = val.b_bool;
+
     /* Initialize the dimensions of the video window */
     InitWindowSize( p_vout, &p_vout->i_window_width,
                     &p_vout->i_window_height );
@@ -638,13 +649,12 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
      */
     if( b_embedded_snapshot )
     {
-        vlc_object_t* p_dest = p_obj;
         block_t *p_block;
-        snapshot_t *p_snapshot;
+        snapshot_t *p_snapshot = p_obj;
         size_t i_size;
 
-       vlc_object_lock( p_dest );
-        p_dest->p_private = NULL;
+       vlc_mutex_lock( &p_snapshot->p_mutex );
+       p_snapshot->p_data = NULL;
 
         /* Save the snapshot to a memory zone */
         p_block = image_Write( p_image, p_pic, &fmt_in, &fmt_out );
@@ -652,23 +662,11 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
         {
             msg_Err( p_vout, "Could not get snapshot" );
             image_HandlerDelete( p_image );
-            vlc_object_signal_unlocked( p_dest );
-           vlc_object_unlock( p_dest );
+           vlc_cond_signal( &p_snapshot->p_condvar );
+           vlc_mutex_unlock( &p_snapshot->p_mutex );
             return VLC_EGENERIC;
         }
 
-        /* Copy the p_block data to a snapshot structure */
-        /* FIXME: get the timestamp */
-        p_snapshot = malloc( sizeof( snapshot_t ) );
-        if( !p_snapshot )
-        {
-            block_Release( p_block );
-            image_HandlerDelete( p_image );
-            vlc_object_signal_unlocked( p_dest );
-           vlc_object_unlock( p_dest );
-            return VLC_ENOMEM;
-        }
-
         i_size = p_block->i_buffer;
 
         p_snapshot->i_width = fmt_out.i_width;
@@ -679,21 +677,18 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
         if( !p_snapshot->p_data )
         {
             block_Release( p_block );
-            free( p_snapshot );
             image_HandlerDelete( p_image );
-            vlc_object_signal_unlocked( p_dest );
-           vlc_object_unlock( p_dest );
+           vlc_cond_signal( &p_snapshot->p_condvar );
+           vlc_mutex_unlock( &p_snapshot->p_mutex );
             return VLC_ENOMEM;
         }
         memcpy( p_snapshot->p_data, p_block->p_buffer, p_block->i_buffer );
 
-        p_dest->p_private = p_snapshot;
-
         block_Release( p_block );
 
         /* Unlock the object */
-        vlc_object_signal_unlocked( p_dest );
-       vlc_object_unlock( p_dest );
+       vlc_cond_signal( &p_snapshot->p_condvar );
+       vlc_mutex_unlock( &p_snapshot->p_mutex );
 
         image_HandlerDelete( p_image );
         return VLC_SUCCESS;
@@ -1215,6 +1210,19 @@ static int AspectCallback( vlc_object_t *p_this, char const *psz_cmd,
     return i_ret;
 }
 
+static int ScalingCallback( 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;
+
+    vlc_mutex_lock( &p_vout->change_lock );
+
+    p_vout->b_scale = newval.b_bool;
+    p_vout->i_changes |= VOUT_SIZE_CHANGE;
+
+    vlc_mutex_unlock( &p_vout->change_lock );
+}
+
 static int OnTopCallback( vlc_object_t *p_this, char const *psz_cmd,
                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {