[vlc-devel] commit: Rewritten embedded window internal ABI ( Rémi Denis-Courmont )
git version control
git at videolan.org
Fri Jun 20 15:41:47 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Fri Jun 20 16:40:27 2008 +0300| [81c7b0627056ca8dbe7c68d925eb7cf0fdf6ca3e]
Rewritten embedded window internal ABI
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=81c7b0627056ca8dbe7c68d925eb7cf0fdf6ca3e
---
include/vlc_vout.h | 3 +-
include/vlc_window.h | 44 ++++++++++++++++++++++++++
modules/control/hotkeys.c | 4 +-
src/video_output/video_output.c | 4 +-
src/video_output/vout_intf.c | 64 +++++++++++++++++++++++++++++++--------
5 files changed, 100 insertions(+), 19 deletions(-)
diff --git a/include/vlc_vout.h b/include/vlc_vout.h
index fc8306b..f958055 100644
--- a/include/vlc_vout.h
+++ b/include/vlc_vout.h
@@ -399,8 +399,7 @@ struct vout_thread_t
unsigned int i_par_num; /**< monitor pixel aspect-ratio */
unsigned int i_par_den; /**< monitor pixel aspect-ratio */
- intf_thread_t *p_parent_intf; /**< parent interface for embedded
- vout (if any) */
+ struct vout_window_t *p_window; /**< window for embedded vout (if any) */
/**@}*/
/** \name Plugin used and shortcuts to access its capabilities */
diff --git a/include/vlc_window.h b/include/vlc_window.h
new file mode 100644
index 0000000..8cbb75a
--- /dev/null
+++ b/include/vlc_window.h
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ * vlc_window.h: Embedded video output window
+ *****************************************************************************
+ * Copyright (C) 2008 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef LIBVLCCORE_WINDOW_H
+# define LIBVLCCORE_WINDOW_H 1
+
+# include <stdarg.h>
+
+typedef struct vout_window_t vout_window_t;
+
+struct vout_window_t
+{
+ VLC_COMMON_MEMBERS
+
+ module_t *module;
+ vout_thread_t *vout;
+ void *handle; /* OS-specific Window handle */
+
+ unsigned width; /* pixels width */
+ unsigned height; /* pixels height */
+ int pos_x; /* horizontal position hint */
+ int pos_y; /* vertical position hint */
+
+ int (*control) (struct vout_window_t *, int, va_list);
+};
+
+#endif /* !LIBVLCCORE_WINDOW_H */
diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c
index f2d80d4..88b5210 100644
--- a/modules/control/hotkeys.c
+++ b/modules/control/hotkeys.c
@@ -982,7 +982,7 @@ static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout,
vout_OSDMessage( p_input, POSITION_TEXT_CHAN, psz_time );
}
- if( !p_vout->p_parent_intf || p_vout->b_fullscreen )
+ if( !p_vout->p_window || p_vout->b_fullscreen )
{
var_Get( p_input, "position", &pos );
vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN,
@@ -999,7 +999,7 @@ static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout,
}
ClearChannels( p_intf, p_vout );
- if( !p_vout->p_parent_intf || p_vout->b_fullscreen )
+ if( !p_vout->p_window || p_vout->b_fullscreen )
{
vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN,
i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER );
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index d2be65a..d61484f 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -304,8 +304,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
p_vout->render_time = 10;
p_vout->c_fps_samples = 0;
p_vout->b_filter_change = 0;
- p_vout->pf_control = 0;
- p_vout->p_parent_intf = 0;
+ p_vout->pf_control = NULL;
+ p_vout->p_window = NULL;
p_vout->i_par_num = p_vout->i_par_den = 1;
/* Initialize locks */
diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c
index b572823..22241cf 100644
--- a/src/video_output/vout_intf.c
+++ b/src/video_output/vout_intf.c
@@ -34,12 +34,14 @@
#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_detach (wnd);
+ 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;
+ vout_window_t *wnd = p_vout->p_window;
+
+ if (wnd == NULL)
+ return VLC_EGENERIC;
+
+ assert (wnd->control);
+ return wnd->control (wnd, i_query, args);
}
/*****************************************************************************
@@ -782,23 +825,18 @@ 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;
- }
+ if( p_vout->p_window )
+ vout_ReleaseWindow( p_vout->p_window, 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;
}
/*****************************************************************************
More information about the vlc-devel
mailing list