DirectShow吐血大送分!!!

noho 2001-05-29 03:18:00

HRESULT CMovieWindow::InitMultiMedia()
{
ASSERT(m_pDD3);
ASSERT(m_pMMStream==NULL);
ASSERT(m_pEvent==NULL);

IGraphBuilder * pGB=NULL;

HRESULT hr=S_OK;

//Create the AMMultiMediaStream object
hr =CoCreateInstance(__uuidof(AMMultiMediaStream),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IAMMultiMediaStream), (void **)&m_pMMStream);
if(FAILED(hr))
return hr;

//Initialize stream
hr = m_pMMStream->Initialize(STREAMTYPE_READ, 0, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
//Add primary video stream
hr = m_pMMStream->AddMediaStream(m_pDD3, &MSPID_PrimaryVideo, 0, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
//Add primary audio stream
hr = m_pMMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio,
AMMSF_ADDDEFAULTRENDERER, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
return hr;
m_pMMStream=NULL;
}
hr=m_pMMStream->GetFilterGraph(&pGB);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
hr=pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);
pGB->Release();
if(m_pEvent)
{
m_pEvent->SetNotifyFlags(0 );
// m_pEvent->CancelDefaultHandling(EC_REPAINT);
}
return hr;
}

HANDLE CMovieWindow::GetMultiMediaEvent()
{
HANDLE hEvent=NULL;
if(m_pEvent)
{
m_pEvent->GetEventHandle((OAEVENT*) &hEvent);
}
return hEvent;
}

m_hCopyEvent=GetMultiMediaEvent();

while(::WaitForSingleObjectEx(m_hCopyEvent, 40, TRUE)!=WAIT_OBJECT_0)
{
if(m_bExit)
break;
}
if(m_bExit)
break;
if(SUCCEEDED(m_pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0)))
{
TRACE(_T("Event: 0x%X\n"), evCode);
if ((EC_COMPLETE == evCode) || (EC_USERABORT == evCode))
{
StopCopyAndDraw();
}
else if (EC_REPAINT == evCode)
{
Copy();
::SetEvent(m_hDrawEvent);
}
m_pEvent->FreeEventParams(evCode, param1, param2);
}


WaitForSingleObjectEx 总是返回 WAIT_TIMEOUT.
请问为什么?
And how to get notification when a new frame in the movie need to be draw?
...全文
324 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
noho 2001-06-07
  • 打赏
  • 举报
回复
//push
noho 2001-06-07
  • 打赏
  • 举报
回复
//push
noho 2001-06-02
  • 打赏
  • 举报
回复
这一段代码是能编译的
Kevin请看一下
关键在于event
runbuff 2001-06-01
  • 打赏
  • 举报
回复
真令人眼花缭乱。
关注。
noho 2001-06-01
  • 打赏
  • 举报
回复
//sigh
Kevin_qing 2001-05-31
  • 打赏
  • 举报
回复
说实话~我已经看晕了
noho 2001-05-31
  • 打赏
  • 举报
回复
//push
Kevin_qing 2001-05-30
  • 打赏
  • 举报
回复
hr=pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);
pGB->Release();
if(m_pEvent)
{
m_pEvent->SetNotifyFlags(0 );
// m_pEvent->CancelDefaultHandling(EC_REPAINT);
}

会不会是SetNotifyFlags(0 );
没有运行到?
我这里没有办法调试,你运行试试看啊
noho 2001-05-30
  • 打赏
  • 举报
回复
谢谢Kevin_qing

这是一个完成的播放movie的窗口类的源代码
现在别的都好了
只差那个event了
请各位高手援助
noho 2001-05-30
  • 打赏
  • 举报
回复
TO
Kevin_qing
怎么样?有何高见?
noho 2001-05-30
  • 打赏
  • 举报
回复
肯定运行到了
如果m_pEvent==NULL的话
就没有后面的GetEventHandle了
Kevin_qing 2001-05-29
  • 打赏
  • 举报
回复
研究中。。。。。。。。。。。。。。
Kevin_qing 2001-05-29
  • 打赏
  • 举报
回复
我的吗呀~~~~~
你帖了这么多啊
Kevin_qing 2001-05-29
  • 打赏
  • 举报
回复
看起来不像有什么问题
我查了半天文档了,这个event还没有用过
noho 2001-05-29
  • 打赏
  • 举报
回复
调用顺序
Create(Window)
Initialize
Open
Start
[Pause]
[Continue]
Stop
Uninitialize
Destroy(Window)
noho 2001-05-29
  • 打赏
  • 举报
回复
cpp 文件

#include <objbase.h>
#include <initguid.h> // Defines DEFINE_GUID macro and enables GUID initialization
#include "MovieWindow.h"
#include <evcode.h>

#pragma comment(lib, "Urlmon.lib")
//#pragma comment(lib, "amstrmid.lib")
//#pragma comment(lib, "quartz.lib")
//#pragma comment(lib, "strmbase.lib")
//#pragma comment(lib, "ddraw.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNCREATE(CMovieWindow, CWindow)

BOOL CMovieWindow::Open(LPCTSTR lpszURL)
{
ASSERT(GetSafeHwnd());
ASSERT(m_pDD3);
ASSERT(m_pMMStream);
HRESULT hr=S_OK;
IMoniker * pMoniker=NULL;

STREAM_STATE nState=STREAMSTATE_RUN;
m_pMMStream->GetState(&nState);
m_pMMStream->SetState(STREAMSTATE_STOP);
if(nState==STREAMSTATE_RUN)
StopCopyAndDraw();

//Convert filename to Unicode
WCHAR wszURL[MAX_PATH];
::MultiByteToWideChar(CP_ACP, 0, lpszURL, -1, wszURL,
sizeof(wszURL)/sizeof(wszURL[0]));
hr=::CreateURLMoniker(NULL, wszURL, &pMoniker);
if(FAILED(hr))
return FALSE;
IBindCtx * pBC=NULL;
hr=::CreateBindCtx(0, &pBC);
if(FAILED(hr))
{
pMoniker->Release();
return FALSE;
}
hr=m_pMMStream->OpenMoniker(pBC, pMoniker, 0);
pBC->Release();
pMoniker->Release();
if(FAILED(hr))
return FALSE;
return SUCCEEDED(InitRender());
}


void CMovieWindow::Start()
{
if(m_pMMStream)
{
STREAM_STATE nState=STREAMSTATE_RUN;
m_pMMStream->GetState(&nState);

m_StreamTime=0;
m_pMMStream->Seek(m_StreamTime);
m_pMMStream->SetState(STREAMSTATE_RUN);
if(nState==STREAMSTATE_STOP)
StartCopyAndDraw();
}
}

void CMovieWindow::Pause()
{
if(m_pMMStream)
{
STREAM_STATE nState=STREAMSTATE_RUN;
m_pMMStream->GetState(&nState);

m_pMMStream->GetTime(&m_StreamTime);
m_pMMStream->SetState(STREAMSTATE_STOP);
if(nState==STREAMSTATE_RUN)
StopCopyAndDraw();
}
}

void CMovieWindow::Continue()
{
if(m_pMMStream)
{
STREAM_STATE nState=STREAMSTATE_RUN;
m_pMMStream->GetState(&nState);

m_pMMStream->Seek(m_StreamTime);
m_pMMStream->SetState(STREAMSTATE_RUN);
if(nState==STREAMSTATE_STOP)
StartCopyAndDraw();
}
}

void CMovieWindow::Stop()
{
if(m_pMMStream)
{
STREAM_STATE nState=STREAMSTATE_RUN;
m_pMMStream->GetState(&nState);

m_pMMStream->SetState(STREAMSTATE_STOP);
m_StreamTime = 0; // Reset the stream time to 0
m_pMMStream->Seek(m_StreamTime); //Run one frame to reset video
m_pMMStream->SetState(STREAMSTATE_RUN);
Render();
m_pMMStream->SetState(STREAMSTATE_STOP); // Stop for real this time
m_StreamTime = 0;
if(nState==STREAMSTATE_RUN)
StopCopyAndDraw();
}
}

HRESULT CMovieWindow::InitDirectDraw()
{
ASSERT(GetSafeHwnd());
ASSERT(m_pDD3==NULL);
ASSERT(m_pPrimarySurface==NULL);
ASSERT(m_pDDSOffscreen==NULL);
ASSERT(m_pDDSOffscreen2==NULL);
ASSERT(m_pDDClipper==NULL);

HRESULT hr=S_OK;

DDSURFACEDESC ddsd, ddsd2, ddsd3;

IDirectDrawFactory * pDDF=NULL;
IDirectDraw * pDD=NULL;

//Create a DirectDrawFactory object
hr = CoCreateInstance(CLSID_DirectDrawFactory,
NULL, CLSCTX_INPROC_SERVER,
IID_IDirectDrawFactory, (void **)&pDDF);
if (FAILED(hr))
return hr;

//Call the IDirectDrawFactory::CreateDirectDraw method to create the
//DirectDraw object, set the cooperative level, and get the address
//of an IDirectDraw interface pointer
hr = (pDDF->CreateDirectDraw(NULL,
::GetDesktopWindow(),
DDSCL_NORMAL,
NULL, NULL, &pDD));
pDDF->Release();
if (FAILED(hr))
return hr;

//Now query for the new IDirectDraw3 interface
hr =pDD->QueryInterface(IID_IDirectDraw3, (LPVOID*)&m_pDD3);
pDD->Release();
if (FAILED(hr))
return hr;

//Initialize the DDSURFACEDESC structure for the primary surface
::ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hr = m_pDD3->CreateSurface(&ddsd, &m_pPrimarySurface, NULL);
if(FAILED(hr))
{
m_pDD3->Release();
m_pDD3=NULL;
return hr;
}


// Now, do the same for the offscreen surfaces.

// The offscreen surface needs to use the same pixel format as the primary.
// Query the primary surface to for its pixel format.
hr = m_pPrimarySurface->GetSurfaceDesc(&ddsd);
if(FAILED(hr))
{
m_pPrimarySurface->Release();
m_pPrimarySurface=NULL;
m_pDD3->Release();
m_pDD3=NULL;
return hr;
}

// Now, set the info for the offscreen surface #1, using the primary's pixel format.
::ZeroMemory(&ddsd2, sizeof(ddsd2));
ddsd2.dwSize = sizeof(ddsd2);
ddsd2.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd2.dwHeight = ddsd.dwHeight; //set the height of the surfaces equal
ddsd2.dwWidth = ddsd.dwWidth; //set the width of the surfaces equal
ddsd2.ddpfPixelFormat = ddsd.ddpfPixelFormat; //set the pixel formats equal

// Now, create the offscreen surface #1 and query for the latest interface.
hr = m_pDD3->CreateSurface(&ddsd2, &m_pDDSOffscreen, NULL);
if(FAILED(hr))
{
m_pPrimarySurface->Release();
m_pPrimarySurface=NULL;
m_pDD3->Release();
m_pDD3=NULL;
return hr;
}

// Now, set the info for the offscreen surface #2, using the primary's pixel format.
::ZeroMemory(&ddsd3, sizeof(ddsd3));
ddsd3.dwSize = sizeof(ddsd3);
ddsd3.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd3.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd3.dwHeight = ddsd.dwHeight; //set the height of the surfaces equal
ddsd3.dwWidth = ddsd.dwWidth; //set the width of the surfaces equal
ddsd3.ddpfPixelFormat = ddsd.ddpfPixelFormat; //set the pixel formats equal


// Now, create the offscreen surface #2 and query for the latest interface.
hr = m_pDD3->CreateSurface(&ddsd3, &m_pDDSOffscreen2, NULL);
if(FAILED(hr))
{
m_pDDSOffscreen->Release();
m_pDDSOffscreen=NULL;
m_pPrimarySurface->Release();
m_pPrimarySurface=NULL;
m_pDD3->Release();
m_pDD3=NULL;
return hr;
}

//Add code for Clipper
hr = m_pDD3->CreateClipper(0, &m_pDDClipper, NULL);
if(FAILED(hr))
{
m_pDDSOffscreen2->Release();
m_pDDSOffscreen2=NULL;
m_pDDSOffscreen->Release();
m_pDDSOffscreen=NULL;
m_pPrimarySurface->Release();
m_pPrimarySurface=NULL;
m_pDD3->Release();
m_pDD3=NULL;
return hr;
}

hr = m_pPrimarySurface->SetClipper(m_pDDClipper);
if(FAILED(hr))
{
m_pDDClipper->Release();
m_pDDClipper=NULL;
m_pDDSOffscreen2->Release();
m_pDDSOffscreen2=NULL;
m_pDDSOffscreen->Release();
m_pDDSOffscreen=NULL;
m_pPrimarySurface->Release();
m_pPrimarySurface=NULL;
m_pDD3->Release();
m_pDD3=NULL;
return hr;
}


hr = m_pDDClipper->SetHWnd(0, m_hWnd);
if(FAILED(hr))
{
m_pDDClipper->Release();
m_pDDClipper=NULL;
m_pDDSOffscreen2->Release();
m_pDDSOffscreen2=NULL;
m_pDDSOffscreen->Release();
m_pDDSOffscreen=NULL;
m_pPrimarySurface->Release();
m_pPrimarySurface=NULL;
m_pDD3->Release();
m_pDD3=NULL;
}
return hr;
}

void CMovieWindow::ClearDirectDraw()
{
//Release DirectDrawEx interfaces
if (m_pDDSOffscreen != NULL) {
m_pDDSOffscreen->Release();
m_pDDSOffscreen= NULL;
}
if (m_pDDSOffscreen2 != NULL) {
m_pDDSOffscreen2->Release();
m_pDDSOffscreen2= NULL;
}
if (m_pDDClipper != NULL) {
m_pDDClipper->Release();
m_pDDClipper= NULL;
}
if (m_pPrimarySurface != NULL) {
m_pPrimarySurface->Release();
m_pPrimarySurface= NULL;
}
if (m_pDD3 != NULL) {
m_pDD3->Release();
m_pDD3= NULL;
}
/* if (m_pDD != NULL) {
m_pDD->Release();
m_pDD= NULL;
}
if (m_pDDF != NULL) {
m_pDDF->Release();
m_pDDF= NULL;
}
*/
}

HRESULT CMovieWindow::InitMultiMedia()
{
ASSERT(m_pDD3);
ASSERT(m_pMMStream==NULL);
ASSERT(m_pEvent==NULL);

IGraphBuilder * pGB=NULL;

HRESULT hr=S_OK;

//Create the AMMultiMediaStream object
hr =CoCreateInstance(__uuidof(AMMultiMediaStream),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IAMMultiMediaStream), (void **)&m_pMMStream);
if(FAILED(hr))
return hr;

//Initialize stream
hr = m_pMMStream->Initialize(STREAMTYPE_READ, 0, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
//Add primary video stream
hr = m_pMMStream->AddMediaStream(m_pDD3, &MSPID_PrimaryVideo, 0, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
//Add primary audio stream
hr = m_pMMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NULL);
if(FAILED(hr))
{
m_pMMStream->Release();
return hr;
m_pMMStream=NULL;
}
hr=m_pMMStream->GetFilterGraph(&pGB);
if(FAILED(hr))
{
m_pMMStream->Release();
m_pMMStream=NULL;
return hr;
}
/* IMediaEventSink * pSink=NULL;
hr=pGB->QueryInterface(__uuidof(IMediaEventSink), (void **)&pSink);
if(pSink)
{
pSink->Release();
}
*/
hr=pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pEvent);
pGB->Release();
if(m_pEvent)
{
m_pEvent->SetNotifyFlags(0 );
// m_pEvent->CancelDefaultHandling(EC_REPAINT);
}
return hr;
}

void CMovieWindow::ClearMultiMedia()
{
if(m_pMMStream)
{
m_pMMStream->SetState(STREAMSTATE_STOP);
}
if(m_pEvent)
{
m_pEvent->Release();
m_pEvent=NULL;
}
//Release MultiMedia streaming Objects
if (m_pMMStream != NULL) {
m_pMMStream->Release();
m_pMMStream= NULL;
}
if (m_pSample != NULL) {
m_pSample->Release();
m_pSample = NULL;
}
/* if (m_pDDStream != NULL) {
m_pDDStream->Release();
m_pDDStream= NULL;
}
if (m_pPrimaryVidStream != NULL) {
m_pPrimaryVidStream->Release();
m_pPrimaryVidStream= NULL;
}
*/
}

HANDLE CMovieWindow::GetMultiMediaEvent()
{
HANDLE hEvent=NULL;
if(m_pEvent)
{
m_pEvent->GetEventHandle((OAEVENT*) &hEvent);
}
return hEvent;
}

BOOL CMovieWindow::InitThread()
{
m_bExit=FALSE;
ASSERT(m_hCopyThread==NULL);
ASSERT(m_hDrawThread==NULL);

m_hCopyEvent=GetMultiMediaEvent();
m_hDrawEvent=::CreateEvent(NULL, TRUE, FALSE, NULL);
m_hSleepEvent=::CreateEvent(NULL, TRUE, FALSE, NULL);

DWORD dwID;
m_hCopyThread=::CreateThread(NULL, 0, CMovieWindow::_DoCopy, this, 0, &dwID);
m_hDrawThread=::CreateThread(NULL, 0, CMovieWindow::_DoDraw, this, 0, &dwID);
return ( (m_hDrawThread!=NULL) && (m_hCopyThread!=NULL) );
}

void CMovieWindow::ClearThread()
{
::CloseHandle(m_hDrawEvent);
m_hDrawEvent=NULL;

m_hCopyEvent=NULL;
m_bExit=TRUE;

StartCopyAndDraw();

HANDLE hThread[2];
hThread[0]=m_hCopyThread;
hThread[1]=m_hDrawThread;
if(::WaitForMultipleObjectsEx(2, hThread, TRUE, 60000, TRUE)==WAIT_TIMEOUT)
{
::TerminateThread(m_hCopyThread, -1);
::TerminateThread(m_hDrawThread, -1);
}
::CloseHandle(m_hCopyThread);
m_hCopyThread=NULL;
::CloseHandle(m_hDrawThread);
m_hDrawThread=NULL;

::CloseHandle(m_hSleepEvent);
m_hSleepEvent=NULL;
}

DWORD WINAPI CMovieWindow::_DoCopy(LPVOID lpParameter)
{
CMovieWindow * pThis=(CMovieWindow *)lpParameter;
ASSERT_KINDOF(CMovieWindow, pThis);
return pThis->DoCopy();
}

DWORD CMovieWindow::DoCopy()
{
long evCode, param1, param2;
while(!m_bExit)
{
while(::WaitForSingleObjectEx(m_hSleepEvent, 40, TRUE)!=WAIT_OBJECT_0)
{
if(m_bExit)
break;
}
if(m_bExit)
break;
::SleepEx(40, TRUE);
Copy();
::SetEvent(m_hDrawEvent);
/* while(::WaitForSingleObjectEx(m_hCopyEvent, 40, TRUE)!=WAIT_OBJECT_0)
{
if(m_bExit)
break;
}
if(m_bExit)
break;
if(SUCCEEDED(m_pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0)))
{
TRACE(_T("Event: 0x%X\n"), evCode);
if ((EC_COMPLETE == evCode) || (EC_USERABORT == evCode))
{
StopCopyAndDraw();
}
else if (EC_REPAINT == evCode)
{
Copy();
::SetEvent(m_hDrawEvent);
}
m_pEvent->FreeEventParams(evCode, param1, param2);
}*/
}
return 0;
}

DWORD WINAPI CMovieWindow::_DoDraw(LPVOID lpParameter)
{
CMovieWindow * pThis=(CMovieWindow *)lpParameter;
ASSERT_KINDOF(CMovieWindow, pThis);
return pThis->DoDraw();
}

DWORD CMovieWindow::DoDraw()
{
while(!m_bExit)
{
while(::WaitForSingleObjectEx(m_hSleepEvent, 40, TRUE)!=WAIT_OBJECT_0)
{
if(m_bExit)
break;
}
if(m_bExit)
break;
while(::WaitForSingleObjectEx(m_hDrawEvent, 40, TRUE)!=WAIT_OBJECT_0)
{
if(m_bExit)
break;
}
if(m_bExit)
break;
Render();
::ResetEvent(m_hDrawEvent);
}
return 0;
}

void CMovieWindow::Copy()
{
RECT rect;
rect.top = rect.left = 0;
rect.bottom = m_video_height;
rect.right = m_video_width;
if(m_pSample)
{
if(FAILED(m_pSample->Update(0, NULL, NULL, 0)))
{
m_pMMStream->SetState(STREAMSTATE_STOP);
StopCopyAndDraw();
}
m_pDDSOffscreen->Blt(&rect, m_pDDSOffscreen2, &rect, DDBLT_WAIT, NULL);
}
}

void CMovieWindow::Render()
{
POINT point;
RECT rect, rect2;
rect.top = rect.left = 0;
rect.bottom = m_video_height;
rect.right = m_video_width;

GetClientRect(m_hWnd, &rect2); // rectangle for the primary surface
point.x = rect2.top; // transfrom rect into screen coordinates
point.y = rect2.left;
ClientToScreen(m_hWnd, &point);
rect2.left = point.x;
rect2.top = point.y;
point.x = rect2.right;
point.y = rect2.bottom;
ClientToScreen(m_hWnd, &point);
rect2.right = point.x;
rect2.bottom= point.y;
m_pPrimarySurface->Blt(&rect2, m_pDDSOffscreen, &rect, DDBLT_WAIT, NULL);
}


void CMovieWindow::StartCopyAndDraw()
{
ASSERT(m_hSleepEvent);
::SetEvent(m_hSleepEvent);
}

void CMovieWindow::StopCopyAndDraw()
{
ASSERT(m_hSleepEvent);
::ResetEvent(m_hSleepEvent);
}

HRESULT CMovieWindow::InitRender()
{
ASSERT(m_pMMStream);
ASSERT(m_pDDSOffscreen2);

if(m_pSample)
{
m_pSample->Release();
m_pSample=NULL;
}

IMediaStream * pPrimaryVidStream=NULL;
IDirectDrawMediaStream * pDDStream=NULL;
DDSURFACEDESC ddsd;
RECT rect;
HRESULT hr=S_OK;

//Use the multimedia stream to get the primary video media stream
hr = m_pMMStream->GetMediaStream(MSPID_PrimaryVideo, &pPrimaryVidStream);
if(FAILED(hr))
return hr;
//Use the media stream to get the IDirectDrawMediaStream
hr = pPrimaryVidStream->QueryInterface(__uuidof(IDirectDrawMediaStream), (void **)&pDDStream);
pPrimaryVidStream->Release();
if(FAILED(hr))
return hr;
//Must set dwSize before calling GetFormat
ddsd.dwSize = sizeof(ddsd);
hr = pDDStream->GetFormat(&ddsd, NULL, NULL, NULL);
if(FAILED(hr))
{
pDDStream->Release();
return hr;
}
rect.top = rect.left = 0;
rect.bottom = ddsd.dwHeight;
m_video_height=(WORD)rect.bottom;
rect.right = ddsd.dwWidth;
m_video_width=(WORD)rect.right;

//Create the stream sample in offscreen surface #2 (attachment)
hr = pDDStream->CreateSample(m_pDDSOffscreen2, &rect, 0, &m_pSample);
pDDStream->Release();
return hr;
}

BOOL CMovieWindow::Initialize()
{
if(FAILED(InitDirectDraw()))
return FALSE;
if(FAILED(InitMultiMedia()))
{
ClearDirectDraw();
return FALSE;
}
if(FAILED(InitThread()))
{
ClearMultiMedia();
ClearDirectDraw();
return FALSE;
}
else
return TRUE;
}

void CMovieWindow::Uninitialize()
{
Stop();
ClearMultiMedia();
ClearDirectDraw();
ClearThread();
}
noho 2001-05-29
  • 打赏
  • 举报
回复
头文件


#include <mmstream.h> // Multimedia stream interfaces
#include <mmreg.h>
#include <amstream.h> // DirectShow multimedia stream interfaces
#include <control.h>

#include <ddstream.h> // DirectDraw multimedia stream interfaces
#include <ddrawex.h> // DirectDrawEx interfaces

class CMovieWindow : public CWindow
{
DECLARE_DYNCREATE(CMovieWindow)
public:
void Uninitialize();
BOOL Initialize();
void Start();
void Stop();
void Pause();
void Continue();
BOOL Open(LPCTSTR lpszURL);


CMovieWindow() : m_pDD3(NULL),
m_pPrimarySurface(NULL), m_pDDSOffscreen(NULL),
m_pDDSOffscreen2(NULL), m_pDDClipper(NULL),
m_pMMStream(NULL)/*, m_pPrimaryVidStream(NULL),
m_pDDStream(NULL)*/, m_pSample(NULL),
m_pEvent(NULL),
m_hCopyThread(NULL), m_hDrawThread(NULL),
m_hCopyEvent(NULL), m_hDrawEvent(NULL),
m_hSleepEvent(NULL),
m_bExit(FALSE), m_StreamTime(0)
{
::CoInitialize(NULL);
}
virtual ~CMovieWindow()
{
::CoUninitialize();
}

protected:
virtual void PreRegisterWindowClass(WNDCLASSEX & wc)
{
CWinApp * pApp=GetApp();
ASSERT(pApp);
if(wc.lpszClassName==NULL)
{
wsprintf(pApp->m_szTempClassName, _T("SWLMovieWindow:%d"), ::GetTickCount());
wc.lpszClassName=pApp->m_szTempClassName;
}
}

protected:
HRESULT InitDirectDraw();
void ClearDirectDraw();
HRESULT InitMultiMedia();
void ClearMultiMedia();
void ClearThread();
BOOL InitThread();
HANDLE GetMultiMediaEvent();

HRESULT InitRender();
void Render();
void Copy();

void StartCopyAndDraw();
void StopCopyAndDraw();

protected:
static DWORD WINAPI _DoCopy(LPVOID lpParameter);
DWORD DoCopy();
static DWORD WINAPI _DoDraw(LPVOID lpParameter);
DWORD DoDraw();

protected:
// copy & draw thread
HANDLE m_hSleepEvent;
HANDLE m_hCopyThread, m_hDrawThread;
HANDLE m_hCopyEvent, m_hDrawEvent;
BOOL m_bExit;
// seek
STREAM_TIME m_StreamTime;
//DirectDrawEx interfaces
// IDirectDrawFactory *m_pDDF;
// IDirectDraw *m_pDD;
IDirectDraw3 *m_pDD3;
IDirectDrawSurface *m_pPrimarySurface;
IDirectDrawSurface *m_pDDSOffscreen;
IDirectDrawSurface *m_pDDSOffscreen2;
IDirectDrawClipper *m_pDDClipper;

//MultiMedia streaming interfaces
IAMMultiMediaStream *m_pMMStream;
// IMediaStream *m_pPrimaryVidStream;
// IDirectDrawMediaStream *m_pDDStream;
IDirectDrawStreamSample *m_pSample;
IMediaEventEx * m_pEvent;
WORD m_video_width, m_video_height;
};
noho 2001-05-29
  • 打赏
  • 举报
回复
多谢!
Kevin_qing 2001-05-29
  • 打赏
  • 举报
回复
待我来研究一下
noho 2001-05-29
  • 打赏
  • 举报
回复
改成INFINITE都不行
用40并且在while中是因为这段代码跑在一个线程中
这样的代码主线程才有机会通知该线程结束
加载更多回复(2)

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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