]> git.sesse.net Git - vlc/blobdiff - modules/video_filter/logo.c
* include/video_output.h, ALL: changed api for vout_Request()/vout_Create() to be...
[vlc] / modules / video_filter / logo.c
index b311004f72f7c14a0108ebb09cc53fa176ab453f..7325801152e8b70cc069497ae8d86efa67d5bae5 100644 (file)
@@ -34,6 +34,7 @@
 #include "vlc_filter.h"
 #include "filter_common.h"
 #include "vlc_image.h"
+#include "osd.h"
 
 #ifdef LoadImage
 #   undef LoadImage
@@ -95,7 +96,7 @@ vlc_module_begin();
 
     add_file( "logo-file", NULL, NULL, FILE_TEXT, FILE_LONGTEXT, VLC_FALSE );
     add_integer( "logo-x", -1, NULL, POSX_TEXT, POSX_LONGTEXT, VLC_FALSE );
-    add_integer( "logo-y", -1, NULL, POSY_TEXT, POSY_LONGTEXT, VLC_FALSE );
+    add_integer( "logo-y", 0, NULL, POSY_TEXT, POSY_LONGTEXT, VLC_FALSE );
     add_integer_with_range( "logo-transparency", 255, 0, 255, NULL,
         TRANS_TEXT, TRANS_LONGTEXT, VLC_FALSE );
     add_integer( "logo-position", 6, NULL, POS_TEXT, POS_LONGTEXT, VLC_TRUE );
@@ -195,7 +196,7 @@ static int Create( vlc_object_t *p_this )
         free( p_sys );
         return VLC_EGENERIC;
     }
-
+    
     p_sys->i_width = p_sys->p_pic->p[Y_PLANE].i_visible_pitch;
     p_sys->i_height = p_sys->p_pic->p[Y_PLANE].i_visible_lines;
 
@@ -210,6 +211,7 @@ static int Init( vout_thread_t *p_vout )
     vout_sys_t *p_sys = p_vout->p_sys;
     picture_t *p_pic;
     int i_index;
+    video_format_t fmt = {0};
 
     I_OUTPUTPICTURES = 0;
 
@@ -219,6 +221,14 @@ static int Init( vout_thread_t *p_vout )
     p_vout->output.i_height = p_vout->render.i_height;
     p_vout->output.i_aspect = p_vout->render.i_aspect;
 
+    fmt.i_width = fmt.i_visible_width = p_vout->render.i_width;
+    fmt.i_height = fmt.i_visible_height = p_vout->render.i_height;
+    fmt.i_x_offset = fmt.i_y_offset = 0;
+    fmt.i_chroma = p_vout->render.i_chroma;
+    fmt.i_aspect = p_vout->render.i_aspect;
+    fmt.i_sar_num = p_vout->render.i_aspect * fmt.i_height / fmt.i_width;
+    fmt.i_sar_den = VOUT_ASPECT_FACTOR;
+
     /* Load the video blending filter */
     p_sys->p_blend = vlc_object_create( p_vout, sizeof(filter_t) );
     vlc_object_attach( p_sys->p_blend, p_vout );
@@ -279,9 +289,7 @@ static int Init( vout_thread_t *p_vout )
     /* Try to open the real video output */
     msg_Dbg( p_vout, "spawning the real video output" );
 
-    p_sys->p_vout =
-        vout_Create( p_vout, p_vout->render.i_width, p_vout->render.i_height,
-                     p_vout->render.i_chroma, p_vout->render.i_aspect );
+    p_sys->p_vout = vout_Create( p_vout, &fmt );
 
     /* Everything failed */
     if( p_sys->p_vout == NULL )
@@ -522,13 +530,6 @@ static int CreateFilter( vlc_object_t *p_this )
     var_AddCallback( p_input->p_libvlc, "logo-transparency", LogoCallback, p_sys );
     vlc_object_release( p_input );
 
-    p_sys->b_absolute = VLC_TRUE;
-    if( p_sys->posx < 0 || p_sys->posy < 0 )
-    {
-        p_sys->b_absolute = VLC_FALSE;
-        p_sys->posx = 0; p_sys->posy = 0;
-    }
-
     p_sys->p_pic = LoadImage( p_this, p_sys->psz_filename );
     if( !p_sys->p_pic )
     {
@@ -637,11 +638,23 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
     }
 
     vout_CopyPicture( p_filter, &p_region->picture, p_sys->p_pic );
-    p_region->i_x = 0;
-    p_region->i_y = 0;
-    p_spu->i_x = p_sys->posx;
-    p_spu->i_y = p_sys->posy;
-    p_spu->i_flags = p_sys->pos;
+
+    /*  where to locate the logo: */
+    if( p_sys->posx < 0 || p_sys->posy < 0 )
+    {   /* set to one of the 9 relative locations */
+        p_spu->i_flags = p_sys->pos;
+        p_spu->i_x = 0;
+        p_spu->i_y = 0;
+        p_spu->b_absolute = VLC_FALSE;
+    }
+    else
+    {   /*  set to an absolute xy, referenced to upper left corner */
+           p_spu->i_flags = OSD_ALIGN_LEFT | OSD_ALIGN_TOP;
+        p_spu->i_x = p_sys->posx;
+        p_spu->i_y = p_sys->posy;
+        p_spu->b_absolute = VLC_TRUE;
+    }
+
     p_spu->p_region = p_region;
     p_spu->i_alpha = p_sys->i_trans;