[MPlayer-dev-eng] [PATCH] Direct3D VO better handling of uncooperative video adapter

Reimar Döffinger Reimar.Doeffinger at stud.uni-karlsruhe.de
Tue Feb 3 12:16:45 CET 2009


On Tue, Feb 03, 2009 at 12:57:38PM +0200, Georgi Petrov wrote:
> >> >> @@ -857,21 +862,16 @@
> >> >>  static void flip_page(void)
> >> >>  {
> >> >>      RECT rect = {0, 0, vo_dwidth, vo_dheight};
> >> >> -    if (FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0))) {
> >> >> +    if (!priv->d3d_device ||
> >> >> +        FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0))) {
> >> >>          mp_msg(MSGT_VO, MSGL_V,
> >> >> -               "<vo_direct3d>Video adapter became uncooperative.\n");
> >> >> -        mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Trying to reinitialize it...\n");
> >> >> +               "<vo_direct3d>Trying to reinitialize uncooperative video adapter.\n");
> >> >>          if (!reconfigure_d3d()) {
> >> >> -            mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Reinitialization Failed.\n");
> >> >> +            mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Reinitialization failed.\n");
> >> >>              return;
> >> >>          }
> >> >> -        if (FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0))) {
> >> >> -            mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Reinitialization Failed.\n");
> >> >> -            return;
> >> >> -        }
> >> >
> >> > Why are you removing it? I guess it can't work, but if so it should be
> >> > done in a separate patch with the reason explained in the commit
> >> > message.
> >>
> >> In flip_page() it was the same - a Present was issued on a possibly
> >> invalid d3d_device and THIS was the ultimate reason MPlayer used to.
> >
> > Yes, but if that was the only issue, the right solution would be to add
> > priv->d3d_device && ...
> >
> 
> No. The current code (before the patch) is this:
> 
> if (FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0)))
> 
> It's flaw is not checking if priv->d3d_device is NULL.
> 
> After the patch it is:
> 
> if (!priv->d3d_device ||
>     FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0)))

Uh, I am talking about the second Present call which you removed.
Since it can not work _in general_ (which I wanted you to confirm)
it is correct to simply remove it, but to avoid the crash adding
"priv->d3d_device && ..." would have been enough.
Again, I am talking about the _second_ Present, for the first there is
no question.



More information about the MPlayer-dev-eng mailing list