posts - 0, comments - 1, trackbacks - 0, articles - 25
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

TMovie

Posted on 2009-10-05 11:40 cngamedev 阅读(186) 评论(0)  编辑 收藏 引用 所属分类: Dev Tips

here is a TMovie class that will allow you to play any movie format in a texture

Code:

#include <dshow.h>
#include <mmstream.h>
#include <amstream.h>
#include <ddstream.h>


static GUID MY_CLSID_AMMultiMediaStream={0x49C47CE5,0x9BA4,0x11D0,0x82,0x12,0x00,0xC0,0x4F,0xC3,0x2C,0x45};
static GUID MY_IID_IAMMultiMediaStream={0xBEBE595C,0x9A6F,0x11D0,0x8F,0xDE,0x00,0xC0,0x4F,0xD9,0x18,0x9D};
static GUID MY_MSPID_PrimaryVideo={0xA35FF56A,0x9FDA,0x11D0,0x8F,0xDF,0x00,0xC0,0x4F,0xD9,0x18,0x9D};
static GUID MY_IID_IDirectDrawMediaStream={0xF4104FCE,0x9A70,0x11D0,0x8F,0xDE,0x00,0xC0,0x4F,0xD9,0x18,0x9D}; 
static GUID MY_MSPID_PrimaryAudio={0xA35FF56B,0x9FDA,0x11D0,0x8F,0xDF,0x00,0xC0,0x4F,0xD9,0x18,0x9D};

class TMovie
 {
         IAMMultiMediaStream*     pAMStream;
         IMediaStream*            pPrimaryVidStream;
         IDirectDrawMediaStream*  pDDStream;
         IDirectDrawStreamSample* pSample;
         IDirectDrawSurface*      pSurface;
         RECT                     Movie_rect;
         LONG                     MoviePitch;
         void*                    MovieBuffer;
         DWORD                    time;
         DWORD                    oldtick;
     
     public:   
           TMovie()
            {
               CoInitialize(0);
               pAMStream         = 0;
               pPrimaryVidStream = 0; 
               pDDStream         = 0;   
               pSample           = 0;
               pSurface          = 0;
               time              = 0;
            }
               
           ~TMovie()
            {
                pPrimaryVidStream->Release();
                pDDStream->Release();
                pSample->Release();
                pSurface->Release();
                pAMStream->Release();
                CoUninitialize();
            }
           
           void LoadMovie(char* filename)
            {
                WCHAR buf[512];
                MultiByteToWideChar(CP_ACP,0,filename,-1,buf,512);
                CoCreateInstance(MY_CLSID_AMMultiMediaStream,0,1,MY_IID_IAMMultiMediaStream,(void**)&pAMStream);
                pAMStream->Initialize((STREAM_TYPE) 0, 0, NULL);
                pAMStream->AddMediaStream( 0, &MY_MSPID_PrimaryVideo, 0, NULL);
                pAMStream->OpenFile(buf,4);
                pAMStream->GetMediaStream( MY_MSPID_PrimaryVideo, &pPrimaryVidStream);
                pPrimaryVidStream->QueryInterface(MY_IID_IDirectDrawMediaStream,(void**)&pDDStream);
                pDDStream->CreateSample(0,0,0,&pSample);
                pSample->GetSurface(&pSurface,&Movie_rect);
                pAMStream->SetState((STREAM_STATE)1);
            }
           
           void NextMovieFrame()
            {
               if(GetTickCount()-oldtick < time)return ;
               oldtick = GetTickCount(); 
               pSample->Update( 0, NULL, NULL, 0);
            }
           
           int MovieWidth() { return (Movie_rect.right - Movie_rect.left);}
           
           int MovieHeight() { return (Movie_rect.bottom - Movie_rect.top);} 
           
           void DrawMovie(int x,int y,ITexture* Buf)
            {   
                void* pBits = Buf->lock();
                LONG  Pitch = Buf->getPitch(); 
                DDSURFACEDESC  ddsd;
                ddsd.dwSize=sizeof(DDSURFACEDESC);
                pSurface->Lock( NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT , NULL);
                int wmin=(Pitch<ddsd.lPitch)?Pitch:ddsd.lPitch;
                for(int h=0; h<ddsd.dwHeight; h++)
                     memcpy((BYTE*)pBits+((y+h)*Pitch)+x*4,(BYTE*)ddsd.lpSurface+h*ddsd.lPitch,wmin);
                pSurface->Unlock(NULL);
                Buf->unlock();
            } 
           
          void SetMovieFPS(int fps)
            {
                time = fps;
            }           
           
 } ;   


you can use it as the following

Code:

TMovie* movie = new TMovie;
movie->LoadMovie("mymovie.mpg");
movie->SetMovieFPS(25);

ITexture* movTxtr;
irrVideo->setTextureCreationFlag(ETCF_ALWAYS_32_BIT , TRUE);
irrVideo->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, FALSE);
movTxtr = irrVideo->addTexture(dimension2d<s32>(512,256),"imovie");

 while(irrDevice->run())
  {
     irrVideo->beginScene(true, true, SColor(0,200,200,200))
                  movie->NextMovieFrame()
                  movie->DrawMovie(0,0,movTxtr)
                  irrSceneMgr->drawAll()
      irrVideo->endScene()
  }


now you see how it is so easy to play any movie in your texture.

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理