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

lvjadey 2010-04-21 05:54:57
我编了个程序,简单代码如下:
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,声音还会继续播放,不知道问题出来哪儿了。好像这样做效率也挺低的,感觉视频播放时不太流畅。请高人指点迷津!
...全文
259 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvjadey 2010-05-04
  • 打赏
  • 举报
回复
唉,继续顶!
lvjadey 2010-04-29
  • 打赏
  • 举报
回复
如何改呢?
xz801025 2010-04-29
  • 打赏
  • 举报
回复
算法的问题,改一下算法就行了
lvjadey 2010-04-28
  • 打赏
  • 举报
回复
ding ding ding
lvjadey 2010-04-27
  • 打赏
  • 举报
回复
继续顶。。。。。
lvjadey 2010-04-22
  • 打赏
  • 举报
回复
高手出来作答一下吧
lvjadey 2010-04-22
  • 打赏
  • 举报
回复
是不是发帖的位置不对啊,怎么没有高人来指点呢!?
visualassist4680 2010-04-22
  • 打赏
  • 举报
回复
太高深了,关注ing
尹成 2010-04-21
  • 打赏
  • 举报
回复
帮顶……
hufen2740 2010-04-21
  • 打赏
  • 举报
回复
帮顶……
lvjadey 2010-04-21
  • 打赏
  • 举报
回复
自己先顶一个

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧