我编了个程序,简单代码如下:
main()
{
....
    DXUTSetCallbackD3D9DeviceAcceptable( IsDeviceAcceptable );
    DXUTSetCallbackD3D9DeviceCreated( OnCreateDevice );
    DXUTSetCallbackD3D9DeviceReset( OnResetDevice );
    DXUTSetCallbackD3D9FrameRender( OnFrameRender );
    DXUTSetCallbackD3D9DeviceLost( OnLostDevice );
    DXUTSetCallbackD3D9DeviceDestroyed( OnDestroyDevice );
    DXUTSetCallbackMsgProc( MsgProc );
    DXUTSetCallbackKeyboard( KeyboardProc );
    DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );
    DXUTSetCursorSettings( true, true );
    DXUTInit( false, false ); 
...
}
实现了播放视频时可以按照几种方式来显示,比如3d视频文件,可以按照设置不同,让左右眼看的画面左右互换,或者将上下模式的画面变成左右模式,我是在OnFrameRender()中实现的,主要代码如下:
void    CALLBACK  CScreenShow::OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
IDirect3DSurface9 *pD3DBackBuffer;
RECT  rc,drc,drc1;
HRESULT  hr;
unsigned char *pImagebuffer=NULL,*pImagebuffer1=NULL;
D3DLOCKED_RECT LockedRect;
D3DLOCKED_RECT d3dlr;
D3DSURFACE_DESC *pDesc;
D3DSURFACE_DESC desc;
hr= pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pD3DBackBuffer);//20090613
if (D3D_OK!=hr)
{
return;
} if (SUCCEEDED(hr=(pd3dDevice)->BeginScene()) )
{
switch(pthisContent->m_StereoType)//选择显示模式
{
case STEREO_MODE_NONE:
if(pthisContent->m_pRenderer->isLeftFrame==true)
{
pImagebuffer=mtBuf.pLBuffer;
}
else
{
pImagebuffer=mtBuf.pRBuffer;
} drc.left=0;
drc.right= (pthisContent->m_DesSize.cx-1)*1;
drc.top=0;
drc.bottom=(pthisContent->m_DesSize.cy-1)*1; if ((hr=D3DXLoadSurfaceFromMemory(
m_ScreenShow.HelpSurface, 
NULL, 
&drc, // CONST RECT* pDestRect,
pImagebuffer, // LPCVOID pSrcMemory,
D3DFMT_A8R8G8B8, // D3DFORMAT SrcFormat
mtBuf.scanline, // UINT SrcPitch,
NULL, // CONST PALETTEENTRY* pSrcPalette,
&(mtBuf.mRRect),//CONST RECT* pSrcRect,
D3DX_FILTER_LINEAR , // DWORD Filter,
0) )!= D3D_OK)
{
hr=S_OK;
}
break;
case STEREO_MODE_ALT:
if (m_ScreenShow.lrswitch)
{
pImagebuffer=mtBuf.pLBuffer;
pImagebuffer1=mtBuf.pRBuffer;
}
else
{
pImagebuffer=mtBuf.pRBuffer;
pImagebuffer1=mtBuf.pLBuffer;
}
drc.left=0;
drc.right= pthisContent->m_DesSize.cx/2-1;
drc.top=0;
drc.bottom=pthisContent->m_DesSize.cy-1;
drc1.left= pthisContent->m_DesSize.cx/2;
drc1.right= pthisContent->m_DesSize.cx-1;
drc1.top=0;
drc1.bottom=pthisContent->m_DesSize.cy-1;
if ((hr=D3DXLoadSurfaceFromMemory(
m_ScreenShow.HelpSurface, 
NULL, 
&drc,//&(m_LeftBuf.mRect), // CONST RECT* pDestRect,
pImagebuffer, // LPCVOID pSrcMemory,
D3DFMT_A8R8G8B8, // D3DFORMAT SrcFormat
mtBuf.scanline, // UINT SrcPitch,
NULL, // CONST PALETTEENTRY* pSrcPalette,
&(mtBuf.mLRect)   ,// CONST RECT* pSrcRect,
D3DX_FILTER_LINEAR , // DWORD Filter,
0) )!= D3D_OK)
{  }
if ((hr=D3DXLoadSurfaceFromMemory(
m_ScreenShow.HelpSurface, 
NULL, 
&drc1, // CONST RECT* pDestRect,
pImagebuffer, // LPCVOID pSrcMemory,//20091116
D3DFMT_A8R8G8B8, // D3DFORMAT SrcFormat
mtBuf.scanline, // UINT SrcPitch,
NULL, // CONST PALETTEENTRY* pSrcPalette,
&(mtBuf.mRRect),
D3DX_FILTER_LINEAR , // DWORD Filter,
0) )!= D3D_OK)

hr=S_OK;
} break;
}
hr=pd3dDevice->UpdateSurface(m_ScreenShow.HelpSurface,NULL,pD3DBackBuffer,NULL);//20090613
if(hr!=D3D_OK)
{
hr=S_OK;
}
(pd3dDevice)->EndScene();
}
pD3DBackBuffer->Release();
return;
}可以通过界面上的按钮来改变pthisContent->m_StereoType,从而按不同模式显示视频。
但是当频繁改变显示模式时,画面就会死掉,调试时显示hr=pd3dDevice->UpdateSurface(m_ScreenShow.HelpSurface,NULL,pD3DBackBuffer,NULL),返回值hr不等于S_OK,声音还会继续播放,不知道问题出来哪儿了。好像这样做效率也挺低的,感觉视频播放时不太流畅。请高人指点迷津!