1
0
mirror of https://github.com/mpv-player/mpv synced 2025-01-02 21:12:23 +00:00

vo_vdpau: don't try to create surfaces of size 0

At least on kwin, we decide to proceed without waiting for the window
being mapped (due to the frame exts hack, see commit 8c002b79). But that
leaves us with a window size of 0x0, which causes VdpOutputSurfaceCreate
to fail. This prints some warnings, although vo_vdpau recovers later and
this has no other bad consequences.

Do the following things to deal with this:
- set the "known" window size to the suggested window size before the
  window is even created
- allow calling XGetGeometry on the window even if the window is not
  mapped yet (this should work just fine)
- make the output surface minimum size 1x1

Strictly speaking, only one of these would be required to make the
warning disappear, but they're all valid changes and increase robustness
and correctness. At no point we use a window size of 0x0 as magic value
for "unset" or unknown size, so keeping it unset has no purpose anyway.

CC: @mpv-player/stable
This commit is contained in:
wm4 2014-10-01 17:12:46 +02:00
parent 7759c182cb
commit 64fb37c173
2 changed files with 11 additions and 11 deletions

View File

@ -234,6 +234,13 @@ static void forget_frames(struct vo *vo, bool seek_reset)
vc->dropped_frame = false;
}
static int s_size(int s, int disp)
{
disp = MPMAX(1, disp);
s += s / 2;
return s >= disp ? s : disp;
}
static void resize(struct vo *vo)
{
struct vdpctx *vc = vo->priv;
@ -259,16 +266,8 @@ static void resize(struct vo *vo)
if (vc->output_surface_width < vo->dwidth
|| vc->output_surface_height < vo->dheight) {
if (vc->output_surface_width < vo->dwidth) {
vc->output_surface_width += vc->output_surface_width >> 1;
vc->output_surface_width = FFMAX(vc->output_surface_width,
vo->dwidth);
}
if (vc->output_surface_height < vo->dheight) {
vc->output_surface_height += vc->output_surface_height >> 1;
vc->output_surface_height = FFMAX(vc->output_surface_height,
vo->dheight);
}
vc->output_surface_width = s_size(vc->output_surface_width, vo->dwidth);
vc->output_surface_height = s_size(vc->output_surface_height, vo->dheight);
// Creation of output_surfaces
for (int i = 0; i < vc->num_output_surfaces; i++)
if (vc->output_surfaces[i] != VDP_INVALID_HANDLE) {

View File

@ -1339,6 +1339,7 @@ void vo_x11_config_vo_window(struct vo *vo, XVisualInfo *vis, int flags,
vo_x11_create_window(vo, vis, rc);
vo_x11_classhint(vo, x11->window, classname);
x11->window_hidden = true;
x11->winrc = geo.win;
}
if (flags & VOFLAG_HIDDEN)
@ -1453,7 +1454,7 @@ static void vo_x11_update_geometry(struct vo *vo)
int dummy_int;
Window dummy_win;
Window win = vo->opts->WinID > 0 ? vo->opts->WinID : x11->window;
if (x11->window_hidden || !win)
if (!win)
return;
XGetGeometry(x11->display, win, &dummy_win, &dummy_int, &dummy_int,
&w, &h, &dummy_int, &dummy_uint);