专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

视频画面切换,效率很低,原因何在?解决思路

发布时间:2011-06-27 19:26:50 文章来源:www.iduyao.cn 采编人员:星星草
视频画面切换,效率很低,原因何在?
我编了个程序,简单代码如下:
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,从而按不同模式显示视频。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: