| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- #ifdef _XBOX
- #include "xmvcodec.h"
- #include "..\Render.h"
- #include "..\mediaplayer\XBoxMediaPlayer.h"
- XMVCodec::XMVCodec(IRender* _pRender,bool _useStreaming) : IVideoCodec(_pRender)
- {
- pPlayer = 0;
- SetViewPosition(0.f,0.f,1.f,1.f,false);
- useStreaming = _useStreaming;
- bPausePlay = false;
- }
- XMVCodec::~XMVCodec()
- {
- CloseFile();
- }
- bool XMVCodec::OpenFile(const char* pcVideoFile,bool bLoopPlay)
- {
- CloseFile();
- pPlayer = GetRender()->GetMediaPlayer(pcVideoFile,bLoopPlay,useStreaming);
- if( pPlayer==NULL )
- return false;
- UpdateViewPosition();
- return true;
- }
- bool XMVCodec::Frame(bool bPause)
- {
- if( pPlayer )
- {
- if( useStreaming && bPausePlay != (IsPause() || bPause) )
- {
- bPausePlay = !bPausePlay;
- pPlayer->Pause(bPausePlay);
- }
- UpdateViewPosition();
- //NGRender::pRS->D3D()->Clear(0, NULL, D3DCLEAR_TARGET, rand(), 0, 0x0);
- DWORD dwSavedColorWrite;
- DWORD dwSavedFillMode;
- DWORD dwSavedAlphaBlend;
- DWORD dwSavedAlphaTest;
- NGRender::pRS->D3D()->GetRenderState(D3DRS_COLORWRITEENABLE, &dwSavedColorWrite);
- NGRender::pRS->D3D()->GetRenderState(D3DRS_FILLMODE, &dwSavedFillMode);
- NGRender::pRS->D3D()->GetRenderState(D3DRS_ALPHABLENDENABLE, &dwSavedAlphaBlend);
- NGRender::pRS->D3D()->GetRenderState(D3DRS_ALPHATESTENABLE, &dwSavedAlphaTest);
- NGRender::pRS->D3D()->SetRenderState(D3DRS_COLORWRITEENABLE, 0x0000000F);
- NGRender::pRS->D3D()->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
- NGRender::pRS->D3D()->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- NGRender::pRS->D3D()->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
-
- IMediaPlayer::MPResultCode rc = pPlayer->RenderNextFrame();
- // wait till async audio stream reading
- //while( rc == IMediaPlayer::MP_NO_DATA )
- // rc = pPlayer->RenderNextFrame();
- if( rc == IMediaPlayer::MP_EOF )
- {
- CloseFile();
- }
- NGRender::pRS->D3D()->SetRenderState(D3DRS_COLORWRITEENABLE, dwSavedColorWrite);
- NGRender::pRS->D3D()->SetRenderState(D3DRS_FILLMODE, dwSavedFillMode);
- NGRender::pRS->D3D()->SetRenderState(D3DRS_ALPHABLENDENABLE, dwSavedAlphaBlend);
- NGRender::pRS->D3D()->SetRenderState(D3DRS_ALPHATESTENABLE, dwSavedAlphaTest);
- }
- return pPlayer!=0;
- }
- void XMVCodec::CloseFile()
- {
- Stop();
- if( pPlayer )
- {
- pPlayer->Release();
- pPlayer = 0;
- }
- bPausePlay = false;
- }
- void XMVCodec::SetViewPosition(float fx, float fy, float fw, float fh, bool bModifyAspect)
- {
- IRender* pRS = GetRender();
- float fAspect = 1.f;
- if( bModifyAspect )
- {
- float cx = (float)pRS->GetFullScreenViewPort_2D().Width;
- float cy = (float)pRS->GetFullScreenViewPort_2D().Height;
- float scr_aspect = cx / cy;
- const float def_aspect = 16.0f / 9.0f;
- fAspect = def_aspect / scr_aspect * pRS->GetWideScreenAspectWidthMultipler();
- }
- float fWidthMultipler = fAspect;
- float fHeightMultipler = 1.f;
- viewPos.left = (fx - 0.5f) * fWidthMultipler + 0.5f;
- viewPos.top = (fy - 0.5f) * fHeightMultipler + 0.5f;
- viewPos.right = (fx + fw - 0.5f) * fWidthMultipler + 0.5f;
- viewPos.bottom = (fy + fh - 0.5f) * fHeightMultipler + 0.5f;
- //SetUV();
- float uvl=0.f;
- float uvr=1.f;
- float uvt=0.f;
- float uvb=1.f;
- float fvpw = viewPos.right - viewPos.left;
- float fvph = viewPos.bottom - viewPos.top;
- // правим UV по левой стороне
- if( viewPos.left < 0.f ) {
- uvl = -viewPos.left / fvpw;
- viewPos.left = 0.f;
- }
- if( viewPos.left > 1.f ) {
- uvl = (viewPos.left - 1.f) / fvpw;
- viewPos.left = 1.f;
- }
- // правим UV по верху
- if( viewPos.top < 0.f ) {
- uvt = -viewPos.top / fvph;
- viewPos.top = 0.f;
- }
- if( viewPos.top > 1.f ) {
- uvt = 1.f - (viewPos.top - 1.f) / fvph;
- viewPos.top = 1.f;
- }
- // правим UV по правой стороне
- if( viewPos.right > 1.f ) {
- uvr = 1.f - (viewPos.right - 1.f) / fvpw;
- viewPos.right = 1.f;
- }
- if( viewPos.right < 0.f ) {
- uvr = -viewPos.right / fvpw;
- viewPos.right = 0.f;
- }
- // правим UV по низу
- if( viewPos.bottom > 1.f ) {
- uvb = 1.f - (viewPos.bottom - 1.f) / fvph;
- viewPos.bottom = 1.f;
- }
- if( viewPos.bottom < 0.f ) {
- uvb = -viewPos.bottom / fvph;
- viewPos.bottom = 0.f;
- }
- if( pPlayer )
- ((XBoxMediaPlayer*)pPlayer)->SetUV(uvl,uvt,uvr,uvb);
- UpdateViewPosition();
- }
- void XMVCodec::UpdateViewPosition()
- {
- if( !pPlayer ) return;
- //RENDERSCREEN & scr = GetHostObj()->Render().GetScreenInfo();
- const RENDERVIEWPORT & vprt = GetRender()->GetViewport();
- RECT r;
- r.left = vprt.X + (long)(viewPos.left * vprt.Width);
- r.top = vprt.Y + (long)(viewPos.top * vprt.Height);
- r.right = vprt.X + (long)(viewPos.right * vprt.Width);
- r.bottom = vprt.Y + (long)(viewPos.bottom * vprt.Height);
- pPlayer->SetRectangle(r);
- }
- void XMVCodec::Stop()
- {
- //CloseFile();
- //if( pPlayer )
- // pPlayer->Stop();
- IVideoCodec::Stop();
- }
- #endif
|