DECLARE_OPEN(aalib);
DECLARE_OPEN(caca);
DECLARE_OPEN(sdl);
-DECLARE_OPEN(xcb);
+DECLARE_OPEN(xcb_x11);
DECLARE_OPEN(xcb_xv);
+DECLARE_OPEN(xcb_glx);
+DECLARE_OPEN(dummy);
+DECLARE_OPEN(fb);
+DECLARE_OPEN(directfb);
+DECLARE_OPEN(yuv);
+DECLARE_OPEN(snapshot);
+DECLARE_OPEN(vmem);
+DECLARE_OPEN(direct3d_xp);
+DECLARE_OPEN(direct3d_vista);
+DECLARE_OPEN(glwin32);
+DECLARE_OPEN(macosx);
#undef DECLARE_OPEN
-#define DECLARE_MODULE(name, priority) \
- set_description( "Video display "#name" wrapper" ) \
- set_shortname( "Video display "#name" wrapper" ) \
+#define DECLARE_MODULE_EXT(name, module, priority) \
+ set_description( "Video display "#module" wrapper" ) \
+ set_shortname( "Video display "#module" wrapper" ) \
set_capability( "video output", priority ) \
- set_callbacks( Open##name, Close ) \
+ set_callbacks( Open##module, Close ) \
add_shortcut( #name )
+#define DECLARE_MODULE(name, priority) \
+ DECLARE_MODULE_EXT(name, name, priority)
+
vlc_module_begin()
set_category( CAT_VIDEO )
set_subcategory( SUBCAT_VIDEO_VOUT )
DECLARE_MODULE(sdl, 60)
add_submodule()
- DECLARE_MODULE(xcb, 0)
+ DECLARE_MODULE(xcb_x11, 75)
+
+ add_submodule()
+ DECLARE_MODULE(xcb_xv, 155)
+
+ add_submodule()
+ DECLARE_MODULE(xcb_glx, 20)
+
+ add_submodule()
+ DECLARE_MODULE(dummy, 1)
+
+ add_submodule()
+ DECLARE_MODULE(fb, 30)
+
+ add_submodule()
+ DECLARE_MODULE(directfb, 60)
+
+ add_submodule()
+ DECLARE_MODULE(yuv, 0)
+
+ add_submodule()
+ DECLARE_MODULE(snapshot, 0)
+
+ add_submodule()
+ DECLARE_MODULE(vmem, 0)
+
+ add_submodule()
+ DECLARE_MODULE_EXT(direct3d, direct3d_vista, 150)
add_submodule()
- DECLARE_MODULE(xcb_xv, 0)
+ DECLARE_MODULE_EXT(direct3d, direct3d_xp, 70)
+
+ add_submodule()
+ DECLARE_MODULE(glwin32, 20)
+
+ add_submodule()
+ DECLARE_MODULE(macosx, 300)
vlc_module_end()
*
*****************************************************************************/
struct vout_sys_t {
+ const char *name;
char *title;
vout_display_t *vd;
bool use_dr;
static void VoutGetDisplayCfg(vout_thread_t *,
vout_display_cfg_t *, const char *title);
+static int Forward(vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void *);
+
+
/*****************************************************************************
*
*****************************************************************************/
vout_thread_t *vout = (vout_thread_t *)object;
vout_sys_t *sys;
- msg_Err(vout, "Opening vout display wrapper");
+ msg_Warn(vout, "Opening vout display wrapper");
/* */
sys = malloc(sizeof(*sys));
if (!sys)
return VLC_ENOMEM;
+ sys->name = module;
sys->title = var_CreateGetNonEmptyString(vout, "video-title");
/* */
return VLC_EGENERIC;
}
+ /* */
+ if (!strcmp(sys->name, "direct3d_xp") || !strcmp(sys->name, "direct3d_vista")) {
+ var_Create(vout, "direct3d-desktop", VLC_VAR_BOOL|VLC_VAR_DOINHERIT);
+ var_AddCallback(vout, "direct3d-desktop", Forward, NULL);
+ }
+
/* */
vout->pf_init = Init;
vout->pf_end = End;
vout_thread_t *vout = (vout_thread_t *)object;
vout_sys_t *sys = vout->p_sys;
- if (sys->vd)
- vout_DeleteDisplay(sys->vd, NULL);
+ /* */
+ if (!strcmp(sys->name, "direct3d_xp") || !strcmp(sys->name, "direct3d_vista")) {
+ var_DelCallback(vout, "direct3d-desktop", Forward, NULL);
+ }
+
+ vout_DeleteDisplay(sys->vd, NULL);
free(sys->title);
free(sys );
}
vout->output.i_chroma = source.i_chroma;
vout->output.i_width = source.i_width;
vout->output.i_height = source.i_height;
- vout->output.i_aspect = source.i_aspect;
+ vout->output.i_aspect = (int64_t)source.i_sar_num * source.i_width * VOUT_ASPECT_FACTOR / source.i_sar_den / source.i_height;
vout->output.i_rmask = source.i_rmask;
vout->output.i_gmask = source.i_gmask;
vout->output.i_bmask = source.i_bmask;
vout->fmt_out.i_visible_width = vout->output.i_width;
vout->fmt_out.i_height =
vout->fmt_out.i_visible_height = vout->output.i_height;
- vout->fmt_out.i_aspect = vout->output.i_aspect;
+ vout->fmt_out.i_sar_num = vout->output.i_aspect * vout->output.i_height;
+ vout->fmt_out.i_sar_den = VOUT_ASPECT_FACTOR * vout->output.i_width;
vout->fmt_out.i_x_offset = 0;
vout->fmt_out.i_y_offset = 0;
}
#endif
if (vout->b_on_top)
- vout_SetDisplayOnTop(vd, true);
+ vout_SetWindowState(vd, VOUT_WINDOW_STATE_ABOVE);
/* XXX For non dr case, the current vout implementation force us to
* create at most 1 direct picture (otherwise the buffers will be kept
picture->p_sys = malloc(sizeof(*picture->p_sys));
if (sys->use_dr) {
- picture_t *direct = vout_display_Get(vd);
+ picture_pool_t *pool = vout_display_Pool(vd, picture_max);
+ if (!pool)
+ break;
+ picture_t *direct = picture_pool_Get(pool);
if (!direct)
break;
picture->format = direct->format;
vout_AllocatePicture(VLC_OBJECT(vd), picture,
vd->source.i_chroma,
vd->source.i_width, vd->source.i_height,
- vd->source.i_aspect);
+ vd->source.i_sar_num, vd->source.i_sar_den);
if (!picture->i_planes)
break;
picture->p_sys->direct = NULL;
if (!sys->use_dr)
free(picture->p_data_orig);
free(picture->p_sys);
+
+ picture->i_status = FREE_PICTURE;
}
+ if (sys->use_dr && vout_AreDisplayPicturesInvalid(sys->vd))
+ vout_ManageDisplay(sys->vd, true);
}
/*****************************************************************************
vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
}
if (vout->i_changes & VOUT_ASPECT_CHANGE) {
- vout->output.i_aspect =
- vout->fmt_out.i_aspect = vout->fmt_in.i_aspect;
+ vout->output.i_aspect = (int64_t)vout->fmt_in.i_sar_num * vout->fmt_in.i_width * VOUT_ASPECT_FACTOR /
+ vout->fmt_in.i_sar_den / vout->fmt_in.i_height;
vout->fmt_out.i_sar_num = vout->fmt_in.i_sar_num;
vout->fmt_out.i_sar_den = vout->fmt_in.i_sar_den;
vout->i_changes &= ~VOUT_SCALE_CHANGE;
}
if (vout->i_changes & VOUT_ON_TOP_CHANGE) {
- vout_SetDisplayOnTop(vd, vout->b_on_top);
+ vout_SetWindowState(vd, vout->b_on_top
+ ? VOUT_WINDOW_STATE_ABOVE
+ : VOUT_WINDOW_STATE_NORMAL);
vout->i_changes &= ~VOUT_ON_TOP_CHANGE;
}
if (sys->use_dr && vout_AreDisplayPicturesInvalid(vd)) {
vout->i_changes |= VOUT_PICTURE_BUFFERS_CHANGE;
}
-
- vout_ManageDisplay(vd);
+ vout_ManageDisplay(vd, !sys->use_dr);
return VLC_SUCCESS;
}
vout_display_t *vd = sys->vd;
assert(sys->use_dr || !picture->p_sys->direct);
+ assert(vout_IsDisplayFiltered(vd) == !sys->use_dr);
if (sys->use_dr) {
- assert(!vout_IsDisplayFiltered(vd));
assert(picture->p_sys->direct);
-
vout_display_Prepare(vd, picture->p_sys->direct);
} else {
- picture_t *filtered = vout_FilterDisplay(vd, picture);
- if (filtered) {
- picture_t *direct = picture->p_sys->direct = vout_display_Get(vd);
- if (direct) {
- picture_Copy(direct, filtered);
- vout_display_Prepare(vd, direct);
- }
- picture_Release(filtered);
+ picture_t *direct = picture->p_sys->direct = vout_FilterDisplay(vd, picture);
+ if (direct) {
+ vout_display_Prepare(vd, direct);
}
}
}
/* Load configuration */
cfg->is_fullscreen = var_CreateGetBool(vout, "fullscreen");
cfg->display.title = title;
- cfg->display.width = var_CreateGetInteger(vout, "width");
- cfg->display.height = var_CreateGetInteger(vout, "height");
+ const int display_width = var_CreateGetInteger(vout, "width");
+ const int display_height = var_CreateGetInteger(vout, "height");
+ cfg->display.width = display_width > 0 ? display_width : 0;
+ cfg->display.height = display_height > 0 ? display_height : 0;
cfg->is_display_filled = var_CreateGetBool(vout, "autoscale");
cfg->display.sar.num = 1; /* TODO monitor AR */
cfg->display.sar.den = 1;
cfg->align.horizontal = VOUT_DISPLAY_ALIGN_BOTTOM;
}
+static int Forward(vlc_object_t *object, char const *var,
+ vlc_value_t oldval, vlc_value_t newval, void *data)
+{
+ vout_thread_t *vout = (vout_thread_t*)object;
+
+ VLC_UNUSED(oldval);
+ VLC_UNUSED(data);
+ return var_Set(vout->p_sys->vd, var, newval);
+}
+