directdraw顯示yuv視頻,出現屏保時,yuv顯示不出來,表面丟失
DDrawSurface 丟失, DDraw表面在很多情況下都會丟失(如:啟動其他全屏獨占程序,屏保,或鎖屏時), 表面丟失其實就是表面所使用的內存或顯存被DirectDraw系統釋放, 分配給其他程序. 如果表面丟失, 對此表面的操作都會返回 DDERR_SURFACELOST , 此時應該調用 IDirectDrawSurface 接口方法 Restore 來恢復表面(重新申請內存或顯存)。
偽代碼如下:
hr = m_lpDDSOffscreen->Lock(rcDest,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT,NULL);
if (hr==DDERR_SURFACELOST)
{
hr = m_lpDDSOffscreen->Restore();
hr = m_lpDDSOffscreen->Lock(rcDest,&ddsd,DDLOCK_WAIT,NULL);
}
if (FAILED(hr))
{
return DD_FALSE;
}
//將數據拷貝到離屏表面,然后使用blt塊傳輸到主表面
HRESULT ddrval;
ddrval=lpDDSPrimary->Blt(NULL, lpDDSOffscreen, NULL, DDBLT_WAIT, NULL);
if (ddrval==DDERR_SURFACELOST)
{
lpDDSPrimary->Restore();
}
這樣當屏保,鎖屏,修改屏幕分辨率,表面都可以恢復,視頻顯示正常
這里也可以使用 ddraw對象,恢復所有表面,方法如下:
lpDD->RestoreAllSurfaces();
其中
LPDIRECTDRAW7 lpDD;