diff options
-rw-r--r-- | Xext/xvmain.c | 82 |
1 files changed, 24 insertions, 58 deletions
diff --git a/Xext/xvmain.c b/Xext/xvmain.c index 93e5f0cd3..0c6f25b5a 100644 --- a/Xext/xvmain.c +++ b/Xext/xvmain.c @@ -327,36 +327,24 @@ XvGetRTPort(void) return XvRTPort; } -static Bool -XvDestroyPixmap(PixmapPtr pPix) +static void +XvStopAdaptors(DrawablePtr pDrawable) { - Bool status; - ScreenPtr pScreen; - XvScreenPtr pxvs; - XvAdaptorPtr pa; - int na; - XvPortPtr pp; - int np; - - pScreen = pPix->drawable.pScreen; - - SCREEN_PROLOGUE(pScreen, DestroyPixmap); - - pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, XvScreenKey); + ScreenPtr pScreen = pDrawable->pScreen; + XvScreenPtr pxvs = dixLookupPrivate(&pScreen->devPrivates, XvScreenKey); + XvAdaptorPtr pa = pxvs->pAdaptors; + int na = pxvs->nAdaptors; /* CHECK TO SEE IF THIS PORT IS IN USE */ - - pa = pxvs->pAdaptors; - na = pxvs->nAdaptors; while (na--) { - np = pa->nPorts; - pp = pa->pPorts; + XvPortPtr pp = pa->pPorts; + int np = pa->nPorts; while (np--) { - if (pp->pDraw == (DrawablePtr) pPix) { - XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted); + if (pp->pDraw == pDrawable) { + XvdiSendVideoNotify(pp, pDrawable, XvPreempted); - (void) (*pp->pAdaptor->ddStopVideo) (pp, pp->pDraw); + (void) (*pp->pAdaptor->ddStopVideo) (pp, pDrawable); pp->pDraw = NULL; pp->client = NULL; @@ -366,9 +354,19 @@ XvDestroyPixmap(PixmapPtr pPix) } pa++; } +} - status = (*pScreen->DestroyPixmap) (pPix); +static Bool +XvDestroyPixmap(PixmapPtr pPix) +{ + ScreenPtr pScreen = pPix->drawable.pScreen; + Bool status; + + if (pPix->refcnt == 1) + XvStopAdaptors(&pPix->drawable); + SCREEN_PROLOGUE(pScreen, DestroyPixmap); + status = (*pScreen->DestroyPixmap) (pPix); SCREEN_EPILOGUE(pScreen, DestroyPixmap, XvDestroyPixmap); return status; @@ -378,45 +376,13 @@ XvDestroyPixmap(PixmapPtr pPix) static Bool XvDestroyWindow(WindowPtr pWin) { + ScreenPtr pScreen = pWin->drawable.pScreen; Bool status; - ScreenPtr pScreen; - XvScreenPtr pxvs; - XvAdaptorPtr pa; - int na; - XvPortPtr pp; - int np; - pScreen = pWin->drawable.pScreen; + XvStopAdaptors(&pWin->drawable); SCREEN_PROLOGUE(pScreen, DestroyWindow); - - pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, XvScreenKey); - - /* CHECK TO SEE IF THIS PORT IS IN USE */ - - pa = pxvs->pAdaptors; - na = pxvs->nAdaptors; - while (na--) { - np = pa->nPorts; - pp = pa->pPorts; - - while (np--) { - if (pp->pDraw == (DrawablePtr) pWin) { - XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted); - - (void) (*pp->pAdaptor->ddStopVideo) (pp, pp->pDraw); - - pp->pDraw = NULL; - pp->client = NULL; - pp->time = currentTime; - } - pp++; - } - pa++; - } - status = (*pScreen->DestroyWindow) (pWin); - SCREEN_EPILOGUE(pScreen, DestroyWindow, XvDestroyWindow); return status; |